Solaris WBEM 開発ガイド

基本的なクライアント操作の実行

この節では、javax.wbem.client API を使った操作の要求方法と、一般的なプログラミング作業の実行方法について説明します。

インスタンスの作成

既存のクラスのインスタンスを作成するには、 newInstance メソッドを使用します。既存のクラスがキープロパティを保持する場合、アプリケーションはそのプロパティを一意の値に設定する必要があります。インスタンスは、必要に応じてそのクラスに定義されていない別の修飾子を定義することもできます。これらの修飾子は、インスタンス、またはそのインスタンスの特定のプロパティに対して定義できます。クラス宣言内に修飾子を記述する必要はありません。

アプリケーションは、クラスに定義されている一連の修飾子を getQualifiers メソッドを使用して取得できます。


例 4–5 インスタンスの作成

次の例では、 newInstance メソッドを使用して、CIM インスタンスを表す Java クラスを作成します。たとえば、 Solaris_Package クラスから Solaris パッケージを作成します。

...
{ 
/* ローカルホスト上の名前空間 root\cimv2 
で CIM オブジェクトマネージャに接続する
root\cimv2 にオブジェクトへの書き込み権を
持つアカウントのユーザー名とパスワードを指定する */
 
 UserPrincipal up = new UserPrincipal("root");
 PasswordCredential pc = new PasswordCredential("root-password"); 
 /* root ユーザーとして root  パスワードを使用して名前空間に接続
する */
 
 CIMClient cc = new CIMClient(cns, up, pc);
 ...
 
 // Solaris_Package クラスを取得
 cimclass = cc.getClass(new CIMObjectPath("Solaris_Package"),  
                                          true, true, true, null);
 
 /* プロパティのデフォルト値で生成された Solaris_Package 
クラスの新しいインスタンスを作成する。
クラスのプロバイダがデフォルト値を指定していない場合、
プロパティの値は NULL になるため、明示的に設定する
必要がある */
 
 CIMInstance ci = cc.createInstance (new CIMObjectPath("Solaris_Package"), 
 ci);
 }
 ... 

インスタンスの削除

インスタンスの削除には、deleteInstance メソッドを使用します。


例 4–6 インスタンスの削除

この例は、次のことを実行します。

 
import java.rmi.*;
import java.util.Enumeration;

import javax.wbem.cim.CIMClass;
import javax.wbem.cim.CIMException;
import javax.wbem.cim.CIMInstance;
import javax.wbem.cim.CIMNameSpace;
import javax.wbem.cim.CIMObjectPath;

import javax.wbem.client.CIMClient;
import javax.wbem.client.PasswordCredential;
import javax.wbem.client.UserPrincipal;

/** 
 * 指定のクラスのインスタンスをすべて返す。
 * この例は、ホスト名 (args[0])、ユーザー名 (args[1])、
 * パスワード (args[2])、名前空間 (args[3])、およびクラス名 (args[4]) という
 * 5 つの引数を取る。指定のクラス名のインスタンスをすべて削除する。
 * 指定のユーザー名は、指定の名前空間に対する書き込み権を持つ必要
 * がある
 */
public class DeleteInstances {
    public static void main(String args[]) throws CIMException {
        CIMClient cc = null;
        // 5 つの引数が指定されない場合は使用法を表示して終了する
        if (args.length != 5) {
           System.out.println("Usage: DeleteInstances host username " +
                              "password namespace classname ");
           System.exit(1);
        }
        try {
            // args[0] にはホスト名、args[3] には名前空間が含まれる。
            // 指定のホスト上の指定の名前空間を指す CIMNameSpace (cns)
            // を作成する
            CIMNameSpace cns = new CIMNameSpace(args[0], args[3]);

            // args[1] と args[2] にはユーザー名とパスワードが含まれる。
            // このユーザー名で UserPrincipal (up) を作成し、
            // このパスワードで PasswordCredential を作成する
            UserPrincipal up = new UserPrincipal(args[1]);
            PasswordCredential pc = new PasswordCredential(args[2]);

            // CIM オブジェクトマネージャに接続し、
            // 作成した CIMNameSpace、UserPrincipal、および
            // PasswordCredential のオブジェクトを渡す
            cc = new CIMClient(cns, up, pc);

            // クラス名 (args[4]) を取得し CIMObjectPath を作成する
            CIMObjectPath cop = new CIMObjectPath(args[4]);

            // クラスとその全サブクラスのインスタンスオブジェクトパスの
            // 列挙を取得する。インスタンスオブジェクトパスは、
            // CIM オブジェクトマネージャがインスタンスを検索する
            // ときに使用する参照
            Enumeration e = cc.enumerateInstanceNames(cop);

            // インスタンスオブジェクトパスの列挙を繰り返し処理する。
            // オブジェクトを構築し、列挙された各インスタンスの
            // オブジェクトパスを格納し、このインスタンスを出力
            // して、削除する
            while (e.hasMoreElements()) {
                CIMObjectPath  op = (CIMObjectPath)e.nextElement();
                System.out.println(op);
                cc.deleteInstance(op);
            } // while の終了
        } catch (Exception e) {
        // 例外が発生した場合はそれを出力する
        System.out.println("Exception: "+e);
        } // catch の終了

        // セッションの終了
        if (cc != null) {
            cc.close();
        }
    }
}

