UML 프로파일이 대상 모델에 올바르게 적용되는지 확인하는 규칙이 포함된 모델에서 모델로 변환에 대한 세부사항

변환에서 새 모델을 작성하거나 기존 모델을 겹쳐쓰는 대신 기존 모델을 갱신하는 경우에는 병합 오퍼레이션 중에 메모리에 로드되는 기존 대상 모델 및 새로 생성된 모델의 메모리 내 버전에 UML 프로파일을 주의해서 적용해야 합니다. 이러한 메모리 내 모델은 각 UML 프로파일의 동일한 메모리 내 인스턴스를 참조해야 하며 그렇지 않으면 모델을 병합할 수 없습니다.

모델에서 모델로 맵핑 변환을 실행하면 임시 메모리 내 모델이 생성됩니다. 이 모델의 컨텐츠가 파일 시스템에 있는 기존 대상 모델의 컨텐츠와 다른 경우 해당 모델은 변환 사후 처리 중에 병합됩니다. 모델에서 모델로 변환 프레임워크에 제공되는 변환 규칙인 기본 병합 프로시저에서는 기존 대상 모델을 메모리에 로드하고 구조적 병합 기능을 사용하여 해당 모델을 생성된 메모리 내 모델과 결합합니다. 구조적 병합의 결과 발생하는 모델은 기존 대상 모델을 대체합니다.

모델에는 다른 모델의 오브젝트에 대한 참조가 포함되어 있을 수 있습니다. 예를 들어, UML 모델에는 UML 프로파일에 정의된 스테레오타입에 대한 참조가 포함되어 있거나 UML 라이브러리에 정의된 기본 유형에 대한 참조가 포함되어 있을 수 있습니다. 구조적 병합에서는 이러한 상호 모델 참조에서는 동일한 오브젝트의 동일한 메모리 내 인스턴스를 참조하는 경우에만 해당 오브젝를 참조한다는 것을 발견합니다.

예를 들어, 기본값이라는 UML 프로파일에 정의된 «Perspective» 스테레오타입이 생성된 메모리 내 모델의 패키지 ExamplePackage와 기존 대상 모델의 동일한 패키지에도 적용된다고 가정하십시오. 기존 대상 모델이 구조적 병합을 위해 메모리에 로드되면 «Perspective» 스테레오타입에 대한 참조가 해석됩니다. 구조적 병합에서는 생성된 메모리 내 모델이 참조하는 메모리에 있는 스테레오타입 오브젝트의 정확하게 동일한 인스턴스를 식별하지 않는 경우 ExamplePackage 패키지의 두 버전 모두에 동일한 스테레오타입이 적용되었음을 발견할 수 없습니다. 기본적으로 구조적 병합은 병합되는 모델에 의해 로드되고 참조되는 동일한 모델(예: 이 예제의 UML 기본값 프로파일)의 중복 인스턴스를 발견하는 경우 중지됩니다.

모델의 중복 메모리 내 인스턴스를 예방하려면 메모리 내 모델이 포함된 자원 세트에 각 모델의 인스턴스가 하나만 포함되어 있는지 확인하십시오.

이 샘플 변환 프로젝트에서는 UML 프로파일이 올바르게 적용되는지 확인하는 두 가지 변환 규칙을 제공합니다.
  • UMLDefaultLibrariesAddRule: 이 규칙을 사용하면 기본 UML 라이브러리 및 프로파일을 일관된 방식으로 생성된 메모리 내 모델에 추가할 수 있습니다.
  • CrossModelReferenceCheckRule: 이 규칙을 사용하면 생성된 모델의 자원 세트 외부에 있는 상호 모델 참조가 생성된 모델에 포함되어 있지 않은지 확인할 수 있습니다. 생성된 메모리 내 모델과 기존 대상 모델의 메모리 내 버전이 병합될 때 이러한 외부 참조로 인해 문제점이 발생할 수 있습니다.

이러한 규칙은 com.ibm.xtools.transform.authoring 패키지에 있습니다. 이러한 규칙에 대한 자세한 정보는 Rational Transformation Authoring 개발자 안내서 API 참조서를 참조하십시오. 이 샘플의 변환에서는 이러한 규칙을 둘 다 사용합니다. 생성된 변환 소스 코드를 탐색하여 사용자 정의할 수 있는 변환 소스 코드의 섹션에서 이들 규칙의 인스턴스화를 확인하십시오.

