Преобразование Acceleo с использованием пользовательской метамодели ecore

Прежде всего, я новичок в функциях моделирования eclipse, поэтому вопрос может быть тривиальным, но я ищу несколько дней и не нашел ответа.

Я создал файл метамодели ecore с проектом моделирования ecore. URI: /com.auth.dotnetPSM.PSMmodel/model/PSMMetamodel.ecore

Я также сгенерировал (посредством преобразования ATL) файл модели xmi. первый элемент такой:

<?xml version="1.0" encoding="ISO-8859-1"?>
<RESTfulServicePSM
    xmi:version="2.0" 
    xmlns:xmi="http://www.omg.org/XMI" 
    xmlns="/com.auth.dotnetPSM.PSMmodel/model/PSMMetamodel.ecore" 
    name="WSAT">

В проекте ATL все работает как положено.

Теперь мне нужно создать преобразование M2T с помощью Acceleo. Итак, для начала я создал два модуля, основной:

[comment encoding = UTF-8 /]

[module PsmToCode('/com.auth.dotnetPSM.PSMmodel/model/PSMMetamodel.ecore')]
[import org::eclipse::acceleo::psm2code::files::ResourceModelClasses/]

[template public PsmToCode(aRESTfulServicePSM : RESTfulServicePSM)]
[comment @main/]
[for ( aCSharpResourceModel : CSharpResourceModel | aRESTfulServicePSM.hasCSharpRModel)]
        [aCSharpResourceModel.generateResourceModelClasses()/]
 [/for]
[/template]

и еще один:

[comment encoding = UTF-8 /]
[module ResourceModelClasses('/com.auth.dotnetPSM.PSMmodel/model/PSMMetamodel.ecore')]

[template public generateResourceModelClasses(aCSharpResourceModel : CSharpResourceModel)]

[file (aCSharpResourceModel.parentName.toUpperFirst().concat('.cs'), false, 'UTF-8')]

[/file]
[/template]

Когда я запускаю это, я получаю исключение Package with uri '/com.auth.dotnetPSM.PSMmodel/model/PSMMetamodel.ecore' not found. (file:/H:/Users/doumas/workspace/PIM2PSM/WSATPSM.xmi, 6, 15). Что я делаю неправильно?

Заранее спасибо.


person odyd    schedule 19.05.2015    source источник
comment
Вы сгенерировали код модели из своего .ecore или хотели использовать динамические экземпляры в качестве моделей? Кроме того, URI, который вы используете, — это значение атрибута nsURI, которое вы установили в корень вашей метамодели?   -  person Vincent Aranega    schedule 20.05.2015
comment
@VincentAranega Да, URI — это свойство nsURI. Когда вы говорите код модели, вы имеете в виду файл .xmi? Это было создано из преобразования ATL. Возможно, мне нужно уточнить, что ошибка, которую я получаю, связана с файлом .xmi. Если вы не говорите о xmi, не могли бы вы уточнить, пожалуйста?   -  person odyd    schedule 20.05.2015
comment
Хорошо, я думаю, я понял, я предположил, что проблема возникла из-за выполнения сценария ускорения. У вас есть только .ecore для вашей метамодели, и вы не создали код метамодели. Я публикую ответ для разработки;)   -  person Vincent Aranega    schedule 20.05.2015
comment
Я только что сделал это. Спасибо, как я уже сказал, я полный новичок в emf, но комментарий о генерации кода мне очень помог. Теперь это работает. Действительно, я никогда не использовал файл .genmodel, хотя думал, что он будет работать так же просто, как преобразование ATL. В любом случае спасибо за ваше время, вы были очень полезны.   -  person odyd    schedule 20.05.2015


Ответы (2)


Вероятно, у вас есть .ecore для вашей метамодели, и вы не сгенерировали код метамодели (используя .genmodel). У вас возникает ошибка, когда вы пытаетесь открыть файл .xmi с помощью инструмента EMF (Acceleo/QVT... и т. д.). Итак, здесь много моментов ;).

Вы можете иметь дело со статическими или динамическими экземплярами вашей метамодели.

Статические экземпляры

Статические экземпляры создаются, когда вы генерируете код вашей метамодели (используя .genmodel), вы регистрируете свой проект как плагин и создаете модель, которая соответствует развернутой вами метамодели. В этом случае ваша метамодель развертывается как подключаемый модуль Eclipse, и ваша метамодель регистрируется в глобальном реестре при загрузке подключаемого модуля Eclipse. В вашей подпрограмме режима разработки самый простой способ определить вашу метамодель и разработать материалы вокруг нее — это обработать два экземпляра eclipse. Первый (я буду называть его исходным экземпляром) — это тот, в котором находится ваш проект метамодели. Второй запускается через меню run new eclipse configuration из исходного экземпляра (буду называть его новым экземпляром). Итак, вот рутина:

  1. Вы создаете свою метамодель
  2. Вы создаете .genmodel, связанный с вашей метамоделью
  3. Вы генерируете код метамодели
  4. Вы запускаете новый экземпляр eclipse из исходного.
  5. Вы проходите через мастер file->new->other->Example Model EMF Creation Wizard->your_stuff, чтобы создать свою модель

Теперь ваша модель создана, и ваша метамодель зарегистрирована в глобальном реестре, поэтому файл Acceleo будет хорошо скомпилирован, и ваша модель будет открыта/читаема любым приложением, совместимым с EMF, без дополнительной работы. Этот метод долгий, но и самый простой.

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

  1. Свяжите свой проект Acceleo с проектом метамодели
  2. Измените файл Java, сгенерированный Acceleo, и добавьте его в метод registerPackages: resourceSet.getPackageRegistry().put(SomethingPackage.eINSTANCE.getNsURI(), SomethingPackage.eINSTANCE);

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

Динамические экземпляры

В описанном вами случае вы имеете дело с динамическими экземплярами. Это означает, что код метамодели не генерируется. ATL может обрабатывать динамические экземпляры, поэтому вы смогли сгенерировать файл .xmi. Кстати, вы можете создать .xmi, открыв свою метамодель, выбрав свой корневой EClass и нажав на right_click->Create dynamic instance....

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

File file = new File("path/to/your/metamodel.ecore"); 
EObject obj = ModelUtils.load(file, resourceSet); 
resourceSet.getPackageRegistry().put("metamodel_ns_uri", obj); 

(ModelUtils происходит от org.eclipse.acceleo.common.utils) Используя это, вы сможете генерировать код из Acceleo с динамическим экземпляром.

Кроме того, несколько слов об Acceleo: если ваши экземпляры RESTfulServicePSM не будут генерировать код, вы можете напрямую поместить аннотацию @main в свой шаблон generateResourceModelClasses. Механизм Acceleo будет выполнять итерацию для каждого экземпляра CSharpResourceModel самостоятельно. О, и вы можете поместить много @main аннотаций на многие шаблоны, они будут оценены ;).

РЕДАКТИРОВАТЬ › Я только что видел, что ваша проблема исправлена, я должен был посмотреть. Простите за длинный пост.

person Vincent Aranega    schedule 20.05.2015
comment
К чему сожаление. Очень понятное объяснение и очень полезная информация для меня :D - person odyd; 20.05.2015

Короче говоря, вам нужно «Сгенерировать код модели», используя .genmodel.

person Saurabh Gupta    schedule 06.09.2017