インスタンスの取得と設定

クライアントアプリケーションは、一般に getInstance メソッドを使って CIMOM から CIM インスタンスを取得します。クラスのインスタンスが作成されると、クラスはクラス階層内のすべての親クラスのプロパティを継承します。getInstance メソッドは、ブール値引数 localOnly を受け取ります。

既存のインスタンスを更新する場合は、setInstance メソッドを使用します。


例 4–7 インスタンスの取得と設定

この例は次のことを行います。

...
{
    // オブジェクトパス、myclass というCIM 名を含むオブジェクト
    // を作成する
    CIMObjectPath cop = new CIMObjectPath("myclass"); 

    /* 列挙内の各インスタンスオブジェクトパスに対するインスタンスを
    取得し、各インスタンスの b のプロパティ値を 10 に更新し、更新した
    インスタンスを CIM オブジェクトマネージャに渡す */
    
    while(e.hasMoreElements()) {
        CIMInstance ci = cc.getInstance((CIMObjectPath)
                         (e.nextElement()),true, true, true, null);
        ci.setProperty("b", new CIMValue(new Integer(10)));
        cc.setInstance(new CIMObjectPath(),ci);
    }
}
...

プロパティの取得と設定

CIM プロパティは、CIM クラスの特性を記述する値です。プロパティは、1 組の関数と見なすことができます。一方の関数はプロパティ値を「取得」し、もう一方の関数はプロパティ値を「設定」します。


例 4–8 プロパティの取得

次の例は、enumerateInstanceNames を使って Solaris プラットフォームプロセッサのすべてのインスタンスの名前を返します。この例は、getProperty を使って各インスタンスの現在のクロック速度の値を取得し、println を使ってこの値を出力します。

...
{
/* オブジェクト (CIMObjectPath) を作成して、
Solaris_Processor クラスの名前を格納する */ 
 
CIMObjectPath cop = new CIMObjectPath("Solaris_Processor"); 
 
/* CIM オブジェクトマネージャは、Solaris_Processor クラスの
インスタンス名を含む列挙を返す */
 
Enumeration e = cc.enumerateInstanceNames(cop); 
 
/* インスタンスオブジェクトパスの列挙を繰り返し処理する。
getProperty メソッドを使用して、Solaris プロセッサごとの
現在のクロック速度の値を取得する */
 
while(e.hasMoreElements()) {
    CIMValue cv = cc.getProperty(e.nextElement(CIMObjectPath), 
                                         "CurrentClockSpeed");
    System.out.println(cv);
}
...
}
 


例 4–9 プロパティの設定

次の例では、すべての Solaris_UserTemplate インスタンスの初期シェル値を設定します。このコードセグメントは、enumerateInstanceNames を使って Solaris_UserTemplate のすべてのインスタンスの名前を取得します。また、setProperty を使って各インスタンスの初期シェルの値を設定します。

