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

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

2 ответа

Решение

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

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

Не все можно удалить с помощью редактора моделей EMF. #eSet, #eGetи т.д. методы должны быть удалены в базовом шаблоне. eInvoke Метод можно удалить, установив "Отражение операции" = false. Пакет утилит можно удалить, установив конфигурацию уровня пакета "Фабрика адаптеров" = false. Существуют и другие изменения, которыми можно управлять из конфигурации genmodel - для получения более подробной информации см. Книгу EMF Modeling Framework, раздел 12.3.1.

Обратите внимание, что "Подавить типы EMF" удаляет тип EMF из EOperation а также EReference только getter и setter, но не из объявленного ivar или конструктора, используемого в вашем getter (если list равен null). Они должны быть изменены в шаблоне - Class.javajet, чтобы быть конкретным. Для получения подробной информации о том, как заменить основные шаблоны EMF, смотрите использование-dynamic-templates-in-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 импл с ArrayList:

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

instead of:
<%=genFeature.getSafeName()%> = new <%=genClass.getListConstructor(genFeature)%>;
Другие вопросы по тегам