URI를 대상으로 지정하는 모델에서 모델로 변환에 대한 세부사항

모델에서 모델로 변환에 대해 생성되는 소스 코드를 수정하여 사용자가 URI(Uniform Resource Identifier)를 대상 모델 파일로 지정할 수 있게 할 수 있습니다.

모델에서 모델로 변환을 실행하면 메모리 내 모델이 생성됩니다. 기본적으로 변환 사후 처리의 일부로서 변환 프레임워크는 생성된 메모리 내 모델의 컨텐츠를 작업공간의 파일에 작성합니다. 사용자가 모델에서 모델로 변환에 대한 변환 구성을 작성하면 사용자는 해당 파일을 변환의 대상 컨테이너로 지정하거나 새 대상 컨테이너를 작성할 수 있습니다. 변환 구성에서 구성 특성 "대상 컨테이너"에는 대상 모델의 파일 이름이 포함되어 있습니다. 변환이 실행되기 전에 이 파일이 작업공간에 있어야 합니다.

이 샘플 변환 프로젝트에서는 사용자가 생성된 변환 소스 코드를 사용자 정의하여 대상 컨테이너를 구성하는 대체 방법을 제공하는 방법을 보여줍니다. 변환 작성자인 경우에는 모델에서 모델로 변환에 대한 소스 코드를 생성한 후 변환 사용자가 모델 파일 대신 URI를 변환 대상 컨테이너로 지정할 수 있도록 코드를 사용자 정의할 수 있습니다. URI가 식별하는 파일은 변환이 실행되기 전에 없어도 됩니다. 해당 파일이 없는 경우 변환에서는 해당 파일을 작성합니다.

이 샘플에는 하나의 UML 모델에서 UML 모델로 맵핑만 정의하는 단순 변환 맵핑 모델이 포함되어 있으며 이 맵핑에서는 생성된 대상 모델에 이름을 지정하고 이 이름은 소스 모델의 이름에서 파생됩니다.
주: 모델의 내부 이름은 파일 시스템의 모델이 포함된 파일의 이름과 일치하지 않아도 됩니다.
이 샘플의 맵핑 모델은 단순하므로 생성된 변환에서는 URI를 사용한 대상 컨테이너 지정을 지원하기 위해 필요한 사용자 정의에 대해서만 설명합니다. 변환에서는 요소를 소스 모델에서 대상 모델로 복사하지 않습니다.
이 샘플에서는 생성된 변환에서 다음 항목을 사용자 정의하는 방법을 보여줍니다.
  • plugin.xml 파일의 변환 확장점
  • 생성된 변환 유효성 검증기 클래스의 isTargetElementValid 메소드
  • 생성된 변환 제공자 클래스 Uri4targetTransformationProvider의 createRootTransformation 메소드

plugin.xml 파일 사용자 정의

변환 소스 코드를 생성한 후 plugin.xml 파일의 변환 확장점에서 targetModelType 특성은 변환 사용자가 대상 컨테이너로 지정할 수 있는 모델 유형을 나열합니다. 기본적으로 이 특성은 자원으로 설정되며 이는 변환 구성에서 사용자가 작업공간에 존재하는 파일을 지정해야 함을 의미합니다. 사용자 정의된 plugin.xml 파일에서는 targetModelType 특성이 없음으로 설정됩니다.

plugin.xml 파일에서 생성된 변환 확장 요소에는 새 변환 특성 대상 모델 URI가 포함되어 있습니다. 이 샘플에서는 변환 구성 마법사 및 편집기의 특성 탭에 있는 대상 모델 URI 필드에서 사용자가 특성의 문자열 값을 지정합니다.

변환 유효성 검증기 클래스 사용자 정의

변환 구성 마법사 및 편집기에서는 생성된 사용자 정의 변환 유효성 검증기 클래스 Uri4targetTransformationValidator를 사용하여 변환 구성의 설정을 유효성 검증합니다. 기본적으로 메소드 isTargetElementValid의 구현에서는 구성된 대상 컨테이너가 파일인 경우에만 true를 리턴합니다. 이 샘플에서는 기본 구현이 대체되고 값이 대상 컨테이너로 지정되는지에 관계없이 true를 리턴합니다. 더욱 강력한 구현에서는 사용자가 지정하는 URI에서 변환 특정 또는 프로젝트 특정 유효성 검증을 수행할 수 있습니다.