다음 코드 단편에는 규칙 UMLDefaultLibrariesAddRule 사용 방법이 표시됩니다.

다음 코드 단편에는 생성된 클래스 Model2ModelTransform에 있는 메소드 addTransformElements의 기본 구현이 표시되며 기본 클래스에는 규칙이 포함되어 있지 않습니다. 생성된 클래스 Model2ModelTransform에서 메소드 addTransformElements는 규칙을 인스턴스화합니다.
    /**
     * <!-- begin-user-doc -->
     * <!-- end-user-doc -->
     * @generated
     */
    private void addTransformElements(Registry registry) {
      // You may add more transform element before the generated ones here
    	// Remember to remove the @generated tag or add NOT to it
    	addGeneratedTransformElements(registry);
    	// You may add more transform element after the generated ones here
    	// Remember to remove the @generated tag or add NOT to it
    }
다음 코드 단편에는 메소드 addTransformElements가 규칙을 인스턴스화하는 방법이 표시됩니다.
주: 소스 코드 생성 프로세스에서 코드에 대한 변경사항을 겹쳐쓰지 않게 하려면 아래 코드 단편에 표시된 것과 같이 @generated 태그를 제거하거나 수정해야 합니다.
    /**
     * <!-- begin-user-doc -->
     * <!-- end-user-doc -->
     * @generated NOT
     */
    private void addTransformElements(Registry registry) {
      add(new UMLDefaultLibrariesAddRule());
      // You may add more transform element before the generated ones here
    	// Remember to remove the @generated tag or add NOT to it
    	addGeneratedTransformElements(registry);
    	// You may add more transform element after the generated ones here
    	// Remember to remove the @generated tag or add NOT to it
    }
다음 코드 단편에는 생성된 TransformationProvider 클래스의 createRootTransformation 메소드 원래 버전이 표시됩니다(CrossModelReferenceCheckRule 규칙 없음).
주: 샘플에서 TransformationProvider 클래스의 이름은 copyprofileTransformationProvider입니다.
    /**
     * Creates a root transformation. You may add more rules to the transformation here
     * <!-- begin-user-doc -->
     * <!-- end-user-doc -->
     * @param transform The root transformation
     * @generated
     */
    protected RootTransformation createRootTransformation(ITransformationDescriptor descriptor) {
        // Create and return an instance of a class that extends RootTransformation 
        // and handles source objects of type = (resource) and target objects of type = (resource)
        // and remove the @generated tag.  The default implementation provided here is
        // for source and target objects of type = (resource).
        return new RootTransformation(descriptor, new MainTransform()){
            protected void addPostProcessingRules() {
                add(new UMLProfilesConsistencyCheckRule());
                super.addPostProcessingRules();
            }};
    }
다음 코드 단편에는 createRootTransformation 메소드에 있는 CrossModelReferenceCheckRule 규칙의 인스턴스화가 표시됩니다.
주: 샘플에서 TransformationProvider 클래스의 이름은 copyprofileTransformationProvider입니다.
    /**
     * Creates a root transformation. You may add more rules to the transformation here
     * <!-- begin-user-doc -->
     * <!-- end-user-doc -->
     * @param transform The root transformation
		 * @generated NOT
     */
    protected RootTransformation createRootTransformation(ITransformationDescriptor descriptor) {
        // Create and return an instance of a class that extends RootTransformation 
        // and handles source objects of type = (resource) and target objects of type = (resource)
        // and remove the @generated tag.  The default implementation provided here is
        // for source and target objects of type = (resource).
        return new RootTransformation(descriptor, new MainTransform()){
            protected void addPostProcessingRules() {
                add(new CrossModelReferenceCheckRule());
                add(new UMLProfilesConsistencyCheckRule());
                super.addPostProcessingRules();
            }};
    }
기본적으로 CrossModelReferenceCheckRule 규칙에서 기존 대상 모델과 동일한 자원 세트에서 해석되지 않는 생성된 메모리 내 모델에서 참조를 발견하면 예외가 발생합니다. 이 예외를 확인하려면 다음 단계를 완료하십시오.
  1. 변환 클래스 Model2Model에서 규칙 UMLDefaultLibrariesAddRule을 주석 처리하십시오.
  2. 변환을 실행하십시오.
생성된 메모리 내 모델에서는 UML 기본 요소 라이브러리를 참조하지만 이 모델의 자원 세트에는 기본 요소 라이브러리가 포함되어 있지 않으므로 변환에서 예외가 발생하여 실행이 중지됩니다.

피드백