소스 오브젝트와의 직접 대응 없이 오브젝트 작성

기본적으로, 맵핑 편집기를 사용하여 단일 소스 컨테이너의 요소에서 단일 대상 컨테이너의 요소로 맵핑할 수 있습니다. 그러나 맵핑 대상과 다른 대상 컨테이너에서도 오브젝트를 작성할 수 있도록 생성된 변환을 수정할 수 있습니다.
이 태스크 정보

특히, 생성된 변환에서 getCreateRule 메소드를 수정하고, 새 구현에서 CreateRule 생성자에 대한 insertEObject 메소드를 대체할 수 있습니다.

메소드를 수정하고 대체사항을 추가하려면 다음을 수행하십시오.

  1. 맵핑 편집기에서, 소스 및 대상 사이의 변환을 정의하는 서브맵에 대해 맵핑 선언에 대한 참조를 찾으십시오. 예를 들어, typeDefinitions에서 packagedElements로 맵핑하는 경우 typeDef2Class 맵핑 선언이 있을 수 있습니다.
  2. 변환 소스 코드를 생성하십시오. 맵핑 선언에는 선언에 대해 생성된 변환이 있고(예: typeDef2ClassTransform), 변환에는 getCreate_Rule 메소드가 포함됩니다.
  3. getCreate_Rule 메소드에서, 인스턴스화되는 새 CreateRule 생성자에서 insertEObject 메소드의 기본 구현을 대체하십시오.

    insertEObject 메소드는 이미 작성된 오브젝트와 대상 컨테이너 오브젝트를 인수로 사용합니다. 대체 코드는 소유자로 사용자가 원하는 대상 컨테이너 오브젝트의 존재를 확인할 수 있습니다. 존재하지 않으면 대상 컨테이너 오브젝트를 작성하고, 실제 삽입에 대한 기본 구현을 보유하십시오. 새 소유자를 대상 컨테이너로 전달합니다.

다음 예제는 UML Class2Class 변환에서 삽입되는 소유자 패키지를 표시합니다. 예제에서는 대상 컨테이너로 UML 패키지를 사용하지만, 사용자는 대상 컨테이너의 모든 유형에 대해 동일한 기술을 사용할 수 있습니다(즉, 서브맵에 연결하는 출력 기능이 될 수 있는 모든 항목).
     protected CreateRule getCreate_Rule(FeatureAdapter referenceAdapter) {
        CreateRule rule = new CreateRule(
            CREATE_RULE, 
            InsertOwnerMessages.Class2Class_Transform_Create_Rule, 
            this,
            referenceAdapter,
            UMLPackage.Literals.CLASS) {
        @Override
        protected void insertEObject(EObject targetContainer, EObject target) {
          final String ownerName = "owner";
          if (targetContainer instanceof Model) {
            org.eclipse.uml2.uml.Package owner = ((Model)targetContainer).getNestedPackage(ownerName);
            if (owner == null) {
              owner = ((Model)targetContainer).createNestedPackage(ownerName);
            }
            targetContainer = owner;
          } 
          super.insertEObject(targetContainer, target);
        }}; 
            
        return rule;    
    }

피드백