この章では、プロバイダプログラムの作成方法について説明します。内容は次のとおりです。
WBEM プロバイダ API (javax.wbem.provider) についての詳細は、/usr/sadm/lib/wbem/doc/index.html を参照してください。
プロバイダは、データにアクセスするために、ディスクドライブおよび CPU などの管理リソースと通信する特別なクラスです。プロバイダは、統合と解釈を行うためにデータを CIM Object Manager に送ります。WBEM リソースの固有のサブセットの管理作業を引き継ぐことにより、Solaris WBEM Services を調整する主 WBEM エージェントである CIM Object Manager を取得できます。プロバイダは、javax.wbem.provider API を使用してこのデータを転送します。CIM Object Manager Repository で使用できないアプリケーションからデータの要求を受け取ると、CIM Object Manager は、プロバイダインタフェースを使用して、その要求を適切なプロバイダに送ります。
Solaris ソフトウェアプロバイダは、ユーザー、グループ、別名、役割、ファイルシステム、ディスク、プロセス、複製ツール、ネットワーク構成、プロダクト登録、デバイスおよびシステム性能モニターなど、さまざまな領域に存在します。
プロバイダでは、クラス (インスタンスのテンプレートとして使用する) ではなく、「インスタンス」を作成、変更、および削除します。インスタンスは、永続的な記憶領域に設定できますが、動的に使用することもできます。
プロバイダは、独自のプロセスおよびメモリーを持ち、CIM Object Manager に委託された作業を実行しますが、CIM Object Manager では、WBEM の調整作業を実行するために各プロバイダの位置を把握する必要があります。MOF ファイルに新規または変更されたプロバイダを含めることにより、CIM Object Manager にプロバイダの情報を知らせることができます。MOF ファイルは、プロバイダがサポートするクラスおよびインスタンスを定義します。MOF ファイルを登録するには、mofcomp (1M) コマンドを使用します。
管理アプリケーションにデータを提供する – 管理アプリケーションにより、CIM Object Manager Repository で使用できない管理リソースについてのデータが要求された場合、CIM Object Manager は要求をプロバイダに転送します。プロバイダは、管理リソースからデータにアクセスし、そのデータを CIM Object Manager に渡します。管理リソースから受け取ったデータがネイティブ形式 (C コードなど) である場合、プロバイダは、CIM Object Manager に渡す前にそのデータを Java CIM クラスにマップします。
管理リソースを制御する – 管理リソースを制御するために、管理アプリケーションがデータを CIM Object Manager に送ると、CIM Object Manager は、データを適切なプロバイダに渡します。管理リソースがネイティブ形式のデータを必要とする場合、データを渡す前にプロバイダは CIM クラスをリソースのネイティブ形式にマップします。
プロバイダと CIM Object Manager は、同じコンピュータに置く必要があります。
永続的でないデータ – プロバイダのメソッドが実行している場合にのみ存在するプロバイダクラスのローカル変数
永続的なメモリー (プロバイダに対してローカル) – プロバイダクラスの大域変数を作成するために使用する。このプロバイダメモリーは、CIM Object Manager を停止して再起動すると消去される。
CIM Object Manager Repository – この永続的なメモリーは、Solaris WBEM Services をアンインストールすると消去される。CIM Object Manager からこのメモリーにアクセスするには、プロバイダが CIM Object Manager ハンドルおよび内部プロバイダを使用する必要がある。
プロバイダによって管理されるファイルおよびデータベース (つまり動的なデータ) – プロバイダは、システムからデータを取得することにより、データを動的に生成できる。たとえば、プロバイダはシステム呼び出しを行なって、現在実行中のプロセス数を取得できる。
プロバイダは扱うことができるサービス要求の種類によって分類されます。クライアントプログラムは、クライアント API を介して CIM Object Manager と通信 (および WBEM データにアクセス) します (/usr/sadm/lib/wbem/doc/index.html を参照)。CIM Object Manager は、プロバイダメソッドをクライアント API の対応するクライアントメソッドにマップします。ただし、引数リストおよび対応するメソッドの戻り値は次のように異なる場合があります。
プロバイダがデータを CIM Object Manager Repository に格納する場合、CIM Object Manager のハンドル (「プロバイダインタフェースの実装」を参照) を使用して CIM Object Manager Repository にアクセスします。CIM Object Manager はクライアント API のメソッドを呼び出します。
プロバイダで、CIM Object Manager Repository にインスタンスまたは関連を作成する必要がある場合、内部プロバイダ (「プロバイダインタフェースの実装」を参照) を使用します。内部プロバイダは、インスタンスのメソッドまたは WBEM の内部にあるアソシエータプロバイダを呼び出します。
使用するメソッドおよびクラスの引数リストおよび戻り値が正しいかどうか確認してください。
次の表に Solaris WBEM SDK プロバイダの種類を示します。
表 4-1 プロバイダの種類
種類 |
クラス名 |
説明 |
---|---|---|
インスタンス |
CIMInstanceProvider |
所定のクラスの動的なインスタンスを提供する。インスタンスの取得、列挙、変更、削除をサポートする |
メソッド |
MethodProvider |
1 つ以上のクラスのメソッドを供給する |
アソシエータ |
CIMAssociatorProvider |
動的な関連クラスのインスタンスを供給する |
インジケーション |
EventProvider |
CIM イベントのインジケーションを処理する |
承認 |
なし |
マーカーインタフェースは、プロバイダが独自に承認検査を行うことを CIM Object Manger に知らせる |
関連するメソッドを登録および実装することにより、単一のプロバイダを前述の 1 つ以上の種類のプロバイダとして使用できます。
プロバイダは、単一の Java クラスに含めることができます。また各プロバイダをそれぞれのクラスに分けて保存することもできます。プロバイダ名は、クラスのプロバイダとなる Java クラスを識別します。現時点では、CIM Object Manager は、Java 言語で記述されたプロバイダのみサポートします。
プロバイダ名およびクラス名は、次の規約に従う必要があります。
クラス名は、有効な CIM クラスである必要があります。つまり、接頭辞、アンダースコア、文字列の順に名前を指定します。
たとえば、green_apples および red_apples は、有効な CIM クラス名ですが、apples、 apples_、および _apples は、有効なクラス名ではありません。
MOF ファイルに指定するプロバイダ名は、プロバイダクラスファイルの名前と一致する必要があります。
たとえば、SimpleCIMInstanceProvider はプロバイダ名、Ex_SimpleCIMInstanceProvider はクラス名です。
Java 言語でプロバイダが記述されていることを CIM Object Manager に通知するために、「java:」をすべてのプロバイダ修飾子の前に付ける必要があります。
標準の Java クラスおよびパッケージ命名規則に従って、プロバイダ名を作成します。パッケージ名の接頭辞は、小文字の ASCII 文字で最上位のドメイン名 (com、edu、gov、 mil、net、org) 、または ISO 標準 3166、1981 で指定されている英語 2 文字の国名コードにする必要があります。
パッケージ名のあとに続く名前は、組織内部の命名規則によって異なります。組織内部の規則では、ディレクトリ名のコンポーネントとして、部名、課名、プロジェクト名、マシン名、あるいはログイン名などを指定します。たとえば、プロバイダ名 java:com.sun.wbem.cimom は、次の要素を示します。
java: – プロバイダを記述した言語
com – 最上位のドメイン名
sun – 会社名
wbem – 製品名
cimom – CIM Object Manager を実装したクラスファイルの種類
プロバイダの作成時には、プロバイダがサポートするインタフェースを指定する必要があります。プロバイダがサポートする各インタフェースのすべてのメソッドを実装してください。またすべてのプロバイダには、 CIMProvider インタフェースを実装する必要があります。プロバイダインタフェースには、次の 2 つのメソッドがあります。
initialize(CIMOMHandle cimom) – プロバイダが CIM Object Manager Repository にデータを保存すると、渡された CIM Object Manager ハンドルを CIM Object Manager ハンドルに割り当てる必要があります。プロバイダはこのハンドルを使用して CIM Object Manager と通信します。たとえば、次のようになります。
private CIMOMHandle cimom = null; ... public void initialize(CIMOMHandle cimom) throws CIMException { this.cimom = (CIMOMHandle) cimom; |
プロバイダは、インスタンスを作成したり、CIM Object Manager Repository の関連を操作したりします。プロバイダは、渡された CIM Object Manager ハンドルをサブクラス ProviderCIMOMHandle にキャストしたあと、内部インスタンスまたは関連プロバイダを取得します。たとえば、次のようになります。
private ProviderCIMOMHandle cimom = null; private CIMAssociatorProvider ap = null; ... public void initialize(CIMOMHandle cimom) throws CIMException { this.cimom = (ProviderCIMOMHandle) cimom; ap = pcimom.getInternalProvider(); |
initialize コマンドは、CIM Object Manager の再起動後、プロバイダが初期化されるたびに自動的に実行されます。
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(); // passed in オブジェクトパスからキーを取得する必要がある // 取得したいインスタンスを一意に識別する 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 以外のメソッドを提供するメソッドプロバイダが作成される
次のコード例は、CIM Object Manager からの要求を 1 つ以上の特化されたプロバイダに配信する Solaris_ComputerSystem プロバイダクラスを作成します。これらの特化されたプロバイダは、特定の管理対象オブジェクトの動的データの要求に対するサービスを行います。たとえば、Solaris_Package プロバイダは、Solaris_Package クラスのメソッドを実行する要求に対応します。
メソッドプロバイダは、invokeMethod という単一のメソッドを実装します。このメソッドは、システムのリブート、システムの停止、またはシリアルポートの削除のいずれかの処理を実行する適切なプロバイダを呼び出します。
... public class Solaris_ComputerSystem implements MethodProvider { ProviderCIMOMHandle pch = null; public void initialize(CIMOMHandle ch) throws CIMExcepiton { 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"); } // 以下にヘルパー関数が定義される ... }
クライアントプログラム (CIMObjectPath ) によって呼び出される関連メソッドの objectName 引数は、クラスではなくインスタンスのオブジェクトパスである必要があります。
インスタンスのオブジェクトパスが指定されていない場合、CIM Object Manager は、クライアントが CIM Object Manager Repository の関連 (関連のメンバーインスタンスが派生するテンプレート) のクラス定義を必要としているとみなします。プロバイダではなく、クライアント 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 メソッドを実装します。CIM Object Manager は、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 メソッドを使用して、インジケーションを CIM Object Manager に配信する
EventProvider インタフェースを実装します。
たとえば、次のようになります。
public class sampleEventProvider implements InstanceProvider EventProvider{ // プロバイダが CIM Object Manager に接続するための参照 private ProviderCIMOMHandle cimom; }
プロバイダが処理するインスタンスインジケーションに対して、表 4–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 Object Manager に配信します。
cimom.deliverEvent(op.getNameSpace(), indication);
イベントプロバイダは、EventProvider インタフェースを実装します。CIM Object Manager は、このインタフェースのメソッドを使って、クライアントが CIM イベントのインジケーションを予約したり、CIM イベントの予約を取り消したことをプロバイダに知らせます。さらにこれらのメソッドによって、プロバイダは、CIM Object Manager が特定のイベントインジケーションのポーリングを行うべきかどうか、インジケーションをハンドラに返すことを承認するかどうかを指定します。
次の表に、イベントプロバイダで実装する必要のある EventProvider インタフェースのメソッドを示します。
表 4-2 EventProvider メソッド
メソッド |
説明 |
---|---|
activateFilter |
クライアントが予約を作成すると、CIM Object Manager は、このメソッドを呼び出して CIM イベントの検査をプロバイダに依頼する |
authorizeFilter |
クライアントが予約を作成すると、CIM Object Manager は、このメソッドを呼び出して指定されたフィルタ式が許可されているかを検査する |
deActivateFilter |
クライアントが予約を削除すると、CIM Object Manager は、このメソッドを呼び出して指定されたイベントフィルタの停止をプロバイダに依頼する |
mustPoll |
クライアントが予約を作成すると、CIM Object Manager は、このメソッドを呼び出して、指定されたフィルタ式をプロバイダが許可するかどうか、そのフィルタ式のポーリングが必要かどうかを検査する |
CIM Object Manager は、すべてのメソッドに次の引数の値を渡します。
filter – インジケーションを生成する必要がある CIM イベントを指定する SelectExp 型
eventType – CIM イベントの種類を指定する String 型。これは、select 式の FROM 節から抽出することもできる
classPath – このイベントを必要とするクラス名を指定する CIMObjectPath 型
さらに、activateFilter メソッドは、これがこのイベントの種類の最初のフィルタであることを示すブール値 firstActivation を受け取ります。deActivateFilter メソッドは、これが最後のフィルタであることを示すブール値 lastActivation を受け取ります。
クライアントアプリケーションが CIM_IndicationSubscription クラスのインスタンスを作成して CIM イベントのインジケーションを予約すると、CIM Object Manager はこの要求を適切なプロバイダに転送します。プロバイダが EventProvider インタフェースを実装していれば、CIM Object Manager は、プロバイダの activateFilter メソッドを呼び出して、指定するイベントのインジケーションの送信をいつ開始するかをプロバイダに通知します。また、CIM Object Manager は、プロバイダの deActivateFilter メソッドを呼び出して、指定するイベントのインジケーションの送信をいつ停止するかをプロバイダに通知します。
プロバイダは、インスタンスを作成、変更、削除するたびに、インジケーションを作成、配信して、CIM Object Manager の要求に応答します。通常、プロバイダは、CIM Object Manager が activateFilter メソッドを呼び出した時に設定し、deActivateFilter メソッドを呼び出した時にクリアされるフラグ変数を定義します。そのあと、インスタンスを作成、変更、または削除するメソッドの中で、動作中のフラグの状態を検査します。フラグが設定されている場合、プロバイダは、作成した CIM インスタンスオブジェクトを含むインジケーションを作成し、deliverEvent メソッドを使用してこのインジケーションを CIM Object Manager に返します。フラグが設定されていない場合、プロバイダは、イベントインジケーションの作成や配信を行いません。
プロバイダは、activateFilter メソッドが呼び出されると、インジケーションの配信を開始します。プロバイダは、CIM_Indication の concrete (具象) サブクラスのインスタンスを作成し、ProviderCIMOMHandled.deliverIndication メソッドを起動します。CIM Object Manager は、インジケーションを受信し、そのインジケーションを適切なインジケーションハンドラに配信します。プロバイダは、複数の種類のイベントを処理できます。たとえば、サイクルインジケーションの場合、プロバイダは CIM_InstCreation、CIM_InstDeletion、および CIM_InstModification を処理できます。
予約者が設定した種類を監視する場合、プロバイダは activateFilter および deActivateFilter 呼び出しにそれぞれ渡された firstActivation および lastActivation フラグを使用できます。firstActivation フラグは、特定のイベントの種類をはじめて予約した場合には、true になります。同様に lastActivation は、特定のイベントの種類の最後の予約を削除すると、true になります。これらのフラグを検査すると、プロバイダは、指定したイベントの種類を監視するために簡単にリソースを割り当てたり、割り当てを解除したりすることができます。
機密データを扱うプロバイダは、インジケーションの要求に対する承認を検査することができます。その場合、プロバイダは Authorizable インタフェースを実装して、そのプロバイダが承認を検査することを示す必要があります。また、プロバイダは authorizeFilter メソッドを実装する必要があります。CIM Object Manager は、authorizeFilter メソッドを呼び出して、イベントハンドラの所有者 (UID) がフィルタ式の評価に基づいて返されるインジケーションの受信を承認されているかどうかを検査します。イベントの宛先の所有者 (イベントハンドラ) の UID は、フィルタを動作中にするように要求するクライアントアプリケーションの所有者と同じである必要はありません。
プロバイダは、管理対象デバイスに関する情報の取得と設定を行います。ネイティブプロバイダは、特定の管理対象デバイスに特化して作成されたプログラムです。たとえば、Solaris システム上のデータにアクセスするプロバイダには、通常、システムを照会するために C 関数が含まれます。
ネイティブプロバイダは、一般に次のような理由で作成されます。
効率 – 速度が重視されるコードの一部を下位レベルのプログラミング言語 (アセンブラなど) で実装したあと、Java アプリケーションでそれらの機能を呼び出すと便利な場合がある
プラットフォーム固有の機能にアクセスする必要がある – 標準の Java クラスライブラリが、アプリケーションに必要なプラットフォームに固有の機能をサポートしていない場合がある
レガシーコード – レガシーコードを Java プロバイダと共に継続して使用したい場合がある
JDK の一部である JNI (Java Native Interface) は、Java のネイティブプログラミングインタフェースです。JNI を使用してプログラムを作成すると、ほとんどのプラットフォームで完全に移植可能です。Java 仮想マシン (JVM) で動作する Java コードで JNI を使用すると、そのコードは C、C++、アセンブラのようなほかの言語で作成されたアプリケーションおよびライブラリで実行できます。
Java プログラムの作成、および Java プログラムとネイティブメソッドの統合についての詳細は、Java Web サイト http://java.sun.com を参照してください。
次の手順に従ってプロバイダを作成します。
プロバイダプログラムを作成または編集します。
Java プログラムをコンパイルしてクラスファイルを作成します。
共有オブジェクトファイル (.so) を /usr/sadm/lib/wbem にコピーします。
CLASSPATH を .class および .jar ファイルがある場所に設定します。
プロバイダの CLASSPATH を設定して、CIM Object Manager に .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 Object Manager に渡す cc.createInstance(new CIMObjectPath(), ci);
サポートするデータと操作についての情報を通信するため、またプロバイダの位置を CIM Object Manager に通知するため、CIM Object Manager に新しいプロバイダまたは変更されたプロバイダを登録します。CIM Object Manager は、この情報を使用してプロバイダの読み込みと初期化、および特定のクライアント要求に適切なプロバイダを決定します。
プロバイダがサポートするクラスを定義するファイルを作成します。
MOF ファイルの作成方法の詳細については、DMTF Web サイト http://www.dmtf.org を参照してください。
MOF ファイルにプロバイダ修飾子を含めて、CIM Object Manager のプロバイダの種類と場所を指定します。
[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; };