Как создать код Java из метамодели Ecore без зависимостей jar от EMF?

Можно ли сгенерировать код Java из метамодели Ecore без зависимостей EMF? Создавайте «чистый код», как если бы это было поколение модели UML.


person seeebown    schedule 19.05.2012    source источник


Ответы (2)


Самый простой способ - установить параметр GenModel «Подавлять типы EMF» в разделе «Параметры модели по умолчанию» узла верхнего уровня... Существует набор соответствующих параметров. Подробную информацию см. в книге EMF (2-е издание).

Вы также можете использовать JET для создания собственного кода Java из модели ECore. Взгляните на "Метамоделирование с помощью EMF: создание конкретных многократно используемых фрагментов кода Java" для довольно подробного описания.

person Tonny Madsen    schedule 19.05.2012
comment
Однако Suppress EMF Types не удаляет все зависимости. книгу посмотрю, спасибо - person seeebown; 21.05.2012
comment
Он также может быть полезен другим: wiki.eclipse.org/EMF/ - person seeebown; 21.05.2012
comment
Не все можно удалить с помощью редактора модели EMF. Методы #eSet, #eGet и т. д. должны быть удалены из базового шаблона. Метод eInvoke можно удалить, установив Operation Reflection = false. Пакет util можно удалить, установив в конфигурации адаптера Factory уровня пакета = false. Ты другие. В настоящее время разрабатываем, как использовать List, а не EList :-( - person wmorrison365; 13.09.2012

Не все можно удалить с помощью редактора модели EMF. В базовом шаблоне необходимо удалить методы #eSet, #eGet и т. д. Метод eInvoke можно удалить, установив «Отражение операции» = false. Пакет util можно удалить, установив в конфигурации уровня пакета «Adapter Factory» = false. Есть и другие изменения, которыми можно управлять из конфигурации genmodel — более подробную информацию см. в книге EMF Modeling Framework, раздел 12.3.1.

Обратите внимание, что «Подавить типы EMF» удаляет тип EMF только из EOperation и EReference геттеров и сеттеров, но не из объявленного ivar или конструктора, используемого в вашем геттере (если список равен нулю). Их необходимо изменить в шаблоне — Class.javajet, чтобы быть конкретным. Подробнее о том, как заменить основные шаблоны EMF, см. на странице использование динамических шаблонов в emf.

Для ивара используйте Feature#getImportedType, а не Feature#getImportedInternalType:

protected <%=genFeature.getImportedType(genClass)%> <%=genFeature.getSafeName()%>;

Эта строка следует за разделом комментариев, содержащим следующее, относящееся к тесту isListType:

<%} else if (genFeature.isListType() || genFeature.isReferenceType()) {%>
  <%if (genClass.isField(genFeature)) {%>
/**
 * The cached value of the '{@link #<%=genFeature.getGetAccessor()%>() <em><%=genFeature.getFormattedName()%></em>}' <%=genFeature.getFeatureKind()%>.
 * <!-- begin-user-doc -->
 * <!-- end-user-doc -->

Для средства доступа используйте что-то вроде следующего, чтобы заменить EMF EList impl на ArrayList:

<%=genFeature.getSafeName()%> = new <%=genModel.getImportedName("java.util.ArrayList")%><<%=genFeature.getListItemTy‌​pe()%>>();

instead of:
<%=genFeature.getSafeName()%> = new <%=genClass.getListConstructor(genFeature)%>;
person wmorrison365    schedule 13.09.2012
comment
Можно возразить, что если вам приходится изменять шаблоны до такой степени, вам не следует использовать EMF :-) - person wmorrison365; 13.09.2012