package org.itscool.weber.testcase;

import java.io.IOException;
import java.io.InputStream;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Set;

import org.itscool.commons.document.BeanToXmlDocument;
import org.itscool.commons.request.GeneralForm;
import org.itscool.commons.request.UploadFile;
import org.itscool.weber.action.ActionBucket;
import org.w3c.dom.Document;

/**
 * ActionBcuketクラスのモッククラスです<BR>
 * このクラスはWeberTestCaseインスタンス生成時に作成されます。
 *
 * @author KANO
 * @since jdk1.4.1
 * @version 1.00A 2005/08/01
 */
public class MockActionBucket implements ActionBucket{
    /** リクエストパラメータ保有オブジェクト */
    private Object form;
    
    /** アクションを許可する権限リスト */
    private HashMap roles = new HashMap();
    /** HttpServletRequestインスタンスのモックインスタンスです */
    private HashMap request = new HashMap();
    /** HttpServletSessionインスタンスのモックインスタンスです */
    private HashMap session = new HashMap();
    /** ServletContextインスタンスのモックインスタンスです */
    private HashMap context = new HashMap();
    
    private Document responseXml;
    private String responseText;
    
    /** ダミーのクエリー文字列です */
    private String queryString;
    
    public MockActionBucket(){}
    
    /** */
    public String getRealPath(String path){
        return path;
    }
    public String getQueryString(){
        return queryString;
    }
    
    public void setQueryString(String queryString){
        this.queryString = queryString;
    }
    
    /**
     * 権限情報リストを取得します
     * @return roles 権限情報リスト
     */
    public HashMap getRoles() {
        return roles;
    }
    /**
     * 権限情報リストをセットします
     * @param roles 権限情報リスト
     */
    public void setRoles(HashMap roles) {
        this.roles = roles;
    }
    
    /**
     * 権限情報をリストに登録します
     * @param roleName 権限名
     */
    public void putRole(String roleName){
        if( roles == null ){
            roles = new HashMap();
        }
        roles.put(roleName, roleName);
    }
    /**
     * フォームオブジェクトを取得します
     * @return フォームオブジェクト
     */
    public Object getForm() {
        return form;
    }
    
    /**
     * フォームオブジェクトをセットします
     * @param object フォームオブジェクト
     */
    public void setForm(Object object) {
        form = object;
    }
    
    /**
     * リクエストスコープにオブジェクトをセットします
     * @param key パラメータのキー
     * @param val パラメータ
     */
    public void setAttribute(String key, Object val){
        request.put(key, val);
    }
    
    /**
     * リクエストスコープからオブジェクトを取得します
     * @param key パラメータのキー
     * @return リクエストパラメータ
     */
    public Object getAttribute(String key){
        return request.get(key);
    }
    
    /**
     * セッションスコープにオブジェクトをセットします
     * @param key パラメータのキー
     * @param val パラメータ
     */
    public void setAttributeFromSession(String key, Object val){
        session.put(key, val);
    }
    
    /**
     * セッションスコープからオブジェクトを取得します
     * @param key パラメータのキー
     * @return リクエストパラメータ
     */
    public Object getAttributeFromSession(String key){
        return session.get(key);
    }
    
    /**
     * アプリケーションスコープにオブジェクトをセットします
     * @param key パラメータのキー
     * @param val パラメータ
     */
    public void setAttributeFromContext(String key, Object val){
        context.put(key, val);
    }
    
    /**
     * アプリケーションスコープからオブジェクトを取得します
     * @param key パラメータのキー
     * @return リクエストパラメータ
     */
    public Object getAttributeFromContext(String key){
        return context.get(key);
    }
    
    /**
     * リクエストスコープからオブジェクトを取得します
     * @param key パラメータのキー
     */
    public void removeAttribute(String key){
        request.remove(key);
    }
    
    /**
     * セッションスコープからオブジェクトを取得します
     * @param key パラメータのキー
     */
    public void removeAttributeFromSession(String key){
        session.remove(key);
    }
    
    /**
     * アプリケーションスコープからオブジェクトを取得します
     * @param key パラメータのキー
     */
    public void removeAttributeFromContext(String key){
        context.remove(key);
    }
    
    /**
     * パラメータで指定されたテキストを出力します
     * @param buff テキスト情報
     */
    public void print(String buff) throws IOException{
//		ServletInformation info = ServletInformation.getInstance();
        System.out.println(buff);
        responseText = buff;
    }
    
    /**
     * パラメータで指定されたXMLドキュメントを出力します
     * @param document XMLドキュメント
     * @throws Exception
     */
    public void printXml(Document document) throws Exception{
        BeanToXmlDocument beanToXml = new BeanToXmlDocument(document);
        this.responseXml = document;
        System.out.println( beanToXml.parseText());
    }
    
    public void printXml(BeanToXmlDocument beanToXml) throws Exception
    {
        Document document = beanToXml.getDocument();
        this.printXml(document);
    }
    
    public void printXml(Object bean, String rootName) throws Exception{
        BeanToXmlDocument beanToXml = new BeanToXmlDocument(rootName);
        beanToXml.addElement(bean, "bean");
        printXml(beanToXml);
    }
    
    public void print(InputStream is, String resourceName) throws IOException{
        
    }
    
    /**
     * フォームエラー時の再入力処理
     * リクエストパラメータの値を再セットしなおす
     * @param generalForm フォームインスタンス
     */
    public void setRetryInputParam(GeneralForm generalForm) {
        Set keySet = generalForm.keySet();
        Iterator it = keySet.iterator();
        
        while( it.hasNext() ){
            String paramName = (String)it.next();
            Object paramValue = generalForm.getParameter(paramName);
            if(paramValue instanceof UploadFile){
                UploadFile file = (UploadFile)paramValue;
                String value = file.getPath() + System.getProperty("file.separator")
                + file.getFileName();
                request.put(paramName, value);
            }else{
                request.put(paramName, paramValue);
            }
        }
    }
    
    public Document getResponseXml() {
        return responseXml;
    }

    public String getResponseText() {
        return responseText;
    }
}
