2013-03-13 93 views
1

我是eclipse UML2的新手,遇到以下问题。Eclipse UML2:获取配置文件中定义的属性的值

我定义了一个具有两个原型的配置文件:ServiceRequest和TransitionEdge。 ServiceRequest使用两个附加属性(cpu,memory)扩展了Action元类,TransitionEdge使用名为“probability”的附加属性扩展了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方法时引发异常。 以下是错误消息:

[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方法。谢谢!! – 2013-03-13 21:12:44

相关问题