1

私はEclipseUML2を初めて使用し、次の問題で立ち往生しています。

ServiceRequestとTransitionEdgeの2つのステレオタイプでプロファイルを定義しました。ServiceRequestは2つの追加プロパティ(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メソッドが要素に対して呼び出されると、例外がスローされます。エラーメッセージは次のとおりです。

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)

何が起こっているのか理解できませんでした。助言がありますか?どうもありがとう!!

4

1 に答える 1

2

Element.getValue(...)メソッドは、モデルで使用される実際のステレオタイプインスタンスが渡されることを想定しています。

最初のブロックでは、2番目のブロックのモデルに使用されているものとは別のResourceSetからステレオタイプインスタンスを取得しています。その結果、モデルのロード中にプロファイルが2回ロードされ、別のステレオタイプインスタンスが作成されます。これを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)。

于 2013-03-13T10:06:05.890 に答える