A.4 Javaサーバー・プラグイン開発者リファレンス

この付録では、Oracle Internet Directoryのサーバー・プラグイン・フレームワークのJava APIについて説明します。

顧客と社内の両方からの要望に応え、オラクル社ではOracle Internet Directoryのサーバー・プラグイン・フレームワークにJava APIを追加しました。サーバー・チェーンなど、Oracle Internet Directoryの新機能のいくつかは、JavaプラグインAPIを使用して開発されました。

この付録の内容は次のとおりです。

A.4.1 Javaプラグインの利点

Java言語自体の利点に加え、Javaサーバー・プラグインには、PL/SQLプラグインに優る多くの利点があります

次のタイプです。

  • サーバーとプラグイン間の双方向通信

  • プラグインで検索結果を戻す機能

  • moddn操作のサポート

  • パフォーマンスの向上

  • データベースの知識が不要

  • セキュリティの強化

  • デバッグ機能の強化

A.4.2 Javaプラグインの設定

次のトピックの説明に従って、Javaプラグインを設定できます。

Javaプラグインを設定するには:

  1. 事前定義済のクラス定義およびメソッドを使用して、スタンドアロンのJavaプログラムを作成します。プラグインは、jarファイルまたはパッケージとして実装できます。
  2. プラグイン・ファイルまたはパッケージをコンパイルします。コンパイルする前に、CLASSPATHが$ORACLE_HOME/ldap/jlib/ospf.jarに設定されていることを確認します。コンパイルがエラーなしで完了していることを確認します。
  3. クラス・ファイル、jarまたはパッケージを、事前に定義したクラスの場所$ORACLE_HOME/ldap/server/pluginに配置します。
  4. プラグイン構成エントリを追加してJavaプラグインを登録します。

    エントリは、コマンド行またはOracle Directory Services Managerを使用して追加できます。詳細は、「コマンド行でのプラグインの登録」および「Oracle Directory Services ManagerおよびOracle Enterprise Manager Fusion Middleware Controlを使用したプラグインの管理」を参照してください。

jarファイルには任意の名前を付けることができます。マニフェスト・ファイルには、後ろにJavaプラグインの名前が続く、属性Main-Classが含まれている必要があります。次に例を示します。

Main-Class: myjavaplugin

プラグイン構成エントリのorclPluginName属性の値は、次のいずれかと対応している必要があります。

  • クラス・ファイル内のクラス名

  • パッケージ内のクラスの完全修飾名

  • jarファイル名

表A-3に、プラグイン名および対応するパスを示します。

前述のステップの実行後は、起動基準が満たされるたびに、サーバーによりプラグインが起動されます。

jarファイルに含まれるクラスが環境内に存在しないようにしてください。存在すると、予期しないエラーが発生する可能性があります。この問題を修正するには、環境からクラスを削除し、Oracle Internet Directoryサーバーを再起動します。JARファイルまたはクラス・ファイルが他のJARファイルやクラス・ファイルに依存している場合は、依存しているJARファイルまたはクラス・ファイルのパスをCLASSPATHに追加して、Oracle Internet Directoryサーバーを再起動します。

プラグインが実行されるたびにサーバーでJavaプラグイン・クラスをリロードするかどうかは、制御できます。属性orclPluginClassReloadEnabledの値が1の場合、サーバーはプラグイン・クラスを毎回リロードします。値が0の場合、サーバーは、プラグインの最初の実行時にのみクラスをロードします。

Oracle Internet Directoryサーバー・プラグイン・フレームワークのjarファイルのパスは、$ORACLE_HOME/ldap/jlib/ospf.jarです。

A.4.3 orclPluginName値

orclPluginName属性の値により、サーバーでクラスまたはjarファイルを検索する場所が決定されます。

表A-3に、いくつかの例を示します。

表A-3 プラグイン名および対応するパス

orclPluginName パス

myjavaplugin

ORACLE_HOME/ldap/server/plugin/myjavaplugin.class

myjavaplugin.jar

ORACLE_HOME/ldap/server/plugin/myjavaplugin.jar

my.package.myjavaplugin

ORACLE_HOME/ldap/server/plugin/my/package/myjavaplugin

A.4.4 JavaプラグインAPIの概要

この項では、APIの概要を把握し、メイン・クラスやインタフェースの役割を理解します。

すべてのJavaサーバー・プラグイン・クラスおよびインタフェースの詳細は、『Oracle® Fusion Middleware Java API Reference for Oracle Internet Directory』を参照してください。

この項の内容は次のとおりです。

ノート:

JavaプラグインではSystem.exit()を使用しないでください。使用すると、Oracleディレクトリ・サーバーが予期しない動作をする可能性があります。

A.4.4.1 サーバーとプラグイン間の通信

