프로젝트를 소스로 지정하는 모델에서 모델로 변환에 대한 세부사항

사용자가 복수의 모델이 포함된 프로젝트를 변환의 소스로 지정할 수 있도록 모델에서 모델로 변환에 대해 생성된 소스 코드를 수정할 수 있습니다.
기본적으로 모델에서 모델로 변환에서는 하나의 모델을 입력으로 승인하므로 일반적으로 변환 사용자는 하나의 모델을 모델에서 모델로 변환의 소스로 지정합니다. 이 샘플에서는 변환 사용자가 모델 파일 대신 Eclipse 프로젝트를 변환 소스로 지정할 수 있도록 하고 사용자 정의 코드가 프로젝트에서 변환할 모델을 판별하도록 생성된 변환 코드를 사용자 정의 하는 방법에 대해 설명합니다. 대상 프로젝트에서 파일 이름 확장자가 .emx인 UML 모델은 사용자가 변환을 구성할 때가 아니라 변환 런타임 시 수집되며 변환에 대한 입력으로 사용됩니다.
주: 이 샘플에서 변환이 소스 모델을 처리하는 순서는 중요하지 않습니다. 특정 순서로 모델을 처리하려면 해당 코드를 클래스 ProjectContentsExtractor의 구현에 추가하십시오.

이 샘플에는 UML 모델, 패키지 및 클래스의 기본 맵핑을 정의하는 변환 맵핑 모델이 포함되어 있습니다. 생성된 변환에서는 소스 프로젝트와 동일한 이름을 가진 UML 모델을 작성하며 해당 모델에서 소스 프로젝트에 포함된 각 UML 모델에 대한 패키지를 작성합니다. 해당 UML 소스 모델의 각 클래스에 대해 변환에서는 각 패키지에서 클래스도 작성합니다. 이 맵핑 모델은 단순하지만 생성된 변환에서는 소스 프로젝트를 지정하여 소스 모델을 지정하기 위해 코드를 사용자 정의해야 하는 방법을 보여줍니다.

이 샘플에서는 생성된 변환에서 다음 항목을 사용자 정의하는 방법을 보여줍니다.
  • 생성된 plugin.xml 파일의 변환 확장점
  • 생성된 변환 유효성 검증기의 isSourceElementValid 메소드
  • 생성된 변환 제공자의 createRootTransformation 메소드

생성된 plugin.xml 파일 사용자 정의

plugin.xml 파일의 변환 확장점에서 특성 sourceModelType은 변환 사용자가 변환 소스로 지정할 수 있는 오브젝트 유형을 지정합니다. 모델에서 모델로 변환 프로젝트를 작성하면 기본적으로 이 특성 값이 자원으로 설정되며 이는 변환 구성 마법사 및 편집기에서 변환 사용자가 작업공간의 기존 파일을 변환 소스로 지정해야 함을 의미합니다. sourceModelType 특성의 값을 프로젝트로 설정하면 변환 사용자는 파일 대신 Eclipse 프로젝트를 변환 소스로 지정할 수 있습니다.

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

변환 구성 마법사 및 편집기에서는 변환 유효성 검증기 클래스를 사용하여 변환이 사용자가 지정하는 설정으로 올바르게 실행될 수 있는지 확인합니다. 변환 유효성 검증기 클래스에서 메소드 isSourceElementValid의 기본 구현에서는 지정된 변환 소스가 파일인 경우에만 true를 리턴합니다.

이 샘플에서 변환 유효성 검증기 클래스 Project4sourceTransformationValidator는 변환이 사용자가 지정하는 설정으로 올바르게 실행될 수 있는지 확인합니다. 이 샘플의 경우 이 클래스의 코드는 메소드 isSourceElementValid의 기본 구현을 대체하고 메소드에서는 변환 소스가 프로젝트인 경우에만 true를 리턴합니다. 더욱 강력한 구현에서는 사용자가 UML 프로젝트를 선택했는지 확인할 수 있습니다.

다음 코드 단편에는 변환에서 생성되는 isSourceElementValid 메소드의 기본 버전이 표시됩니다.

    /**
     * <!-- begin-user-doc -->
     * <!-- end-user-doc -->
     * @see com.ibm.xtools.transform.authoring.TransformationValidator#isSourceElementValid(java.lang.Object)
     * @generated
     */
    protected boolean isSourceElementValid(Object source) {
    	//Remove @generated tag to add more source validation checks
    	return super.isSourceElementValid(source);
    }
다음 코드 단편에는 이 샘플의 목적상 항상 true를 리턴하는 이 메소드의 사용자 정의된 버전이 표시됩니다.
    /**
     * <!-- begin-user-doc -->
     * <!-- end-user-doc -->
     * @see com.ibm.xtools.transform.authoring.TransformationValidator#isSourceElementValid(java.lang.Object)
     * @generated NOT
     */
    protected boolean isSourceElementValid(Object source) {
    	return source instanceof IProject;
    }

