Corticon 5.3 : Sharing Model API State

こんにちは。渡邊です。

商用ルールエンジン、Corticonの研究をしています。

“Corticon Foundation User Guide.pdf” を一読しました。
概要についてはCorticon 5.3 : Corticon Foundation User Guide.pdf メモにまとめました。本記事では、Sharing Model API Stateついて掘り下げます。

この記事は、Corticon 5.3 : Demand-Loading and Lazy-Loadingの続きです。

Vocabulary編集者の変更がRulesheet編集者側に反映されないのは、都合が悪いかもしれません。Sharing Model API Stateがこのような不都合を解決します。IModelAPIStateインスタンスを生成し、各APIに設定します。

Corticon 5.3 : Demand-Loading and Lazy-Loadingで示したコードの一部を変更しました。変更箇所を赤字で示します。完全なコードはこちらからダウンロード可能です。

メインロジック
流れは変わっていません。ModelAPIStateImplを生成し、各編集者に渡しています。

public void start(String vocabularyFileName, String rulesheetFileName) {
    IModelAPIState sharing = new ModelAPIStateImpl();

    // Vocabulary編集開始
    VocabularyEditor vocabularyEditor = new VocabularyEditor(vocabularyFileName, sharing);
    vocabularyEditor.addEntity("商品");
    vocabularyEditor.save();
    vocabularyEditor.addEntity("注文");

    // Rulesheet編集開始
    RulesheetEditor rulesheetEditor = new RulesheetEditor(rulesheetFileName, sharing);
    rulesheetEditor.addScopeEntity("商品");
    rulesheetEditor.addScopeEntity("注文");
    vocabularyEditor.save();
    rulesheetEditor.addScopeEntity("注文");
    rulesheetEditor.load(rulesheetFileName);
    rulesheetEditor.addScopeEntity("注文");
    rulesheetEditor.save();

    // 後処理
    vocabularyEditor.dispose();
    rulesheetEditor.dispose();
}

Vocabulary編集者
IVocabularyTreeModelAPIにIModelAPIStateを設定しています。 リソースのロード前に設定していることに留意してください。

class VocabularyEditor {
    private IVocabularyTreeModelAPI vocabularyAPI;
    private Resource resource;

    public VocabularyEditor(String fileName, IModelAPIState sharing) {
        systemout("Vocabulary> 編集を開始(API生成)します。");
        vocabularyAPI = VocabularyTreeModelAPIFactory.getInstance();
        vocabularyAPI.setModelAPIState(sharing);
        load(fileName);
    }
    
    public void load(String fileName) {
    systemout("Vocabulary> リソースをロードします。");
        resource = vocabularyAPI.loadResource(fileName);
    }

    public void addEntity(String name) {
        IEntity newEntity1 = vocabularyAPI.addEntity();
        vocabularyAPI.setEntityName(newEntity1, name);
        systemout("Vocabulary> エンティティ'" + name + "'を語彙に追加しました。");
    }

    public void save() {
        vocabularyAPI.saveResource(resource);
        systemout("Vocabulary> 保存しました。");
    }

    public void dispose() {
        vocabularyAPI.dispose();
    }
}

Rulesheet編集者
IRulesheetTableModelAPIにIModelAPIStateを設定しています。 リソースのロード前に設定していることに留意してください。

class RulesheetEditor {
    private IRulesheetTableModelAPI rulesheetAPI;
    private Resource resource;

    public RulesheetEditor(String fileName, IModelAPIState sharing) {
    	systemout("Rulesheet>  編集を開始(API生成)します。");
        rulesheetAPI = RulesheetTableModelAPIFactory.getInstance();
        rulesheetAPI.setModelAPIState(sharing);
        load(fileName);
    }
    
    public void load(String fileName) {
        systemout("Rulesheet>  リソースをロードします。");
        resource = rulesheetAPI.loadResource(fileName);
    }

    public void addScopeEntity(String name) {
        IVocabularyModelAPI vocabularyAPI = rulesheetAPI.getVocabularyModelAPI();
        IEntity newEntity = vocabularyAPI.findEntity(name);
        if (newEntity != null) {
            rulesheetAPI.addScopeEntity(newEntity);
            systemout("Rulesheet>  エンティティ'" + name + "'をスコープに追加しました。");
        } else {
            systemout("Rulesheet>  エンティティ'" + name + "'は存在しません。スコープに登録できません。");
        }
    }
    
    public void save() {
        rulesheetAPI.saveResource(resource);
        systemout("Rulesheet>  保存しました。");
    }

    public void dispose() {
        rulesheetAPI.dispose();
    }
}

実行結果
リソースを共有しているのではなく、Canonical APIの状態を共有しているので、Vocabulary編集者が語彙「注文」の登録を保存する前に、Rulesheet編集者は語彙「注文」を取得することができています。

01: Vocabulary> 編集を開始(API生成)します。
02: Vocabulary> リソースをロードします。
03: Vocabulary> エンティティ'商品'を語彙に追加しました。
04: Vocabulary> 保存しました。
05: Vocabulary> エンティティ'注文'を語彙に追加しました。
06: Rulesheet>  編集を開始(API生成)します。
07: Rulesheet>  リソースをロードします。
08: Rulesheet>  エンティティ'商品'をスコープに追加しました。
09: Rulesheet>  エンティティ'注文'をスコープに追加しました。
10: Vocabulary> 保存しました。
11: Rulesheet>  エンティティ'注文'をスコープに追加しました。
12: Rulesheet>  リソースをロードします。
13: Rulesheet>  エンティティ'注文'をスコープに追加しました。
14: Rulesheet>  保存しました。

保存されたRulesheetをStudioから開きました。スコープに「注文」が3個登録されています。まだ試していませんが、それぞれに重複しないようなエイリアスを付ければ、エラー表示が消えるのではないでしょうか。
corticon-helloapi-20140822-02

コメントを残す

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