すべてのJavaプラグインでは、プラグインとOracle Internet Directoryサーバーとの通信にServerPluginインタフェースが使用されます。サーバーによりJavaプラグインが起動される際に、PluginDetailオブジェクトが構成され、そのオブジェクトのプラグインに情報が渡されます。プラグインにより、PluginResultオブジェクトが構成されます。タスクが完了すると、プラグインによりPluginResultオブジェクトがサーバーに戻されます。プラグインにより、PluginDetailから受信した情報に変更または追加が加えられ、PluginResultオブジェクトに含めたその情報がサーバーに戻される場合もあります。図A-3は、Oracle Internet DirectoryサーバーとJavaプラグインの間の通信を示しています。

図A-3 サーバーとJavaプラグインの間の通信

本文中で説明されています。

Javaプラグインでは、ログ・ファイルにメッセージを記録するために、ServerLogクラスも使用できます。

A.4.4.2 Javaプラグインの構造

次に、Javaプラグインの一般的な構造を示します。

public class Java_Plug-in_Class_Name {extends ServerPluginAdapter} {
     	public PluginResult 
Name_of_ServerPlugin_Method(PluginDetail plgObj)
throws Exception {
      // Plug-in Code
      }
}

または

public class Java_Plug-in_Class_Name {implements ServerPlugin}  {
     	public PluginResult 
Name_of_ServerPlugin_Method(PluginDetail plgObj)
throws Exception {
      // Plug-in Code
      }
}

A.4.4.3 PluginDetailの概要

PluginDetailには、次の項で説明する情報が含まれます。

A.4.4.3.1 サーバー・オブジェクト

このオブジェクトには、プラグインが実行されるOracle Internet Directoryサーバーに関するメタデータ情報が含まれます。次の情報が含まれます。

  • Hostname

  • Port

  • LdapContext

HostnameおよびPortは、サーバーが稼働しているホストとポートを示します。

LdapContextオブジェクトによって、プラグインはサーバーに接続し返し、接続がプラグインから取得されていることを通知できます。これは、ldapbind自体を実行するldapbindプラグインなどに必要です。LdapContextオブジェクトを使用してサーバーに接続すると、サーバーにより同じプラグインが起動され、それが原因で無限ループが発生するのを防ぐことができます。

次のコード・フラグメントは、プラグインがPluginDetailからServerオブジェクトを取得し、サーバーに接続する様子を示しています。

// An LDAP Bind Plug-in
public class MyBindPlugin extends ServerPluginAdapter
{
  …..
  // Retrieve the Server Object from the PluginDetail
  Server srvObj = plgObj.getServer();
  ……
  // This bind will not result in the LDAP Bind Plug-in being called  
  // in an infinite loop
  InitialLdapContext myConn = 
                           
(InitialLdapContext)srvObj.getLdapContextFromServerPlugin();
  myConn.bind(…);
  ….
}

例で使用されているメソッドの詳細は、『Oracle® Fusion Middleware Java API Reference for Oracle Internet Directory』を参照してください。

A.4.4.3.2 LdapBaseEntry

LdapBaseEntryには、次の情報が含まれます。

  • DN

  • 属性

ldapaddを除き、すべての操作のDN情報をサーバーから送信する必要があります。表A-4は、各操作のDNの内容を示しています。

表A-4 各LDAP操作のDN情報の内容

操作 DNの内容

ldapadd

DNは送信されません

ldapbind

ディレクトリ・サーバーがバインドを試行するエントリ。

ldapcompare

比較が実行されるベース・エントリ。

ldapdelete

タイミングが前および操作時の場合に削除されるエントリ。

タイミングが後の場合、DNは送信されません。

ldapmoddn

移動対象のベース・エントリ。

ldapmodify

タイミングが前および操作時の場合に変更が行われるエントリ。

タイミングが後の場合に変更されるエントリ。

ldapsearch

検索のベース・エントリ。

AttributesはJNDI属性です。

LdapBaseEntryには、DNおよびAttributesにアクセスするためのメソッドがあります。LdapBaseEntryがグループ・エントリで、エントリ・キャッシュ機能が無効な場合、パフォーマンス上の理由から、属性uniquememberおよびmemberにはアクセスできません。

関連項目:

『パフォーマンスのチューニング』Oracle Internet Directoryのパフォーマンスのチューニングに関する項

A.4.4.3.3 LdapOperationの動作

この項では、LdapOperationとは何であるかを説明し、追加、バインド、削除、比較、検索、変更など様々な操作について説明します。

この項では、次の項目について説明します。

A.4.4.3.3.1 LDAP操作

すべてのプラグインは、add、bind、compare、delete、moddn、modifyまたはsearchの7つの基本的なLDAP操作のいずれかに関連付けられています。LdapOperationオブジェクトには、次の情報が含まれ、7つのすべての操作に渡されます。

  • バインドDN

  • サーバー制御

  • Operation Result Code

