例 5–6 のサンプルプログラムでは、execQuery メソッドによって渡された WQL 文字列を、照会 API を使って解析します。このプログラムは、照会文字列中の Select 式を解析し、クラスを詳細列挙します。そして、列挙の各インスタンスを 1 つずつ処理して、各インスタンスを照会式および select リストと比較します。最後にプログラムは、照会文字列と一致するインスタンスの列挙が含まれているベクトルを返します。
/*
* execQuery メソッドは、部分的なキーマッチングに基づく限られた照会
* しかサポートしない。照会によって選択されたエントリがないと、
* 空の Vector を返す
*
* @param op 返される CIM インスタンスの CIM オブジェクトパス
* @param query CIM 照会式
* @param ql CIM 照会言語のインジケータ
* @param cc CIM クラス参照
*
* @return CIM オブジェクトインスタンスのリスト
*
* @version 1.19 01/26/00
* @author Sun Microsystems, Inc.
*/
public Vector execQuery(CIMObjectPath op,
String query,
int ql,
CIMClass cc)
throws CIMException {
ByteArrayInputStream in = new ByteArrayInputStream(query.getBytes());
WQLParser parser = new WQLParser(in);
Vector result = new Vector();
try {
SelectExp q = (SelectExp)parser.querySpecification();
SelectList attrs = q.getSelectList();
NonJoinExp from = (NonJoinExp)q.getFromClause();
QueryExp where = q.getWhereClause();
Vector v = new Vector();
v = enumInstances(op, false, cc, true);
// インスタンスをフィルタリングする
for (int i = 0; i < v.size(); i++) {
if ((where == null) || (where.apply((CIMInstance)v.elementAt(i)) == true)) {
result.addElement(attrs.apply((CIMInstance)v.elementAt(i)));
}
}
} catch (Exception e) {
throw new CIMException(CIMException.CIM_ERR_FAILED, e.toString());
}
return result;
} // execQuery
}