1

メタモデル(クラス図)とそのインスタンス(オブジェクト図)を入力として受け取るAPIを開発する必要がありますが、プログラムでそれを行う方法がわかりません。

調査を行ったところ、EMF APIで遊ぶことができることがわかりましたが、その方法と、検証前に図を挿入する方法がわかりません。

私は初心者で、インターネット上にあるすべてのドキュメントの間で迷子になっているので、私の主題が明確でない場合はすみません

オリエンテーションが必要です。何をしなければならないかを理解するようアドバイスしてください。

編集:主題は、 MagicDrawで作成されたメタモデルに対してインスタンスを検証することです。したがって、ファイルをエクスポートし(ecore?XMI?誰が最適かわからない)、これら2つのファイルを解析するJava APIを作成し(それらを挿入/インポートする方法も理解する必要があります)、ブール値を返す必要があります検証について。これは最初のステップであり、その後、インスタンスを検証するためにOCL制約を追加すると思いますが、今のところ、単純な検証に焦点を当てる必要があります。必要に応じて、EMFまたは他のツールを使用してそれを行うにはどうすればよいですか?

4

2 に答える 2

4

あなたの質問は、概念と実装の2つのレベルで答えることができます。どちらを探しているのかわからないので、両方をカバーしようと思います。どちらかが不要な場合はお詫びします(両方ではないことを願っています!)。

まず最初に、あなたが与える例では、クラス図を「モデル」として参照し、オブジェクト図をそのモデルのインスタンスとして参照するのがより一般的です。厳密に言えば、「メタモデル」は、インスタンスを持つモデルを記述するために使用されます。以下の用語を使用しますが、おそらく注目に値します。

概念レベル

「概念的」とは、「メタモデルに対してモデルを検証することはどういう意味ですか」という質問に答えることを意味します。

答えはとても簡単です。メタモデルは、有効なモデルを構成するものを定義するスキーマまたはルールのセットです。xmlは素晴らしい例を提供します。xmlスキーマは、いくつかの主題の構造とルールを定義します。許可されるタイプ、それらが持つことができる属性、属性が複数の値を持つことができるかどうか、属性が保持できる可能な値のセット。等々。xmlドキュメントは、スキーマで定義されているルールのいずれにも違反していない場合にのみ、スキーマに準拠しています。

モデルへの一般化:モデルは、メタモデルで定義されたルールのいずれにも違反しない場合にのみ、メタモデルに準拠します。

実装レベル

「API」が何に使用されるかについては詳しく説明しません。最も単純な解決策は、xmlを使用することである可能性があります。メタモデルは単なるxmlスキーマであり、モデルはそれらのスキーマに準拠したxmlドキュメントです。次に、「実装」には、検証中の多くのxmlパーサーライブラリの1つを選択し、クライアントコードから呼び出すだけです。

ただし、EMFについて言及しているので、おそらくそれを使用する必要があります。簡単にするために、メタモデルを次のように定義するとします。

Class Dog {
  name: String
  gender: String
  owner: Person
}

Class Person {
  name: String
  address: Address
  dogs: Set<Dog>
}

EMFは、そのようなものを定義するためのAPI( eCore API )を提供します。JavaのリフレクションAPIのように考えてください。メタモデルを定義するには、eCore APIのインスタンスを(プログラムで、またはエディターの1つを介して)作成します。したがって、次を作成します。

  • 2つのインスタンスEClass(1つは人用、もう1つは犬用)
  • 6つのインスタンスEAttribute(属性ごとに1つ)
  • forClass.ownerEReferenceおよびforPerson.dogsのEReferencesコレクション

等々。eCore APIは、APIを使用してモデルのインスタンスを作成する機能も提供します。(必要に応じて、Eclipse GUIでインスタンスを作成するためのエディターも自動生成されます)。モデルのインスタンスをさまざまな具体的な構文で読み取ることもできます。読んでいるモデルがメタモデルに準拠していない場合、EMFは例外を発生させます。

少し長ければごめんなさい。必要に応じて例をより詳細に説明する優れた記事がここにあります。

編集

修正された質問への回答の追加:

主題は、MagicDrawで作成されたメタモデルに対してインスタンスを検証することです。

わかった。MagicDrawのエクスポート機能についてはよくわかりませんが、ecoreをエクスポートできる場合は、ここから始めるとよいでしょう。

  • クラス図(「メタモデル」)をecoreとしてエクスポートし、EMFにロードしてモデルを作成します。これはかなり簡単なはずです。
  • 同様に、オブジェクト図をecoreおよびloadとしてエクスポートし、EMFがロード時に検証できるようにします。さらに検証を追加する必要がある場合は、@Charlesの投稿がEMF検証フレームワークへの適切なリンクを提供します。

あなたがするためにたくさんの仕事をしているなら、それはおそらくEMF本に投資する価値があります。これは最もアクセスしやすいものではありませんが、EMFのさまざまな要素を適切にカバーします。

hth。

于 2012-04-12T20:05:09.540 に答える
2

ECoreを使用してメタモデルを定義した場合、EMFは定義されたEClassのインスタンス(モデル)を作成するためのJavaAPIを生成します。したがって、定義上、モデルはそのメタモデルに準拠します。

モデルが別のアプリケーションによって作成され、個別に作成されたメタモデルに対して検証する場合は、最初に、メタモデルからEMFによって生成されたエディターでモデルを開こうとすることができます。準拠していない場合は、sommeエラーが発生します。これは、最初の試行には十分な場合があります。よく覚えていると思いますが、thareはデフォルトのバリデーターでもあり、生成されたエディターを右クリックして[検証]を選択することで実行できます。

EMFによって提供される別のソリューションがあります:EMF検証フレームワーク。このフレームワークを使用すると、インスタンスに対して検証される制約を定義できます。

public class MyConstraint extends AbstractModelConstraint{
   @Override
   public IStatus validate(IValidationContext ctx) {
      try{
         //Get the object that will be validated
         Object obj = ctx.getTarget();
         //Here you can run you validation
         //Create Validation Status
         return validationStatus
      } catch (Exception e) {
         return ctx.createFailureStatus(e);
      }
   }
}

詳細については、このチュートリアルを参照してください:http: //help.eclipse.org/helios/index.jsp? topic=%2Forg.eclipse.emf.validation.doc%2Ftutorials%2FvalidationTutorial.html

メタモデルにOCL制約を定義できると確信していますが、これは別のプロジェクトの一部です。これを見てください:http ://www.eclipse.org/modeling/mdt/?project = ocl#ocl 私はそれを使ったことがないので、それについてあなたを助けることはできません。ごめん。

お役に立てば幸いです。

チャールズ

于 2012-04-13T09:16:03.457 に答える