Можно ли сгенерировать код Java из метамодели Ecore без зависимостей EMF? Создавайте «чистый код», как если бы это было поколение модели UML.
Как создать код Java из метамодели Ecore без зависимостей jar от EMF?
Ответы (2)
Самый простой способ - установить параметр GenModel «Подавлять типы EMF» в разделе «Параметры модели по умолчанию» узла верхнего уровня... Существует набор соответствующих параметров. Подробную информацию см. в книге EMF (2-е издание).
Вы также можете использовать JET для создания собственного кода Java из модели ECore. Взгляните на "Метамоделирование с помощью EMF: создание конкретных многократно используемых фрагментов кода Java" для довольно подробного описания.
Не все можно удалить с помощью редактора модели 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.getListItemType()%>>();
instead of:
<%=genFeature.getSafeName()%> = new <%=genClass.getListConstructor(genFeature)%>;