...
{
    /* オブジェクト (CIMObjectPath) を作成して 
    Solaris_Processor クラスの名前を格納する */ 
 
    CIMObjectPath cop = new CIMObjectPath("Solaris_UserTemplate"); 
 
    /* CIM オブジェクトマネージャは、 Solaris_UserTemplate クラスおよび
   そのサブクラスすべてのインスタンス名を含む列挙を返す */
 
    Enumeration e = cc.enumerateInstanceNames(cop); 
 
    /* インスタンスオブジェクトパスの列挙を繰り返し処理する。
    setProperty メソッドを使用して、初期シェル値を Solaris_UserTemplate 
    のインスタンスごとに /usr/bin/sh に設定する */
 
    for (; e.hasMoreElements(); cc.setProperty(e.nextElement(), 
         "/usr/bin/sh", new CIMValue(new Integer(500))));
}

オブジェクトの列挙

列挙とは一度にオブジェクトを 1 つずつ取り出すことができるオブジェクトの集合です。クラス、クラス名、インスタンス、インスタンス名、および名前空間を列挙できます。次の表に示すように、列挙の結果は使用するメソッドや引数によって異なります。

オブジェクトの列挙

表 4–1 オブジェクトの列挙

ソート方法 

引数なし 

deep

localOnly

enumerateClasses

path に指定されたクラスの内容を返す

true の場合: 指定されたクラスのサブクラスの内容を返す。ただし、指定されたクラス自体は返さない

true の場合: 指定されたクラスの継承されないプロパティおよびメソッドのみを返す

   

false の場合: 指定されたクラスの直接のサブクラスの内容を返す

false の場合: 指定されたクラスのプロパティをすべて返す

enumerateInstances

path に指定されたクラスのインスタンスを返す

true の場合: 指定されたクラスおよびそのサブクラスのインスタンスを返す

true の場合: 指定されたクラスのインスタンスの継承されないプロパティのみを返す

   

false の場合: 指定されたクラスおよびそのサブクラスのインスタンスを返す。サブクラスのプロパティは、フィルタ処理される

false の場合: 指定されたクラスのインスタンスのプロパティをすべて返す

enumerateClassNames

path に指定されたクラスの名前を返す

true の場合: 指定されたクラスから派生したすべてのクラスの名前を返す

なし 

   

false の場合:指定されたクラスの第 1 レベルの子の名前のみを返す

なし 

enumerateInstanceNames

path に指定されたクラスのインスタンスの名前を返す

なし 

なし 

       

enumNameSpace

path に指定された名前空間内の名前空間のリストを返す

true の場合: 指定された名前空間内の名前空間階層全体を返す

なし 

   

false の場合: 指定された名前空間の第 1 レベルの子のみを返す

なし 


例 4–10 クラスの列挙

次のプログラム例は、クラスおよびそのサブクラスの内容を返します。

...
{
    /* CIMObjectPath オブジェクトを作成し、列挙される CIM クラスの 
   名前 (myclass) で初期化する */
     
    CIMObjectPath cop = new CIMObjectPath(myclass); 
     
    /* この列挙には、列挙されたクラス内のクラスとサブクラスが
    含まれる (deep=true)。 この列挙は、各クラスおよびサブクラスの
    継承されないメソッドおよびプロパティだけを返す (localOnly が true) */
 
    Enumeration e = cc.enumerateClasses(cop, true, true);  
}
...


例 4–11 クラスおよびインスタンスの列挙

次のプログラム例は、クラスおよびインスタンスの列挙で deep および shallow (deep=false) が指定された場合の動作を示します。localOnly フラグは、クラスおよびインスタンスの名前ではなく、クラスおよびインスタンスの内容を返します。

import java.rmi.*;
import java.util.Enumeration;

import javax.wbem.client.CIMClient;
import javax.wbem.cim.CIMClass;
import javax.wbem.cim.CIMException;
import javax.wbem.cim.CIMInstance;
import javax.wbem.cim.CIMNameSpace;
import javax.wbem.cim.CIMObjectPath;

import javax.wbem.client.UserPrincipal;
import javax.wbem.client.PasswordCredential;


/** 
 * この例は、クラスとインスタンスを列挙する。コマンド行から
 * 渡されるクラス上で deep 列挙と shallow 列挙を行う
 */
public class ClientEnum {

