ヘッダーをスキップ
Oracle Fusion Middleware Oracle Internet Directory管理者ガイド
11gリリース1(11.1.1)
B55919-01
  目次
目次
索引
索引

戻る
戻る
 
次へ
次へ
 

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

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

この章の項目は次のとおりです。

E.1 Javaプラグインの利点

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

E.2 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を使用したプラグインの管理」を参照してください。

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

Main-Class: myjavaplugin

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

orclPluginName属性の値により、サーバーでクラスまたはjarファイルを検索する場所が決定されます。表E-1に、いくつかの例を示します。

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

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


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

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です。

E.3 JavaプラグインAPI

この項では、APIの高度な概要、およびメイン・クラスやインタフェースの役割を説明します。すべてのJavaサーバー・プラグイン・クラスおよびインタフェースの詳細は、Javadocの『Oracle Fusion Middleware Java API Reference for Oracle Internet Directory』を参照してください。

この項の項目は次のとおりです。


注意:

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

E.3.1 サーバーとプラグイン間の通信

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

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

この図はテキストで説明します。

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

E.3.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
      }
}

E.3.3 PluginDetail

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

E.3.3.1 Server

このオブジェクトには、プラグインが実行される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(…);
  ….
}

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

E.3.3.2 LdapBaseEntry

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

  • DN

  • 属性

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

表E-2 各LDAP操作のDN情報の内容

操作 DNの内容

ldapadd

DNは送信されません。

ldapbind

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

ldapcompare

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

ldapdelete

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

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

ldapmoddn

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

ldapmodify

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

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

ldapsearch

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


AttributesはJNDI属性です。

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


関連項目:

パフォーマンス・チューニングの詳細は、第33章「Oracle Internet Directoryのチューニングとサイズ設定」を参照してください。

E.3.3.3 LdapOperation

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

  • Bind DN

  • Server Controls

  • Operation Result Code

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

表E-3 Operation Result Codeの動作

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

操作時

使用しない

操作時置換

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

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


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

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

表E-4 LdapOperationのサブクラスおよびクラス固有の情報

クラス クラス固有の情報

AddLdapOperation


LdapEntry

BindLdapOperation


Bind Password

CompareLdapOperation


Attribute Name

Attribute Value

DeleteLdapOperation


Delete DN

ModdnLdapOperation


New Parent DN

New Relative DN

Delete Old RDN

New DN

ModifyLdapOperation


LdapModification

SearchLdapOperation


Filter

Required Attributes

Scope

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


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

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

E.3.3.3.1 AddLdapOperation

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

  • DN

  • 属性

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

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

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

操作時

操作時置換

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

入力のみ。


E.3.3.3.2 BindLdapOperation

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

  • Bind Password

  • Proxy Requester DN

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

E.3.3.3.3 CompareLdapOperation

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

  • Attribute Name

  • Attribute Value

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

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

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

操作時

操作時置換

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

入力のみ。


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

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

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

操作時

操作時置換

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

入力のみ。


E.3.3.3.4 DeleteLdapOperation

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

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

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

操作時

操作時置換

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

入力のみ。


E.3.3.3.5 ModdnLdapOperation

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

  • New Parent DN

  • New Relative DN

  • Delete Old RDN

  • New DN

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

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

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

操作時

操作時置換

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

入力のみ。


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

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

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

操作時

操作時置換

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

入力のみ。


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

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

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

操作時

操作時置換

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

入力のみ。


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

E.3.3.3.6 ModifyLdapOperation

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

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

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

操作時

操作時置換

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

入力のみ。


E.3.3.3.7 SearchLdapOperation

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

  • Filter

  • Required Attributes

  • Scope

  • SearchResultSet

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

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

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

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

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

操作時

操作時置換

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

入力のみ。


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

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

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

操作時

操作時置換

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

入力のみ。


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

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

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

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

操作時

操作時置換

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

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


E.3.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

E.3.4 PluginResult

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

E.3.5 ServerPluginインタフェース

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

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

この項のこれ以降では、各LDAP操作のServerPluginメソッドを示します。次に示すメソッドが示されます。

E.3.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;

E.3.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;

E.3.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;

E.3.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;

E.3.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;

E.3.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;

E.3.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

E.4 Javaプラグイン・エラーおよび例外処理

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

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

E.4.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

E.4.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

E.4.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

E.5 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サーバーを起動する必要があります。

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

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

134217728

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

268435456

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

402653184

上の両方


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

E.6 Javaプラグインの例

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


注意:

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

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

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

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

E.6.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

E.6.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;
    }
  }
}

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

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

E.6.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

E.6.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;
   }
  }
 }