例 7-1 のコードセグメントは、CIM Object Manager からのインスタンスデータ要求を 1 つ以上の特化されたプロバイダに送る Solaris インスタンスプロバイダクラスを作成します。これらの特化されたプロバイダは、特定の Solaris オブジェクトの動的データの要求に対するサービスを提供します。たとえば、Solaris_Package プロバイダは、Solaris_Package クラスのインスタンスの要求に対応します。
インスタンスプロバイダは、InstanceProvider インタフェースのすべてのメソッドを実装する必要があります。例 7-1 のコードセグメントは、次の 2 つのメソッドだけを示しています。
enumInstances - Solaris パッケージとパッチを列挙する適切なプロバイダを呼び出す。このメソッドは、クラスおよびそのサブクラスのすべてのインスタンスを返すディープ列挙を行う
getInstances - Solaris パッケージとパッチのインスタンスを取得する適切なプロバイダを呼び出す
public class Solaris implements InstanceProvider { /** * 最上位レベルのプロバイダクラスが、CIM Object Manager * からの要求を適切なプロバイダに送る。 */ public void initialize(CIMONHandle, ch) throws CIMException { } public void cleanup() throws CIMException { } /* このクラスは、指定されたクラス内の指定されたオブジェクトの 列挙済みインスタンスが入ったベクトルを返す。オブジェクトが Solaris パッケージの場合、このクラスは Solaris_Package プロバイダを呼び 出し、システム上の Solaris パッケージのリストを返す。 オブジェクトが Solaris パッチの場合、Solaris_Patch プロバイダを 呼び出し、システム上の Solaris パッチのリストを返す。*/ public Vector enumInstances(CIMObjectPath op, CIMClient.DEEP, CIMClass cc) throws CIMException { if (op.getObjectName().equalsIgnoreCase("solaris_package")) { Solaris_Package sp = new Solaris_Package(); return sp.enumerateInstances(op); } if (op.getObjectName().equalsIgnoreCase("solaris_patch")) { Solaris_Patch sp = new Solaris_Patch(); return sp.enumerateInstances(op); } return new Vector(); } /* このクラスは、指定されたクラス内の指定されたオブジェクトの インスタンスを返す。オブジェクトが Solaris パッケージの場合、 このクラスは Solaris_Package プロバイダを呼び出し、指定された Solaris パッケージのデータを返す。オブジェクトが Solaris パッチの場合、Solaris_Patch プロバイダを呼び出し、指定された Solaris パッチのデータを返す。*/ public CIMInstance getInstance(CIMObjectPath op, CIMClass cc) throws CIMException { if (op.getObjectName().equalsIgnoreCase("solaris_package")) { Solaris_Package sp = new Solaris_Package(); return sp.getInstance(op,cc); } if (op.getObjectName().equalsIgnoreCase("solaris_patch")) { Solaris_Patch sp = new Solaris_Patch(); return sp.getInstance(op,cc); } } |
特化された Solaris インスタンスプロバイダは、API を使用してオブジェクトインスタンスの取得と設定を行います。これらのプロバイダは、C 関数を呼び出して Solaris 固有の値 (ホスト名、シリアル番号、リリース、マシン、アーキテクチャ、メーカーなど) を取得するネイティブメソッドの宣言も行います。
例 7-2 のコードセグメントは、例 7-1 で呼び出される solaris_package クラスを示します。このコードセグメントは、getInstance メソッドを実装します。このメソッドは、指定されたクラスの新しいインスタンスを作成し、ネイティブ C 関数 (GetPkgArchitecture() など) が返すプロパティをそれらのインスタンスに割り当てます。
public class Solaris_Package { public CIMInstance getInstance(CIMObjectPath op, CIMClass cc) { String pkgName = ""; for (Enumeration e = op.getKeys().elements(); e.hasMoreElements();) { CIMProperty cp = (CIMProperty)e.nextElement(); if (cp.getName().equalsIgnoreCase("name")) { pkgName = (String) ((CIMValue)(cp.getValue())).getValue(); } } CIMInstance ci = cc.newInstance(); ci.setProperty("Name", new CIMValue(pkgName)); ci.setProperty("TargetOperatingSystem", new CIMValue(new UnsignedInt16(29))); ci.setProperty("Status", new CIMValue(GetPkgStatus(pkgName))); ci.setProperty("Architecture", new CIMValue(GetPkgArchitecture(pkgName))); ci.setProperty("Description", new CIMValue(GetPkgDescription(pkgName))); ci.setProperty("Caption", new CIMValue(GetPkgDescription(pkgName))); ci.setProperty("Manufacturer", new CIMValue(GetPkgVendor(pkgName))); ci.setProperty("Category", new CIMValue(GetPkgCategory(pkgName))); ci.setProperty("Basedir", new CIMValue(GetPkgBasedir(pkgName))); return ci; } native String GetPkgDescription(String pkgName); native String GetPkgArchitecture(String pkgName); native String GetPkgVersion(String pkgName); native String GetPkgVendor(String pkgName); native String GetPkgBasedir(String pkgName); native String GetPkgCategory(String pkgName); native String GetPkgStatus(String pkgName); static { System.loadLibrary("NativeUnix"); } } |