Sun WBEM SDK 開発ガイド

高度なプログラミング

この節では、高度なプログラミング作業と、使用頻度の低いプログラミング作業について説明します。

ネームスペースの作成

インストールを行うと、標準の CIM MOF ファイルがデフォルトのネームスペース root\cimv2root\security にコンパイルされます。新しいネームスペースを作成する場合は、そのネームスペースにオブジェクトを作成する前に適切な CIM MOF ファイルをネームスペースにコンパイルします。たとえば、標準の CIM 要素を使用するクラスを作成する場合は、ネームスペースに CIM コアスキーマをコンパイルします。CIM アプリケーションスキーマを拡張するクラスを作成する場合は、ネームスペースに CIM アプリケーションをコンパイルします。

例 — ネームスペースの作成

例 4–20 のコードセグメントは、2 段階の処理により既存のネームスペース内にネームスペースを作成します。


例 4–20 ネームスペースの作成 (CIMNameSpace)

{
    ...
    /* ネームスペースオブジェクトをクライアント上に作成する。ネームスペースオブジェクトは、
    コマンド行から入力されたパラメータを格納する。args[0] にはホスト名
    (たとえば myhost)、args[1] には親ネームスペース (たとえば 
    toplevel ディレクトリ) がそれぞれ含まれている。 */
     
    CIMNameSpace cns = new CIMNameSpace (args[0], args[1]); 
     
    /* CIM Object Manager に接続し、パラメータとして、ホスト名 
    (args[0]) と親ネームスペース名 (args[1]) を持つネームスペース
    オブジェクト (cns) と、ユーザー名文字列 (args[3])、パスワード文字列 
    (args[4]) の 3 つを渡す。 */
     
    CIMClient cc = new CIMClient (cns, "root", "secret");	
     
    /* CIM Object Manager に別のネームスペースオブジェクトを渡す。
    これには、null 文字列 (ホスト名) と args[2] (
    子ネームスペースの名前 (たとえば、secondlevel) ) が含まれる。 */
     
    CIMNameSpace cop = new CIMNameSpace("", args[2]);
    
    /* secondlevel という新しいネームスペースを、myhost 上の 
    toplevel ネームスペースの下に作成する。 /*
     
    cc.createNameSpace(cop);
    ...
} 


ネームスペースの削除

ネームスペースを削除するには、deleteNameSpace メソッドを使用します。

例 — ネームスペースの削除

例 4–21 のサンプルプログラムは、指定されたホスト上の指定されたネームスペースを削除します。このプログラムは、5 つの必須文字列引数 (ホスト名、親ネームスペース、子ネームスペース、ユーザー名、パスワード) を受け取ります。このプログラムを実行するユーザーは、削除するネームスペースへの書き込みアクセス権を持つアカウントのユーザー名とパスワードを指定する必要があります。


例 4–21 ネームスペースの削除 (deleteNameSpace)

{
import java.rmi.*;
import com.sun.wbem.client.CIMClient;
import com.sun.wbem.cim.CIMInstance;
import com.sun.wbem.cim.CIMValue;
import com.sun.wbem.cim.CIMProperty;
import com.sun.wbem.cim.CIMNameSpace;
import com.sun.wbem.cim.CIMObjectPath;
import com.sun.wbem.cim.CIMClass;
import com.sun.wbem.cim.CIMException;
import java.util.Enumeration;
 /**
 * このサンプルプログラムは、指定されたホスト上の指定されたネームスペースを
 * 削除する。このプログラムを実行するユーザーは、指定するネームスペースへの
 * 書き込みアクセス権を持つアカウントのユーザー名とパスワードを指定する必要
 * がある
 */
 public class DeleteNameSpace {
    public static void main(String args[]) throws CIMException {
        // CIMClient クラスのインスタンスを初期化する
				CIMClient cc = null;
        // 5 つのコマンド行引数が必要。全部が入力されない場合は、
        // コマンド文字列を出力する
				if(args.length != 5) {
	    		    System.out.println("Usage: DeleteNameSpace host parentNS 
					          childNS username password"); 
	    			  System.exit(1);
				}
				try {
		         /**
						 * ネームスペースオブジェクト (cns) を作成し、
						 * ホスト名と親ネームスペースを格納する
						 */ 
	      			 CIMNameSpace cns = new CIMNameSpace(args[0], args[1]);
	     			/** 
						 * CIM Object Manager に接続し、ネームスペース
						 * オブジェクト (cns) と、コマンド行引数のユーザー名と
	     			 * パスワードを渡す
	     			 */
	     			 cc = new CIMClient(cns, args[3], args[4]);
	   			  /**
						 * もう 1 つネームスペースオブジェクト (cop) を作成し、ホスト名
						 * として null 文字列を、子ネームスペースとしてコマンド行引数の
						 * 文字列をそれぞれ格納する
						 */
		   			 CIMNameSpace cop = new CIMNameSpace("",args[2]);
	 					/**
						 * 親ネームスペースの下にある子ネームスペースを削除する
	     		   */ 
	    			   cc.deleteNameSpace(cop);
				} catch (Exception e) {
	    		    System.out.println("Exception: "+e);
				}
 				// セッションを閉じる
				if(cc != null) {
	   		    cc.close();
				}
   	 }
}


基底クラスの作成

アプリケーションは、MOF 言語またはクライアント API のどちらかを使用してクラスを作成できます。MOF の構文に慣れている場合は、テキストエディタを使用して MOF ファイルを作成し、その後 MOF コンパイラを使用してそのファイルを Java クラスにコンパイルすることをお勧めします。この節では、クライアント API を使用して基底クラスを作成する方法を説明します。

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

プロパティには、キープロパティであることを識別するキー修飾子を指定できます。キープロパティは、クラスのインスタンスを個別に定義します。インスタンスを持てるのは、キーが指定されたクラスだけです。そのため、キープロパティが定義されないクラスは、abstract クラスとしてしか使用できません。

新しいネームスペース内でクラスにキープロパティを定義する場合は、最初にコア MOF ファイルをそのネームスペースにコンパイルする必要があります。コア MOF ファイルには、標準の CIM 修飾子 (キー修飾子など) の宣言が含まれます。

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

例 — CIM クラスの作成

例 4–22 は、ローカルホスト上のデフォルトネームスペース (root\cimv2) に新しい CIM クラスを作成します。このクラスは 2 つのプロパティを持ち、その 1 つはこのクラスのキープロパティです。続いて、newInstance メソッドを使用して、この新しいクラスのインスタンスを作成します。


例 4–22 CIM クラスの作成 (CIMClass)

{
...
    /* ローカルホスト上の root\cimv2 ネームスペースに接続し、
    新しいクラス myclass を作成 */

    // ローカルホスト上のデフォルトネームスペースに接続
    CIMClient cc = new CIMClient();
 
    // 新しい CIMClass オブジェクトを構築
    CIMClass cimclass = new CIMClass();

    // CIM クラス名を myclass に設定
    cimclass.setName("myclass"); 

    // 新しい CIM プロパティオブジェクトを構築
    CIMProperty cp = new CIMProperty(); 

    // プロパティ名を設定
    cp.setName("keyprop"); 
     
    // プロパティの型として、あらかじめ定義されている CIM データ型のいずれか 1 つを設定
    cp.setType(CIMDatatype.getPredefinedType(CIMDataType.STRING)); 
     
    // 新しい CIM Qualifier オブジェクトを構築
    CIMQualifier cq = new CIMQualifier(); 
     
    // 修飾子名を設定
    cq.setName("key"); 
     
    // 新しいキー修飾子名をプロパティに追加
    cp.addQualfier(cq); 
     
    /* 整数プロパティを作成し、10 に初期化 */
     
    // 新しい CIM プロパティオブジェクトを構築
    CIMProperty mp = new CIMProperty();
     
    // プロパティ名に myprop を設定
    mp.setName("myprop"); 
     
    // プロパティの型に、あらかじめ定義されている CIM データ型のいずれかを設定
    mp.setType(CIMDatatype.getPredefinedType(CIMDataType.SINT16)); 
     
    // mp を CIMValue に初期化する。CIM Object Manager は、
    // 値 10 を持つ新しい整数オブジェクトであるこの CIMValue を、
    // 上の mp.setType 文でプロパティに対して指定されている
    // CIM データ型 (SINT16) に変換する。CIMValue (Integer 10) 
    // がプロパティ (SINT16) の CIM データ型で定義される値の
    // 範囲内にない場合、CIM Object Manager は例外をスローする。
    mp.setValue(new CIMValue(new Integer(10)));
     
    /* myclass にこの新しいプロパティを追加した後、クラスを
    作成するために CIM Object Manager を呼び出す。 */
     
    // クラスオブジェクトにキープロパティを追加
    cimclass.addProperty(cp); 
     
    // クラスオブジェクトに整数プロパティを追加
    cimclass.addProperty(mp); 
     
    /* CIM Object Manager に接続し、新しいクラスを渡す。 */
    cc.createClass(new CIMObjectPath(),cimclass);
     
    // myclass に新しい CIM インスタンスを作成
    ci = cc.newInstance(); 
     
    // クライアント接続が開かれている場合、接続を閉じる。
		if(cc != null) {
        cc.close();
    }
}


クラスの削除

クラスを削除するには、CIMClientdeleteClass メソッドを使用します。クラスを削除すると、クラス、そのサブクラス、およびそのすべてのインスタンスが削除されます。削除されるクラスを参照する関連は削除されません。

例 — クラスの削除

例 4–23 のサンプルプログラムは、deleteClass メソッドを使って、デフォルトネームスペース root\cimv2 にあるクラスを削除します。このプログラムは、4 つの必須文字列引数 (ホスト名、クラス名、ユーザー名、パスワード) を受け取ります。このプログラムを実行するユーザーは、root\cimv2 ネームスペースへの書き込みアクセス権を持つアカウントのユーザー名とパスワードを指定する必要があります。


例 4–23 クラスの削除 (deleteClass)

 
		import java.rmi.*;
		import com.sun.wbem.client.CIMClient;
		import com.sun.wbem.cim.CIMInstance;
		import com.sun.wbem.cim.CIMValue;
		import com.sun.wbem.cim.CIMProperty;
		import com.sun.wbem.cim.CIMNameSpace;
		import com.sun.wbem.cim.CIMObjectPath;
		import com.sun.wbem.cim.CIMClass;
		import com.sun.wbem.cim.CIMException;
		import java.util.Enumeration;
	 /**
		* コマンド行に指定されるクラスを削除。
		* デフォルトネームスペース root\cimv2 で作業を行う。
		*/
		public class DeleteClass {
	      public static void main(String args[]) throws CIMException {
			      CIMClient cc = null;
			      if(args.length != 4) {
	   		 	      System.out.println("Usage: 
                        DeleteClass host className username password"); 
	   		 	      System.exit(1);
				    }
				    try {
	   			      /**
	     		       * ネームスペースオブジェクト (cns) を作成し、ホスト名を渡す
					       */ 
						    CIMNameSpace cns = new CIMNameSpace(args[0]);
 
	   			     /** 
						    * CIM Object Manager に接続し、ネームスペース
						    * オブジェクト (cns) と、コマンド行引数から入力された
	     		      * ユーザー名とパスワードを渡す
	     		      */
						    cc = new CIMClient(cns, args[2], args[3]);
 
					      /** 
						     * クラスの名前 (args[1]) を持つオブジェクト (CIMObjectPath) 
						     * を作成する
						     */
						    CIMObjectPath cop = new CIMObjectPath(args[1]);
 
						    /**
						     * CIM オブジェクトパスで参照されるクラスを削除する
						     */
	  		  			    cc.deleteClass(cop);
					   } catch (Exception e) {
	 		  			    System.out.println("Exception: "+e);
					   }
					   if(cc != null) {
	    				    cc.close();
				     }
  	    }
}

修飾子のデータ型と修飾子の処理

CIM 修飾子は、CIM クラス、インスタンス、プロパティ、メソッド、またはパラメータの特性を示す要素です。修飾子の属性は、次のとおりです。

MOF (Managed Object Format) 構文では、各 CIM 修飾子は同じ MOF ファイルでそのデータ型を宣言する必要があります。修飾子には、スコープ属性はありません。スコープは、どの CIM 要素がその修飾子を使用できるかを示します。スコープを定義できるのは、修飾子のデータ型宣言内だけです。スコープは、修飾子では変更できません。

次に、CIM 修飾子のデータ型を宣言する MOF 構文を示します。この文は、ブール型 (デフォルト値は false) を使用して修飾子のデータ型 key を定義します。このデータ型が記述できるのは、プロパティと、オブジェクトに対する参照だけです。DisableOverride フレーバは、このキー修飾子がそれらの値を変更できないことを意味します。

Qualifier Key : boolean = false, Scope(property, reference), 
								Flavor(DisableOverride);

次のコード例は、CIM 修飾子の MOF 構文を示します。このサンプル MOF ファイルでは、keyDescription はプロパティ test の修飾子です。プロパティのデータ型は、値 a を持つ整数です。

{
[key, Description("test")]
int a
}

例 — CIM 修飾子の取得

例 4–24 のコードセグメントは、CIMQualifier クラスを使用して CIM 要素のベクトル内の CIM 修飾子を識別します。この例は、各 CIM 修飾子ごとにプロパティ名、値、およびデータ型を返します。

修飾子フレーバは、修飾子の使用を制御するフラグです。フレーバは、派生クラスとインスタンスに修飾子を継承できるかどうか、および派生クラスまたはインスタンスが修飾子の本来の値をオーバーライドできるかどうかを指定する規則を記述します。


例 4–24 CIM 修飾子の取得 (CIMQualifier)

	
...
 
    } else if (tableType == QUALIFIER_TABLE) {
		CIMQualifier prop = (CIMQualifier)cimElements.elementAt(row);
		if (prop != null) {
		    if (col == nameColumn) {
			return prop.getName();
		    } else if (col == typeColumn) {
			CIMValue cv = prop.getValue();
			if (cv != null) {
			    return cv.getType().toString();
			} else {
			    return "NULL";			      }
		  } 
 
...
 
 


例 — CIM 修飾子の設定

例 4–25 のコードセグメントは、新しいクラスの CIM 修飾子のリストをそのスーパークラス内の修飾子に設定します。


例 4–25 修飾子の設定 (setQualifiers)

   ...
	try 	{
	    	cimSuperClass = cimClient.getClass(new CIMObjectPath(scName));
	    	Vector v = new Vector();
	    	for (Enumeration e = cimSuperClass.getQualifiers().elements();
					e.hasMoreElements();) { 
					CIMQualifier qual = (CIMQualifier)((CIMQualifier)e.nextElement()).clone();
					v.addElement(qual);
	    	}
	    	cimClass.setQualifiers(v);
		} catch (CIMException exc) {
	    	return;
		}
}