プロバイダは、それらの役割に固有のサービスをサポートするプロバイダインタフェースを実装します。インタフェースを実装するには、プロバイダクラスは初めに implements 節でそのインタフェースを宣言し、続いてそのインタフェースのすべての抽象メソッドに対して実装 (本体) を提供する必要があります。
CIM Object Manager は、initialize メソッドを使用してプロバイダと通信できます。initialize メソッドには、CIM Object Manager への参照である、 CIMOMhandle 型の引数を指定できます。CIMOMhandle クラスには、プロバイダが CIM Object Manager との間でデータ転送に使用できるメソッドが含まれます。
次の表で、com.sun.wbem.provider パッケージに含まれているプロバイダインタフェースについて説明します。com.sun.wbem.provider20 パッケージの InstanceProvider インタフェースを使用してください。 メソッドプロバイダ、インスタンスプロバイダ、およびプロパティプロバイダは、単一の Java クラスファイルに含めることも、あるいは個々のファイルに格納することもできます。
表 5–1 プロバイダインタフェース|
インタフェース |
説明 |
|---|---|
|
CIMProvider |
すべてのプロバイダが実装する基本インタフェース |
|
InstanceProvider |
インスタンスプロバイダが実装する基本インタフェース。インスタンスプロバイダは、クラスの動的インスタンスを提供する |
|
MethodProvider |
メソッドプロバイダが実装する基本インタフェース。メソッドプロバイダは、CIM クラスのすべてのメソッドを実装する |
|
PropertyProvider |
プロパティプロバイダが実装する基本インタフェース。プロパティプロバイダは、動的プロパティの検出と更新のために使用される。動的データは、CIM Object Manager Repository には格納されない |
|
AssociatorProvider |
動的関連インスタンスのプロバイダによって実装される基本インタフェース |
|
Authorizable |
マーカーインタフェースは、プロバイダが独自に承認検査を行うことを CIM Object Manger に知らせる |
次の表で、Provider パッケージ (com.sun.wbem.provider20) に含まれるインスタンスプロバイダインタフェースのメソッドについて説明します。
これらの各メソッドは引数 op を取ります。op は、指定された CIM クラスまたは CIM インスタンスの CIMObjectPath です。オブジェクトパスには、ネームスペース、クラス名、およびキー (オブジェクトがインスタンスの場合) が含まれます。ネームスペースは、ほかのネームスペース、クラス、インスタンス、および修飾子のデータ型を格納できるディレクトリです。キーは、クラスインスタンスを個別に識別するプロパティです。キープロパティには、キー修飾子が含まれます
たとえば、次のオブジェクトパスは 2 つの部分から構成されます。
\\myserver\root\cimv2\Solaris_ComputerSystem:Name=mycomputer: CreationClassName=Solaris_ComputerSystem |
\\myserver\root\cimv2
これは、ホスト myserver 上のデフォルトの CIM ネームスペースです。
Solaris_ComputerSystem:Name=mycomputer: CreationClassName=Solaris_ComputerSystem
これは、ホスト myserver 上のデフォルトネームスペースに存在する特定の Solaris Computer System オブジェクトです。この Solaris コンピュータシステムは、(プロパティ=値) という書式で示される 2 つのキー修飾子値によって個別に識別されます。
Name=mycomputer
CreationClassName=Solaris_ComputerSystem
|
メソッド |
説明 |
|---|---|
|
CIMObjectPath createInstance(CIMObjectPath op, CIMInstance ci) |
op によって指定されたインスタンス ci が存在しない場合は、それを作成する。この CIM インスタンスがすでにある場合は、ID が CIM_ERR_ALREADY_EXISTS の CIMInstanceException をプロバイダがスローする必要がある。作成されたインスタンスの CIMObjectPath を返す。 |
|
void deleteInstance(CIMObjectPath op) |
オブジェクトパス (op) に指定されたインスタンスを削除する。 |
|
Vector enumInstances(CIMObjectPath path, boolean deep, CIMClass cc) |
path に指定されたクラスの各インスタンスの「名前」を返す。deep が true の場合は、指定されたクラスとそのクラスから派生したすべてのクラスのすべてのインスタンスの名前を返す。deep が true でない場合は、指定されたクラスに属するインスタンスの名前だけを返す。 プロバイダがインスタンスをゼロから作成したくない場合は、新しいインスタンスのテンプレートを作成できる。それには、そのインスタンスが属するクラス (cc) の newInstance() メソッドを呼び出す。 |
|
Vector enumInstances(CIMObjectPath path, boolean deep, CIMClass cc, boolean localOnly) |
path に指定されたクラスのインスタンス (インスタンスの名前だけでなく、インスタンス全体) を返す。 プロバイダがインスタンスをゼロから作成したくない場合は、新しいインスタンスのテンプレートを作成できる。それには、そのインスタンスが属するクラス (cc) の newInstance() メソッドを呼び出す。 localOnly が true の場合は、列挙されたインスタンスのローカルプロパティ (継承されたプロパティではない) だけを返す。localOnly が true でない場合は、すべての継承されたプロパティとローカルプロパティを返す。 |
|
Vector execQuery (CIMObjectPath op, String query, int ql, CIMClass cc |
照会を実行して CIM オブジェクトを検索する。このメソッドは、指定された照会文字列に一致する、指定された CIM クラス (cc) の CIM インスタンスのベクトルを返す。 |
|
CIMInstance getInstance(CIMObjectPath op, CIMClass cc, boolean localOnly) |
オブジェクトパス (op) に指定されたインスタンスを返す。 プロバイダがインスタンスをゼロから作成したくない場合は、新しいインスタンスのテンプレートを作成できる。それには、そのインスタンスが属するクラス (cc) の newInstance() メソッドを呼び出す。 localOnly が true の場合は、列挙されたインスタンスのローカルプロパティ (継承されたプロパティではない) だけを返す。localOnly が true でない場合は、すべての継承されたプロパティとローカルプロパティを返す。 |
|
void setInstance(CIMInstance ci) |
指定された CIM インスタンスが存在する場合は、それを更新する。このインスタンスが存在しない場合は、ID が CIM_ERR_NOT_FOUND の CIMInstanceException をスローする。 |
次のコード例は、インスタンスプロバイダ SimpleInstanceProvider の Java ソースコードです。このインスタンスプロバイダは、Ex_SimpleInstanceProvider クラスの enumInstances インタフェースと getInstance インタフェースを実装しています。わかりやすくするために、この例では、CIMException をスローすることによって deleteInstance、createInstance、setInstance、execQuery の各インタフェースを実装します。実際には、インスタンスプロバイダがすべての InstanceProvider インスタンスを実装する必要があります。
/*
* "@(#)SimpleInstanceProvider.java"
*/
import com.sun.wbem.cim.*;
import com.sun.wbem.client.*;
import com.sun.wbem.provider.CIMProvider;
import com.sun.wbem.provider20.InstanceProvider;
import com.sun.wbem.provider.MethodProvider;
import java.util.*;
import java.io.*;
public class SimpleInstanceProvider implements InstanceProvider{
static int loop = 0;
public void initialize(CIMOMHandle cimom) throws CIMException {
}
public void cleanup() throws CIMException {
}
public Vector enumInstances(CIMObjectPath op, boolean deep, CIMClass cc,
boolean localOnly) throws CIMException {
return null;
}
/*
* enumInstances:
* 名前だけでなく、インスタンス全体が返される。
* 詳細列挙または簡易列挙が可能だが、現在のところ
* CIMOM は簡易列挙だけを要求する。
*/
public Vector enumInstances(CIMObjectPath op, boolean deep, CIMClass cc)
throws CIMException {
if (op.getObjectName().equalsIgnoreCase("Ex_SimpleInstanceProvider"))
{
Vector instances = new Vector();
CIMObjectPath cop = new CIMObjectPath(op.getObjectName(),
op.getNameSpace());
if (loop == 0){
cop.addKey("First", new CIMValue("red"));
cop.addKey("Last", new CIMValue("apple"));
// このクラスを削除する場合は、この次の行を
// コメントにしてコンパイルする。
instances.addElement(cop);
loop += 1;
} else {
cop.addKey("First", new CIMValue("red"));
cop.addKey("Last", new CIMValue("apple"));
// このクラスを削除する場合は、この次の行を
// コメントにしてコンパイルする。
instances.addElement(cop);
cop = new CIMObjectPath(op.getObjectName(),
op.getNameSpace());
cop.addKey("First", new CIMValue("green"));
cop.addKey("Last", new CIMValue("apple"));
// このクラスを削除する場合は、この次の行を
// コメントにしてコンパイルする。
instances.addElement(cop);
}
return instances;
}
return new Vector();
}
public CIMInstance getInstance(CIMObjectPath op,
CIMClass cc, boolean localOnly) throws CIMException {
if (op.getObjectName().equalsIgnoreCase("Ex_SimpleInstanceProvider"))
{
CIMInstance ci = cc.newInstance();
ci.setProperty("First", new CIMValue("yellow"));
ci.setProperty("Last", new CIMValue("apple"));
return ci;
}
return new CIMInstance();
}
public Vector execQuery(CIMObjectPath op, String query, int ql, CIMClass cc)
throws CIMException {
throw(new CIMException(CIMException.CIM_ERR_NOT_SUPPORTED));
}
public void setInstance(CIMObjectPath op, CIMInstance ci)
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));
}
}
次の表で、プロパティプロバイダインタフェースのメソッドについて説明します。
表 5–3 PropertyProvider インタフェースメソッド|
メソッド |
説明 |
|---|---|
|
CIMValue getPropertyValue(CIMObjectPath op, String originClass, String propertyName) |
op に指定されたインスタンスの propertyName によって指定されたプロパティの値を含む CIMValue を返す。originClass には、このプロパティを最初に定義した、このクラス階層のクラスの名前を指定する。 |
|
void setPropertyValue(CIMObjectPath op, String originClass, String propertyName, CIMValue cv) |
op に指定されたインスタンスの propertyName によって指定されたプロパティの値に CIMValue cv を設定する。originClass には、このプロパティを最初に定義した、このクラス階層のクラスの名前を指定する。 |
例 5–2 のコードセグメントは、例 5–2 で登録されるプロパティプロバイダ (fruit_prop_provider) クラスを作成します。fruit_prop_provider は、PropertyProvider インタフェースを実装します。
このサンプルプロパティプロバイダは、指定されたクラスのプロパティ値、親クラス、およびプロパティ名を返す getPropertyValue メソッドを示しています。CIM プロパティは、その名前と親クラスによって定義されます。複数のプロパティで同じ名前を使用できますが、親クラスはプロパティを個別に識別します。
...
public class SimplePropertyProvider implements PropertyProvider{
public void initialize(CIMOMHandle cimom)
throws CIMException {
}
public void cleanup()
throws CIMException {
}
public CIMValue getPropertyValue(CIMObjectpath op, string originclass,
string PropertyName){
if (PropertyName.equals("A")
return new CIMValue("ValueA")
else
return new CIMValue("ValueB");
}
...
}
次の表で、メソッドプロバイダインタフェースのメソッドについて説明します。
表 5–4 MethodProvider インタフェースメソッド|
メソッド |
説明 |
|---|---|
|
CIMValue invokeMethod(CIMObjectPath op, String methodName, Vector inParams, Vector outParams) |
CIM Object Manager は、op によって参照されるインスタンス内の methodName が呼び出されると、このメソッドを呼び出す。 inParams は、呼び出されるメソッドへの入力パラメータとなる CIMValues のベクトル、outParams は、呼び出されるメソッドからの出力パラメータとなる CIMValues のベクトル。 |
例 5–3 のコードセグメントは、CIM Object Manager からのメソッド実行要求を 1 つ以上の特化されたプロバイダに送る Solaris プロバイダクラスを作成します。これらの特化されたプロバイダは、特定の Solaris オブジェクトの動的データの要求に対するサービスを行います。たとえば、Solaris_Package プロバイダは、Solaris_Package クラスのメソッドを実行する要求に対応します。
この例のメソッドプロバイダは、適切なプロバイダを呼び出して次に示す処理の 1 つを実行する単一のメソッド invokeMethod を実装します。
Solaris システムをリブートする
Solaris システムをリブートまたは停止する
Solaris シリアルポートを削除する
...
public class Solaris implements MethodProvider {
public void initialize(CIMONHandle, ch) throws CIMException {
}
public void cleanup() throws CIMException {
}
public CIMValue invokeMethod(CIMObjectPath op, String methodName,
Vector inParams, Vector outParams) throws CIMException {
if (op.getObjectName().equalsIgnoreCase("solaris_computersystem")) {
Solaris_ComputerSystem sp = new Solaris_ComputerSystem();
if (methodName.equalsIgnoreCase("reboot")) {
return new CIMValue (sp.Reboot());
}
}
if (op.getObjectName().equalsIgnoreCase("solaris_operatingsystem")) {
Solaris_OperatingSystem sos = new Solaris_OperatingSystem();
if (methodName.equalsIgnoreCase("reboot")) {
return new CIMValue (sos.Reboot());
}
if (methodName.equalsIgnoreCase("shutdown")) {
return new CIMValue (sos.Shutdown());
}
}
if (op.getObjectName().equalsIgnoreCase("solaris_serialport")) {
Solaris_SerialPort ser = new Solaris_SerialPort();
if (methodName.equalsIgnoreCase("disableportservice")) {
return new CIMValue (ser.DeletePort(op));
}
}
return null;
}
}
...
次の表で、AssociatorProvider インタフェースのメソッドについて説明します。これらのメソッドに渡す引数についての詳細は、関連メソッドを参照してください。
表 5–5 AssociatorProvider インタフェースのメソッド|
メソッド |
説明 |
|---|---|
|
Vector associators(CIMObjectPath assocName, CIMObjectPath objectName, String role, String resultRole, boolean includeQualifiers, boolean includeClassOrigin, String[] propertyList) |
objectName によって指定されたインスタンスに関連付けられている CIM インスタンスのベクトルを返す。 |
|
Vector associatorNames(CIMObjectPath assocName, CIMObjectPath objectName, String role, String resultRole) |
objectName によって指定された CIM インスタンスに関連付けられている CIM インスタンスの名前のベクトルを返す。 |
|
Vector references(CIMObjectPath assocName, CIMObjectPath objectName, String role, boolean includeQualifiers, boolean includeClassOrigin, String[] propertyList) |
objectName によって指定された CIM インスタンスが関与する関連ベクトルを返す。 |
|
Vector referenceNames(CIMObjectPath assocName, CIMObjectPath objectName, String role) |
objectName によって指定された CIM インスタンスが関与する関連の名前のベクトルを返す。 |
完全な関連付けプロバイダには、すべての AssociatorProvider メソッドを実装する必要があります。わかりやすくするために、次のコード例には、associators メソッドだけを実装しています。CIM Object Manager は、assocName、 objectName、 role、 resultRole、 includeQualifiers、 includeClassOrigin、 propertyList のそれぞれの値を関連付けプロバイダに渡します。
例 5–4 では、CIM 関連付けクラスの名前と、返される関連付けされたオブジェクトが属する CIM クラスまたはインスタンスを出力します。このプロバイダは、example_teacher クラスと example_student クラスのインスタンスを扱います。
public Vector associators(CIMObjectPath assocName,
CIMObjectPath objectName, 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;
}
// 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;
}
}
プロバイダは、管理対象デバイスに関する情報の取得と設定を行います。ネイティブプロバイダは、管理対象デバイスで動作するように作成されるマシン固有のプログラムです。たとえば、Solaris システム上のデータにアクセスするプロバイダは、通常、C 関数を組み込んで Solaris システムを照会します。ネイティブプロバイダは、一般に次のような理由で作成されます。
効率 – 速度が重視されるコードの一部を低レベルのプログラミング言語 (アセンブラなど) で実装し、その後 Java アプリケーションでそれらの機能を呼び出すと便利な場合がある
プラットフォーム固有の機能にアクセスする必要がある – 標準の Java クラスライブラリが、アプリケーションに必要なプラットフォームに固有の機能をサポートしていない場合がある
従来のコード - Java 以外のプログラミング言語で作成された従来のコードを Java プロバイダと共に継続して使用したい場合がある
JDK の一部である JNI (Java Native Interface) は、Java のネイティブプログラミングインタフェースです。JNI を使用してプログラムを作成すると、ほとんどのプラットフォームで完全に移植可能です。Java Virtual Machine (VM) で動作する Java コードで JNI を使用すると、そのコードは C、C++、アセンブラのようなほかの言語で作成されたアプリケーションおよびライブラリで実行できます。
Java プログラムの作成、および Java プログラムとネイティブメソッドの統合についての詳細は、 Java Web サイト http://www.javasoft.com/docs/books/tutorial/native1.1/index.html を参照してください。