こんにちは。渡邊です。
商用ルールエンジン、Corticonの研究をしています。
“Corticon Foundation User Guide.pdf” を一読しました。
概要についてはCorticon 5.3 : Corticon Foundation User Guide.pdf メモにまとめました。本記事では、基盤APIのライフサイクルについて掘り下げます。
基盤APIのライフサイクル
リソースを新規作成する場合は、Dialog “Smarts” APIを使います。
- APIを生成する。
- API経由でリソースを作成する。
- APIを解放する。
リソースを編集する場合は、主にPresentation APIを使います。
- APIを生成する。
- API経由でリソースを読み込む。
- API経由でリソースの状態を更新する。
- API経由でリソースを保存する。
- APIを解放する。
APIを生成する。
各APIに対応するFactoryクラスがあります。Factoryの命名規則が決まっていて、「{先頭の”I”を除くAPI名} + Factory」です。
IVocabularyTreeModelAPI api = VocabularyTreeModelAPIFactory.getInstance();
API経由でリソースを作成する。
Dialog “Smarts” APIのcreateXXXメソッドを実行します。ドキュメントには記載されていませんが、Presentation APIのcreateResourceメソッドを試したところ、新規作成ではなく更新になってしまいました。
API経由でリソースを読み込む。
loadResourceメソッドを実行します。org.eclipse.emf.common.util.URIクラスのインスタンスによって、リソースのロケーションを指定します(少なくともIVocabularyTreeModelAPI APIについては、Stringで指定するAPIもありましたが、そうでないAPIもありました)。
URI resourceURI = URI.createFileURI("c:\corticon\test.ecore"); Resource resource = api.loadResource(resourceURI);
API経由でリソースの状態を更新する。
各API固有の状態変更メソッドを駆使し、メモリにロードされたリソースの状態を更新します。
具体的なコードを後述します。
API経由でリソースを保存する。
saveResourceメソッドを実行します。
api.saveResource(resource);
APIを解放する。
disposeメソッドを実行します。理由がわかりませんが、私が試した限り、IVocabularyDialogAPIにはdisposeメソッドがありませんでした。
api.dispose();
シンプルなアプリケーション
上記を踏まえて、GUIなしのシンプルなアプリケーションを作成しました。独自形式の入力ファイルを読み込み、Vocabularyリソースを作成します。
まずは入力ファイルの形式を示します。インデントなしの行がエンティティ、タブによるインデントありの行が属性を意味します(あくまでサンプルですので、入力データの妥当性は気にしないでください)。
顧客 ID 会員番号 名前 年齢 性別 商品 ID 名前 値段 注文 ID 顧客ID 商品ID 数量 値段
基盤APIがスレートフルな設計であることを念頭に置くと、理解しやすいかと思います。
package com.natswell.corticon.helloapi; import java.io.BufferedReader; import java.io.File; import java.io.FileReader; import java.io.IOException; import java.util.Locale; import org.eclipse.emf.common.util.URI; import org.eclipse.emf.ecore.resource.Resource; import com.corticon.eclipse.studio.vocabulary.core.IAttribute; import com.corticon.eclipse.studio.vocabulary.core.IEntity; import com.corticon.eclipse.studio.vocabulary.core.IVocabularyDialogAPI; import com.corticon.eclipse.studio.vocabulary.core.VocabularyDialogAPIFactory; import com.corticon.eclipse.studio.vocabulary.tree.core.IVocabularyTreeModelAPI; import com.corticon.eclipse.studio.vocabulary.tree.core.VocabularyTreeModelAPIFactory; public class VocabularyGenerator { public static void main(String[] args) { final String inputFileName = args[0]; final String outputFileName = args[1]; // 古いVocabularyを削除する File oldResource = new File(outputFileName); if (oldResource.exists()) { oldResource.delete(); } // 新しいVocabularyを作成する URI resourceURI = URI.createFileURI(outputFileName); IVocabularyDialogAPI dialogAPI = VocabularyDialogAPIFactory.getInstance(); dialogAPI.createVocabulary(resourceURI); // 前処理 IVocabularyTreeModelAPI presentationAPI = VocabularyTreeModelAPIFactory.getInstance(); presentationAPI.setLocale(Locale.JAPAN); // 入力ファイルをVocabularyリソースに変換 Resource resource = presentationAPI.loadResource(resourceURI); try (BufferedReader reader = new BufferedReader(new FileReader(inputFileName));) { String line; IEntity currentEntity = null; while ((line = reader.readLine()) != null) { // エンティティとその名称を追加する if (!line.startsWith("\t")) { currentEntity = presentationAPI.addEntity(); presentationAPI.setEntityName(currentEntity, line); } else { // 属性とその名称を追加する if (currentEntity != null) { IAttribute attribute = presentationAPI.addAttribute(currentEntity); presentationAPI.setAttributeName(attribute, line); } } } } catch (IOException e) { throw new RuntimeException(e); } // リソース保存と後処理 presentationAPI.saveResource(resource); presentationAPI.dispose(); } }
ドキュメントに記載されている通り、次のライブラリにクラスパスを通します。
- Corticon_Foundation_API.jar(基盤API)
- Corticon_Foundation_I18n.jar (国際化対応)
- Corticon_Foundation_NonPluginJars.zipに含まれるJAR(サードパーティライブラリ)
出力されたファイル(拡張子は”.ecore”にしておきました)をStudioで開きました。
所感
シンプルなAPIでいいですね。