Bind DNは、LDAP操作をリクエストするアイデンティティの識別名です。Server Controlsは、制御情報を含むベクターです。操作中に任意のサーバー・コントロールがサーバーに渡された場合、制御情報はServer ControlsのJavaプラグインに渡されます。表A-4に示すように、Operation Result Codeの内容は操作のタイミングによって異なります。操作時置換の場合、プラグインによるOperation Result Codeの情報の変更が可能で、その情報はPluginResultに含められてサーバーに渡されます。

表A-5 Operation Result Codeの動作

プラグインのタイミング Operation Result Codeの内容および動作

操作時

使用しません

操作時置換

プラグインによって行われたLDAP操作のエラー状態。プラグインからサーバーへの出力。

サーバーによって実行されたLDAP操作のエラー・ステータス。サーバーからプラグインへの入力です。

LdapOperationには、コンテンツを取得および変更するためのメソッドもあります。

7つのLDAP操作を表す異なる7つのクラスにより、LdapOperationクラスが拡張されます。各サブクラスには、LdapOperation情報の他に、クラス固有の情報も含まれます。表A-6は、クラスおよびクラス固有の情報を示しています。表A-6の各クラス名は、そのクラスの詳細が説明されている項にリンクされています。

表A-6 LdapOperationのサブクラスおよびクラス固有の情報。

クラス クラス固有の情報

AddLdapOperation

LdapEntry

BindLdapOperation

バインド・パスワード

CompareLdapOperation

属性名

属性値

DeleteLdapOperation

Delete DN

ModdnLdapOperation

New Parent DN

New Relative DN

Delete Old RDN

New DN

ModifyLdapOperation

LdapModification

SearchLdapOperation

フィルタ

必須属性

有効範囲

SearchResultSet(サーバーからは送信されず、データを戻すためにプラグインによって作成されます。)

各クラスには、情報を作成、変更および取得するためのメソッドもあります。クラス固有の情報は、プラグインへの入力またはプラグインからサーバーへの出力(あるいはその両方)を表します。

操作固有のクラスの詳細は、この項のこれ以降の部分で説明します。

A.4.4.3.3.2 AddLdapOperation

ldapaddプラグインの起動時に、サーバーにより、追加するエントリの情報を渡すためのLdapEntryオブジェクトを含むAddLdapOperationオブジェクトが構成されます。LdapEntryオブジェクトには、次の情報が含まれます。

  • DN

  • 属性

DNは、追加するエントリの識別名を表します。Attributesは、エントリのJNDI属性です。表A-7に示すように、操作後を除くすべての操作で、プラグインによるLdapEntryの情報の変更が可能で、その情報はサーバーに戻されます。

表A-7 各プラグインのタイミングに対するLdapEntry情報の動作

プラグインのタイミング LdapEntry情報の動作

操作時

操作時置換

入力および出力の両方。プラグインによる情報の変更が可能で、その情報はサーバーに戻されます。

入力のみ。

A.4.4.3.3.3 BindLdapOperation

サーバーにより、ldapbindプラグインに次の情報が渡されます。

  • バインド・パスワード

  • Proxy Requester DN

Bind Passwordは、バインド用のパスワードです。Proxy Requester DNは、プロキシ・スイッチをリクエストするアイデンティティの識別名です。

A.4.4.3.3.4 CompareLdapOperation

サーバーにより、ldapcompareプラグインに次の情報が渡されます。

  • 属性名

  • 属性値

Attribute Nameは、ldapcompare操作中に比較される名前です。表A-8に示すように、操作後を除くすべての操作で、プラグインによるAttribute Nameの情報の変更が可能で、その情報はサーバーに戻されます。

表A-8 各プラグインのタイミングに対するAttributeNameの動作

プラグインのタイミング Attribute Name情報の動作

操作時

操作時置換

入力および出力の両方。プラグインによる情報の変更が可能で、その情報はサーバーに戻されます。

入力のみ。

Attribute Valueは、ldapcompare操作中に比較される値です。表A-9に示すように、操作後を除くすべての操作で、プラグインによるAttribute Valueの情報の変更が可能で、その情報はサーバーに戻されます。

表A-9 各プラグインのタイミングに対するAttribute Valueの動作

プラグインのタイミング Attribute Value情報の動作

操作時

操作時置換

入力および出力の両方。プラグインによる情報の変更が可能で、その情報はサーバーに戻されます。

入力のみ。

A.4.4.3.3.5 DeleteLdapOperation

サーバーはDelete DNオブジェクトをldapdeleteプラグインに渡します。これは削除される識別名です。表A-10に示すように、操作後を除くすべての操作で、プラグインによるDelete DNの情報の変更が可能で、その情報はサーバーに戻されます。

表A-10 各プラグインのタイミングに対するDelete DNの動作

