EMFの依存関係なしに、EcoreメタモデルからJavaコードを生成することは可能ですか?UMLモデルからの生成であるかのように、「クリーンなコード」を生成します。
2 に答える
簡単な方法は、最上位ノードの「モデル機能のデフォルト」セクションでGenModelオプション「EMFタイプの抑制」を設定することです...関連するオプションの穴セットがあります。詳細については、EMFブック(第2版)を参照してください。
JETを使用して、ECoreモデルから独自のJavaコードを生成することもできます。かなり詳細な説明については、「EMFを使用したメタモデリング:具体的で再利用可能なJavaスニペットの生成」を参照してください。
EMFモデルエディターを使用してすべてを削除できるわけではありません。、、などのメソッドは#eSet
、#eGet
基になるテンプレートで削除する必要があります。このeInvoke
メソッドは、「OperationReflection」=falseを設定することで削除できます。utilパッケージは、パッケージレベルのconfig "Adapter Factory"=falseを設定して削除できます。genmodel configから管理できる他の変更があります。詳細については、EMFModelingFrameworkの本のセクション12.3.1を参照してください。
「EMFタイプの抑制」は、EMFタイプEOperation
をEReference
ゲッターとセッターからのみ削除しますが、宣言されたivarまたはゲッターで使用されるコンストラクター(リストがnullの場合)からは削除しないことに注意してください。これらはテンプレートで変更する必要があります-具体的にはClass.javajet。コアEMFテンプレートを置き換える方法の詳細については、using-dynamic-templates-in-emfを参照してください。
ivarには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)%>;