この章では、プロバイダプログラムの作成方法について説明します。内容は次のとおりです。
javax.wbem.provider 内の WBEM プロバイダ API の詳細については、/usr/sadm/lib/wbem/doc/index.html を参照してください。
ディスクドライブや CPU といった管理リソース (管理対象のリソース) と通信してデータにアクセスする特別なクラスのことを「プロバイダ」と呼びます。プロバイダは、統合および解釈の目的で、Solaris WBEM サービスの主要 WBEM エージェントである CIMOM (CIM オブジェクトマネージャ) にデータを転送します。また、WBEM リソースのサブセットの管理作業を引き受けることにより、CIMOM の負荷を軽減します。データ転送には、javax.wbem.provider API を使用します。アプリケーションから CIM オブジェクトマネージャリポジトリにないデータを要求されると、CIMOM は、プロバイダインタフェースを使って、この要求を適切なプロバイダに転送します。
Solaris ソフトウェアプロバイダは、さまざまな領域で使用されます。たとえば、ユーザー、グループ、別名、役割、ファイルシステム、ディスク、プロセス、cron ツール、ネットワーク構成、製品レジストリで使用されます。さらに、デバイスやシステムのパフォーマンスの監視にも使用されます。
プロバイダは、インスタンスのテンプレートとなるクラスではなく、インスタンスを作成、変更、および削除します。インスタンスは、永続的な記憶領域に存在しますが、動的に使用することもできます。
プロバイダは独自のプロセスとメモリーを持ちながら、CIMOM から委託された作業を行います。WBEM を正しく機能させるためには、CIMOM に各プロバイダの位置を通知する必要があります。MOF ファイルに新規または変更されたプロバイダを含めることにより、CIMOM にプロバイダの情報を知らせることができます。MOF ファイルは、プロバイダがサポートするクラスおよびインスタンスを定義します。MOF ファイルを登録するには、mofcomp (1M) コマンドを使用します。
管理アプリケーションにデータを提供する – 管理アプリケーションから CIM オブジェクトマネージャリポジトリで使用できない管理リソースのデータを要求された場合、CIMOM は、この要求をプロバイダに転送します。プロバイダは、管理リソースからデータにアクセスし、そのデータを CIMOM に渡します。管理リソースから受け取ったデータがネイティブ形式 (C コードなど) である場合、プロバイダは、そのデータを Java CIM クラスにマップしてから CIMOM に渡します。
管理リソースを制御する – CIMOM は、管理リソースを制御するため、管理アプリケーションから受け取ったデータを適切なプロバイダに渡します。管理リソースがネイティブ形式のデータを必要とする場合、プロバイダは、CIM クラスをリソースのネイティブ形式にマップしてからデータを渡します。
プロバイダと CIMOM は、同じコンピュータに置く必要があります。
永続的でないデータ – プロバイダのメソッドが実行している場合にのみ存在するプロバイダクラスのローカル変数
永続的なメモリー (プロバイダに対してローカル) – プロバイダクラスの大域変数を作成するために使用する。このプロバイダメモリーは、CIMOM を停止して再起動すると消去される
CIM オブジェクトマネージャリポジトリ – この永続的なメモリーは、Solaris WBEM サービスソフトウェアをアンインストールすると消去される。プロバイダは、CIMOM ハンドルと内部プロバイダを使って、CIMOM からこのメモリーにアクセスする必要がある
プロバイダによって管理されるファイルおよびデータベース (つまり動的なデータ) – プロバイダは、システムからデータを取得することにより、データを動的に生成できる。たとえば、システム呼び出しにより、現在実行中のプロセス数を取得できる
プロバイダは、処理できる要求の種類によって分類されます。クライアントプログラムは、CIMOM と通信し、クライアント API 経由で WBEM にアクセスします。CIMOM は、プロバイダメソッドをクライアント API の対応するクライアントメソッドにマップします。ただし、引数リストおよび対応するメソッドの戻り値は異なる場合があります。/usr/sadm/lib/wbem/doc/index.html を参照してください。
CIM オブジェクトマネージャリポジトリにデータを格納している場合、プロバイダは、CIMOM へのハンドルを使ってこのリポジトリにアクセスします。これらのハンドルは、クライアント API のメソッドを呼び出します。プロバイダインタフェースの実装を参照してください。
CIM オブジェクトマネージャリポジトリ内にインスタンスまたは関連を作成する必要がある場合は、内部プロバイダを使用します。プロバイダは、インスタンスのメソッドか、WBEM 内部のアソシエータ (関連) プロバイダのメソッドを呼び出します。プロバイダインタフェースの実装を参照してください。
使用するメソッドおよびクラスの引数リストおよび戻り値が正しいかどうか確認してください。
次の表に Solaris WBEM SDK プロバイダの種類を示します。
表 6–1 プロバイダの種類
種類 |
クラス名 |
説明 |
---|---|---|
インスタンス |
CIMInstanceProvider |
所定のクラスの動的なインスタンスを提供する。インスタンスの取得、列挙、変更、削除をサポートする |
メソッド |
MethodProvider |
1 つ以上のクラスのメソッドを供給する |
アソシエータ |
CIMAssociatorProvider |
動的な関連クラスのインスタンスを供給する |
インジケーション |
EventProvider |
CIM イベントのインジケーションを処理する |
承認 |
なし |
マーカーインタフェースは、プロバイダが独自に承認検査を行うことを CIMOM に知らせる |
関連するメソッドを登録および実装することにより、単一のプロバイダを 1 種類以上のプロバイダとして使用できます。
プロバイダは、単一の Java クラスに含めることができます。また各プロバイダをそれぞれのクラスに分けて保存することもできます。プロバイダ名は、クラスのプロバイダとなる Java クラスを識別します。現時点では、CIMOM は、Java 言語で作成されたプロバイダのみをサポートします。
プロバイダ名およびクラス名は、次の規約に従う必要があります。
クラス名は有効な CIM クラスでなければなりません。すなわち、接頭辞、続いて下線 (_)、最後に文字列の順で構成されていなければなりません。
たとえば、green_apples および red_apples は、有効な CIM クラス名ですが、apples、 apples_、および _apples は、有効なクラス名ではありません。
MOF ファイルに指定するプロバイダ名は、プロバイダクラスファイルの名前と一致する必要があります。
たとえば、SimpleCIMInstanceProvider はプロバイダ名、Ex_SimpleCIMInstanceProvider はクラス名です。
プロバイダ修飾子の前には、必ず「java:」を付けます。これは、プロバイダが Java 言語で作成されていることを CIMOM に認識させるためです。
標準の Java クラスおよびパッケージ命名規則に従って、プロバイダ名を作成します。パッケージ名の接頭辞は、小文字の ASCII 文字で最上位のドメイン名 (com、edu、gov、 mil、net、org) 、または ISO 標準 3166、1981 で指定されている英語 2 文字の国名コードにする必要があります。
パッケージ名のあとに続く名前は、組織内部の命名規則によって異なります。組織内部の規則では、ディレクトリ名のコンポーネントとして、部名、課名、プロジェクト名、マシン名、あるいはログイン名などを指定します。たとえば、プロバイダ名 java:com.sun.wbem.cimom は、次の情報を示します。
java: – プロバイダを記述した言語
com – 最上位のドメイン名
sun – 会社名
wbem – 製品名
cimom – CIMOM を実装するクラスファイルの種類
プロバイダの作成時には、プロバイダがサポートするインタフェースを指定する必要があります。プロバイダがサポートする各インタフェースのすべてのメソッドを実装してください。またすべてのプロバイダには、 CIMProvider インタフェースを実装する必要があります。プロバイダインタフェースには、次の 2 つのメソッドがあります。
initialize(CIMOMHandle cimom) – CIM オブジェクトマネージャリポジトリにデータを格納する場合、プロバイダは、渡された CIMOM ハンドルを、CIMOM との通信に使用する CIMOM ハンドルに指定する必要があります。次に例を示します。
private CIMOMHandle cimom = null; ... public void initialize(CIMOMHandle cimom) throws CIMException { this.cimom = (CIMOMHandle) cimom; |
CIM オブジェクトマネージャリポジトリ内にインスタンスを作成する必要がある場合、またはこのリポジトリ内の関連を操作する必要がある場合、プロバイダはまず、渡された CIMOM ハンドルをサブクラス ProviderCIMOMHandle にキャストする必要があります。次に、内部インスタンスまたは関連プロバイダを取得します。次に例を示します。
private ProviderCIMOMHandle cimom = null; private CIMAssociatorProvider ap = null; ... public void initialize(CIMOMHandle cimom) throws CIMException { this.cimom = (ProviderCIMOMHandle) cimom; ap = pcimom.getInternalProvider(); |
initialize コマンドは、CIMOM の再起動後、プロバイダが初期化されるたびに自動的に実行されます。
cleanup() – 現時点では、可変部分として使用します。
次のコード例は、 Ex_SimpleCIMInstanceProvider クラスの enumerateInstances および getInstance インタフェースを実装します。わかりやすくするために、この例では、CIMException をスローすることによって deleteInstance、createInstance、setInstance、execQuery の各インタフェースを実装します。
execQuery メソッドの実装についての詳細は、照会の構文解析を参照してください。
/* * "@(#)SimpleCIMInstanceProvider.java" */ import javax.wbem.cim.*; import javax.wbem.client.*; import javax.wbem.provider.CIMProvider; import javax.wbem.provider.CIMInstanceProvider; import javax.wbem.provider.MethodProvider; import java.util.*; import java.io.*; public class SimpleCIMInstanceProvider implements CIMInstanceProvider { static int loop = 0; public void initialize(CIMOMHandle cimom) throws CIMException { } public void cleanup() throws CIMException { } public CIMObjectPath[] enumerateInstanceNames(CIMObjectPath op, CIMClass cc) throws CIMException { return null; } /* * enumerateInstances: * 名前だけではなくインスタンス全体を返す */ public CIMInstance[] enumerateInstances(CIMObjectPath op, boolean localOnly,boolean includeQualifiers, boolean includeClassOrigin,String[] propertyList, CIMClass cc) throws CIMException { if (op.getObjectName().equalsIgnoreCase ("Ex_SimpleCIMInstanceProvider")) { Vector instances = new Vector(); CIMInstance ci = cc.newInstance(); if (loop == 0){ ci.setProperty("First", new CIMValue("red")); ci.setProperty("Last", new CIMValue("apple")); // 要求されたプロパティのみを含める ci = ci.filterProperties(propertyList, includeQualifier, includeClassOrigin); instances.addElement(ci); loop += 1; } else { ci.setProperty("First", new CIMValue("red")); ci.setProperty("Last", new CIMValue("apple")); // 要求されたプロパティのみを含める ci = ci.filterProperties(propertyList, includeQualifier, includeClassOrigin); instances.addElement(ci); ci = cc.newInstance(); ci.setProperty("First", new CIMValue("green")); ci.setProperty("Last", new CIMValue("apple")); // 要求されたプロパティのみを含める ci = ci.filterProperties(propertyList, includeQualifier, includeClassOrigin); instances.addElement(ci); } return (CIMInstance[])instances.toArray(); } throw new CIMException(CIM_ERR_INVALID_CLASS); } public CIMInstance getInstance(CIMObjectPath op, boolean localOnly, boolean includeQualifiers, boolean includeClassOrigin, String[] propertyList, CIMClass cc) throws CIMException { if (op.getObjectName().equalsIgnoreCase ("Ex_SimpleCIMInstanceProvider")) { CIMInstance ci = cc.newInstance(); // 取得したいインスタンスを一意に識別するため // オブジェクトパス内の渡された項目からキーを取得することが // 必要である java.util.Vector keys = cop.getKeys(); // これは例なので、キーをインスタンス内に配置するだけで // 終了する ci.setProperties(keys); // キープロパティ以外のプロパティがある場合はここに追加する // 要求されたプロパティのみを含める ci = ci.filterProperties(propertyList, includeQualifiers, includeClassOrigin); return ci; } throw new CIMException(CIM_ERR_INVALID_CLASS); } public CIMInstance[] execQuery(CIMObjectPath op, \ String query, String ql, CIMClass cc) throws CIMException { throw(new CIMException(CIMException.CIM_ERR_NOT_SUPPORTED)); } public void setInstance(CIMObjectPath op, CIMInstance ci, boolean includeQualifiers, String[] propertyList) throws CIMException { throw(new CIMException(CIMException.CIM_ERR_NOT_SUPPORTED)); } public CIMObjectPath createInstance(CIMObjectPath op, CIMInstance ci) throws CIMException { throw(new CIMException( CIMException.CIM_ERR_NOT_SUPPORTED)); } public void deleteInstance(CIMObjectPath cp) throws CIMException { throw(new CIMException(CIMException.CIM_ERR_NOT_SUPPORTED)); } }
クライアントプログラムが Solaris WBEM プロバイダのメソッドを呼び出すためには、invokeMethod メソッドが必要です。これは、組み込み済みのプロバイダと開発者によって追加されたプロバイダの両方に当てはまります。
組み込み済みプロバイダ – 「プラットフォームに依存しない」CIM_* プロバイダ、または Solaris プラットフォーム固有の Solaris_* プロバイダ
開発者によって追加されたプロバイダ – たとえば、MethodProvider インタフェースを実装すると、プロバイダまたは WBEM 以外のメソッドを提供するメソッドプロバイダが作成される
次のコード例では、CIMOM からの要求を 1 つ以上の特別なプロバイダに配信する Solaris_ComputerSystem プロバイダクラスを作成します。これらのプロバイダは、特定の管理対象オブジェクトの動的データの要求を処理します。たとえば、Solaris_Package プロバイダは、Solaris_Package クラスメソッドを実行する要求に対応します。
メソッドプロバイダは、invokeMethod という単一メソッドを実装します。このメソッドは、システムのリブート、システムのシャットダウン、シリアルポートの削除のいずれかの処理を実行する適切なプロバイダを呼び出します。
... public class Solaris_ComputerSystem implements MethodProvider { ProviderCIMOMHandle pch = null; public void initialize(CIMOMHandle ch) throws CIMException { pch = (ProviderCIMOMHandle)ch; } public void cleanup() throws CIMException { } public CIMValue invokeMethod(CIMObjectPath op, String methodName, Vector inParams, Vector outParams) throws CIMException { if (op.getObjectName().equalsIgnoreCase("solaris_computersystem")) { if (methodName.equalsIgnoreCase("reboot")) { // ここに表示されていないヘルパー関数を呼び出す return new CIMValue(rebootSystem()); } if (methodName.equalsIgnoreCase("shutdown")) { // ここに表示されていないヘルパー関数を呼び出す return new CIMValue(shutdownSystem()); } } if (op.getObjectName().equalsIgnoreCase("solaris_serialport")) { if (methodName.equalsIgnoreCase("disableportservice")) { // ここに表示されていないヘルパー関数を呼び出す return new CIMValue(deletePort(op)); } } // ここに到達した場合はエラーを返す throw new CIMException(CIMException.CIM_ERR_NOT_SUPPORTED, "The requested function does not exist"); } // 以下にヘルパー関数を定義する ... }
クライアントプログラムによって呼び出される個々の関連メソッド内の objectName 引数、すなわち CIMObjectPath は、クラスではなく「インスタンス」のオブジェクトパスになっていなければなりません。
CIMOM がインスタンスのオブジェクトパスを認識しない場合は、クライアントが CIM オブジェクトマネージャリポジトリ内の関連のクラス定義を求めているものと見なします。関連のクラス定義には、その関連のメンバーインスタンスを派生するテンプレートが含まれます。したがって、CIMOM は、プロバイダの関連メソッドではなくクライアント API の関連メソッドを使用します。
関連を設計およびコーディングする場合に最も重要な部分は、関連クラスです。作成する関連は、関連クラスのコンテンツ以上には複雑になりません。関連のメンバー数は、関連クラスの参照数に等しくなります。役割は、さらに複雑な関連をモデル化する場合に使用できます。次に、関連クラスの例を示します。
非対称ペア関連。教師と生徒のように 1 対 1 関係では、2 つの役割 (teaches と taughtby) が定義されます。
class TeacherStudent { Teacher REF teaches; Student REF taughtby; }; |
1 対多関係
class Classroom { Teacher REF teaches; Student1 REF taughtby; Student2 REF taughtby; Student3 REF taughtby; Student4 REF taughtby; }; |
多対多関係
class TeachingAssistants { Assistant1 REF assists; Assistant2 REF assists; Student1 REF assistedby; Student2 REF assistedby; Student3 REF assistedby; Student4 REF assistedby; Student5 REF assistedby; }; |
互いに対等な 2 つ以上のメンバーの関連
class Club { Member1 REF; Member2 REF; Member3 REF; }; |
次のコード例では associators メソッドを実装します。CIMOM は、associatorNames、objectName、role、resultRole、includeQualifiers、includeClassOrigin、および propertyList のそれぞれの値を関連プロバイダに渡します。また CIM 関連クラスの名前と、返される関連オブジェクトが属する CIM クラスまたはインスタンスを出力します。このプロバイダは、example_teacher クラスと example_student クラスのインスタンスを処理します。
... public CIMInstance[] associators(CCIMObjectPath assocName, CIMObjectPath objectName, String resultClass, String role, String resultRole, boolean includeQualifiers, boolean includeClassOrigin, String[] propertyList) throws CIMException { System.out.println("Associators "+assocName+" "+objectName); if (objectName.getObjectName()equalsIgnoreCase("example_teacher")) { Vector v = new Vector(); if ((role != null) && (!role.equalsIgnoreCase("teaches"))) { // Teacher は、teaches という役割だけを担う return v; } if ((resultRole != null) && (!resultRole.equalsIgnoreCase ("taughtby"))) { // Teacher は、taughtby という役割によってのみ得られる return v; } // Teacher のアソシエータを取得する CIMProperty nameProp = (CIMProperty)objectName.getKeys().elementAt (0); String name = (String)nameProp.getValue().getValue(); // Student のクラスを取得する CIMObjectPath tempOp = new CIMObjectPath("example_student"); tempOp.setNameSpace(assocName.getNameSpace()); CIMClass cc = cimom.getClass(tempOp, false); // objectName によって渡されたインスタンス名をテストし、Student // クラスの関連インスタンスを返す if(name.equals("teacher1")) { // teacher1 の Student (複数) を取得する CIMInstance ci = cc.newInstance(); ci.setProperty("name", new CIMValue("student1")); v.addElement(ci.filterProperties(propertyList, includeQualifiers, includeClassOrigin)); ci = cc.newInstance(); ci.setProperty("name", new CIMValue("student2")); v.addElement(ci.filterProperties(propertyList, includeQualifiers, includeClassOrigin)); return v; } } }
CIM イベントのインジケーションを生成するには、次のタスクを実行する必要があります。
EventProvider インタフェースのメソッドを使用して、CIM イベントインジケーションの送信をいつ開始および停止するかを検出する
CIM_Indication クラスの 1 つまたは複数のサブクラスのインスタンスを作成し、発生した CIM イベントの情報を格納する
ProviderCIMOMHandle インタフェースの deliverEvent メソッドを使用して、インジケーションを CIMOM に配信する
EventProvider インタフェースを実装します。
次に例を示します。
public class sampleEventProvider implements InstanceProvider EventProvider{ // プロバイダが CIM オブジェクトマネージャに接続するための参照 private ProviderCIMOMHandle cimom; }
プロバイダが処理するインスタンスインジケーションに対して、表 6–2 に示すそれぞれのメソッドを実行します。
作成、変更、および削除のインスタンスイベントに対してインジケーションを作成します。
以下に createInstance メソッドの例を示します。
public CIMObjectPath createInstance(CIMObjectPath op, CIMInstance ci) throws CIMException { CIMObjectpath newop = ip.createInstance(op, ci); CIMInstance indication = new CIMInstance(); indication.setClassName("CIM_InstCreation"); CIMProperty cp = new CIMProperty(); cp.setName("SourceInstance"); cp.setValue(new CIMValue(ci)); Vector v = new Vector(); v.addElement(cp); indication.setProperties(v); ... }
イベントインジケーションを CIM オブジェクトマネージャに送信します。
cimom.deliverEvent(op.getNameSpace(), indication);
イベントプロバイダは、EventProvider インタフェースを実装します。クライアントが CIM イベントのインジケーションを予約した場合、CIMOM は、このインタフェースに含まれるメソッドを使ってプロバイダに通知します。このメソッドは、クライアントが CIM イベントの予約を取り消した場合にも使用されます。さらにこれらのメソッドにより、CIMOM が特定のイベントインジケーションのポーリングを行うかどうか、インジケーションをハンドラに返すことを承認するかどうかも指定します。
次の表に、イベントプロバイダで実装する必要のある EventProvider インタフェースのメソッドを示します。
表 6–2 EventProvider メソッド
メソッド |
説明 |
---|---|
activateFilter |
クライアントが予約を作成すると、CIMOM は、このメソッドを呼び出して、CIM イベントの検査をプロバイダに依頼する |
authorizeFilter |
クライアントが予約を作成すると、CIMOM は、このメソッドを呼び出して、指定されたフィルタ式が許可されているかを検査する |
deActivateFilter |
クライアントが予約を削除すると、CIMOM は、このメソッドを呼び出して、指定されたイベントフィルタの停止をプロバイダに依頼する |
mustPoll |
クライアントが予約を作成すると、CIMOM は、このメソッドを呼び出して、指定されたフィルタ式をプロバイダが許可するかどうか、そのフィルタ式のポーリングが必要かどうかを検査する |
CIMOM は、すべてのメソッドに次の引数の値を渡します。
filter – インジケーションを生成する必要がある CIM イベントを指定する SelectExp 型
eventType – CIM イベントの種類を指定する String 型。これは、select 式の FROM 句から抽出することもできる
classPath – このイベントを必要とするクラス名を指定する CIMObjectPath 型
さらに、activateFilter メソッドは、これがこのイベント型の最初のフィルタであることを示すブール値 firstActivation を受け取ります。deActivateFilter メソッドは、これが最後のフィルタであることを示すブール値 lastActivation を受け取ります。
クライアントアプリケーションが CIM_IndicationSubscription クラスのインスタンスを作成して CIM イベントのインジケーションを予約すると、CIMOM は、この要求を適切なプロバイダに転送します。プロバイダが EventProvider インタフェースを実装する場合、CIMOM は、指定するイベントのインジケーションの送信をいつ開始するかをプロバイダに通知します。プロバイダは、activateFilter メソッドを呼び出すことにより、この通知を行います。また、CIMOM は、プロバイダの deActivateFilter メソッドを呼び出して、指定するイベントのインジケーションの送信をいつ停止するかをプロバイダに通知します。
プロバイダは、インスタンスを作成、変更、削除するたびに、インジケーションを作成、配信して、CIMOM の要求に応答します。通常、プロバイダは、CIMOM が activateFilter メソッドを呼び出すときに設定されるフラグ変数を定義します。このフラグの設定は、CIMOM が deActivateFilter メソッドを呼び出すときにクリアされます。そのあと、プロバイダは、インスタンスを作成、変更、または削除するメソッドの中で、動作中のフラグの状態を検査します。フラグが設定されている場合、プロバイダは、作成された CIM インスタンスオブジェクトを含むインジケーションを作成します。プロバイダは、deliverEvent メソッドを使って、CIMOM にインジケーションを返します。フラグが設定されていない場合、プロバイダは、イベントインジケーションの作成や配信を行いません。
プロバイダは、activateFilter メソッドが呼び出されると、インジケーションの配信を開始します。プロバイダは、CIM_Indication の concrete (具象) サブクラスのインスタンスを作成し、ProviderCIMOMHandled.deliverIndication メソッドを起動します。CIMOM は、インジケーションを受信し、そのインジケーションを適切なインジケーションハンドラに配信します。プロバイダは、複数の種類のイベントを処理できます。たとえば、サイクルインジケーションの場合、プロバイダは CIM_InstCreation、CIM_InstDeletion、および CIM_InstModification を処理できます。
予約者が設定した種類を監視する場合、プロバイダは activateFilter および deActivateFilter 呼び出しにそれぞれ渡された firstActivation および lastActivation フラグを使用できます。firstActivation フラグは、特定のイベントの種類をはじめて予約した場合には、true になります。同様に lastActivation は、特定のイベントの種類の最後の予約を削除すると、true になります。これらのフラグを検査すると、プロバイダは、指定したイベントの種類を監視するために簡単にリソースを割り当てたり、割り当てを解除したりすることができます。
機密データを扱うプロバイダは、インジケーションの要求に対する承認を検査することができます。その場合、プロバイダは Authorizable インタフェースを実装して、そのプロバイダが承認を検査することを示す必要があります。また、プロバイダは authorizeFilter メソッドを実装する必要があります。CIMOM は、このメソッドを呼び出して、イベントハンドラの所有者 (UID) がフィルタ式の評価に基づいて送信されるインジケーションを受信することを承認されているかどうかを検査します。イベントの宛先の所有者 (イベントハンドラ) の UID は、フィルタを動作中にするように要求するクライアントアプリケーションの所有者と同じである必要はありません。
プロバイダは、管理対象デバイスに関する情報の取得と設定を行います。ネイティブプロバイダは、特定の管理対象デバイスに特化して作成されたプログラムです。たとえば、Solaris システム上のデータにアクセスするプロバイダには、通常、システムを照会するために C 関数が含まれます。
ネイティブプロバイダは、一般に次のような理由で作成されます。
効率 – 速度が重視されるコードの一部を下位レベルのプログラミング言語 (アセンブラなど) で実装したあと、Java アプリケーションでそれらの機能を呼び出すと便利な場合がある
プラットフォーム固有の機能にアクセスする必要がある – 標準の Java クラスライブラリが、アプリケーションに必要なプラットフォームに固有の機能をサポートしていない場合がある
レガシーコード – レガシーコードを Java プロバイダと共に継続して使用したい場合がある
Java Native Interface は、JDK ソフトウェアの一部です。Java Native Interface を使ってプログラムを作成すれば、その Java プログラムコードはどのプラットフォームにも移植可能です。Java コードは、Java Native Interface により、Java 以外の言語 (C、C++、アセンブラなど) で作成されたアプリケーションやライブラリを使用できます。
Java プログラムの作成、および Java プログラムとネイティブメソッドの統合についての詳細は、Java Web サイト http://java.sun.com を参照してください。
次の手順に従ってプロバイダを作成します。
プロバイダプログラムを作成または編集します。
Java プログラムをコンパイルしてクラスファイルを作成します。
共有オブジェクトファイル (.so) を /usr/sadm/lib/wbem にコピーします。
CLASSPATH を .class および .jar ファイルがある場所に設定します。
プロバイダの CLASSPATH を設定して、CIM オブジェクトマネージャに .class および .jar ファイルの保存場所を知らせます。
Solaris_ProviderPath クラスのインスタンスを作成します。
次に例を示します。
/* root\system (名前空間名) で初期化された名前空間オブジェクトを ローカルホスト上に作成する */ CIMNameSpace cns = new CIMNameSpace("", "root\system"); // root\system 名前空間にスーパーユーザーとして接続する cc = new CIMClient(cns, "root", "root_password"); // Solaris_ProviderPath クラスを取得する cimclass = cc.getClass(new CIMObjectPath("Solaris_ProviderPath"); // Solaris_ProviderPath の新しいインスタンスを作成する class ci = cimclass.newInstance();
標準的な URL 形式を使用して、pathurl プロパティにファイルの場所を設定します。
次に例を示します。
/* プロバイダの CLASSPATH に /myhome/myproviders を設定する */ ci.setProperty("pathurl", new CIMValue(new String ("file:///myhome/myproviders/")));
プロバイダの CLASSPATH |
標準 URL 形式 |
---|---|
ディレクトリへの絶対パス |
file:///a/b/c/ |
.jar ファイルへの絶対パス |
file:///a/b/my.jar |
インスタンスを作成します。
次に例を示します。
// 更新されたインスタンスを CIM オブジェクトマネージャに渡す cc.createInstance(new CIMObjectPath(), ci);
新しいプロバイダ、または変更されたプロバイダを CIM オブジェクトマネージャに登録して、プロバイダがサポートするデータおよび操作に関する情報を送受信できるようにします。また、CIMOM にプロバイダの場所を通知するためにプロバイダを登録します。CIM オブジェクトマネージャは、この情報を使用してプロバイダの読み込みと初期化、および特定のクライアント要求に適切なプロバイダを決定します。
プロバイダがサポートするクラスを定義するファイルを作成します。
MOF ファイルの詳しい作成方法については、DMTF の Web サイト http://www.dmtf.org を参照してください。
MOF ファイルにプロバイダ修飾子を含めて、CIMOM のプロバイダの種類と場所を指定します。
[Provider("java:com.sun.providers.myprovider")] Class_name { … };
java: – Java 言語で記述され、javax.wbem.provider インタフェースを実装するプロバイダ
com.sun.providers.myprovider – プロバイダを実装する Java クラス名
mofcomp(1M) コマンドを使用して、MOF ファイルをコンパイルします。
次の MOF ファイルには、Ex_SimpleCIMInstanceProvider クラスのプロバイダとして SimpleCIMInstanceProvider が宣言されています。
// ======================================================== // タイトル: SimpleCIMInstanceProvider // ファイル名: SimpleCIMInstanceProvider.mof // 説明: // ================================================================== // ================================================================== // Pragmas // ================================================================== #pragma Locale ("en-US") // ================================================================== // SimpleCIMInstanceProvider // ================================================================== [Provider("java:SimpleCIMInstanceProvider")] class Ex_SimpleCIMInstanceProvider { // プロパティ [Key, Description("First Name of the User")] string First; [Description("Last Name of the User")] string Last; };