변환이 C++ 요소를 해당되는 UML 요소로 변환하는 방법을
사용자 정의하기 위해 C++에서 UML로 변환과 여기에 포함되는 변환을
확장할 수 있습니다.
시작하기 전에
다음 프로시저에서는 사용자가 플러그인을 작성, 테스트 및 분배하는 방법을 알고 있으며
Eclipse PDE(Plug-in Development Environment)에 익숙한 것으로
가정합니다.
이 태스크 정보
이 주제에 있는 예제는 C++에서 UML로 변환을 확장하여
C++ 클래스의 C++ 속성에서 UML 속성으로의 변환을 사용자 정의하는
방법을 설명합니다. 다른 C++ 요소를 UML로 변환하는 변환에 대한
정보는 아래에서 관련 참조 주제를 참조하십시오.
C++에서 UML로 변환을 확장하려면 다음을 수행하십시오.
- Eclipse 작업공간에서 플러그인 프로젝트를 작성하십시오.
- 를 클릭한 후 다음을 클릭하십시오.
- 플러그인 프로젝트 페이지의 프로젝트 이름
필드에서 프로젝트 이름을 지정하십시오. 이 예제의 경우
com.ibm.xtools.cpp.uml2.attributetypeextn.transformation.Extension을 지정하십시오.
- 다음을 클릭하십시오.
- 플러그인 컨텐츠 페이지에서 기본값을 승인하고
다음을 클릭하십시오.
- 완료를 클릭하십시오. 플러그인 개발 Perspective로
전환하라는 프롬프트가 표시되면 예를 클릭하십시오.
- 탐색 보기에서, 1단계에서
작성한 플러그인 프로젝트의 META-INF 폴더에서
MANIFEST.MF를 두 번 클릭하십시오.
- 플러그인 Manifest 파일에서 TransformationExtension 요소를
작성하십시오.
- 확장 페이지에서 추가를 클릭하십시오.
- 새 확장 마법사의 확장점 선택 페이지에서
확장점 마법사 탭을 클릭하십시오.
- 확장 마법사 페이지에서 을 클릭한 후 다음을 클릭하십시오.
- 새 변환 확장 페이지에서 다음 단계를
완료하십시오.
- 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을 누르십시오.
- 다음을 클릭하십시오.
- 새 변환 확장 페이지에서 변환 확장에 대한 규칙을 정의하십시오.
- 삽입을 클릭하십시오.
- 요소 목록의 요소 유형 열에서
규칙을 선택하십시오.
- ID 및 이름 열에서 com.ibm.xtools.cpp.uml2.attributetypeextn.attrtyperule을 지정하십시오.
- 클래스 열에서 attrtyperule을 지정하십시오.
이 조치는 규칙만 선언합니다. 확장하는 어떤 변환에도
추가하지 않습니다.
- 다음을 클릭하십시오.
- 다음으로 표시되는 새 변환 확장 페이지의 "확장된
변환" 테이블에서 확장할 변환을 지정하십시오. 다음 목록의 변환은
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
- 각각의 확장된 변환이 10 단계에서 선언한
규칙을 구현해야 함을 지정하십시오.
"확장된 변환" 테이블에서 지정하는 변환마다 다음 단계를
완료하십시오.
- "확장된 변환" 테이블에서 대상 변환 ID 열의 셀을
클릭하십시오.
- "선택된 확장 변환에 대한 추가사항" 테이블 옆에 있는
삽입을 클릭하십시오.
- 목록의 요소 유형 열에서 규칙을 선택하십시오.
- ID 열에서, 10에서 선언한 규칙에 포함된
클래스의 ID를 지정하십시오. 이 예제의 경우 com.ibm.xtools.cpp.uml2.attributetypeextn.attrtyperule을 지정하십시오.
"확장된 변환" 테이블의 대상 변환 ID 열에서 셀을
클릭하면 "선택된 확장 변환에 대한 추가사항" 테이블에
해당 변환과 연관되는 요소가 표시됩니다.
이 예제의 경우, attrtyperule 규칙이 "확장된 변환"
테이블의 각 변환과 연관됩니다.
- 다음을 클릭한 후 완료를 클릭하십시오.
플러그인에 대해 작성한 변경사항을 저장하도록 요청하는 프롬프트가 표시되면
예를 클릭하십시오.
- 각 변환의 경우 확장된 각각의 변환에서 두 번째 규칙으로
attrtyperule 규칙이 실행됨을 지정하십시오. 플러그인 Manifest 편집기에서
확장 페이지의 모든 확장 섹션에서 ExtendTransform 요소마다
다음 단계를 완료하십시오.
- com.ibm.xtools.cpp.uml2.attributetypeextn.attrtyperule 규칙과 연관되는
AddRule 요소를 클릭하십시오.
- 확장 요소 세부사항 영역의 색인 필드에
1을 입력하십시오. 색인화는 0에서 시작합니다.
- 을 클릭하십시오.
- 종속성 페이지의 필수 플러그인 섹션에서
다음 플러그인을 추가하십시오(아직 존재하지 않는 경우).
- org.eclipse.uml2.uml
- com.ibm.xtools.cpp.model
- com.ibm.xtools.transform.core
- com.ibm.xtools.transform.cpp.uml2
- 을 클릭하십시오.
- 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로 변환을 실행할 때
변환은 이전 코드 단편에 지정된 대로 속성을 변환합니다.