クライアントプログラム (CIMObjectPath ) によって呼び出される関連メソッドの objectName 引数は、クラスではなくインスタンスのオブジェクトパスである必要があります。
インスタンスのオブジェクトパスが指定されていない場合、CIM Object Manager は、クライアントが CIM Object Manager Repository の関連 (関連のメンバーインスタンスが派生するテンプレート) のクラス定義を必要としているとみなします。プロバイダではなく、クライアント API の関連メソッドを使用します。
関連を設計およびコーディングする場合に最も重要な部分は、関連クラスそのものです。作成する関連は、関連クラスのコンテンツ以上には複雑になりません。関連のメンバー数は、関連クラスの参照数に等しくなります。役割は、さらに複雑な関連をモデル化する場合に使用できます。次に関連クラスの例を示します。
非対称ペア関連。教師と生徒のように 1 対 1 関係では、2 つの役割 (teaches と taughtby) が定義されます。
class TeacherStudent
{
Teacher REF teaches;
Student REF taughtby;
};
|
1 対多関係
class Classroom
{
Teacher REF teaches;
Student1 REF taughtby;
Student2 REF taughtby;
Student3 REF taughtby;
Student4 REF taughtby;
};
|
多対多関係
class TeachingAssistants
{
Assistant1 REF assists;
Assistant2 REF assists;
Student1 REF assistedby;
Student2 REF assistedby;
Student3 REF assistedby;
Student4 REF assistedby;
Student5 REF assistedby;
};
|
互いに対等な 2 つ以上のメンバーの関連
class Club
{
Member1 REF;
Member2 REF;
Member3 REF;
};
|
次のコード例では associators メソッドを実装します。CIM Object Manager は、associatorNames、objectName、role、resultRole、includeQualifiers、 includeClassOrigin、および propertyList のそれぞれの値を関連プロバイダに渡します。また CIM 関連クラスの名前と、返される関連オブジェクトが属する CIM クラスまたはインスタンスを出力します。このプロバイダは、example_teacher クラスと example_student クラスのインスタンスを扱います。
...
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;
}
}