자원 마커

플러그인은 특수 파일 확장을 정의하고 이런 파일 유형에 대해 특수 편집 기능을 제공하는 편집기를 제공합니다. 자원을 편집(또는 빌드)하는 동안 플러그인은 자원을 태그화하여 사용자에게 문제점이나 기타 정보를 제공해야 합니다. 자원 마커 메커니즘은 이런 유형의 정보를 관리하는 데 사용됩니다.

마커는 자원에 부착하는 노란색의 메모라고 생각할 수 있습니다. 마커에 문제점(예: 위치, 심각도)이나 수행될 타스크에 대한 정보를 기록할 수 있습니다.  또는 마커 위치를 책갈피로 기록할 수도 있습니다. 

사용자는 자원 내에서 표시된 위치로 신속히 점프할 수 있습니다. Workbench UI는 편집기를 따라 책갈피, 중단점, 타스크, 문제점에 대한 프리젠테이션을 지원합니다.  이 마커는 타스크 또는 문제점 보기와 같은 보기에 항목으로 표시될 수도 있습니다.

플랫폼 자원 API는 마커 작성, 마커 값 설정 및 새 마커 유형을 사용하여 플랫폼을 확장하기 위한 메소드를 정의합니다. 플랫폼이 마커를 관리하는 동안 플러그인이 마커 작성, 제거 및 속성 값을 제어합니다.

마커는 작고, 간단한 오브젝트입니다. 하나의 프로젝트에 수백개의, 심지어 수천개의 마커가 있을 수 있습니다.  예를 들어, Java 컴파일러는 마커를 사용하여 소스 코드에서 찾은 각 문제점을 플래그합니다.

플랫폼은 삭제된 자원에 첨부된 마커를 처리하지만 존재하는 자원에 마커가 더 이상 적용되지 않을 경우에는 플러그인이 마커를 제거합니다.

마커 조작

마커를 조작하는 것은 자원을 조작하는 것과 유사합니다. 마커는 핸들 오브젝트입니다. 자원으로부터 마커 핸들을 얻을 수 있지만, exists() 프로토콜을 사용하거나 다른 방법으로 조작을 시도할 때까지 실제로 마커 핸들이 있는지 알지 못합니다. 마커가 있는지 확인했으면 마커에 지정되었을 수도 있는 이름 지정된 속성을 조회할 수 있습니다.

플랫폼이 마커를 소유하고 관리하는데, 플랫폼은 마커를 지속적으로 유지하고 마커가 추가, 삭제 또는 변경되면 리스너에게 알립니다.  플러그인은 필수 마커 작성하거나 마커 속성을 변경하고, 마커가 더이상 필요 없을 경우 마커를 제거합니다.

마커 작성

마커는 생성자를 사용하여 직접 작성되지 않습니다. 연관된 자원에서 팩토리 메소드(IResource.createMarker())를 사용하여 작성됩니다.

IMarker marker = file.createMarker(IMarker.TASK);

글로벌 범위를 가진(특정 자원과 연관되지 않은) 마커를 작성하려면 작업공간 루트(IWorkspace.getRoot())를 자원으로 사용할 수 있습니다.

마커 삭제

마커를 삭제하기 위한 코드는 간단합니다.

         try {
      marker.delete();
} catch (CoreException e) {
      // Something went wrong
   }

마커가 삭제되면 마커 오브젝트(핸들)이 "쓸모 없게" 됩니다. 플러그인은 IMarker.exists() 프로토콜을 사용하여 머커 오브젝트가 아직 유효한지 확인해야 합니다.

자원이 마커를 삭제하도록 하면 일괄처리로 마커를 삭제할 수 있습니다. 이 메소드는 동시에 다수의 마커를 제거하거나 개별 마커 참조 또는 ID를 사용할 수 없는 경우에 유용합니다.

int depth = IResource.DEPTH_INFINITE;
         try {
      resource.deleteMarkers(IMarker.PROBLEM, true, depth);
} catch (CoreException e) {
      // something went wrong
   }

