Solaris WBEM SDK 開発ガイド

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

このセクションでは、javax.wbem.client API を使用して、操作の要求および一般的なプログラミング作業を実行する方法を説明します。

インスタンスの作成

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

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


例 3-5 インスタンスの作成

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

...
{ 
/* ローカルホストの root\cimv2 名前空間の 
   CIM Object Manager に接続。root\cimv2 名前空間内の
   オブジェクトに対する書き込み権を持つアカウントのユーザー名とパスワードを
   指定する */
 
    UserPrincipal up = new UserPrincipal("root");
    PasswordCredential pc = new PasswordCredential("root_password"); 
    /* 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 メソッドを使用します。


例 3-6 インスタンスの削除

次の例では、クライアントアプリケーションを CIM Object Manager に接続し、CIMObjectPath を使用して削除するオブジェクトの CIM オブジェクトパスを含むオブジェクトを構築し、enumerateInstance を使用してインスタンスおよびサブクラスのすべてのインスタンスを取得し、 deleteInstance を使用して各インスタンスを削除します。

 
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;

/** 
 * 指定されたクラスのインスタンスをすべて返す。
 * このプログラム例では、5 つの必須コマンド行引数、hostname (args[0])、
 * username (args[1])、password (args[2]) namespace (args[3])、
 * および classname (args[4]) を取り、
 * 指定されたクラス名のインスタンスをすべて削除する。
 * 指定されたユーザー名は、
 * 指定された名前空間への書き込み権を持つ必要がある
 */
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 Object Manager に接続して、
        // 作成した CIMNameSpace、UserPrincipal、および 
        // PasswordCredential オブジェクトを渡す
        cc = new CIMClient(cns, up, pc);

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

        // クラスおよびそのサブクラスすべてのインスタンスオブジェクトパス
        // すべての列挙を取得する。インスタンスオブジェクトパスは、
        // CIM Object Manager がインスタンス検出に
        // 使用する参照を指す
        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();
       }
    }
}


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

クライアントアプリケーションが CIM Object Manager から CIM インスタンスを取得する場合には、通常 getInstance メソッドが使用されます。クラスのインスタンスが作成されるときに、インスタンスはその派生元クラスとそのクラス階層にあるすべての親クラスのプロパティを継承します。getInstance メソッドはブール値引数 localOnly を受け取ります。localOnly が true の場合、getInstance メソッドは指定されたインスタンスによって継承されたプロパティ以外のプロパティだけを返します。

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


例 3-7 インスタンスの取得と設定

次の例では、列挙されたオブジェクトパスのインスタンスを取得し、各インスタンス内で b のプロパティ値を 10 に更新し、更新したインスタンスを CIM Object Manager に渡します。

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

    /* 列挙内の各インスタンスオブジェクトパスのインスタンスを取得し、
       各インスタンス内で b のプロパティ値を 10 に更新し、
       更新したインスタンスを CIM Object Manager に渡す */
    
    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 クラスの特性を記述する値です。プロパティは、プロパティ値を取得する機能と、プロパティ値を設定する機能の組み合わせとして考えることができます。


例 3-8 プロパティの取得

次の例では、enumerateInstanceNames を使用して Solaris プロセッサのすべてのインスタンス名を返し、getProperty を使用して各インスタンスの現在のクロック速度の値を取得し、println を使用して出力します。

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



例 3-9 プロパティの設定

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

...
{
    /* オブジェクト (CIMObjectPath) を作成して
    Solaris_Processor クラスの名前を格納する */ 
 
    CIMObjectPath cop = new CIMObjectPath("Solaris_UserTemplate"); 
 
    /* CIM Object Manager は、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 つずつ取り出すことができます。クラス、クラス名、インスタンス、インスタンス名、および名前空間を列挙できます。次の表に示すように、列挙の結果は使用するメソッドや引数によって異なります。

オブジェクトの列挙

表 3-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 レベルの子のみを返す

なし 


例 3-10 列挙クラス

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

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


例 3-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();
  }
 }
}


例 3-12 クラス名の列挙

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

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



例 3-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 Object Manager に接続して
           // 作成した 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();
        }
    }
}


関連の作成

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

図 3-1 TeacherStudent 関連 1

Graphic

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

関連メソッド

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

表 3-2 関連メソッド

メソッド 

説明 

associators

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

associatorNames

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

references

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

referenceNames

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

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

図 3-2 TeacherStudent 関連 2

Graphic

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

表 3-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 とリンクされている。Math TeacherArt Teacher は、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 メソッドを使用して、所定のクラスのすべてのインスタンスを返し、ループ構造を使用して各インスタンスを処理します。ループでは、各インスタンスを関連メソッドに渡すことができます。


例 3-14 インスタンスの引き渡し

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

 {
    ...
    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 を指定する必要があります。返されるクラスやインスタンスをフィルタ処理するパラメータには、assocClassresultClassroleresultRole があります。これらの引数を使用すると、これらのパラメータに指定された値と一致するクラスやインスタンスだけが返されます。返されるクラスやインスタンスに含まれている情報をフィルタ処理するパラメータには、includeQualifiersincludeClassOriginpropertyList があります。

メソッドの呼び出し

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

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

表 3-4 invokeMethod パラメータ

パラメータ 

データ型 

説明 

name

CIMObjectPath

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

methodName

String

呼び出すメソッド名 

inParams

Vector

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

outParams

Vector

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


例 3-15 メソッドの呼び出し

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

{
    ...
    /* CIM_Service クラスの 
CIM オブジェクトパスを CIM Object Manager に渡す。
このクラスで定義されたメソッドを呼び出す */ 
     
    CIMObjectPath op = new CIMObjectPath("CIM_Service"); 
     
    /* CIM Object Manager は インスタンスオブジェクトパスの列挙、
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 を受け取ります。


例 3-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、つまりエラー状態をスローします。CIM Object Manager は、Java の例外処理を使用して WBEM 固有の例外の階層を作成します。CIMException クラスは、CIM 例外の基底クラスです。CIMException 以外の CIM 例外クラスは、CIMException クラスのサブクラスです。

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

名前空間の作成

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


例 3-17 名前空間の作成

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

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

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

{
    ...
    /* クライアント上で名前空間オブジェクトを作成し、コマンド行から
渡されるパラメータを格納する。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 Object Manager に接続し、3 つのパラメータを渡す。
3 つのパラメータとは、ホスト名 (args[0]) および親の名前空間名 (args[1]) 
を含む名前空間オブジェクト (cns)、ユーザー名文字列 (args[3])、
およびパスワード文字列 (args[4]) を指す */
     
    CIMClient cc = new CIMClient (cns, up, pc);
     
    /* CIM Object Manager に、NULL 文字列 (ホスト名) と args[2]の
子名前空間の名前 (たとえば secondlevel) を含む
別の名前空間オブジェクトを渡す */
     
    CIMNameSpace cop = new CIMNameSpace("", args[2]);
    
    /* myhost の最上位の名前空間に args[2] として渡された名前で、
新しい名前空間を作成する /*
     
    cc.createNameSpace(cop);
    ...
} 


名前空間の削除

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

基底クラスの作成


注 -

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


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

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

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

クラスの削除

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


注 -

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



例 3-18 クラスの削除

このプログラム例は、deleteClass メソッドを使用して、デフォルトの名前空間 root\cimv2 にあるクラスを削除します。このプログラムは、4 つの必須文字列引数 (hostnameclassnameusername、および password) を取ります。このプログラムを実行するユーザーは、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 (cns) を作成する
          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();
       }
    }
}