    public static void main(String args[]) throws CIMException {
        CIMClient cc = null;
        CIMObjectPath cop = null;
        if (args.length < 4) {
            System.out.println("Usage: ClientEnum host user passwd " + 
                               "classname");
            System.exit(1);
        }
       try {
           CIMNameSpace cns = new CIMNameSpace(args[0]);
           UserPrincipal up = new UserPrincipal(args[1]);
           PasswordCredential pc = new PasswordCredential(args[2]);
           cc = new CIMClient(cns, up, pc);

           // コマンド行からクラス名を取得
           cop = new CIMObjectPath(args[3]);    
           // クラスの deep 列挙を実行
           Enumeration e = cc.enumerateClasses(cop, true, true, true, 
                                               true);
           // クラスのサブクラスをすべて出力
           while (e.hasMoreElements()) {
               System.out.println(e.nextElement());
           }
           System.out.println("+++++");
           // クラスの shallow 列挙を実行
           e = cc.enumerateClasses(cop, false, true, true, true);
           // 第 1 レベルのサブクラスを出力
           while (e.hasMoreElements()) {
               System.out.println(e.nextElement());
           }
           System.out.println("+++++");
           // クラスのインスタンスの deep 列挙を実行
           e = cc.enumerateInstances(cop, false, true, true, true, null);
           // クラスおよびそのサブクラスのインスタンスをすべて出力
           while (e.hasMoreElements()) {
               System.out.println(e.nextElement());
           }
           System.out.println("+++++");
           // クラスのインスタンスの shallow 列挙を実行
           e = cc.enumerateInstances(cop, false, false, true, true, null);
           // クラスのインスタンスをすべて出力
           while (e.hasMoreElements()) {
               System.out.println(e.nextElement());
           }
           System.out.println("+++++");
           e = cc.enumerateInstanceNames(cop);
           while (e.hasMoreElements()) {
               System.out.println(e.nextElement());
            }
           System.out.println("+++++");
           e = cc.enumerateInstanceNames(cop);
           while (e.hasMoreElements()) {
               CIMObjectPath opInstance = (CIMObjectPath)e.nextElement();
               CIMInstance ci = cc.getInstance(opInstance, false, 
                                                true, true, null);
               System.out.println(ci); 
           }
           System.out.println("+++++");
       }
       catch (Exception e) {
           System.out.println("Exception: "+e);
       }
       // セッションの終了
       if (cc != null) {
           cc.close();
       }
    }
}


例 4–12 クラス名の列挙

次のプログラム例は、クラス名およびサブクラス名のリストを返します。

...
{
    /* CIMObjectPath オブジェクトを作成し、列挙する CIM クラスの
    名前 (myclass) を使用して初期化する */
    CIMObjectPath cop = new CIMObjectPath(myclass); 
    
    /* この列挙には、列挙されたクラス内の
    クラスおよびサブクラスの名前が含まれる */
    Enumeration e = cc.enumerateClassNames(cop, true);
}
... 


例 4–13 名前空間の列挙

このプログラム例は、CIMClient クラスの enumNameSpace メソッドを使用して、名前空間とその中に含まれるすべての名前空間の名前を出力します。

 
import java.rmi.*;
import java.util.Enumeration;

import javax.wbem.cim.CIMClass;
import javax.wbem.cim.CIMException;
import javax.wbem.cim.CIMInstance;
import javax.wbem.cim.CIMNameSpace;
import javax.wbem.cim.CIMObjectPath;

import javax.wbem.client.CIMClient;
import javax.wbem.client.PasswordCredential;
import javax.wbem.client.UserPrincipal;


/** 
 *
 */
public class EnumNameSpace {
    public static void main(String args[]) throws CIMException {
        CIMClient cc = null;
        // 4 つの引数が指定されない場合、使用法を表示して終了する
        if (args.length < 4) {
            System.out.println("Usage: EnumNameSpace host username " +
                               "password namespace");
            System.exit(1);
        }
        try {
            // args[0] にはホスト名が含まれる。指定されたホスト上の
            // 指定された名前空間を指す CIMNameSpace (cns) を作成する
            CIMNameSpace cns = new CIMNameSpace(args[0], "");

            // args[1] と args[2] にはユーザー名およびパスワードが含まれる。
            // ユーザー名を使用して UserPrincipal (up) を、
            // パスワードを使用して PasswordCredential を作成する
            UserPrincipal up = new UserPrincipal(args[1]);
            PasswordCredential pc = new PasswordCredential(args[2]);

            // CIM オブジェクトマネージャに接続して、作成した CIMNameSpace、
            // UserPrincipal、 およびPasswordCredential オブジェクトを渡す
            cc = new CIMClient(cns, up, pc);

            // 名前空間 (args[3]) を使用して CIMObjectPath を作成する
            CIMObjectPath cop = new CIMObjectPath("", args[3]);

            // 名前空間を列挙する
            Enumeration e = cc.enumNameSpace(cop);
            while (e.hasMoreElements()) {
                System.out.println((CIMObjectPath)e.nextElement());
            } // while の終了

        } catch (Exception e) {
              // 例外が発生した場合はそれを出力する
              System.out.println("Exception: "+ e);
        } //  catch の終了

        // セッションの終了
        if (cc != null) {
            cc.close();
        }
    }
}