변환 제공자 클래스 사용자 정의

변환 제공자 클래스 Project4sourceTransformationProvider에서 메소드 createRootTransformation의 기본 구현에서는 오브젝트 RootTransformation을 인스턴스화하며 이는 클래스 ResourceTransform의 기본 구현을 인스턴스화합니다. 클래스 ResourceTransform의 기본 구현에는 다음 항목이 포함되어 있습니다.
  • 모델 파일을 열어 컨텐츠를 메모리에 로드하는 메소드 ResourceContentsExtractor의 구현
  • 변환에서 생성되는 대상 모델을 초기화하는 규칙 ResourceTargetRule
    주: 이 규칙은 변환 컨텍스트의 sourceModelType 특성에 종속됩니다. 특성 sourceModelType의 기본값을 변경하는 경우 규칙 ResourceTargetRule 및 메소드 ResourceContentsExtractor의 구현도 사용자 정의해야 합니다.
이 샘플에서는 클래스 ResourceTransform의 사용자 정의된 버전인 클래스 ResourcesFromProjectTransform을 정의합니다. 이 사용자 정의된 클래스는 다음 클래스를 인스턴스화합니다.
  • 클래스 ResourceContentsExtractor의 사용자 정의된 버전인 클래스 ProjectContentsExtractor
  • 클래스 ResourceTargetRule의 사용자 정의된 버전인 클래스 Project4sourceTargetRule

다음 코드 단편에는 변환에서 생성되는 메소드 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 ResourcesFromProjectTransform(mainTransform)));
             }};
    }

다음 코드 단편에는 추출기 ProjectContentsExtractor 및 규칙 Project4sourceTargetRule이 포함된 변환 ResourcesFromProjectTransform의 소스 코드가 표시됩니다.

    protected class ResourcesFromProjectTransform extends ResourceTransform {
        public ResourcesFromProjectTransform(Transform mainTransform) {
            super(Project4sourceMessages.ResourcesFromProjectTransform_id);
            setName(Project4sourceMessages.ResourcesFromProjectTransform_name);
            add(new Project4sourceTargetRule());
            add(new ProjectContentsExtractor(mainTransform));
        }
    }
    
    protected class ProjectContentsExtractor extends ResourceContentsExtractor {
        
        public static final String UML_MODEL_FILE_TYPE = "emx"; //$NON-NLS-1$
        
        public ProjectContentsExtractor(AbstractTransform transform) {
            super(transform);
            setName(Project4sourceMessages.ProjectContentsExtractor_name);
        }

        @Override
        public Collection<Model> execute(ITransformContext context) {
            final ResourceSet resourceSet = ((EditingDomain) context
.getPropertyValue(TransformAuthoringConstants.SOURCE_EDITING_DOMAIN)).getResourceSet();
            final Collection<Model> models = new BasicEList();
            Object source = context.getSource();
            if (source instanceof IProject) {
                IProject project = (IProject)source;
                IResourceVisitor visitor = new IResourceVisitor() {
                    @Override
                    public boolean visit(IResource resource) throws CoreException {
                        if (resource instanceof IProject || resource instanceof IFolder)
                            return true;
                        if (resource instanceof IFile) {
                            IFile file = (IFile)resource;
                            if (UML_MODEL_FILE_TYPE.equals(file.getFileExtension())) {
                                Resource modelResource = resourceSet.getResource(getPlatformURI(file), true);
                                for (Iterator<EObject> i = modelResource.getContents().iterator(); i.hasNext();) {
                                    EObject content = i.next();
                                    if (content instanceof Model)
                                        models.add((Model)content);
                                }
                            }
                        }
                        return false;
                    }                    
                };
                try {
                    project.accept(visitor);
                } catch (CoreException ce) {
                    Activator.getDefault().getLog().log(new Status(IStatus.ERROR, Activator.PLUGIN_ID,
Project4sourceMessages.ProjectContentsExtractor_name, ce));
                }                   
            }
            return models;
        }

    }
    
    protected class Project4sourceTargetRule extends ResourceTargetRule {

        @Override
        protected Object createTarget(ITransformContext context) {
            if (context.getSource() instanceof IProject) {        
                Object targetContainer = context.getTargetContainer();        
                if (targetContainer instanceof Resource) {
                    return targetContainer;
                } else if (targetContainer instanceof IFile){
                    IFile targetFile = (IFile)targetContainer;
                    ValidateEditRule.addAffectedFile(context, targetFile);
                    ResourceSet resourceSet = ((EditingDomain) context
.getPropertyValue(TransformAuthoringConstants.TARGET_EDITING_DOMAIN)).getResourceSet();
                    return resourceSet.createResource(getPlatformURI(targetFile));
                }
            }
            return super.createTarget(context);
        }
        
    }

피드백