2013-03-13 4 views
1

저는 UML2를 일식 사용하는 데 익숙하지 않고 다음과 같은 문제에 봉착했습니다.Eclipse UML2 : 프로파일에 정의 된 속성의 값을 얻으십시오.

ServiceRequest와 TransitionEdge의 두 가지 고정 관념이있는 프로필을 정의했습니다. ServiceRequest는 두 개의 추가 속성 (cpu, memory)으로 작업 메타 클래스를 확장하고 TransitionEdge는 "확률"이라는 추가 속성으로 ActivityEdge 메타 클래스를 확장합니다. 이러한 모든 속성은 PrimitiveType으로 정의 된 float 유형입니다.

저는 프로필과 스테레오 타입이 적용된 활동 다이어그램을 만들었습니다. 활동 다이어그램에서 각 모서리는 프로파일에 정의 된 TransitionEdge이며 확률 속성에 값이 할당되었습니다.

프로파일 및 활동 모델이 있으므로, 다음 Java 코드를 사용하여로드합니다.

// Load the profile 
URI profileUri = URI.createURI(PROFILE_NAME); 
ResourceSet profileSet = new ResourceSetImpl(); 
profileSet.getPackageRegistry().put(UMLPackage.eNS_URI, UMLPackage.eINSTANCE); 
profileSet.getResourceFactoryRegistry().getExtensionToFactoryMap().put(UMLResource.FILE_EXTENSION, UMLResource.Factory.INSTANCE); 
profileSet.createResource(profileUri); 
Resource profileResource = profileSet.getResource(profileUri, true); 
Profile profile = (Profile)EcoreUtil.getObjectByType(profileResource.getContents(), UMLPackage.Literals.PROFILE); 
Profile sopraProfile = (Profile)profile.getOwnedMember(PROFILE_NAME); 
Stereotype serviceRequestStereotype = (Stereotype)sopraProfile.getOwnedMember(STEREOTYPE_SERVICE_REQUEST); 
Stereotype transitionEdgeStereotype = (Stereotype)sopraProfile.getOwnedMember(STEREOTYPE_TRANSITION_EDGE); 

// Load the model 
URI modelUri = URI.createURI(MODEL_NAME); 
ResourceSet modelSet = new ResourceSetImpl(); 
modelSet.getPackageRegistry().put(UMLPackage.eNS_URI, UMLPackage.eINSTANCE); 
modelSet.getResourceFactoryRegistry().getExtensionToFactoryMap().put(UMLResource.FILE_EXTENSION, UMLResource.Factory.INSTANCE); 
modelSet.createResource(modelUri); 
Resource modelResource = modelSet.getResource(modelUri, true); 
Model model = (Model)EcoreUtil.getObjectByType(modelResource.getContents(), UMLPackage.Literals.MODEL); 

EList<Element> elements = model.getOwnedElements(); 
for(Element e : elements){ 
    if(e instanceof Activity){ 
    Activity activity = (Activity)e; 
    EList<ActivityEdge> edges = activity.getEdges(); 
    for(ActivityEdge edge : edges){ 
     System.out.println(edge.getValue(transitionEdgeStereotype, "probability")); 
    } 
    } 
} 

요소에 대해 getValue 메서드가 호출되면 예외가 throw됩니다.

[email protected] (name: base_ActivityEdge, visibility: <unset>) (isLeaf: false) (isStatic: false) (isOrdered: false, isUnique: true, isReadOnly: false) (aggregation: none, isDerived: false, isDerivedUnion: false, isID: false) 

[email protected] (name: probability, visibility: public) (isLeaf: false) (isStatic: false) (isOrdered: false, isUnique: true, isReadOnly: false) (aggregation: none, isDerived: false, isDerivedUnion: false, isID: false) 

Exception in thread "main" java.lang.IllegalArgumentException: [email protected] (name: TransitionEdge, visibility: <unset>) (isLeaf: false, isAbstract: false, isFinalSpecialization: false) (isActive: false) 
    at org.eclipse.uml2.uml.internal.operations.ElementOperations.getValue(ElementOperations.java:527) 
    at org.eclipse.uml2.uml.internal.impl.ElementImpl.getValue(ElementImpl.java:296) 
    at test.Test.main(Test.java:68) 

내가 무슨 일이 있었는지 알아낼 수 : 다음은 오류 메시지입니다. 어떤 제안? 고마워요 !!

답변

2

Element.getValue (...) 메소드는 전달 될 실제 Stereotype 인스턴스가 모델과 함께 사용되기를 기대합니다.

첫 번째 블록에서 두 번째 블록의 모델에 사용 된 것과 다른 ResourceSet에서 Stereotype 인스턴스를 검색하고 있습니다. 따라서 모델을로드하는 동안 프로파일이 두 번로드되고 다른 Stereotype 인스턴스가 만들어집니다. 그 중 하나를 Element.getValue (...)에 전달해야합니다.

Activity activity = ... 
Stereotype transitionEdgeStereotype = 
    activity.getAppliedStereotype(STEREOTYPE_TRANSITION_EDGE); 
if (transitionEdgeStereotype != null) { 
    System.out.println(edge.getValue(transitionEdgeStereotype, "probability")); 
} 

편집 :이 경우는, STEREOTYPE_TRANSITION_EDGE는 예를 들어, 프로파일 이름을 포함하는 고정 관념의 전체 규정 된 이름이어야합니다

이 할 수있는 가장 안전한 방법입니다 ServiceProfile :: TransitionEdge입니다.

+0

완벽하게 작동합니다. 모델에서 스테레오 타입을 얻은 다음 getValue 메소드에 전달합니다. 감사!! –