プラグインのタイミング DeleteDN情報の動作

操作時

操作時置換

入力および出力の両方。プラグインによる情報の変更が可能で、その情報はサーバーに戻されます。

入力のみ。

A.4.4.3.3.6 ModdnLdapOperation

サーバーにより、ldapmoddnプラグインに次の情報が渡されます。

  • New Parent DN

  • New Relative DN

  • Delete Old RDN

  • New DN

New Parent DNには、PluginDetailLdapBaseEntryに指定されたRDNの新規の親が含まれます。表A-11に示すように、操作後を除くすべての操作で、プラグインによるNew Parent DNの情報の変更が可能で、その情報はサーバーに戻されます。

表A-11 各プラグインのタイミングに対するNew Parent DN情報の動作

プラグインのタイミング New Parent DN情報の動作

操作時

操作時置換

入力および出力の両方。プラグインによる情報の変更が可能で、その情報はサーバーに戻されます。

入力のみ。

New Relative DNは、PluginDetailLdapBaseEntryに指定されたRDNを置き換える新規のRDNです。表A-12に示すように、操作後を除くすべての操作で、プラグインによるNew Relative DNの情報の変更が可能で、その情報はサーバーに戻されます。

表A-12 各プラグインのタイミングに対するNew Relative DN情報の動作

プラグインのタイミング New Relative DN情報の動作

操作時

操作時置換

入力および出力の両方。プラグインによる情報の変更が可能で、その情報はサーバーに戻されます。

入力のみ。

Delete Old RDN値には、PluginDetailLdapBaseEntryに指定されている古いRDNを、新規の相対識別名に置き換えた後も格納するかどうかを指定します。表A-13に示すように、操作後を除くすべての操作で、プラグインによるDelete Old RDNの値の変更が可能で、その情報はサーバーに戻されます。

表A-13 各プラグインのタイミングに対するDelete Old RDN情報の動作

プラグインのタイミング Delete Old RDN情報の動作

操作時

操作時置換

入力および出力の両方。プラグインによる情報の変更が可能で、その情報はサーバーに戻されます。

入力のみ。

New DNは、ldapmoddn操作のターゲット識別名を指定します。この情報は、サーバーからプラグインへの入力のみです。プラグインがこの情報を変更してサーバーに戻すことはできません。

A.4.4.3.3.7 ModifyLdapOperation

サーバーにより、ldapmodifyプラグインにLdapModificationオブジェクトが渡されます。LdapModificationオブジェクトには、JNDI変更アイテムであるModification Itemが含まれます。表A-14に示すように、操作後を除くすべての操作で、プラグインによるLdapModificationの情報の変更が可能で、その情報はサーバーに戻されます。

表A-14 各プラグインのタイミングに対するLdapModification情報の動作

プラグインのタイミング LdapModification情報の動作

操作時

操作時置換

入力および出力の両方。プラグインによる情報の変更が可能で、その情報はサーバーに戻されます。

入力のみ。

A.4.4.3.3.8 SearchLdapOperation

SearchLdapOperationオブジェクトには、次の情報が含まれます。

  • フィルタ

  • 必須属性

  • 有効範囲

  • SearchResultSet

Filter、Required AttributesおよびScopeはサーバーによって渡されます。

Filterには、ldapsearch操作に指定されたLDAP検索フィルタが含まれます。これは、プラグインへの入力のみです。プラグインがこの情報を変更してサーバーに戻すことはできません。

Required Attributesには、ldapsearch操作に指定された必須属性が含まれます。表A-15に示すように、操作後を除くすべての操作で、プラグインによるRequired Attributesの情報の変更が可能で、その情報はサーバーに戻されます。

表A-15 各プラグインのタイミングに対するRequired Attributesの動作

プラグインのタイミング Required Attributes情報の動作

操作時

操作時置換

入力および出力の両方。プラグインによる情報の変更が可能で、その情報はサーバーに戻されます。

入力のみ。

Scopeには、ldapsearch操作により実行される検索の範囲が含まれます。表A-16に示すように、操作後を除くすべての操作で、プラグインによるScopeの情報の変更が可能で、その情報はサーバーに戻されます。

表A-16 各プラグインのタイミングに対するScopeの動作

プラグインのタイミング Scope情報の動作

操作時

操作時置換

入力および出力の両方。プラグインによる情報の変更が可能で、その情報はサーバーに戻されます。

入力のみ。

SearchResultSetは、Javaプラグインからサーバーに戻される検索結果を定義します。ldapsearch操作を実行するプラグインは、このオブジェクトを構成できます。表A-17に示すように、SearchResultSetをサーバーに戻すことができるのは操作時プラグインと操作時置換プラグインのみです。

表A-17 各プラグインのタイミングに対するSearchResultSetの動作

