서브맵 맵핑 규칙에서 사용자 정의 추출기 지정

서브맵 맵핑 규칙에 대한 변환 소스 코드는 다른 변환을 호출합니다. 서브맵 맵핑 규칙의 입력 속성이 오브젝트 콜렉션을 표시하는 경우 서브맵 규칙에 지정된 변환은 콜렉션에 있는 오브젝트마다 한 번씩 실행됩니다. 입력 필터나 사용자 정의 추출기를 지정하여 이 기본 동작을 수정할 수 있습니다. 생성된 변환 코드를 실행할 때 사용자 정의 추출기가 리턴하는 오브젝트의 콜렉션은 입력 속성 콜렉션 대신 사용됩니다.
시작하기 전에

사용자 정의 추출기를 작성하지만 입력 필터를 지정하지 않은 경우, 서브맵 추출기가 리턴하는 모든 오브젝트는 변환 실행 시 서브맵 규칙에 의해 처리됩니다. 사용자 정의 추출기는 기본 추출기의 동작을 대체합니다. 기본 추출기는 서브맵에 의해 지정된 입력 속성에서 전체 오브젝트 콜렉션을 리턴합니다.

맵핑 모델이 열려 있어야 합니다. 맵핑 모델의 파일 이름 확장자는 .mapping입니다. 맵핑 모델에는 하나 이상의 맵핑 선언이 있어야 합니다및 서브맵 맵핑 규칙이 맵핑 선언에 정의되어야 합니다.

이 태스크 정보

서브맵 맵핑 규칙에서 사용자 정의 추출기를 작성하려면 다음을 수행하십시오.

  1. 편집기 영역에서 맵핑 규칙을 마우스 오른쪽 단추로 클릭한 후 특성에 표시를 클릭하십시오.
  2. 특성 보기에서 사용자 정의 추출기 탭을 클릭하십시오.
  3. 사용자 정의 추출기 선택란을 선택하십시오.
    주: 이 선택란에서 선택 표시를 지우면, 사용자가 변환을 실행할 때 서브맵 규칙이 입력 기능의 컨텐츠를 추출합니다.
  4. 사용자 정의 추출기에 대한 코드를 지정하려면 다음 단계 중 하나를 완료하십시오.
    • 인라인을 클릭하여 코드 옵션 아래에 있는 텍스트 영역에서 Java™ 코드를 입력한 후 적용을 클릭하십시오. 지정하는 코드는 java.util.Collection 유형의 결과를 리턴해야 합니다.
      팁: 올바른 변수 이름 목록을 표시하려면 인라인 단추 아래에 있는 텍스트 영역에서 Ctrl+Space를 누르십시오.
      주: <name>_src 변수는 현재 입력 오브젝트를 지정합니다.
    • 외부를 클릭하여 사용자 정의 추출기 코드를 포함하는 Java 클래스를 지정하십시오. 지정하는 Java 클래스는 com.ibm.xtools.transform.authoring.ExtractorExtension 인터페이스를 구현해야 합니다. 또한 Collection execute(EObject source) 메소드를 구현해야 합니다. 여기서 source는 현재 입력 오브젝트로 설정됩니다. 메소드는 입력 속성의 콜렉션에서 오브젝트를 추출하고 java.util.Collection 유형 콜렉션에 있는 해당 오브젝트를 리턴합니다. 찾아보기를 클릭하면 대화 상자에서 올바른 클래스가 선택됩니다.
      팁: 사용자 정의 추출기를 구현하는 Java 클래스를 작성하려면 새로 작성을 클릭한 후 새 Java 클래스 창에서 필드를 완료하십시오.
  5. 파일 > 저장을 클릭하십시오.
UML 패키지 Package1이 있는 입력 오브젝트를 고려하십시오. 이 패키지에는 Class1 및 Class2라고 하는 두 개의 UML 클래스가 있습니다. Package1에는 Package2 UML 패키지가 있고, Package2에는 Class3 UML 클래스가 있습니다.
package uml_to_ecore_example.transforms;
import java.util.Collection
public class AddClassesFromNestedPackages implements ExtractorExtension {
    public Collection execute(EObject source) {
        Package pkg = (Package)source;
        Collection c = new BasicEList();
        // recursively add all classes in this package and its nested packages
        for (Iterator i=pkg.getPackagedElements().iterator(); i.hasNext();) {
            Object obj = i.next();
            if (obj instanceof Class) c.add(obj);
            else if (obj instanceof Package) c.addAll(execute((Package)obj));
        }
        return c;}}

피드백