다음 코드 단편에는 변환에서 생성되는 메소드 isTargetElementValid의 기본 구현이 표시됩니다.
    /**
     * <!-- begin-user-doc -->
     * <!-- end-user-doc -->
     * @see com.ibm.xtools.transform.authoring.TransformationValidator#isTargetElementValid(java.lang.Object)
     * @generated
     */
    protected boolean isTargetElementValid(Object target) {
    	//Remove @generated tag to add more target validation checks
    	return super.isTargetElementValid(target);
    }
다음 코드 단편에는 이 샘플의 목적상 항상 true를 리턴하는 샘플에 포함된 사용자 정의된 구현이 표시됩니다.
    /**
     * <!-- begin-user-doc -->
     * <!-- end-user-doc -->
     * @see com.ibm.xtools.transform.authoring.TransformationValidator#isTargetElementValid(java.lang.Object)
     * @generated NOT
     */
    protected boolean isTargetElementValid(Object target) {
        return true;
    }

변환 제공자 사용자 정의

생성된 사용자 정의 클래스 Uri4targetTransformationProvider에서 메소드 createRootTransformation의 기본 구현은 클래스 RootTransformation을 인스턴스화한 후 클래스 ResourceTransform을 인스턴스화합니다. 클래스 ResourceTransform의 기본 구현에서는 구성된 대상 컨테이너를 나타내는 파일을 여는 구현 ResourceTargetRule을 사용합니다. 이 샘플에서 구성된 대상 컨테이너는 파일이 아니라 URI이므로 사용자 정의 ResourceTransform 구현 ResourceFromUriTransform과 사용자 정의 ResourceTargetRule 규칙 ResourceFromUriTargetRule이 Uri4targetTransformationProvider 클래스에 추가됩니다.

사용자 정의 구현 ResourceFromUriTargetRule에서는 다음 단계를 완료합니다.
  • URI에 의해 지정된 파일을 작성함(해당 파일이 없는 경우)
  • URI에 의해 지정된 파일을 염
  • 메모리 내 모델 자원을 파일과 연관시키고 파일 오브젝트를 루트 변환 컨텍스트에 저장하여 다른 변환 규칙이 검색할 수 있게 함
다음 코드 단편에는 변환에서 생성되는 createRootTransformation 메소드의 기본 구현이 표시됩니다.
    /**
     * 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) {
        return new RootTransformation(descriptor, new MainTransform());
    }
다음 코드 단편에는 샘플에 포함된 메소드 createRootTransformation의 사용자 정의 구현이 표시됩니다.
    /**
     * 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) {
        return new RootTransformation(descriptor, new MainTransform()) {
            @Override
             protected void addInitialExtractor(Transform mainTransform) {
                add(new ResourceListExtractor(new ResourceFromUriTransform(mainTransform)));
             }};
    }
    
다음 코드 단편에는 클래스 Uri4targetTransformationProvider에 포함된 사용자 정의 구현 ResourceFromUriTransform 및 ResourceFromUriTargetRule이 표시됩니다.
    protected class ResourceFromUriTransform extends ResourceTransform {
        public ResourceFromUriTransform(Transform mainTransform) {
            super(Uri4targetMessages.ResourceFromUriTransform_id);
            setName(Uri4targetMessages.ResourceFromUriTransform_name);
            add(new ResourceFromUriTargetRule());
            add(new ResourceContentsExtractor(mainTransform));
        }
    }

    protected class ResourceFromUriTargetRule extends ResourceTargetRule {
        @Override
        protected Object createTarget(ITransformContext context) {
            ResourceSet resourceSet = ((EditingDomain) context
.getPropertyValue(TransformAuthoringConstants.TARGET_EDITING_DOMAIN))
.getResourceSet();
            Resource resource = null;
            Object targetModelURIString = context.getPropertyValue("TargetModelURI"); //$NON-NLS-1$
            if (targetModelURIString instanceof String) {
                URI targetModelURI = URI.createURI((String)targetModelURIString);
                IPath targetModelPath = new Path(targetModelURI.path());                
                IWorkspaceRoot wsRoot = ResourcesPlugin.getWorkspace().getRoot();
                IFile targetModelFile = wsRoot.getFile(targetModelPath);
                ValidateEditRule.addAffectedFile(context, targetModelFile);
                resource = resourceSet.createResource(getPlatformURI(targetModelFile));
                ITransformContext rootContext = context;
                while (rootContext.getParentContext() != null)
                    rootContext = rootContext.getParentContext();
                rootContext.setPropertyValue(ITransformContext.TARGET_CONTAINER, targetModelFile);
            }
            return resource;
        }        
    }

피드백