関連の作成

関連とは、コンピュータやそのハードディスクなどの管理される複数のリソース間の関係を表したものです。この関係は、関連修飾子を含む特殊なクラス型である関連クラス内で抽象化されます。実際のオブジェクトに影響を与えることなく、関連クラスを追加または変更できます。

図 4–1 TeacherStudent 関連 1

TeacherStudent 関連 1 は、Teacher が Student に教え (Teaches)、Student が Teacher から教えられる (Taught By) 関係を表します。

前出の図には、TeacherStudent という 2 つのクラスが示されています。両方のクラスは、TeacherStudent 関連によってリンクされています。TeacherStudent 関連には、次の 2 つの参照が存在します。

関連メソッド

CIMClient 内の関連メソッドは、クライアントとインスタンス間の関連 (関係) に関する情報を返します。次の表では、これらのメソッドについて説明します。

表 4–2 関連メソッド

ソート方法 

説明 

associators

指定された CIM クラスやインスタンスに関連付けられている CIM クラスやインスタンスを取得する 

associatorNames

指定された CIM クラスやインスタンスに関連付けられている CIM クラスやインスタンスの名前を取得する 

references

指定された CIM クラスやインスタンスを参照する関連クラスやインスタンスを取得する 

referenceNames

指定された CIM クラスやインスタンスを参照する関連クラスやインスタンスの名前を取得する 

これらのメソッドは、単一の必須引数 CIMObjectPath を取ります。CIMObjectPath は、検索する関連、関連付けられたクラス、またはインスタンスを持つソースの CIM クラスまたは CIM インスタンスの名前です。CIMOM は、関連、関連付けられたクラス、またはインスタンスを検出できない場合、何も返しません。

図 4–2 TeacherStudent 関連 2

Math Teacher と Art Teacher は Teacher のサブクラス、Teacher 1、Teacher 2、および Student 1 はクラスインスタンスです。

前出の図の associators および associatorNames メソッドは、Teacher および Student クラスに関連付けられたクラスの情報を返します。references および referenceNames メソッドは、Teacher および Student クラス間の関連に関する情報を返します。

表 4–3 TeacherStudent メソッド

例 

出力 

説明 

associators(Teacher, null, null, null, null, false, false, null)

Student クラス

関連付けられているクラスを返す。Student は、TeacherStudent 関連によって Teacher とリンクされている

associators(MathTeacher, null, null, null, null,false, false, null)

Student

関連付けられているクラスを返す。Teacher は、TeacherStudent 関連によって Student とリンクされている。MathTeacherArtTeacher は、Teacher から TeacherStudent 関連を継承する

associatorNames(Teacher, null, null, null, null)

Student クラスの名前

関連付けられているクラスの名前を返す。Student は、TeacherStudent 関連によって Teacher とリンクされている

references(Student, null, null, false, false, null)

TeacherStudent

Student が関与している関連を返す

references(Teacher, null, null, false, false, null)

TeacherStudent

Teacher が関与している関連の名前を返す

references(Teacher, null, null, false, false, null)

TeacherStudent

Teacher が関与している関連の名前を返す

referenceNames(Teacher, null, null)

TeacherStudent クラスの名前

Teacher が関与している関連の名前を返す

referenceNames(Teacher, null, null)

TeacherStudent クラスの名前

Teacher が関与している関連の名前を返す


注 –

associatorNames および referenceNames メソッドは、引数 includeQualifiersincludeClassOrigin および propertyList を取りません。これらの引数は、インスタンスまたはクラスの名前だけを返し、その内容を返さないメソッドには不必要です。


