Как использовать Java Emitter Template (JET) для генерации Java-кода из файла .xmi, созданного на основе модели EMF - PullRequest
2 голосов
/ 18 декабря 2010

Итак, вот моя проблема, у меня есть проект Eclipse EMF, и я построил модель, сгенерировал соответствующий код, а также вручную запрограммировал некоторые базовые классы, которые соответствуют модели.

Я использовал мастер eclipse, чтобы адаптировать проект к проекту преобразования Java Emitter Template (JET) (и заметил, что это не генерирует те же конфигурации в MANIFEST, что проект JET, созданный с нуля, делает ... )

Я создал файл JET, который создает класс Java для генерации кода для основного класса приложения на основе ввода, который входит в «аргумент».

Затем я создал экземпляр Dynamic и заполнил созданный файл .xmi несколькими узлами в соответствии с моделью.

Теперь я создал рабочую конфигурацию JET Transformation, и я пытаюсь передать в качестве входного файла .xmi и использовать одну из двух доступных вещей в поле со списком Transformation ID ...

Если я выберу Transformation ID для jet2, я получу этот вывод в консоли:

templates/main.jet(8,1):  <c:setVariable var='org.eclipse.jet.taglib.control.iterateSetsContext' select='true()'>
    Trace: completed action. 
templates/main.jet(29,1):  <c:if test='isVariableDefined(''org.eclipse.jet.resource.project.name'')'>
    Trace: processing body
templates/dump.jet(2,1):  <c:dump select='/*' format='true' entities='true'>
    Trace: completed action. 
templates/main.jet(30,5):  <ws:file template='templates/dump.jet' path='{$org.eclipse.jet.resource.project.name}/dump.xml'>
    Trace: completed action. 
Successful Execution

И если вместо этого я выбираю Transformation ID как org.eclipse.jet.transforms.taglib.doc (единственный доступный другой вариант), я получаю:

templates/control.jet(8,1):  <c:setVariable var='jetPluginNS' select='''org.eclipse.jet'''>
    Trace: completed action. 
templates/control.jet(9,1):  <c:setVariable var='tagLibrariesXP' select='concat($jetPluginNS, ''.tagLibraries'')'>
    Trace: completed action. 
templates/control.jet(15,1):  <c:setVariable var='pluginNS' select='$org.eclipse.jet.resource.project.name'>
    Trace: completed action. 
templates/control.jet(16,1):  <c:setVariable var='docPlugin' select='concat($org.eclipse.jet.resource.project.name, ''.doc'')'>
    Trace: completed action. 
templates/control.jet(21,5):  <c:iterate select='/plugin/extension[@point = $tagLibrariesXP]' var='extension'>
    Trace: loop initialized
templates/control.jet(21,5):  <c:iterate select='/plugin/extension[@point = $tagLibrariesXP]' var='extension'>
    Trace: finished loop
templates/control.jet(69,5):  <c:iterate select='/plugin/extension[@point = $tagLibrariesXP]' var='extension'>
    Trace: loop initialized
templates/control.jet(69,5):  <c:iterate select='/plugin/extension[@point = $tagLibrariesXP]' var='extension'>
    Trace: finished loop
Successful Execution

В любом случае, я не получаю сгенерированный Java-класс из метода generate, и тем не менее оба говорят, что они успешны ... также, с помощью консольных сообщений в первом случае, я вижу, что генерируется файл dump.xml с переводом этого файла из xmi в xml, но без какой-либо связи с Java или какими-либо методами, которые я определил для создания в классе генерации JET ...

Кроме того, если после создания упомянутого файла dump.xml я пытаюсь использовать его в качестве входных данных, он говорит мне, что мой объект Application не найден или является абстрактным. На самом деле тот из сгенерированного пакета действительно является интерфейсом, но даже если я пытаюсь использовать Impl, я получаю ту же ошибку, и я даже не знаю, работает ли он правильно из-за всей этой процедуры, которую я предпринял, чтобы добраться до Файл dump.xml.

Что я делаю не так? Может кто-нибудь, пожалуйста, помогите мне?

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

1 Ответ

2 голосов
/ 17 августа 2012

Поскольку у вас было только два варианта идентификатора преобразования, я скажу, что вы не создали проект преобразования JET. Если бы у вас было тогда, его идентификатор преобразования был бы показан в раскрывающемся списке в диалоге конфигурации.

Я бы начал с использования мастера нового проекта для создания нового проекта преобразования JET. Поведение по умолчанию для нового преобразования - выгрузить входную модель в файл с именем dump.xml в корневом каталоге того же проекта, который содержит файл входной модели. Когда этот JET-проект будет создан, используйте диалоговое окно конфигурации запуска, чтобы запустить преобразование для вашего XML-файла. Когда вы посмотрите на созданный файл dump.xml, вы увидите реальную модель, которую использует JET. Модели EMF могут быть циклическими, но JET адаптирует модель EMF к подмножеству, имеющему иерархический характер.

Как только вы увидите эффективную модель (модель в файле dump.xml), вы можете создать или изменить свои шаблоны для использования этой модели и генерировать любые нужные вам файлы.

Кроме того, при формулировке вашего вопроса вы, похоже, создали для своего класса единый шаблон JET, но JET также нужен шаблон, обычно называемый main.jet, который действует как контроллер в смысле MVC и который отвечает для применения других JET-шаблонов в проекте JET к модели и указания результирующих имен файлов для сгенерированного контента.

...