こんにちは。渡邊です。
商用ルールエンジン、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でいいですね。