마커 그룹을 삭제할 때 삭제할 마커 유형(예: IMarker.PROBLEM)을 지정하십시오. 마커를 모두 삭제하려면 null을 지정하십시오. 두 번째 인수는 하위 유형 마커를 삭제할지 여부를 표시합니다. (잠시 후 새 마커 유형을 정의할 때 하위 유형에 대해 살펴 보도록 합니다.)  depth 인수는 삭제 깊이를 제어합니다. 

IWorkspace.deleteMarkers(IMarker [])를 사용하여 마커를 삭제할 수도 있습니다.

마커 속성

마커가 제공되면 연관된 자원, 해당 자원과 관련하여 고유한 마커 ID 및 마커 유형을 요구할 수 있습니다. 일반 속성을 통해 추가 정보에 액세스할 수도 있습니다.

각 마커 유형마다 이름 지정 규칙을 사용하여 마커 유형 작성자에 의해 정의된 특정 속성 세트가 있습니다.  IMarker 인터페이스는 플랫폼 마커 유형의 표준 속성 이름(및 일부 예상 값)이 들어 있는 상수 세트를 정의합니다. 다음 메소드는 플랫폼 상수를 사용하여 속성을 조작합니다.

IMarker marker = file.createMarker(IMarker.TASK);
   if (marker.exists()) {
         try {
         marker.setAttribute(IMarker.MESSAGE, "A sample marker message");
         marker.setAttribute(IMarker.PRIORITY, IMarker.PRIORITY_HIGH);
} catch (CoreException e) {
         // You need to handle the case where the marker no longer exists      }
   }

일반적으로 속성은 이름/값 쌍으로 유지보수되는데, 이름은 문자열이고 값은 지원되는 값 유형(부울, 정수, 문자열) 중 하나입니다. 값 유형에 제한이 있기 때문에 플랫폼은 마커를 신속하면서도 간단하게 지속할 수 있습니다.

마커 조회

마커와 하위 마커에 대해 자원을 조회할 수 있습니다. 예를 들어, 깊이가 무한대인 작업공간 루트를 조회하면 작업공간의 모든 마커가 참작됩니다.

IMarker[] problems = null;
int depth = IResource.DEPTH_INFINITE;
         try {
      problems = resource.findMarkers(IMarker.PROBLEM, true, depth);
} catch (CoreException e) {
      // something went wrong
   }

findMarkers에서 리턴한 결과는 전달된 인수에 따라 다릅니다. 위의 스니펫에서는 자원과 모든 직간접 하위 항목에 표시되는 PROBLEM 유형의 모든 마커를 찾고 있습니다.  

마커 유형으로 null을 전달하면, 자원과 연관된 모든 마커 유형을 가져오게 됩니다. 두 번째 인수는 자원의 하위를 검색할지 여부를 지정합니다.  depth 인수는 자원의 하위를 검색하고 있을 때 검색 깊이를 제어합니다. 깊이는 DEPTH_ZERO(주어진 자원만), DEPTH_ONE(자원과 그 모든 직접적인 하위) 또는 DEPTH_INFINITE(자원과 그 모든 직/간접 하위 항목)입니다.

마커 지속

플랫폼 표준 마커(타스크, 문제점, 책갈피)는 지속적입니다. 이것은 Workbench 종료 및 시작에 걸쳐 상태가 저장됨을 의미합니다. 그러나, 지속적인 마커 유형은 예약된 transient 속성을 true로 설정하여 선택적으로 임시 상태가 될 수 있습니다.

플러그인에 의해 선언된 새 마커 유형은 지속적으로 선언된 경우를 제외하고 지속적이지 않습니다.

새 마커 유형을 사용하여 플랫폼 확장

플러그인은 org.eclipse.core.resources.markers 확장점을 사용하여 고유 마커 유형을 선언할 수 있습니다. 문제점, 타스크, 책갈피에 대한 표준 마커 유형은 자원 플러그인의 마크업에서 플랫폼에 의해 선언됩니다.

   <extension
      id="problemmarker" 
      point="org.eclipse.core.resources.markers" 
      name="%problemName">
      <super type="org.eclipse.core.resources.marker"/>
      <persistent value="true"/>
      <attribute name="severity"/>
      <attribute name="message"/>
      <attribute name="location"/>
   </extension>   <extension
      id="taskmarker" 
      point="org.eclipse.core.resources.markers" 
      name="%taskName">
      <super type="org.eclipse.core.resources.marker"/>
      <persistent value="true"/>
      <attribute name="priority"/>
      <attribute name="message"/>
      <attribute name="done"/>
      <attribute name="userEditable"/>      
   </extension>   <extension
      id="bookmark" 
      point="org.eclipse.core.resources.markers" 
      name="%bookmarkName">
      <super type="org.eclipse.core.resources.marker"/>
      <persistent value="true"/>
      <attribute name="message"/>
      <attribute name="location"/>
   </extension>   

새 마커 유형은 다중 상속을 사용하여 기존 마커 유형에서 유래됩니다. 새 마커 유형은 수퍼유형으로부터 모든 속성을 상속하며, 정의된 새 속성을 선언 유형으로 추가합니다. 일시적으로 해당 수퍼유형의 수퍼유형으로부터 속성을 상속하기도 합니다. 다음 마커는 가상의 com.example.markers 플러그인에 새 마커 유형을 정의합니다.

   <extension
      id="mymarker"
      point="org.eclipse.core.resources.markers" />
<extension
      id="myproblem"
      point="org.eclipse.core.resources.markers">
      <super type="org.eclipse.core.resources.problemmarker"/>
      <super type="com.example.markers.mymarker"/>
      <attribute name="myAttribute" />
      <persistent value="true" />
   </extension>   

org.eclipse.core.resources.problemmarker 유형은 실제로 미리 정의된 유형(aka IMarker.PROBLEM) 중 하나입니다. 

상속되지 않는 마커 수퍼유형의 유일한 특성은 persistent 플래그입니다.  지속 기본값은 'false'이므로 지속되어야 할 마커 유형에는 <persistent value="true"/>를 지정해야 합니다.

플러그인 Manifest 파일에 새 마커 유형을 선언한 후에는 com.example.markers.myproblem 마커 유형 인스턴스를 작성하고 myAttribute 속성을 자유로이 설정하거나 가져올 수 있습니다.

새 속성을 선언하면 데이터를 다른 곳(보기 또는 편집기)에 사용할 마커와 연관시킬 수 있습니다. 특정 유형의 마커는 선언된 속성에 대한 모든 값을 갖지 않아도 됩니다. 속성 선언은 컨텐츠를 제한하기 위한 것이 아니라 모든 사람이 "메시지"를 사용하여 마커 설명을 이해할 수 있도록 이름 지정 규칙 문제점을 해결하기 위한 것입니다.

public IMarker createMyMarker(IResource resource) {
         try {
         IMarker marker = resource.createMarker("com.example.markers.myproblem");
         marker.setAttribute("myAttribute", "MYVALUE");
         return marker;
} catch (CoreException e) {
         // You need to handle the cases where attribute value is rejected
      }
   }

플랫폼 마커 유형을 조회하는 것과 동일한 방법으로 사용자 고유 마커 유형을 조회할 수 있습니다.  다음 메소드는 주어진 대상 자원 및 모든 하위 항목과 연관된 mymarkers를 모두 찾습니다. includeSubtypes 인수에 대해 'true'가 전달되므로 이 메소드는 myproblems도 모두 찾습니다.

public IMarker[] findMyMarkers(IResource target) {
      String type = "com.example.markers.mymarker";
      IMarker[] markers = target.findMarkers(type, true, IResource.DEPTH_INFINITE);
   }