2015-06-10 5 views
0

Я пытаюсь создать java-программу для реализации State Machine из UML-модели с использованием Acceleo.Как мне получить значение «xmi: type»

В моей модели у меня есть записи, как: -

<subvertex xmi:type="uml:State" xmi:id="{BB1999-E740-4e7d-A1BE-F099BEXYD970}" name="WaitingApproval"> 

Я хочу, чтобы проверить значение «XMi: тип», но я не могу работать, как получить доступ к этому от Acceleo. (Я пробовал каждую комбинацию попаданий, о которых я могу думать, и тип появляется только как часть более длинной строки, если я сбрасываю всю вершину.)

+0

https://stackoverflow.com/ вопросы/48024563/how-to-get-xmiid-from-xmi-files-in-acceleo – kincki

ответ

1

Если вы находитесь на subvertex, то вы должны быть на Region. xmi:type - способ, которым XMI обрабатывает полиморфные ссылки. Поскольку subvertex определяется как Vertex [*], XMI должен указывать тип каждого элемента в коллекции. Чтобы проверить это поле, вам просто необходимо проверить тип элемента (с помощью oclIsTypeOf или oclIsKindOf)

Так, из Region:

[template public test(r : Region)] 
[r.subvertex->filter(State)/] --> filter all States from the subvertex collection 
which is equ. to 
[r.subvertex->select(oclIsKindOf(State))/] 
and if you want only the State elements (no subclasses) 
[r.subvertex->select(oclIsTypeOf(State))/] 
[/template] 

Кроме того, вы можете обрабатывать их в различных шаблонов путем добавления шаблона охранник:

[template public test(r : Region)] 
[r.subvertex.test2()/] 
[/template] 

[template public test2(s : Vertex) ? (oclIsKindOf(State))] 
[s/] is a state for sure 
[/template] 

вы также можете избежать караул путем перезаписи вышеуказанных шаблонов, как это:

[template public test(r : Region)] 
[r.subvertex.test2()/] 
[/template] 

[template public test2(v : Vertex)/] 
[template public test2(s : State)] 
[s/] is a state for sure 
[/template] 

EDIT

Если вы абсолютно хотите получить значение типа в строковый формат, вы должны пойти проверить элемент метакласса и попросить его имя:

... 
[s.eClass().name/] -> result as String, s.eClass() gets the EClass 
... 
+0

Спасибо за это! Не удалось просмотреть oclIsTypeOf в доступных методах! –