Sun WBEM SDK 開発ガイド

WQL 照会文字列を解析するプロバイダの作成

照会 API を使って WQL 照会文字列を解析するプロバイダを作成する一般的な手順は、次のとおりです。

WQL 照会文字列を解析するプロバイダを作成する方法
  1. WQL パーサーを初期化します。以下に例を示します。


     
        /* CIM Object Manager から execQuery に渡された
           照会文字列を入力データストリームに読み込む */
        ByteArrayInputStream in = new ByteArrayInputStream(query.getBytes()); 
    
        /* 入力データストリームを使ってパーサーを初期化する */
        WQLParser parser = new WQLParser(in);
           

  2. 照会結果を格納するベクトルを作成します。以下に例を示します。


     
        Vector result = new Vector();

  3. 照会から select 式を取得します。以下に例を示します。


     
        /* querySpecification がパーサーから WQL 式を返す
          (SelectExp)parser が WQL 式を select 式にキャストする */
        SelectExp q = (SelectExp)parser.querySpecification();  

  4. select 式から select リストを取得します。以下に例を示します。


     
        /* SelectExp クラスの SelectList メソッドを使って
           select リストを返す。select リストとは、
           属性または CIM プロパティのリスト */
        SelectList attrs = q.getSelectList();     

  5. From 節を取得します。以下に例を示します。


     
        /* SelectExp クラスの getFromClause メソッドを使って
           From 節を返す。From 節を非 join 式 
           (単一の CIM クラスを表すテーブル) にキャストする */
        NonJoinExp from = (NonJoinExp)q.getFromClause();

  6. enumInstances メソッドを使ってクラスの詳細列挙を返します。以下に例を示します。


     
       /* 指定されたクラス (cc) に属するすべてのインスタンス
          (継承されたプロパティとローカルプロパティを含む) を返す */
        Vector v = new Vector();
        v = enumInstances(op, true, cc, true);
        ...  

  7. 列挙のインスタンスを 1 つずつ処理し、その中で各インスタンスを照会式および select リストと比較します。以下に例を示します。


     
      /* WHERE 節の照会式が CIM インスタンスと 
    	   一致するかを比較する。select リストを CIM インスタンスに 
         適用し、select リストと一致するインスタンス  
         (CIM プロパティのリスト) を結果に追加する。 */
      for (int i = 0; i < v.size(); i++) {
    	  if ((where == null) || // WHERE 節があるか
      	    (where.apply((CIMInstance)v.elementAt(i)) == true)) { 
    	         result.addElement(attrs.apply((CIMInstance)v.elementAt(i)));
       ...        

  8. 照会結果を返します。以下に例を示します。

    return result;

例 — 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
}