C++에서 UML로 변환 확장

변환이 C++ 요소를 해당되는 UML 요소로 변환하는 방법을 사용자 정의하기 위해 C++에서 UML로 변환과 여기에 포함되는 변환을 확장할 수 있습니다.
시작하기 전에
다음 프로시저에서는 사용자가 플러그인을 작성, 테스트 및 분배하는 방법을 알고 있으며 Eclipse PDE(Plug-in Development Environment)에 익숙한 것으로 가정합니다.
이 태스크 정보
이 주제에 있는 예제는 C++에서 UML로 변환을 확장하여 C++ 클래스의 C++ 속성에서 UML 속성으로의 변환을 사용자 정의하는 방법을 설명합니다. 다른 C++ 요소를 UML로 변환하는 변환에 대한 정보는 아래에서 관련 참조 주제를 참조하십시오.

C++에서 UML로 변환을 확장하려면 다음을 수행하십시오.

  1. Eclipse 작업공간에서 플러그인 프로젝트를 작성하십시오.
    1. 파일 > 새로 작성 > 변환 작성 > 일반 변환 프로젝트를 클릭한 후 다음을 클릭하십시오.
  2. 플러그인 프로젝트 페이지의 프로젝트 이름 필드에서 프로젝트 이름을 지정하십시오. 이 예제의 경우 com.ibm.xtools.cpp.uml2.attributetypeextn.transformation.Extension을 지정하십시오.
  3. 다음을 클릭하십시오.
  4. 플러그인 컨텐츠 페이지에서 기본값을 승인하고 다음을 클릭하십시오.
  5. 완료를 클릭하십시오. 플러그인 개발 Perspective로 전환하라는 프롬프트가 표시되면 를 클릭하십시오.
  6. 탐색 보기에서, 1단계에서 작성한 플러그인 프로젝트의 META-INF 폴더에서 MANIFEST.MF를 두 번 클릭하십시오.
  7. 플러그인 Manifest 파일에서 TransformationExtension 요소를 작성하십시오.
    1. 확장 페이지에서 추가를 클릭하십시오.
    2. 새 확장 마법사의 확장점 선택 페이지에서 확장점 마법사 탭을 클릭하십시오.
    3. 확장 마법사 페이지에서 변환 템플리트 > 변환 확장을 클릭한 후 다음을 클릭하십시오.
  8. 새 변환 확장 페이지에서 다음 단계를 완료하십시오.
    • ID 필드에서 변환 서비스에 대해 변환 확장을 식별하는 고유 값을 지정하십시오. 이 필드는 일반적으로 프로젝트 이름과 transformationExtension 접미부로 채워집니다. 이 예제의 경우, 이 필드에는 com.ibm.xtools.cpp.uml2.attributetypeextn.transformation.Extension.transformationExtension 값이 포함됩니다.
    • 이름 필드에서 변환 확장의 이름을 지정하십시오. 이 예제의 경우 My Transformation Attribute Extension을 지정하십시오.
    • 대상 변환 ID 필드에서 com.ibm.xtools.transform.cpp.uml2.transformation을 지정하십시오.
    주: 이 페이지에 있는 다른 필드와 마법사의 나머지 페이지에 대한 자세한 정보는 제품에서 해당 페이지가 표시될 때 F1을 눌러서 컨텍스트 도움말을 참조하십시오. Linux® 플랫폼을 사용 중인 경우 Shift+F1을 누르십시오.
  9. 다음을 클릭하십시오.
  10. 새 변환 확장 페이지에서 변환 확장에 대한 규칙을 정의하십시오.
    1. 삽입을 클릭하십시오.
    2. 요소 목록의 요소 유형 열에서 규칙을 선택하십시오.
    3. ID 및 이름 열에서 com.ibm.xtools.cpp.uml2.attributetypeextn.attrtyperule을 지정하십시오.
    4. 클래스 열에서 attrtyperule을 지정하십시오.
    이 조치는 규칙만 선언합니다. 확장하는 어떤 변환에도 추가하지 않습니다.
  11. 다음을 클릭하십시오.
  12. 다음으로 표시되는 새 변환 확장 페이지의 "확장된 변환" 테이블에서 확장할 변환을 지정하십시오. 다음 목록의 변환은 C++ 속성과 인터페이스 속성을 해당되는 UML 요소로 변환합니다. 이 변환 각각에 대해, "확장된 변환" 테이블 옆에 있는 삽입을 클릭하고 대상 변환 ID 열에 변환 이름을 지정하십시오.
    • com.ibm.xtools.transform.cpp.uml2.CPPProjectMemberTransform.CPPFolderMemberTransform.CPPNamespaceMemberTransform.CPPClassStructUnionMemberTransform.CPPMemberVariableTransform
    • com.ibm.xtools.transform.cpp.uml2.CPPProjectMemberTransform.CPPSourceMemberTransform.CPPNamespaceMemberTransform.CPPClassStructUnionMemberTransform.CPPMemberVariableTransform
    • com.ibm.xtools.transform.cpp.uml2.CPPProjectMemberTransform.CPPSourceMemberTransform.CPPClassStructMemberTransform.CPPMemberVariableTransform
  13. 각각의 확장된 변환이 10 단계에서 선언한 규칙을 구현해야 함을 지정하십시오. "확장된 변환" 테이블에서 지정하는 변환마다 다음 단계를 완료하십시오.
    1. "확장된 변환" 테이블에서 대상 변환 ID 열의 셀을 클릭하십시오.
    2. "선택된 확장 변환에 대한 추가사항" 테이블 옆에 있는 삽입을 클릭하십시오.
    3. 목록의 요소 유형 열에서 규칙을 선택하십시오.
    4. ID 열에서, 10에서 선언한 규칙에 포함된 클래스의 ID를 지정하십시오. 이 예제의 경우 com.ibm.xtools.cpp.uml2.attributetypeextn.attrtyperule을 지정하십시오.
    "확장된 변환" 테이블의 대상 변환 ID 열에서 셀을 클릭하면 "선택된 확장 변환에 대한 추가사항" 테이블에 해당 변환과 연관되는 요소가 표시됩니다. 이 예제의 경우, attrtyperule 규칙이 "확장된 변환" 테이블의 각 변환과 연관됩니다.
  14. 다음을 클릭한 후 완료를 클릭하십시오. 플러그인에 대해 작성한 변경사항을 저장하도록 요청하는 프롬프트가 표시되면 를 클릭하십시오.
  15. 각 변환의 경우 확장된 각각의 변환에서 두 번째 규칙으로 attrtyperule 규칙이 실행됨을 지정하십시오. 플러그인 Manifest 편집기에서 확장 페이지의 모든 확장 섹션에서 ExtendTransform 요소마다 다음 단계를 완료하십시오.
    1. com.ibm.xtools.cpp.uml2.attributetypeextn.attrtyperule 규칙과 연관되는 AddRule 요소를 클릭하십시오.
    2. 확장 요소 세부사항 영역의 색인 필드에 1을 입력하십시오. 색인화는 0에서 시작합니다.
  16. 파일 > 저장을 클릭하십시오.
  17. 종속성 페이지의 필수 플러그인 섹션에서 다음 플러그인을 추가하십시오(아직 존재하지 않는 경우).
    • org.eclipse.uml2.uml
    • com.ibm.xtools.cpp.model
    • com.ibm.xtools.transform.core
    • com.ibm.xtools.transform.cpp.uml2
  18. 파일 > 저장을 클릭하십시오.
  19. C++에서 UML로 변환의 변환이 변환 소스에서 C++ 속성을 발견할 때 호출하는 속성 규칙의 Java™ 구현을 정의하십시오. 이 예제에서는 구현 클래스가 변환 확장과 다른 프로젝트에 있습니다. 다음 코드 단편은 가능한 구현을 보여 줍니다.
    /*
     *+------------------------------------------------------------------------+
     *| Licensed Materials - Property of IBM                                   |
     *| (C) Copyright IBM Corp. 2004.  All Rights Reserved.                    |
     *|                                                                        |
     *| US Government Users Restricted Rights - Use, duplication or disclosure |
     *| restricted by GSA ADP Schedule Contract with IBM Corp.                 |
     *+------------------------------------------------------------------------+
     */
    package com.ibm.xtools.cpp.uml2.attributetypeextn;
    
    import org.eclipse.uml2.uml.Classifier;
    import org.eclipse.uml2.uml.NamedElement;
    import org.eclipse.uml2.uml.Package;
    import org.eclipse.uml2.uml.Property;
    import org.eclipse.uml2.uml.Type;
    
    import com.ibm.xtools.cpp.model.CPPOwnedAttribute;
    import com.ibm.xtools.transform.core.AbstractRule;
    import com.ibm.xtools.transform.core.ITransformContext;
    import com.ibm.xtools.transform.cpp.uml2.internal.CPPModelToUML.util.CPPModelToUMLUtil;
    
    /**
     * attrtyperule is registered in plugin.xml as a RuleDefinition.  
     */
    
    /*
     * (non-Javadoc)
     * 
     * @see com.ibm.xtools.transform.core.AbstractRule
     */
    public class attrtyperule extends AbstractRule {
    
    	/*
    	 * (non-Javadoc)
    	 * 
    	 * @see com.ibm.xtools.transform.core.AbstractRule#createTarget(com.ibm.xtools.transform.core.ITransformContext)
    	 */
    	public static final String UML_TYPE_STRING = "String"; 
    
    	
    	public Object createTarget(ITransformContext ruleContext) {
    
    		//TODO Auto-generated method stub
    		Object source = ruleContext.getSource();
    		if (source instanceof CPPOwnedAttribute) {
    			CPPOwnedAttribute attribute = (CPPOwnedAttribute) source;
    			Classifier klass = (Classifier) ruleContext.getTargetContainer();
    			NamedElement umlElement = null;
    
    			if(klass instanceof org.eclipse.uml2.uml.Class){
    				umlElement = ((org.eclipse.uml2.uml.Class)klass).getOwnedMember(attribute.getName());
    			}
    			
    			Property umlProperty = (Property) umlElement;
    			if(attribute.getQualifierString().contains("*") &&(umlProperty.getType().getName().equalsIgnoreCase("char")) ){
    				setStringType(umlProperty);
    			}
    
    			return umlElement;
    
    		}	
    		return null;
    
    
    	}
    	public static Type setStringType( 	Property umlProperty ){
    		 Package rootElement = CPPModelToUMLUtil.getRootElement(umlProperty);
    		 Type umlString = (Type) rootElement.getImportedMember(UML_TYPE_STRING);
    		 umlProperty.setType(umlString);
    		return null;
    	}
    	
    	
    }
결과
다음에 C++에서 UML로 변환을 실행할 때 변환은 이전 코드 단편에 지정된 대로 속성을 변환합니다.

피드백