Не удается получить доступ к стереотипам SysML и их свойствам в Acceleo

Я разрабатываю генератор M2T в Acceleo (в Eclipse). Модель в основном представляет собой модель UML с профилем SysML, созданным в Papyrus. Включает в себя блоки и FlowPorts. Мне нужно получить доступ к этим стереотипам, но мне кажется, что я не могу извлечь ни один объект SysML, даже если они появляются в списке (предложение кода). На самом деле я должен получить доступ к свойству "Направление" FlowPort, связанного с портом. Я уже попробовал предложения и ответы на различных форумах (включая https://www.eclipse.org/forums/index.php/t/452587/), но тщетно.

Код приведен ниже. Я создал java-сервисы в соответствии с предложением https://www.eclipse.org/forums/index.php?t=msg&th=1060450&goto=1693765&; но port.hasStereotype('FlowPort') всегда возвращает false. Я также попытался "SysML::PortAndFlows::FlowPort" вместо "FlowPort". Я использую Acceleo 3.6.2 на Eclipse Mars.

...
[template public generateElement(model : Model)]
[comment @main/]

[file ('created.txt', false, 'UTF-8')]
[for(port: Port | model.eAllContents(Port))]
    [if(port.hasStereotype('FlowPort'))]
        OK
    [else]
        NOT OK
    [/if]
[/for]
[/file]
[/template]

Я включаю следующие метамодели в Модуль во время создания модуля:

http://www.eclipse.org/uml2/5.0.0/UML
http://www.eclipse.org/papyrus/0.7.0/SysML
http://www.eclipse.org/papyrus/0.7.0/SysML/Blocks
http://www.eclipse.org/papyrus/0.7.0/SysML/Constraints
http://www.eclipse.org/papyrus/0.7.0/SysML/PortAndFlows
http://www.eclipse.org/emf/2002/Ecore

Кроме того, я регистрирую необходимые пакеты, в том числе следующие в registerPackages() Generate.java, как предлагается по ссылке, только что упомянутой выше.

    // UML2 profiles
    URI uri = URI.createURI("platform:/plugin/org.eclipse.uml2.uml.resources");
    uriMap.put(URI.createURI(UMLResource.LIBRARIES_PATHMAP), uri.appendSegment("libraries").appendSegment(""));
    uriMap.put(URI.createURI(UMLResource.METAMODELS_PATHMAP), uri.appendSegment("metamodels").appendSegment(""));
    uriMap.put(URI.createURI(UMLResource.PROFILES_PATHMAP), uri.appendSegment("profiles").appendSegment(""));  

    // SysML profiles
    uri = URI.createURI("platform:/plugin/org.eclipse.papyrus.sysml");
    uriMap.put(URI.createURI(SysmlResource.LIBRARIES_PATHMAP), uri.appendSegment("librairies").appendSegment(""));
    uriMap.put(URI.createURI("pathmap://SysML_PROFILES/"), uri.appendSegment("SysML.profile.uml").appendSegment("")); 
    uriMap.put(URI.createURI("pathmap://SysML_PROFILES/"), uri.appendSegment("model").appendSegment(""));

Любая помощь приветствуется.

1 ответ

У меня была идентичная проблема, но с UML/MARTE, а не с SysML.

Могу поспорить, что port.getAppliedStereotypes() всегда возвращает пустой список, несмотря ни на что (даже если, конечно, порт имеет стереотип). Я также попытался все, что вы сделали, безуспешно, включая двойную проверку, если был @generated NOT в javadoc из registerPackages метод (чтобы он генерировался каждый раз).

Я исправил проблему с помощью небольшого обходного пути. Я предполагаю, что вы (как и я) использовали в качестве входных данных для преобразования файл model.uml, сгенерированный Papyrus. Это может быть причиной проблемы, хотя я не вижу альтернативы. Если вы откроете этот файл в текстовом редакторе, вы обнаружите, что <FlowPort> теги находятся за пределами <uml:Model> тег. Это означает, что по причинам, которые я до сих пор не понимаю, stereotype() методы не могут "видеть" стереотипы и всегда возвращают нулевые или пустые списки. Это возможно потому, что они не соответствуют стереотипу base_NamedElement к xmi:id внутри <uml:Model> тег.

С другой стороны, если вы определите шаблон, который принимает в качестве входных данных FlowPort (а не модель), вы сможете получить свой стереотипный элемент и все его свойства.

[template public generateElement(aFlowPort: FlowPort)]
[comment @main /]
[comment here you can access to the aFlowPort fields]
[/template]

Среди прочего, вы также можете получить доступ к base_NamedElement свойство стереотипа (т. е. Port это стереотипно FlowPort в вашей модели), и вы можете использовать qualifiedName свойство базового элемента для сопоставления стереотипа с Port в вашем Model, На практике это означает, что вы должны вручную связать стереотипы с их стереотипными сущностями.

Неуклюжий и раздражающий, но все же выполняет свою работу, пока кто-то не придет с менее "обходным" решением.

Другие вопросы по тегам