Sun WBEM SDK 開発ガイド

例 — execQuery メソッドの実装

例 5–6 のサンプルプログラムでは、execQuery メソッドによって渡された WQL 文字列を、照会 API を使って解析します。このプログラムは、照会文字列中の Select 式を解析し、クラスを詳細列挙します。そして、列挙の各インスタンスを 1 つずつ処理して、各インスタンスを照会式および select リストと比較します。最後にプログラムは、照会文字列と一致するインスタンスの列挙が含まれているベクトルを返します。


例 5–6 execQuery メソッドを実装するプロバイダ

/*
     * 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
}