Как создать 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.getListItemType()%>>();
instead of:
<%=genFeature.getSafeName()%> = new <%=genClass.getListConstructor(genFeature)%>;