Corticon 5.3 : 基盤APIのライフサイクル

こんにちは。渡邊です。

商用ルールエンジン、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();
        }
    }
    
  • クラスパスに通す必要があるJAR
  • ドキュメントに記載されている通り、次のライブラリにクラスパスを通します。

    • Corticon_Foundation_API.jar(基盤API)
    • Corticon_Foundation_I18n.jar (国際化対応)
    • Corticon_Foundation_NonPluginJars.zipに含まれるJAR(サードパーティライブラリ)
  • 実行結果
  • 出力されたファイル(拡張子は”.ecore”にしておきました)をStudioで開きました。

    出力ファイルをStudioで開いた

    出力ファイルをStudioで開いた


    所感
    シンプルなAPIでいいですね。

    コメントを残す

    メールアドレスが公開されることはありません。 * が付いている欄は必須項目です