요소 팩토리를 사용하여 Workbench 시스템 종료 중에 저장한 데이터에서 Workbench 모델 오브젝트를 다시 작성합니다.
요소 팩토리 확장을 자세히 살펴 보기 전에 플러그인별 작동을 공통 플랫폼 모델 오브젝트에 추가하려면 플랫폼에서 사용되는 일반 기술을 검토해야 합니다.
다양한 Workbench 클래스를 찾아보면 여러 Workbench 인터페이스에서 IAdaptable 인터페이스를 확장하는 것을 볼 수 있습니다.
플러그인에서는 어댑터를 사용하여 특정 작동을 시스템의 기존 유형에 추가합니다. 예를 들어 Workbench는 표시할 레이블 및 이미지에 대해 자원이 응답하도록 할 수 있습니다. UI별 작동을 낮은 레벨의 오브젝트에 추가하는 것은 좋은 설계가 아닙니다. 그렇다면 어떤 방법으로 이 작동을 자원 유형에 추가할 수 있습니까?
플러그인은 기존 유형에 작동을 추가하는 어댑터를 등록할 수 있습니다. 그러면 응용프로그램 코드는 특정 어댑터에 대해 오브젝트를 조회할 수 있습니다. 오브젝트에 대해 등록된 어댑터가 있으면 응용프로그램은 이 어댑터를 가져와서 어댑터에 정의된 새 작동을 사용할 수 있습니다.
오브젝트에 대해 어댑터를 동적으로 조회하는 기능을 제공하여 시스템 향상에 따라 시스템의 융통성을 향상시킬 수 있습니다. 원래 유형의 정의를 변경하지 않고도 새 플러그인으로 플랫폼 유형에 새 어댑터를 등록할 수 있습니다. 오브젝트에 특정 어댑터를 요구하는 패턴은 다음과 같습니다.
//given an object o, we want to do "workbench" things with it. if (!(o instanceof IAdaptable)) { return null; } IWorkbenchAdapter adapter = (IWorkbenchAdapter)o.getAdapter(IWorkbenchAdapter.class); if (adapter == null) return null; // now I can treat o as an IWorkbenchAdapter ...
해당 오브젝트에 등록된 어댑터가 없으면 어댑터로 널이 리턴됩니다. 이런 경우를 처리할 수 있게 클라이언트를 준비해야 합니다. 예상되는 어댑터가 등록되어 있지 않은 경우도 있습니다.
Workbench에서는 어댑터를 사용하여 IResource와 같은 기본 플랫폼 유형에서 UI 정보를 가져옵니다. 어댑터는 UI별 지식에서 기본 유형을 숨기므로 Workbench는 기본 정의를 변경하지 않고 인터페이스를 향상시킬 수 있습니다.
어댑터를 사용하지 않는 경우 Workbench API에서 전달되는 클래스는 UI 인터페이스를 구현해야 하므로 클래스 정의의 수가 증가하고 긴밀한 결합이 이루어지고 코어 및 UI 클래스 간에 순환 종속성이 생깁니다. 어댑터를 사용하여 모든 클래스는 IAdaptable을 구현하고 플러그인이 기본 유형의 작동을 확장할 수 있게 해주는 어댑터 레지스트리를 사용합니다.
Workbench 코드에서 어댑터에 대해 플랫폼 코어 유형을 조회할 수 있는 경우가 표시됩니다. 조회는 유형에 대한 UI 지향 정보에 응답하는 방법을 아는 오브젝트를 얻는 데 사용됩니다.
사용자가 Workbench를 시스템 종료할 경우 Workbench에 표시된 IAdaptable 오브젝트의 현재 상태를 저장해야 합니다. IMemento라는 특수한 형식으로 오브젝트의 기본 데이터 매개변수를 저장하여 오브젝트의 상태를 저장합니다. IMemento에서 오브젝트를 다시 만들 수 있는 팩토리의 ID도 저장되며 데이터는 파일 시스템에 저장됩니다.
플랫폼을 다시 시작하면 Workbench는 IMemento의 팩토리 ID와 연관된 요소 팩토리를 찾습니다. org.eclipse.ui.elementFactories 확장에 사용할 수 있는 플러그인 레지스트리를 확인하여 팩토리를 찾습니다.
마크업은 매우 간단합니다. 팩토리의 id와 팩토리를 구현하는 해당 클래스를 지정하기만 하면 됩니다.
다음 코드 스니펫은 Workbench plugin.xml에서 가져온 것입니다.
<extension point="org.eclipse.ui.elementFactories"> <factory class="org.eclipse.ui.internal.model.ResourceFactory" id="org.eclipse.ui.internal.model.ResourceFactory"> </factory> <factory class="org.eclipse.ui.internal.model.WorkspaceFactory" id="org.eclipse.ui.internal.model.WorkspaceFactory"> </factory> <factory class="org.eclipse.ui.part.FileEditorInputFactory" id="org.eclipse.ui.part.FileEditorInputFactory"> </factory> <factory class="org.eclipse.ui.internal.dialogs.WelcomeEditorInputFactory" id="org.eclipse.ui.internal.dialogs.WelcomeEditorInputFactory"> </factory> <factory class="org.eclipse.ui.internal.WorkingSetFactory" id="org.eclipse.ui.internal.WorkingSetFactory"> </factory> </extension>