プラグインのタイミング SearchResultSet情報の動作

このプラグインはオブジェクトを戻せません。

操作時

操作時置換

このプラグインは、サーバーにオブジェクトを戻すことができます。

このプラグインはオブジェクトを戻せません。

A.4.4.3.4 PluginFlexfield

プラグインを登録すると、プラグイン構成エントリにカスタム情報を格納できます。サーバーによりプラグインが起動される際に、この情報がプラグイン・フィールドPluginFlexfieldに渡されます。

構成エントリにカスタム情報を格納するためのスキーマ属性は3つあります。orclPluginFlexfield属性にはテキスト情報を格納できます。格納するカスタム情報をさらに詳細に記録するには、サブタイプを使用できます。たとえば、サブタイプorclPluginFlexfield;ad-hostを使用して、プラグインが接続する必要のあるActive Directoryサーバーのホスト名を格納できます。

orclPluginBinaryFlexfield属性には、バイナリ値を格納できます。サーバーではバイナリ属性の属性サブタイプがサポートされていないため、プラグインごとにorclPluginBinaryFlexfieldに格納できるのは1つの値のみです。

クリアテキストには表示しないカスタム・テキスト情報を格納するには、orclPluginSecuredFlexfieldを使用できます。値は暗号化形式で格納および表示されます。ユーザーがこの属性をクリアテキストで取得できないようにするため、Oracle Internet Directoryでは必ずプライバシ・モードを有効にします。「機密の属性のプライバシ・モードの有効化」を参照してください。格納するカスタム情報をさらに詳細に記録するには、サブタイプを使用できます。orclPluginFlexfieldと同じサブタイプ形式を使用してください。

サーバーによりプラグインが起動されるときに、orclPluginFlexfieldorclPluginBinaryFlexfieldおよびorclPluginSecuredFlexfieldからPluginFlexfieldオブジェクトに情報が渡されます。プラグインにより情報が解析されて使用されます。これは、PluginFlexfieldをサーバーに返すことはできません。

次に示す構成エントリの例では、orclPluginFlexfieldのサブタイプにより、パスワードの長さは8文字以上で、数値が含まれている必要があり、同じ文字は繰返し使用できないことが指定されています。

dn: cn=pre_add replace,cn=plugin,cn=subconfigsubentry
orclPluginFlexfield;minPwdLength: 8
orclPluginFlexfield;isDigitPwd: 1
orclPluginFlexfield;isRepeatCharsPwd: 0
objectclass: orclPluginConfig
objectclass: top
orclpluginname: MyJavaPwdCheckPlugin
orclplugintype: configuration
orclplugintiming: pre
orclpluginldapoperation: ldapadd
orclpluginenable: 1
orclpluginsubscriberdnlist: cn=users,dc=us,dc=oracle,dc=com
orclpluginattributelist: userpassword
orclPluginKind: Java

A.4.4.4 PluginResult

実行結果をサーバーに戻すため、JavaプラグインによりPluginResultオブジェクトが構成され、そのオブジェクトがサーバーに渡されます。PluginResultには、LdapOperationまたはその操作固有のサブクラスの1つの、いずれかのオブジェクトが含まれます。これらのオブジェクトは、「LdapOperationの動作」で説明しました。その項で説明しているように、操作およびタイミングによっては、PluginDetailから受信したLdapOperationサブクラス・オブジェクトの情報をプラグインが変更可能で、そのオブジェクトはPluginResultに含められてサーバーに戻されます。

A.4.4.5 LDAP操作のServerPluginインタフェース・メソッド

すべてのJavaプラグインでは、ServerPluginインタフェースが使用されます。このインタフェースには、サーバーと通信するための事前定義済のメソッドがあります。各LDAP操作およびタイミングに対して1つのメソッドがあります。各メソッドでは、PluginDetailオブジェクトが入力として使用され、PluginResultオブジェクトがOracle Internet Directoryサーバーに返されます。

ServerPluginAdapterクラスは、ServerPluginインタフェースを実装します。ServerPluginAdapterクラスには、デフォルト(NULL)で、ServerPluginメソッドが実装されています。このクラスを使用すると、すべてのメソッドを実装しなくてもJavaプラグインをコーディングできます。

この項のこれ以降では、各LDAP操作のServerPluginメソッドを示します。内容は次のとおりです。

