Sun WBEM SDK 開発ガイド

プロバイダインタフェースの実装

プロバイダは、それらの役割に固有のサービスをサポートするプロバイダインタフェースを実装します。インタフェースを実装するには、プロバイダクラスは初めに 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 に知らせる 

インスタンスプロバイダインタフェース (InstanceProvider)

次の表で、Provider パッケージ (com.sun.wbem.provider20) に含まれるインスタンスプロバイダインタフェースのメソッドについて説明します。

これらの各メソッドは引数 op を取ります。op は、指定された CIM クラスまたは CIM インスタンスの CIMObjectPath です。オブジェクトパスには、ネームスペース、クラス名、およびキー (オブジェクトがインスタンスの場合) が含まれます。ネームスペースは、ほかのネームスペース、クラス、インスタンス、および修飾子のデータ型を格納できるディレクトリです。キーは、クラスインスタンスを個別に識別するプロパティです。キープロパティには、キー修飾子が含まれます

たとえば、次のオブジェクトパスは 2 つの部分から構成されます。

\\myserver\root\cimv2\Solaris_ComputerSystem:Name=mycomputer:
   CreationClassName=Solaris_ComputerSystem

表 5–2 InstanceProvider インタフェースメソッド

メソッド 

説明 

CIMObjectPath createInstance(CIMObjectPath op, CIMInstance ci)

op によって指定されたインスタンス ci が存在しない場合は、それを作成する。この CIM インスタンスがすでにある場合は、ID が CIM_ERR_ALREADY_EXISTSCIMInstanceException をプロバイダがスローする必要がある。作成されたインスタンスの CIMObjectPath を返す。

void deleteInstance(CIMObjectPath op)

オブジェクトパス (op) に指定されたインスタンスを削除する。

Vector enumInstances(CIMObjectPath path, boolean deep, CIMClass cc)

path に指定されたクラスの各インスタンスの「名前」を返す。deeptrue の場合は、指定されたクラスとそのクラスから派生したすべてのクラスのすべてのインスタンスの名前を返す。deeptrue でない場合は、指定されたクラスに属するインスタンスの名前だけを返す。

プロバイダがインスタンスをゼロから作成したくない場合は、新しいインスタンスのテンプレートを作成できる。それには、そのインスタンスが属するクラス (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_FOUNDCIMInstanceException をスローする。

例 — インスタンスプロバイダの実装

次のコード例は、インスタンスプロバイダ SimpleInstanceProvider の Java ソースコードです。このインスタンスプロバイダは、Ex_SimpleInstanceProvider クラスの enumInstances インタフェースと getInstance インタフェースを実装しています。わかりやすくするために、この例では、CIMException をスローすることによって deleteInstancecreateInstancesetInstanceexecQuery の各インタフェースを実装します。実際には、インスタンスプロバイダがすべての InstanceProvider インスタンスを実装する必要があります。


例 5–1 SimpleInstanceProvider インスタンスプロバイダ

/*
 * "@(#)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));
     }
 }


プロパティプロバイダインタフェース (PropertyProvider)

次の表で、プロパティプロバイダインタフェースのメソッドについて説明します。

表 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 プロパティは、その名前と親クラスによって定義されます。複数のプロパティで同じ名前を使用できますが、親クラスはプロパティを個別に識別します。


例 5–2 プロパティプロバイダの実装

...

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");
    }
    ...
}
 


メソッドプロバイダインタフェース (MethodProvider)

次の表で、メソッドプロバイダインタフェースのメソッドについて説明します。

表 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 を実装します。


例 5–3 メソッドプロバイダの実装

...
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)

次の表で、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 は、assocNameobjectNameroleresultRoleincludeQualifiersincludeClassOriginpropertyList のそれぞれの値を関連付けプロバイダに渡します。

例 5–4 では、CIM 関連付けクラスの名前と、返される関連付けされたオブジェクトが属する CIM クラスまたはインスタンスを出力します。このプロバイダは、example_teacher クラスと example_student クラスのインスタンスを扱います。


例 5–4 アソシエータプロバイダの実装

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 システムを照会します。ネイティブプロバイダは、一般に次のような理由で作成されます。

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 を参照してください。