関連メソッドへのクラスの引き渡し

クラス名を指定する場合、そのモデルパスを指定します。モデルパスには、クラスの名前空間、クラス名、およびキーが含まれます。キーは、管理対象リソースを一意に識別するプロパティまたはプロパティのセットです。キープロパティは、key 修飾子によって示されます。次に、サンプルモデルパスを示します。

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

このモデルパスは、次の値を指定します。

関連メソッドへのインスタンスの引き渡し

enumerateInstances メソッドを使用して、所定のクラスのすべてのインスタンスを返し、ループ構造を使用して各インスタンスを処理します。ループでは、各インスタンスを関連メソッドに渡すことができます。


例 4–14 インスタンスの引き渡し

この例は、op クラスとそのサブクラスのインスタンスを列挙します。while ループを使って個々のインスタンスを CIMObjectPath (op) にキャストし、各インスタンスを associators メソッドの第 1 引数として渡します。

 {
    ...
    Enumeration e = cc.enumerateInstances(op, true);
    while (e.hasMoreElements()) {
        op = (CIMObjectPath)e.nextElement();
        Enumeration e1 = cc.associators(op, null, null, 
                null, null, false, false, null);
    ...
    }           

関連メソッドでのオプション引数の使用

関連メソッドでオプション引数を使用して、返されるクラスやインスタンスをフィルタ処理できます。すべてのパラメータが処理されるまで、オプションの各パラメータ値は、その結果をフィルタ処理のために次のパラメータに渡します。

任意の 1 つのオプションパラメータ、またはその組み合わせた値を渡すことができます。各パラメータには値または null を指定する必要があります。最初の 4 つのパラメータは、返されるクラスおよびインスタンスをフィルタします。

これらの引数を使用すると、これらのパラメータに指定された値と一致するクラスやインスタンスだけが返されます。返されるクラスやインスタンスに含まれている情報をフィルタ処理するパラメータには、includeQualifiersincludeClassOriginpropertyList があります。

メソッドの呼び出し

プロバイダによってサポートされるクラス内のメソッドを呼び出すには、invokeMethod インタフェースを使用します。メソッドのシグニチャーを取得するには、最初にそのメソッドが属するクラスの定義を取得する必要があります。invokeMethod メソッドは CIMValue を返します。呼び出したメソッドが戻り値を定義していない場合には、戻り値は null です。

invokeMethod インタフェースは、次の表に示す 4 つの引数を受け取ります。

表 4–4 invokeMethod パラメータ

パラメータ 

データ型 

説明 

name

CIMObjectPath

インスタンス名。このインスタンスでメソッドを呼び出す 

methodName

String

呼び出すメソッド名 

inParams

Vector

メソッドに渡す入力パラメータ 

outParams

Vector

メソッドから受け取る出力パラメータ 


例 4–15 メソッドの呼び出し

この例では、CIM_Service クラスのインスタンスを取得します。これらのインスタンスは、デバイスやソフトウェアの機能を管理するサービスを表します。invokeMethod メソッドを使って、各サービスを停止します。

{
    ...
    /* CIM_Service クラスの CIM オブジェクトパスを  
    CIM オブジェクトマネージャに渡す。このクラスで定義されたメソッドを
    呼び出す */ 
     
    CIMObjectPath op = new CIMObjectPath("CIM_Service"); 
     
    /* CIM オブジェクトマネージャは、インスタンスオブジェクトパスの
   列挙、CIM_Service クラスのインスタンス
   名を返す */
     
    Enumeration e = cc.enumerateInstanceNames (op, true); 
     
    /* インスタンスオブジェクトパスの列挙を繰り返し処理する*/
     
    while(e.hasMoreElements()) {
                // インスタンスを取得する
                CIMObjectPath op = (CIMObjectPath) e.nextElement();
                // Stop Service メソッドを呼び出して CIM サービスを停止する
                cc.invokeMethod("StopService", null, null);
              }
}
 

クラス定義の取得

CIM クラスを取得するには getClass メソッドを使用します。クラスが作成されると、そのクラスは、クラス階層内のすべての親クラスのメソッドとプロパティを継承します。getClass メソッドは、ブール値引数 localOnly を受け取ります。


例 4–16 クラス定義の取得

このプログラム例は、次のメソッドを使用してクラス定義を取得します。

import java.rmi.*;
import javax.wbem.client.CIMClient;
import javax.wbem.cim.CIMInstance;
import javax.wbem.cim.CIMValue;
import javax.wbem.cim.CIMProperty;
import javax.wbem.cim.CIMNameSpace;
import javax.wbem.cim.CIMObjectPath;
import javax.wbem.cim.CIMClass;
import javax.wbem.cim.CIMException;
import java.util.Enumeration;
/**
 * コマンド行で指定されたクラスを取得する。作業をデフォルトの名前空間
 *  root\cimv2 で行う
 */
public class GetClass {
    public static void main(String args[]) throws CIMException {
        CIMClient cc = null;
        try {
           CIMNameSpace cns = new CIMNameSpace(args[0]);
           UserPrincipal up = new UserPrincipal("root");
           PasswordCredential pc = new PasswordCredential("root_password");
           cc = new CIMClient(cns);
           CIMObjectPath cop = new CIMObjectPath(args[1]);
           // 指定されたクラスに対してローカルなメソッド
           // とプロパティのみを返す
           //  (localOnly は true)
           cc.getClass(cop, true);
        } catch (Exception e) {
            System.out.println("Exception: "+e);
        }
        if(cc != null) {
            cc.close();
        }
    }
}

例外の処理

CIMClient メソッドは、CIMException、つまりエラー状態をスローします。CIMOM は、Java の例外処理により、WBEM 固有の例外の階層を作成します。CIMException クラスは、CIM 例外の基底クラスです。CIMException 以外の CIM 例外クラスは、CIMException クラスのサブクラスです。

CIM 例外の各クラスは、API コードが処理する特定のエラー状態を定義します。CIMException は、エラーコードおよび例外に関連したパラメータを取得するメソッドを保持します。CIMException クラスの詳細は、/usr/sadm/lib/wbem/doc/index.html を参照してください。

名前空間の作成

Solaris OS は、標準の CIM MOF (Managed Object Format) ファイルをコンパイルしてデフォルトの名前空間を生成します。新しい名前空間を作成する場合は、先に適切な CIM .mof ファイルを新しい名前空間にコンパイルしてから、その名前空間にオブジェクトを作成する必要があります。たとえば、標準の CIM 要素を使用するクラスを作成する場合は、名前空間に CIM コアスキーマをコンパイルします。CIM アプリケーションスキーマを拡張するクラスを作成する場合は、名前空間に CIM アプリケーションをコンパイルします。


例 4–17 名前空間の作成

次の例では、2 段階の処理を実行して、既存の名前空間内に名前空間を作成します。

  1. 名前空間の作成時に、CIMNameSpace メソッドが CIM オブジェクトマネージャ に渡すパラメータを含む名前空間オブジェクトを作成します。

  2. CIMClient クラスは、 CIM オブジェクトマネージャ に接続して名前空間オブジェクトを渡します。CIM オブジェクトマネージャ は、名前空間オブジェクトに含まれるパラメータを使用して名前空間を作成します。

{
    ...
    /* クライアント上で名前空間オブジェクトを作成し、
    コマンド行から渡されるパラメータを格納する。args[0] にはホスト名
     (たとえば myhost) が、args[1] には親の名前空間 (たとえば 最上位
    ディレクトリ) が含まれる。 */
       
    CIMNameSpace cns = new CIMNameSpace (args[0], args[1]); 

    UserPrincipal up = new UserPrincipal("root");
    PasswordCredential pc = new PasswordCredential("root_password"); 
     
    /* CIM オブジェクトマネージャに接続し、3 つのパラメータを渡す。
    3 つのパラメータとは、ホスト名 (args[0]) および親の名前空間名 
   (args[1]) を含む名前空間オブジェクト (cns)、ユーザー名文字列 
   (args[3])、およびパスワード文字列 (args[4]) を指す */
     
    CIMClient cc = new CIMClient (cns, up, pc);
     
    /*  CIM オブジェクトマネージャに、NULL 文字列 (ホスト名) と
    args[2] の子名前空間の名前 (たとえば secondlevel) を含む別の
    名前空間オブジェクトを渡す */
     
    CIMNameSpace cop = new CIMNameSpace("", args[2]);
    
    /* myhost の最上位の名前空間に、args[2] を介して渡された名前で、
    新しい名前空間を作成する./*
     
    cc.createNameSpace(cop);
    ...
} 

名前空間の削除

名前空間を削除するには、 deleteNameSpace メソッドを使用します。

基底クラスの作成


注 –

MOF 言語を使用して基底クラスを作成することもできます。MOF 構文に慣れている場合は、テキストエディタで MOF ファイルを作成します。次に、MOF コンパイラでファイルをコンパイルし、Java クラスを生成します。詳細は、第 7 章「MOF コンパイラを使用した JavaBeans 構成要素の作成」を参照してください。


CIM クラスを表す Java クラスを作成するには、 CIMClass クラスを使用します。ほとんどの基底クラスは、クラス名およびキープロパティまたは abstract (抽象) 修飾子を指定するだけで宣言できます。ただし、ほとんどのクラスには、クラスのデータを表すプロパティが含まれます。プロパティを宣言するには、プロパティのデータ型、名前、およびオプションのデフォルト値を含めます。プロパティのデータ型は、CIMDataType のインスタンスである必要があります。

プロパティには、キープロパティであることを示すキー修飾子を指定できます。キープロパティは、クラスのインスタンスを個別に定義します。インスタンスを持てるのは、キーが指定されたクラスだけです。そのため、キープロパティが定義されないクラスは、abstract (抽象) クラスとしてしか使用できません。新しい名前空間内でクラスにキープロパティを定義する場合は、最初にコア MOF ファイルをその名前空間にコンパイルする必要があります。コア MOF ファイルには、標準の CIM 修飾子 (キー修飾子など) の宣言が含まれます。

クラス定義は、別名、修飾子、修飾子フレーバなどの MOF 機能が含まれることにより複雑化します。

クラスの削除

クラスを削除するには、CIMClientdeleteClass メソッドを使用します。このメソッドは、クラスを削除し、CIMException をスローします。


注 –

基底クラスを削除する場合、最初に既存のサブクラスまたはインスタンスをすべて削除しておく必要があります。



例 4–18 クラスの削除

このプログラム例は、deleteClass メソッドを使用して、デフォルトの名前空間 root\cimv2 にあるクラスを削除します。このプログラムは、次の 4 つの必須文字列引数を取ります。

このプログラムを実行するユーザーは、root\cimv2 名前空間への書き込み権を持つアカウントのユーザー名とパスワードを指定する必要があります。

 
import javax.wbem.cim.CIMClass;
import javax.wbem.cim.CIMException;
import javax.wbem.cim.CIMNameSpace;
import javax.wbem.cim.CIMObjectPath;
import javax.wbem.client.CIMClient;
import javax.wbem.client.UserPrincipal;
import javax.wbem.client.PasswordCredential;

import java.rmi.*;
import java.util.Enumeration;

/**
 * コマンド行で指定されたクラスを削除する。デフォルトの名前空間 
 *  root\cimv2 で作業を行う
 */
public class DeleteClass {
    public static void main(String args[]) throws CIMException {
        CIMClient cc = null;
        // 4 つの引数が指定されていない場合、使用法を表示して終了する
        if (args.length != 4) {
            System.out.println("Usage: DeleteClass host className " +
                              "username password"); 
            System.exit(1);
        }
        try {
            // args[0] にはホスト名が含まれる。指定されたホスト上の
            // デフォルトの名前空間を指す CIMNameSpace を作成する
            CIMNameSpace cns = new CIMNameSpace(args[0]);

            // args[2] と args[3] には、ユーザー名およびパスワードが
            // 含まれる。
            // ユーザー名を使用して UserPrincipal (up) を、
            // パスワードを使用して PasswordCredential を作成する
            UserPrincipal up = new UserPrincipal(args[2]);
            PasswordCredential pc = new PasswordCredential(args[3]);

            cc = new CIMClient(cns, up, pc);

            // クラス名 (args[4]) を取得し、CIMObjectPath を作成する
            CIMObjectPath cop = new CIMObjectPath(args[1]);
            // クラスを削除する
            cc.deleteClass(cop);
        }
        catch (Exception e) {
            System.out.println("Exception: "+e);
        }
        if (cc != null) {
            cc.close();
        }
    }
}