Sun WBEM 開発ガイド

高度なプログラミング

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

ネームスペースの作成

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

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

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


例 6-14 ネームスペースの作成 (CIMNameSpace)

{
/*クライアントに渡すパラメータを格納するネームスペース 
オブジェクトをそのクライアント上に作成する。
args[0] には、ホスト名 (myhost など)が入る。
args[1] には、ネームスペース (最上位のディレクトリなど)が
入る。*/
CIMNameSpace cns = new CIMNameSpace (args[0], args[1]); 
/* CIM Object Manager に接続し、ネームスペース 
パラメータが入ったネームスペースオブジェクト (cns) を
渡す。*/
CIMClient cc = new CIMClient (cns);	
/* CIM Object Manager に、NULL 文字列 (ホスト名) と args[2] 
(secondlevel のようなネームスペース名) が入った別の 
ネームスペースオブジェクトを渡す。 */
CIMNameSpace cop = new CIMNameSpace("", args[2]);
/* myhost の最上位レベルのネームスペースの下に
新しいネームスペース secondlevel を作成する。/*
cc.createNameSpace(cop);
}
 


ネームスペースの削除

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

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

例 6-15 のコードセグメントは、最初にネームスペースを作成し、続いて deleteNameSpace メソッドを使用してこのネームスペースを削除します。


例 6-15 ネームスペースの削除 (deleteNameSpace)

{
/* ネームスペースパラメータ args[0] (ホスト名) と 
args[1] (ネームスペース名) を格納するネームスペース 
オブジェクトをクライアント上に作成する。 */ 
 
CIMNameSpace cns = new CIMNameSpace (args[0], args[1]);
 
/* CIM Object Manager に接続し、作成したネームスペース 
オブジェクトを渡す。 */
 
CIMClient cc = new CIMClient (cns); 
 
/* CIM Object Manager に NULL ホスト引数 (ここでは
CIM Object Manager ホストは変更しない) と削除される
ネームスペース名が入ったネームスペースオブジェクトを
渡す。*/
 
CIMNameSpace cop = new CIMNameSpace("", args[2]); 
 
/* ネームスペース cop を削除する。 */
 
cc.deleteNameSpace(cop); 									


基底クラスの作成

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

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

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

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

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

例 - CIM クラスの作成

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


例 6-16 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"); 
// プロパティのデータ型を設定
cp.setType(CIMDatatype.getpredefined(CIMDataType.STRING)); 
// 新しい CIM 修飾子オブジェクトを構築
CIMQualifier cq = new CIMQualifier(); 
// 修飾子名を設定
cq.setName("key"); 
// プロパティに新しいキー修飾子を追加
cp.addQualfiier(cq); 
/* 10 に初期化された整数プロパティを作成 */
// 新しい CIM プロパティオブジェクトを構築
CIMProperty mp = new CIMProperty(); 
// プロパティ名を myprop に設定
mp.setName("myprop"); 
// プロパティのデータ型を設定
mp.setType(CIMDatatype.getpredefined(CIMDataType.INTEGER)); 
// myprop を 10 に初期化 
mp.setValue(CIMValue.setValue(10));
 
/* myclass にこの新しいプロパティを追加した後、クラスを
作成するために CIM Object Manager を呼び出す。*/
// クラスオブジェクトにキープロパティを追加
cimclass.addProperty(cp); 
// クラスオブジェクトに整数プロパティを追加
cimclass.addProperty(mp); 
 
/* CIM Object Manager に接続し、新しいクラスを渡す。*/
cc.setClass(new CIMObjectPath(),cimclass); 
// CIM Object Manager に新しいクラスを渡す
ci = cc.newInstance(); 
// myclass に新しい CIM インスタンスを作成
// クライアント接続が開かれている場合、接続を閉じる。
		if(cc != null) {
            cc.close();
}


クラスの削除

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

例 - クラスの削除

例 6-17 は、deleteClass インタフェースを使用してクラスを削除します。


例 6-17 クラスの削除 (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;
        try {
            CIMNameSpace cns = new CIMNameSpace(args[0]);
 
            cc = new CIMClient(cns);
 
            CIMObjectPath cop = new CIMObjectPath(args[1]);
            cc.deleteClass(cop);
        }
        catch (Exception e) {
            System.out.println("Exception: "+e);
        }
        if(cc != null) {
            cc.close();
        }
    }
}

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

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

Managed Object Format (MOF) 構文では、各 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 修飾子の取得

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

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


例 6-18 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 修飾子の設定

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


例 6-19 修飾子の設定 (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;
		}
}