Solaris WBEM 開発ガイド

アソシエータプロバイダの作成


注 –

クライアントプログラムによって呼び出される個々の関連メソッド内の objectName 引数、すなわち CIMObjectPath は、クラスではなく「インスタンス」のオブジェクトパスになっていなければなりません。


CIMOM がインスタンスのオブジェクトパスを認識しない場合は、クライアントが CIM オブジェクトマネージャリポジトリ内の関連のクラス定義を求めているものと見なします。関連のクラス定義には、その関連のメンバーインスタンスを派生するテンプレートが含まれます。したがって、CIMOM は、プロバイダの関連メソッドではなくクライアント API の関連メソッドを使用します。

関連を設計およびコーディングする場合に最も重要な部分は、関連クラスです。作成する関連は、関連クラスのコンテンツ以上には複雑になりません。関連のメンバー数は、関連クラスの参照数に等しくなります。役割は、さらに複雑な関連をモデル化する場合に使用できます。次に、関連クラスの例を示します。

次のコード例では associators メソッドを実装します。CIMOM は、associatorNamesobjectNameroleresultRoleincludeQualifiersincludeClassOrigin、および propertyList のそれぞれの値を関連プロバイダに渡します。また CIM 関連クラスの名前と、返される関連オブジェクトが属する CIM クラスまたはインスタンスを出力します。このプロバイダは、example_teacher クラスと example_student クラスのインスタンスを処理します。


例 6–3 CIMAssociator プロバイダ

...

public CIMInstance[] associators(CCIMObjectPath assocName, CIMObjectPath 
                objectName, String resultClass, String role, String
                resultRole, boolean includeQualifiers, boolean 
                includeClassOrigin, String[] propertyList)
                throws CIMException {
        
    System.out.println("Associators "+assocName+" "+objectName);
    if (objectName.getObjectName()equalsIgnoreCase("example_teacher")) {
        Vector v = new Vector();
        if ((role != null)  && (!role.equalsIgnoreCase("teaches"))) {
            // Teacher は、teaches という役割だけを担う
            return v;
        }
        if ((resultRole != null)  && (!resultRole.equalsIgnoreCase
                                     ("taughtby"))) {
            // Teacher は、taughtby という役割によってのみ得られる
            return v;
        }
        // Teacher のアソシエータを取得する
        CIMProperty nameProp = (CIMProperty)objectName.getKeys().elementAt
                               (0);
        String name = (String)nameProp.getValue().getValue();
        // Student のクラスを取得する
        CIMObjectPath tempOp = new CIMObjectPath("example_student");
        tempOp.setNameSpace(assocName.getNameSpace());
        CIMClass cc = cimom.getClass(tempOp, false);
        // objectName によって渡されたインスタンス名をテストし、Student
        // クラスの関連インスタンスを返す
        if(name.equals("teacher1")) {
            // teacher1 の Student (複数) を取得する
            CIMInstance ci = cc.newInstance();
            ci.setProperty("name", new CIMValue("student1"));
            v.addElement(ci.filterProperties(propertyList, 
                             includeQualifiers,
                             includeClassOrigin));
            ci = cc.newInstance();
            ci.setProperty("name", new CIMValue("student2"));
            v.addElement(ci.filterProperties(propertyList,
                        includeQualifiers, includeClassOrigin));
            return v;
        }
    }
}