Solaris WBEM 開発ガイド

照会を処理するプロバイダの記述

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


例 5–1 照会を処理するプロバイダ

/*
 * 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 CIMInstance[] execQuery(CIMObjectPath op, 
                       String query, 
                       String  ql,
                       CIMClass cc) 
           throws CIMException {

   Vector result = new Vector();
   try {
       SelectExp q = new SelectExp(query);
       SelectList attrs = q.getSelectList();
       NonJoinExp from = (NonJoinExp)q.getFromClause();
       QueryExp where = q.getWhereClause();

       CIMInstance[] v = enumerateInstances(op, false, true, 
                                            true, null, cc);

       // インスタンスをフィルタリングする
       for (int i = 0; i < v.length; i++) {
               if ((where == null) || (where.apply(v[i]) == true)) {
                   result.addElement(attrs.apply(v[i]));
                } 
       }
   } catch (Exception e) {
       throw new CIMException(CIMException.CIM_ERR_FAILED, e.toString());
   }
   return (CIMInstance[])result.toArray();
 } // execQuery
}