Eclipse UML2: получить значение свойства, определенного в профиле

Я новичок в затмении UML2 и застрял в следующей проблеме.

Я определил профиль с двумя стереотипами: ServiceRequest и TransitionEdge. ServiceRequest расширяет метакласс Action двумя дополнительными свойствами (процессор, память), а TransitionEdge расширяет метакласс ActivityEdge дополнительным свойством, называемым «вероятность». Все эти свойства имеют тип float, определенный как PrimitiveType.

Я создал диаграмму активности, к которой применены профиль и стереотипы. На диаграмме активности каждое ребро представляет собой 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 для элемента возникает исключение. Ниже приведено сообщение об ошибке:

org.eclipse.uml2.uml.internal.impl.PropertyImpl@7a6d6a3f (name: base_ActivityEdge, visibility: <unset>) (isLeaf: false) (isStatic: false) (isOrdered: false, isUnique: true, isReadOnly: false) (aggregation: none, isDerived: false, isDerivedUnion: false, isID: false)

org.eclipse.uml2.uml.internal.impl.PropertyImpl@255a8ce4 (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: org.eclipse.uml2.uml.internal.impl.StereotypeImpl@442f4161 (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)

Я не мог понять, что происходит. Какие-либо предложения? Большое спасибо!!


person Xiang Zhang    schedule 13.03.2013    source источник


Ответы (1)


Метод Element.getValue(...) ожидает передачи фактического экземпляра Stereotype, который используется с моделью.

В первом блоке вы извлекаете свой экземпляр 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.

person Carsten    schedule 13.03.2013
comment
Это работает отлично. Я получаю стереотип из модели и затем передаю его методу getValue. Спасибо!! - person Xiang Zhang; 14.03.2013