A.4.4.5.1 LdapbindのServerPluginメソッド
public PluginResult pre_bind(PluginDetail pc) throws Exception;
public PluginResult when_bind_replace(PluginDetail pc) throws Exception; 
public PluginResult post_bind(PluginDetail pc) throws Exception;
A.4.4.5.2 LdapcompareのServerPluginメソッド
public PluginResult pre_compare(PluginDetail pc) throws Exception;
public PluginResult when_compare_replace(PluginDetail pc) throws Exception; 
public PluginResult post_compare(PluginDetail pc) throws Exception; 
A.4.4.5.3 LdapaddのServerPluginメソッド
public PluginResult pre_add(PluginDetail pc) throws Exception;
public PluginResult when_add(PluginDetail pc) throws Exception;
public PluginResult when_add_replace(PluginDetail pc) throws Exception;
public PluginResult post_add(PluginDetail pc) throws Exception;
A.4.4.5.4 LdapmodifyのServerPluginメソッド
public PluginResult pre_modify(PluginDetail pc) throws Exception;
public PluginResult when_modify(PluginDetail pc) throws Exception;
public PluginResult when_modify_replace(PluginDetail pc) throws Exception; 
public PluginResult post_modify(PluginDetail pc) throws Exception;
A.4.4.5.5 LdapmoddnのServerPluginメソッド
public PluginResult pre_moddn(PluginDetail pc) throws Exception;
public PluginResult when_moddn(PluginDetail pc) throws Exception;
public PluginResult when_moddn_replace(PluginDetail pc) throws Exception; 
public PluginResult post_moddn(PluginDetail pc) throws Exception;
A.4.4.5.6 LdapsearchのServerPluginメソッド
public PluginResult pre_search(PluginDetail pc) throws Exception;
public PluginResult when_search(PluginDetail pc) throws Exception;
public PluginResult when_search_replace(PluginDetail pc) throws Exception;
public PluginResult post_search(PluginDetail pc) throws Exception;
A.4.4.5.7 LdapdeleteのServerPluginメソッド
public PluginResult pre_delete(PluginDetail pc) throws Exception;
public PluginResult when_delete(PluginDetail pc) throws Exception;
public PluginResult when_delete_replace(PluginDetail pc) throws Exception; 
public PluginResult post_delete(PluginDetail pc) throws Exception;Java plug-in API

A.4.5 Javaプラグイン・エラーおよび例外処理の例

すべての未処理例外は、プラグインの実行中にOracle Internet Directoryサーバーによって捕捉されます。各例外の例外スタック・トレースおよびメッセージは、サーバー・ログ・ファイルに記録されます。

これらの例外は3つのカテゴリに分類されます。

  • ランタイム・エラーおよび例外は、不適切なプラグイン・コードまたはロジックが原因で発生します。Javaプラグインの実行中に生成されたすべてのランタイム・エラーおよび例外(NullPointerExceptionなど)は、サーバーにより捕捉されます。これらのエラーおよび例外は、サーバー・ログ・ファイルに記録されます。

  • プラグインによりスローされる予想される例外は、Oracle Internet Directoryサーバーのログ・ファイルに記録されます。また、例外はプラグインによって捕捉され、サーバー・ログ・ファイルに記録するためにサーバーにスローされます。

  • プラグインでは、PluginExceptionクラスを使用してエラーを生成できます。PluginExceptionオブジェクトまたはそのサブクラスを使用してサーバーに渡されたエラー・メッセージは、LDAPクライアントに渡されます。このメッセージも、例外スタック・トレースおよびメッセージとともに、サーバーによりサーバー・ログ・ファイルに記録されます。

この項では、3つの例を説明します。次のタイプです。

A.4.5.1 ランタイム例外の例

次に、プラグインの実行中に生成される典型的な例外のログ・エントリを示します。

….
06:17:03 * 
    ERROR * gslpg_exceptionHndlr * Exception Message : Error
    ERROR * gslpg_exceptionHndlr * Exception Stack Trace :
              MyCompareJavaPlugin.post_compare(Prog2.java:75)
END
              
BEGIN
2004/10/19:01:52:13 * 
    ServerWorker (REG):4 * ConnID:0 * OpID:1 * OpName:compare
    ERROR * gslpg_exceptionHndlr * Exception Stack Trace :
               java.lang.NullPointerException
              java.util.Hashtable.put(Hashtable.java:393)
               oracle.ldap.ospf.PluginDetail.put(PluginDetail.java:41)
END

A.4.5.2 ランタイム・エラーの例

このエラーは、プラグインMyJavaPlugin$ORACLE_HOME/ldap/server/pluginディレクトリに存在しなかったために発生しました。ログ・ファイル・エントリは次のようになります。

BEGIN
2004/10/19:01:52:13 * 
    ServerWorker (REG):4 * ConnID:0 * OpID:1 * OpName:compare
    ERROR * gslpg_exceptionHndlr * Exception Stack Trace :
               java.lang.NoClassDefFoundError: MyJavaPlugin                
END

A.4.5.3 PluginExceptionの例

PluginExceptionオブジェクトがサーバーにスローされると、Oracle Internet Directoryサーバーにより、その他のエラー・メッセージとともに、標準のプラグイン・エラー・メッセージがLDAPクライアントに戻されます。次に、LDAPクライアントにより表示されるエラーを示します。

