/**
 * Copyright (c) 2003-2004 System Integrator Corporation.
 *                 All Rights Reserved.
 */
package jp.co.sint.database;

import java.util.*;
import org.apache.log4j.Category;

import jp.co.sint.tools.*;
import jp.co.sint.config.*;

/**
 * @version $Id : SIVariableSQL.java,v 1.0 Exp $
 * @author      : Jinwang Chen
 * <br>Description :変数を定義したSQLを表すクラスです。SQL文内の変数は、{}で変数名を囲みます。
 * <p>History</p>
 * <p>Author&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Date&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Reason</p>
 * ============&nbsp;&nbsp;&nbsp;==========&nbsp;&nbsp;===========================<br>
 * J.W.Chen       2003/07/29  Original
 */

public class SIVariableSQL{

  //ログ用のインスタンスの生成
  private static Category log=Category.getInstance(SIConfig.SILOG4J_WEBSHOP_CATEGORY_NAME);

  private String variableSQL="";

  /**
   * VariableSQLインスタンスを生成します。
   */
  public SIVariableSQL(String lVariableSQL){
    this.variableSQL = lVariableSQL;
  }

  /**
   * 変数名で、値を設定するMapオブジェクトを取得して、SQL文の{変数}を値に変換して
   * 新しいSQL文を返します
   * @param values 値マップセット
   * @return 新しいSQL文
   * @throws なし
   */
  public String getSQL(Map lValues){
    if (lValues==null) return this.variableSQL;

    String lResultSQL = this.variableSQL;
    String lName;
    Object lObj;
    String lValue;

    for(Iterator it = lValues.keySet().iterator();it.hasNext();){
      lName = (String)it.next();

      lObj = lValues.get(lName);
      if (lObj==null)lValue=null;
      else if (lObj instanceof String)lValue = (String)lObj;
      else if (lObj instanceof Integer)lValue = ((Integer)lObj).toString();
      else if (lObj instanceof Long)lValue = ((Long)lObj).toString();
      else if (lObj instanceof Double)lValue = ((Double)lObj).toString();
      else if (lObj instanceof Float) lValue = ((Float)lObj).toString();
      else if (lObj instanceof int[]){
        StringBuffer buf = new StringBuffer();
        int[] a = (int[])lObj;
        for(int i=0;i<a.length;i++){
          if (i>0)buf.append(",");
          buf.append(a[i]);
        }
        lValue = buf.toString();
      } else if (lObj instanceof double[]){
        StringBuffer buf = new StringBuffer();
        double[] a = (double[])lObj;
        for(int i=0;i<a.length;i++){
          if (i>0)buf.append(",");
          buf.append(a[i]);
        }
        lValue = buf.toString();
      }else if (lObj instanceof String[]){
        StringBuffer buf = new StringBuffer();
        String[] a = (String[])lObj;
        for(int i=0;i<a.length;i++){
          if (i>0)buf.append(",");
          buf.append("\'");
          buf.append(a[i]);
          buf.append("\'");
        }
        lValue = buf.toString();
      }else lValue=null;

      if (lValue!=null)lResultSQL = SIUtil.replace(lResultSQL,"{" + lName + "}",lValue);
    }
    return(lResultSQL);
  }
}