Oracle Business Rules ユーザーズ・ガイド 10g(10.1.3.1.0) B31866-02 |
|
Oracle Business Rules SDK (Rules SDK)には、開発者が、カスタマイズ・アプリケーションの記述に使用できるAPIが用意されています。このアプリケーションは、ルールとデータ・モデル(および Oracle Business Rules ディクショナリに格納されているすべての情報)へのアクセス、作成または変更に使用します。Rules SDK APIを使用すると、適切に定義されたインタフェースを使用して、ディクショナリ・データを作成、変更およびアクセスできます。このAPIは、カスタマイズ・ルール対応アプリケーションの構築にも使用できます。
Rules SDK APIは、既存のルールにアクセスし、Rules Engineを実行するルール対応アプリケーションで使用したり、ルールとデータ・モデルの情報へのアクセス、作成または編集を記述したアプリケーションで使用できます。
この章では、Oracle Business Rules SDK APIについて説明します。
この章の内容は次のとおりです。
最上位レベルのRules SDKパッケージであるoracle.rules.sdk
には、次の各パッケージが含まれています。
oracle.rules.sdk.repository
oracle.rules.sdk.dictionary
oracle.rules.sdk.editor.datamodel
oracle.rules.sdk.editor.ruleset
oracle.rules.sdk.exception
JavaBeanモデルに準拠したRules SDKインタフェースには、Beanプロパティごとにgetterとsetterが組み込まれています。たとえば、setName("somevalue")
によって、個別インスタンスのname
プロパティが設定されます。
Beanインタフェースに加えて、Rules SDKには、ハッシュ関数のgetおよびputスタイル・インタフェースが用意されています。一般的に、Beanインタフェースは有用ですが、少なくとも1つのGUIフレームワークでHashMapスタイルが必要になります。
Oracle Business Rulesディクショナリは、リポジトリに格納されています。ディクショナリにアクセスする前に、そのリポジトリへのアクセスを確立する必要があります。このためには、アクセスするリポジトリのタイプと、そのリポジトリ固有のタイプに必要な初期化パラメータを指定する必要があります。出荷時のRule Authorでは、WebDAV(Web Distributed Authoring and Versioning)リポジトリとファイル・リポジトリがサポートされています。
表6-1に、WebDAVリポジトリの初期化パラメータ・キーを示します。リポジトリ・タイプ・キーは、oracle.rules.sdk.store.webdav
です。
表6-2に、ファイル・リポジトリの初期化パラメータ・キーを示します。リポジトリ・タイプ・キーは、oracle.rules.sdk.store.jar
です。
パラメータ | キー | 説明 |
---|---|---|
ファイル・パス |
|
ルール・リポジトリが保存されているファイルへのパス。このパラメータは必須です。 |
例6-1に、WebDAVリポジトリへのアクセスの確立方法を示します。
String url; // the URL for the WebDAV repository Locale locale; // the desired Locale // The following code assumes that the url and locale have been set appropriately RepositoryType rt = RepositoryManager.getRegisteredRepositoryType("oracle.rules.sdk.store.webdav"); RuleRepository repos = RepositoryManager.createRuleRepositoryInstance(rt); RepositoryContext rc = new RepositoryContext(); rc.setLocale(locale); rc.setProperty("oracle.rules.sdk.store.webdav.url", url); repos.init(rc);
WebDAVリポジトリが認証を必要とするように構成されている場合は、次の手順を実行する必要があります。
oracle.rules.sdk.callbacks.WalletCallback
クラスのインスタンスを作成し、init
メソッドをコールする前に、RepositoryContext
内に設定します。
例6-2の/wallets/rules_wallet
は、WebDAV認証用の資格証明で構成したウォレットへのパスです。
WalletCallback callback = new WalletCallback("/wallets/rules_wallet", null); rc.setSensitiveDataCallback(callback);
例6-3に、ファイル・リポジトリへのアクセスの確立方法を示します。
String path; // the path to the file repository Locale locale; // the desired Locale // The following code assumes that the path and locale have been set appropriately RepositoryType rt = RepositoryManager.getRegisteredRepositoryType("oracle.rules.sdk.store.jar"); RuleRepository repos = RepositoryManager.createRuleRepositoryInstance(rt); RepositoryContext rc = new RepositoryContext(); rc.setLocale(locale); rc.setProperty("oracle.rules.sdk.store.jar.path", path); repos.init(rc);
ディクショナリは、ディクショナリ名を指定することでロードできます。この場合は、次のコードを使用して、ディクショナリのデフォルト・バージョンをロードします。
RuleDictionary dictionary = repos.loadDictionary(dictionaryName);
または、次のコードを使用して、ディクショナリ名とバージョンの両方を指定します。
RuleDictionary dictionary = repos.loadDictionary(dictionaryName, dictionaryVersion);
これらの例は、ファイル・リポジトリとWebDAVリポジトリの両方に適用できます。
Rules SDKデータ・モデルには、ルールの作成に使用するファクト・タイプ、内部変数、制約および関数が含まれています。データ・モデルのファクト・タイプは、対応するルールに基づいて判断できます。Oracle Business Rulesの変数には、複数のルールで共有する情報が含まれています。Oracle Business Rulesの関数には、ルールに対して再使用するロジックが用意されています。制約によって、ルールのカスタマイズに使用する有効な値のセットが制限されます。
リポジトリを使用してRuleDictionary
オブジェクトを作成または開いた後は、Rules SDKを使用してこのディクショナリにデータ・モデルを作成できます。RuleDictionary
オブジェクトは、DataModel
インスタンスの作成に必要な内部データ構造にアクセスできます。
この章で紹介するデータ・モデルの例には、email
というサンプル・パッケージからインポートしたJavaファクト・タイプが含まれています。このemail
パッケージは、Rule Authorを使用してインポートしました。表6-3に示したクラスとプロパティは、email.jar
をインポートして移入しました。
email
パッケージ・クラス
名前 | 説明 | タイプ |
---|---|---|
|
メッセージの発生を表します。 |
Javaファクト・タイプ |
|
電子メール・アドレスを表します。 |
Javaファクト・タイプ |
|
電子メール・アドレスのリストを表します。 |
Javaファクト・タイプ |
スパムを処理するデータ・モデル例では、email
パッケージが使用され、データ・モデルは、SpamFound
というRLFact
オブジェクトを作成することで推論をサポートします。グローバル・カウントを組み込むには、spamCounter
という変数を作成し、定数のString
変数によってスパムを示します。ルールによって、スパムの電子メール・メッセージが検出されると、killSpam
という関数からアクションが提供されます。表6-4に、これらのデータ・モデル・コンポーネントを示します。
名前 | 説明 | タイプ |
---|---|---|
|
電子メール・メッセージがスパムであると判断された場合にアサートされます。 |
RLファクト・タイプ |
|
スパム・メッセージの件数を累計します。 |
変数 |
|
特別なオファーの |
定数変数 |
|
削除するスパムが検出されるとコールされます。 |
RL関数 |
RuleDictionary
オブジェクトを作成して開いた後は、Rules SDKを使用してeditor.DataModel
インスタンスを作成できます。RuleDictionary
オブジェクトは、DataModel
インスタンスの作成に必要な内部データ構造にアクセスできます。
次に例を示します。
eDM = new oracle.rules.sdk.editor.datamodel.DataModel(m_dict);
データ・モデル・タイプ・システムの基本はFactType
オブジェクトです。FactType
オブジェクトは、プリミティブ、Java、XMLまたはRLファクト・タイプとして定義されます。プリミティブ・ファクト・タイプは固定で、Javaプリミティブ(String、int
、doubleなど)
が含まれます。Rules SDKでは、RuleDictionary
を作成すると、プリミティブ・タイプが自動的に作成されます。JARファイル、クラス・ファイルまたはスキーマ・ファイルからクラスをインポートするときは、JavaおよびXMLのファクト・タイプを作成します。RLファクト・タイプは、Rules SDKを使用して直接作成できます。Java、XMLおよびRLの各ファクト・タイプではクラスが定義され、JavaBeanで定義されたプロパティを表す関連のプロパティとメソッドを指定できます。
データ・モデルの各部分は、適切なModelComponentTable
オブジェクトを使用して作成します。新規インスタンス(Function
、FactType
、Variable
またはConstraint
)の作成に必要な順序は、次のとおりです。
例6-4に、関数インスタンスの作成方法を示します。
FunctionTable ft = eDM.getFunctionTable(); Function fKillSpam = ft.add();
既存のJavaクラスまたはXMLスキーマをインポートするには、Rule Authorアプリケーションを使用する必要があります。SDKでリポジトリを使用できるのは、Rule Authorを使用してクラスまたはスキーマをインポートした後です。SDKの今後のバージョンでは、JavaクラスおよびXMLスキーマを直接インポートできるように機能が拡張される予定です。
Rules SDKでは、FormalParameterTable
オブジェクトを使用して、関数の引数リストを作成します。各FormalParameter
エントリは、1つのパラメータを表します。 1番目のパラメータは、FormalParameterTable
内の1番目(ゼロ)のエントリ、2番目のパラメータは2番目のエントリと、以下同様に続きます。変数が定数の場合があります。この場合は、最初の初期化後に、値を割り当てることはできません。setFinal()
メソッドは、定数の動作を制御します。各FormalParameter
オブジェクトには、タイプと名前があります。仮パラメータのタイプは、使用可能なファクト・タイプから選択されます。
例6-5のコードでは、email
サンプルに対するFormalParameterTable
オブジェクトが作成されます。
// define the parms of the function // basically just an instance of ElectronicMessage // and a String to explain what triggered this FormalParameterTable fKillSpamParmTable = fKillSpam.getFormalParameterTable(); FormalParameter fp1 = fKillSpamParmTable.add(); FormalParameter fp2 = fKillSpamParmTable.add(); fp1.setName("emsg"); fp1.setAlias("Email Message"); // use the alias for the email.ElectronicMessage fact type // will be in the getType_Options list fp1.setType("email.ElectronicMessage"); fp2.setName("reason"); fp2.setAlias("reason"); // use the primitive type for String // will be in the getType_Options list fp2.setType("String");
Rules SDKでは、変数にルールセットの内部の状態が組み込まれます。各変数には、タイプと初期化式を指定する必要があります。変数タイプは、使用可能なファクト・タイプ(データ・モデルにはすべてのファクト・タイプが定義されています)のリストから選択します。
式には、次の2つのタイプがあります。
Expression
このタイプの式は、次の形式に従う必要があります。
operand operator operand
Expression
で使用可能なオペランドと演算子は、AdvancedExpression
で使用可能なオペランドと演算子よりも制限されています。たとえば、Expression
では、オペランドに、パラメータが必要な関数を使用できません。
AdvancedExpression
このタイプの式では、すべてのオペランドと演算子が使用できます。
式の初期化には、AdvancedExpression
を使用することをお薦めします。例6-6に、変数の初期値の設定方法を示します。
InitialValue iv = var.getValue(); AdvancedExpression adv = iv.getAdvancedExpression(); adv.insert(0, "¥"FIXEDVALUE¥"");
RL関数本体は、RL Languageの複数の文字列で構成されます。RL関数本体は、任意の関数パラメータ、つまり任意のグローバル変数を参照する場合があります。関数本体は文字列で入力します。この文字列は、構文として正しいRL Languageである必要があります(例6-7を参照)。
//set the body of the function // in this case just pretty print a message fKillSpam.setBody(" println(¥" email from: ¥" + emsg.getSender() + ¥" because ¥" + reason)" );
Rules SDKでは、ルールは(条件と呼ばれる)条件式で、条件がtrueと評価された場合に実行される一連のアクションです。ルール条件は、一連のパターンで構成されます。パターンによって一致タイプが決まり、そのタイプと、前のパターン(順序に意味があります)に出現した他のタイプに対するテストが組み込まれます。ルール・アクションには、コール、割当て、取消しおよびアサーションがあります。
図6-1に、ルールセットの一般的なコンテナ階層を示します。
Rules SDKには、これらの各オブジェクトを表すクラスが用意されています。すべてのクラスは、RuleComponent
の下位クラスです。コレクション(ルールセット内のルール、ルール内のパターン、ルール内のアクションなど)の場合は、特定のコレクションを管理するために、Rules SDKによって、RuleComponentTable
より下位のクラスが提供されます(図6-2を参照)。RuleComponentTable
サブクラスでは、表で表す特定のサブクラスに対して特別なadd()
メソッドが提供されます。
XMLスキーマ、Javaクラス、RLグローバル変数およびRL関数を記述したRules SDKコンポーネントは、(ディクショナリに格納された)データ・モデル内にあります。通常、RuleComponent
インスタンスは、データ・モデル・エンティティを参照します。
一般的に、RuleComponent
オブジェクトの作成に使用する順序は、次のとおりです。
RuleSet
コンストラクタを使用して、RuleSet
インスタンスを作成します。
PatternTable
、ActionTable
、ExpressionTable
、SimpleTestTable
)のadd()
メソッドによって、RuleSet
の子を作成します。
Rules SDK APIには、RuleSet
内のコレクションを表すクラスが用意されています。これらの各オブジェクトは、RuleComponent
の下位オブジェクトです。コレクション(ルールセット内のルール、ルール内のパターンまたはルール内のアクションなど)の場合は、特定のコレクションを管理するために、Rules SDKによって、RuleComponentTable
クラスより下位のクラスが提供されます。RuleComponentTable
サブクラスでは、表で表す特定のサブクラスに対して特別なadd()
メソッドが提供されます。
例6-8のコードでは、emailサンプルに対するRuleSet
が作成されます。
oracle.rules.sdk.editor.ruleset.RuleSet rs = null; try { rs = new oracle.rules.sdk.editor.ruleset.RuleSet(m_dict); m_curBean = rs; rs.setName("SpamRuleSet"); } catch (Exception e) { System.out.println(" create RuleSet FAILED"); addException(e); return; }
Rules SDKには、RuleSet
内のオブジェクトを表すクラスが用意されています。これらの各オブジェクトは、RuleComponent
オブジェクトの下位オブジェクトです。コレクション(ルールセット内のルール、ルール内のパターンまたはルール内のアクションなど)の場合は、特定のコレクションを管理するために、Rules SDKによって、RuleComponentTable
クラスより下位のクラスが提供されます。RuleComponentTable
サブクラスでは、表で表す特定のサブクラスに対して特別なadd()
メソッドが提供されます。
コレクションの一部ではないクラスがいくつかあります。これらのクラスにアクセスするには、getterインタフェースで親Beanを使用します。たとえば、適切なPattern
インスタンスでgetAdvancedExpression()
を起動し、AdvancedExpression
を取得します。
例6-9のコードは、ルールセット内の表にルールを追加する方法を示しています。
//add rule to the table oracle.rules.sdk.editor.ruleset.Rule r = rs.getRuleTable().add(); r.setName("DetectSpamRule");
Rules SDK APIには、パターンを表すPattern
クラスが用意されています。getPatternTable
サブクラスには、例6-10に示すように、パターン・オブジェクトを追加するための特別なadd()
メソッドが用意されています。
//add pattern to the rule oracle.rules.sdk.editor.ruleset.Pattern p = r.getPatternTable().add(); //set pattern p.setVariable("xx"); p.setFactType( "email.ElectronicMessage"); p.setTestForm("Advanced");
TestForm
プロパティでは、パターンに関連付けられたテストのタイプが定義されます。
すべてのPattern
には、そのPattern
に関連したテストを指定できます。テストには、SimpleTest
オブジェクトまたはAdvancedExpression
オブジェクトの形式を採用できます。Pattern
に指定できるテスト数に制限はありません。
RL Languageの生成時には、Rules SDKの論理積(AND)もテストします。たとえば、emailの例に使用するテストには、パラメータ付きの関数が必要です。このためには、AdvancedExpression
オブジェクトが必要です(例6-11を参照)。
AdvancedExpression adv = (AdvancedExpression)p.get("AdvancedExpression"); // FUNCTION and Variable complex expression adv.put("Function", "containsString"); adv.insert(0, adv.getFunctionDescription()); //System.out.println(" function is: <<" + adv.getFunctionDescription() + ">>"); //set the function parms // normally the cursor position is set by user input actions adv.setVariable("SPECIAL OFFER"); adv.replace(17, 57, adv.getVariable() ); adv.insert( ((String)adv.getValue()).length() , "," ); adv.setVariable("message.subject"); adv.insert( ((String)adv.getValue()).length() + 1, adv.getVariable() ); adv.insert( ((String)adv.getValue()).length() , " )" ); //since boolean, this is a single operator no need for anything else
テストが次のような形式の場合は、
operand operator operand
どちらのオペランドもパラメータを必要としない関数であるため、SimpleTest
を使用できます。たとえば、パターン変数名がemsgで、テストがemsg.sender == david@fun.comの場合、簡易テストでは、例6-12のようになります。
// use the simple form of tests p1.put("TestForm", Pattern.TEST_FORM_SIMPLE); ////////////////////////////////////////////////////////////////////// // add a SimpleTest to the Pattern // emsg.sender == "david@fun.com" ////////////////////////////////////////////////////////////////////// //create a simple test SimpleTest simple = p1.getSimpleTestTable().add(); // // emsg.sender == "david@fun.com" // set the left side Expression lhs = simple.getLeft(); lhs.setForm(Expression.FORM_SINGLE_TERM); lhs.setSingleTermValue("emsg.sender"); // set the operator simple.setOperator("=="); // set the right hand side Expression rhs = simple.getRight(); rhs.setForm(Expression.FORM_ADVANCED); AdvancedExpression radv = rhs.getAdvancedExpression(); radv.insert(0, "¥"david@fun.com¥"");
Rules SDKでは、次のタイプのActions
をサポートしています。
アクションのsetForm
プロパティ内の設定によって、アクションのタイプが定義されます。特定のルールに関連付けられたgetActionTable
インスタンスのadd()
メソッドを使用して、アクションを追加します(例6-13を参照)。
////////////////////////////////////////////////////////////////////// // Add a action to retract the instance of SpamFound ////////////////////////////////////////////////////////////////////// act = spamRule.getActionTable().add(); act.setForm(Action.FORM_RETRACT); act.setTarget("spamMessage"); // see above setVariable ////////////////////////////////////////////////////////////////////// // Add a action to call the kill spam function ////////////////////////////////////////////////////////////////////// act = spamRule.getActionTable().add(); act.setForm(Action.FORM_CALL); act.setTarget("kill spam"); //see the datamodel fn definitions, alias for fnKillSpam Expression exp1 = act.getExpression(0); Expression exp2 = act.getExpression(1); exp1.setForm(Expression.FORM_ADVANCED); exp2.setForm(Expression.FORM_ADVANCED); AdvancedExpression adv1 = exp1.getAdvancedExpression(); AdvancedExpression adv2 = exp2.getAdvancedExpression(); adv1.setVariable("spamMessage.Spam Email"); adv1.insert(0, adv1.getVariable()); adv2.setVariable("spamMessage.Why is this spam"); adv2.insert(0, adv2.getVariable());
RuleSet
にコンポーネントを追加する順序は重要です。必要な子オブジェクトは、親オブジェクトを使用して作成します。たとえば、RuleSet
のRuleTable
インスタンスにルールを追加できるのは、RuleSet
インスタンスを作成した後です。RuleSet
を作成した後で、RuleTable
のadd()
メソッドを使用して、RuleSet
にルールを追加します。次に、PatternTable.add()
メソッドを使用して、ルールにルール・パターンを追加します。最後に、Pattern
内にテストを作成するには、getAdvancedExpression()
を使用して、AdvancedExpression
にアクセスするか、標準モードのテストの場合は、SimpleTestTable.add()
を使用します。
|
![]() Copyright © 2005, 2006, Oracle Corporation. All Rights Reserved. |
|