ldap_compare: UnKnown Error Encountered
ldap_compare: additional info: Error Message returned by the Java Plug-in 

A.4.6 Javaプラグインのデバッグおよびロギング

プラグインでは、独自のログ・ファイルを保持し、そのファイルにリアルタイムで記録することが可能です。また、プラグインでは、ServerLogクラスを使用して、実行中にOracle Internet Directoryサーバーのログ・ファイルにデバッグ・メッセージを記録できます。

ServerLogクラスにメッセージを記録するためのメソッドは、次のようになります。

public static void log(String message);

ServerLog.log()メソッドにより記録されたメッセージは、先頭に次の文字列が付きます。

* Server Java Plug-in *

次に例を示します。

2006/05/11:01:11:28 * ServerWorker (REG):7
  ConnID:241 * mesgID:2 * OpID:1 * OpName:bind
01:11:28 * Server Java Plug-in * MESSAGE FROM PLUGIN
01:11:28 * Server Java Plug-in * Bind DN :
 cn=ad_user,cn=oiddvusers,cn=oraclecontext,dc=us,dc=oracle,dc=com

プラグインのデバッグ・メッセージをサーバー・ログに記録するには、次に示すデバッグ・レベルのいずれかを使用してOracle Internet Directoryサーバーを起動する必要があります。

表A-18 Javaプラグインのロギングのデバッグ・レベル

Oracle Internet Directoryサーバーのデバッグ・レベル デバッグ・レベルの内容

134217728

Javaプラグイン・フレームワーク関連のすべてのJavaプラグイン・デバッグ・メッセージと内部サーバー・メッセージ

268435456

ServerLogオブジェクトを使用してJavaプラグインによって渡されるすべてのメッセージ

402653184

上の両方

ServerLog.log()メソッドはスレッド・セーフです。このメソッドを実行すると、パフォーマンスが低下する場合があります。

A.4.7 Javaプラグインの例

例を参考にしてJavaプラグインについて理解します。

次の項では、次の例を示します。

ノート:

JavaプラグインではSystem.exit()を使用しないでください。使用すると、Oracleディレクトリ・サーバーが予期しない動作をする可能性があります。

A.4.7.1 例1: パスワード検証プラグイン

この例では、ldapmodify操作の前にuserPasswordを検証するJavaプラグインを説明します。操作前Javaプラグインは、Oracle Internet Directoryサーバーに登録されています。プラグイン構成には、そのプラグインで検証される最低限のパスワードの長さが含まれます。この情報は、orclPluginFlexfield属性を使用して、プラグイン構成エントリに登録されます。サブタイプminPwdLengthには、最低限の長さが指定されます。この情報は、PluginFlexfieldを使用してプラグインに渡されます。orclPluginNameにより、Oracle Internet Directoryサーバーにより起動されるJavaプラグインの名前が指定されます。

プラグインへの入力はPluginDetailで、プラグインからの出力はPluginResultです。

この項では、次の項目について説明します。

A.4.7.1.1 パスワード検証プラグインの構成エントリ
dn: cn=checkuserpassword,cn=plugin,cn=subconfigsubentry
orclPluginFlexfield;minPwdLength: 8
objectclass: orclPluginConfig
objectclass: top
orclpluginname: CheckPassword
orclplugintype: configuration
orclplugintiming: pre
orclpluginldapoperation: ldapmodify
orclpluginenable: 1
orclpluginsubscriberdnlist: cn=users,dc=us,dc=oracle,dc=com
orclpluginattributelist: userPassword
orclPluginKind: Java
A.4.7.1.2 パスワード検証プラグインのコード例
import java.io.*;
import java.lang.*;
import java.util.*;
import javax.naming.*;
import javax.naming.directory.*;
import oracle.ldap.ospf.*;
/**
 * This PRE modify plug-in will check whether the "userPassword"
 * is greater than 8 characters in length
 */
public class CheckPassword extends ServerPluginAdapter {
 
