クライアントプログラムによって呼び出される個々の関連メソッド内の objectName 引数、すなわち CIMObjectPath は、クラスではなく「インスタンス」のオブジェクトパスになっていなければなりません。
CIMOM がインスタンスのオブジェクトパスを認識しない場合は、クライアントが CIM オブジェクトマネージャリポジトリ内の関連のクラス定義を求めているものと見なします。関連のクラス定義には、その関連のメンバーインスタンスを派生するテンプレートが含まれます。したがって、CIMOM は、プロバイダの関連メソッドではなくクライアント 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 メソッドを実装します。CIMOM は、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;
}
}
}