    // This PRE modify plug-in takes in a PluginDetail Object
    // and returns a PluginResult Object
    public PluginResult pre_modify(PluginDetail plgObj)
       throws Exception
    {
       try {
         // Retrieve the LdapOperation Object from the PluginDetail
         ModifyLdapOperation opObj = (ModifyLdapOperation)
plgObj.getLdapOperation();
 
        
         // Retrieve the LdapModification Object from the LdapOperation
            LdapModification modObj = opObj.getLdapModification();
 
 
        
         // Retrieve the PluginFlexfield Object from the PluginDetail
         PluginFlexfield flxFldObj = plgObj.getPluginFlexfield();
        
         // Retrieve the custom information from the PluginFlexfield
         // Get the minimum password length
 String passwdlength =
            flxFldObj.getFlexfield("minPwdLength");
 
        // Create a Result Object to return to the OID server
           PluginResult plgResObj = new PluginResult();
 
         // Check if the LdapModification Object is a NULL
         // set the appropriate error and error message
         if (modObj==null)
         {
            throw new PluginException("CheckPassword Plug-in Execution
Error");
         }
 
          // Retrieve the "userPassword" Attribute Value
         ModificationItem modItem = modObj.getModificationItemAt(0);
         BasicAttribute attr = (BasicAttribute)modItem.getAttribute();
         String attrval = null;
          if ((attr.getID()).equals("userpassword"))
     attrval = attr.get(0);
 
         // Check for the password length and set appropriate error
         // and error message
          if (attrval.length() < Integer.parseInt(passwdlength))
         {
             throw new PluginException("userPassword is less than 8
characters");
         }
        
        // Return the PluginResult Object to the OID Server
        return plgResObj;
    }
    // Catch any unexpected exception which may occur and throw
    // it back to the OID server to log it
    catch (Exception e)
    {
        throw e;
    }
  }
} 

A.4.7.2 例2: Active Directoryの外部認証プラグイン

この例では、Active Directoryの外部認証プラグインを説明します。クライアントがuserPasswordのldapcompare操作をリクエストすると、サーバーによりこのJavaプラグインが起動され、Active Directoryに対してユーザーが認証されます。

この項では、次の項目について説明します。

A.4.7.2.1 外部認証プラグインの構成エントリ
dn: cn=when_rep_comp,cn=plugin,cn=subconfigsubentry
orclpluginsubscriberdnlist: cn=users,dc=us,dc=oracle,dc=com;
orclpluginflexfield;ad-host: dlin-pc2.us.example.com
orclpluginflexfield;ad-port: 3060
orclpluginflexfield;ad-su-dn: administrator@dlin.net
orclpluginflexfield;ad-su-passwd: password1
objectclass: orclPluginConfig
objectclass: top
orclpluginname: ExtAuthAD
orclplugintype: configuration
orclplugintiming: when
orclpluginisreplace: 1
orclpluginldapoperation: ldapcompare
orclpluginversion: 1.0.1
cn: when_rep_comp
orclpluginkind: Java
orclpluginenable: 1
A.4.7.2.2 外部認証プラグインのコード
public class ExtAuthAD extends ServerPluginAdapter {

public PluginResult when_compare_replace(PluginDetail plgObj)
   throws Exception {
   try {

       // Retrieve the LdapOperation from the PluginDetail
       CompareLdapOperation opObj = 
           (CompareLdapOperation) plgObj.getLdapOperation();       String baseDn = plgObj.getLdapBaseEntry().getDN();

       // Retrieve the Base DN, Attribute and Attribute Value
       String bdn = baseDn.substring(0,
             baseDn.lastIndexOf("cn=users,dc=us,dc=oracle,dc=com")-1)
             +",cn=users,dc=dlin,dc=net";
       String ban = opObj.getAttributeName();       String bav = opObj.getAttributeValue().toString();

       // Retrieve the AD Information from the PluginFlexfield
       PluginFlexfield flxObj = plgObj.getPluginFlexfield();
       String adhost = flxObj.getFlexfield("ad-host");
       String adport = flxObj.getFlexfield("ad-port");
       String adsudn = flxObj.getFlexfield("ad-su-dn");
       String adsupasswd = flxObj.getFlexfield("ad-su-passwd");

       // Create a PluginResult Object to return to the OID server
       PluginResult plgResObj = new PluginResult();


       // Create a Hashtable with values required to connect to AD
       Hashtable env = new Hashtable();

       env.put(Context.INITIAL_CONTEXT_FACTORY,
               "com.sun.jndi.ldap.LdapCtxFactory");
       env.put(Context.PROVIDER_URL, "ldap://"+adhost+":"+adport);
       env.put(Context.SECURITY_AUTHENTICATION, "simple");
       env.put(Context.SECURITY_PRINCIPAL, bdn);
       env.put(Context.SECURITY_CREDENTIALS, bav);

       // Try to connect to AD
       DirContext dirContext = null;
       try {
         dirContext = new InitialDirContext(env);
         if (dirContext != null) {
             // User has been successfully authenticated, add the appropriate
             // result code to the LdapOperation
             opObj.setOperationResultCode(6);
         }
       }
       catch(NamingException ne) {
        // Unable to connect to the AD directory server with the given
        // credentials, add the appropriate result code to the LdapOperation
         opObj.setOperationResultCode(5);
       }

       // Add the LdapOperation to the PluginResult
       plgResObj.setLdapOperation(opObj);

       // Return the PluginResult
       return plgResObj;

  } catch(Exception e) {
     // In case of any unexpected errors in the plug-in, throw the Exception
     // back to the OID server to log it     throw e;
   }
  }
 }