package org.fireproject.axissample;

import java.util.Hashtable;
import java.util.List;

import org.apache.axis.AxisFault;
import org.apache.axis.handlers.BasicHandler;
import org.apache.axis.MessageContext;

import org.w3c.dom.Document;
import org.w3c.dom.Element;
import javax.xml.namespace.QName;

/**
 * ハンドラの動作を確認するハンドラ.
 * 親の全メソッドをオーバーライドする.
 * 各メソッドでは,オーバーライドしているメソッドを呼び,結果を標準出力してから返す.
 *
 */
public class SampleHandler extends BasicHandler {

    /**
     * このハンドラが指定されたQNameを処理できるかどうかを判定する.
     * @param 判定対象
     * @return true 処理可 / false 処理不可
     *
     */
    public boolean canHandleBlock(QName qname) {
	boolean result = super.canHandleBlock(qname);
	System.out.println("result of canHandleBlock = " + result);
	return result;
    }

    /**
     * このハンドラオブジェクトを含むチェーンの処理が終了した際に呼ばれる.
     *
     */
    public void cleanup() {
	super.cleanup();
	System.out.println("creanup done");
    }

    /**
     * WSDL情報を取得する.
     * 単にMessageContextにプロパティを設定するだけのものもあれば,実際のWSDLを生成するものもある.
     * @param msgContext 処理コンテキスト
     *
     */
    public void generateWSDL(MessageContext msgContext) throws AxisFault {
	System.out.println("generateWSDL called." + msgContext);
	super.generateWSDL(msgContext);
	System.out.println(msgContext);
    }

    /**
     * このハンドラのデプロイ情報を記述したXMLドキュメントのルート要素を返す.
     * @param doc デプロイ情報を記述したXMLドキュメント
     * @return 引数のルート要素
     *
     */
    public Element getDeploymentData(Document doc) {
	System.out.println("parameter of getDeploymentData = " + doc);
	Element result = super.getDeploymentData(doc);
	System.out.println("result of getDeploymentData = " + result);
	return result;
    }

    /**
     * このハンドラの名前を返す.
     * @return 名前
     *
     */
    public String getName() {
	String result = super.getName();
	System.out.println("result of getName = " + result);
	return result;
    }

    /**
     * 引数で指定した名前に対応するオプションを返す. 
     * @param name オプション名
     * @return 指定したオプションの値
     *
     */
    public Object getOption(String name) {
	System.out.println("parameter of getOption = " + name);
	Object result = super.getOption(name);
	System.out.println("result of getOption = " + result);
	return result;
    }

    /**
     * ハンドラが含んでいるオプションを返す.
     * @return オプションの一覧
     *
     */
    public Hashtable getOptions() {
	Hashtable result = super.getOptions();
	System.out.println("result of getOptions = " + result);
	return result;
    }

    /**
     * ハンドラが理解するヘッダのQNameのリストを返す.
     * @return 処理可能QNameのリスト
     *
     */
    public List getUnderstoodHeaders() {
	List result = getUnderstoodHeaders();
	System.out.println("result of getUnderstoodHeaders = " + result);
	return result;
    }

    /**
     * 初期化メソッド.
     *
     */
    public void	init() {
	super.init();
	System.out.println("init called");
    }

    /**
     *
     *
     */
    public void initHashtable() {
	super.initHashtable();
	System.out.println("initHashtable called");
    }

    /**
     * BasicHandlerのサブクラスが実装する,ハンドラの主要な処理を行うメソッド.
     * @param msgContext 処理コンテキスト
     *
     */
    public void invoke(MessageContext msgContext) {
	System.out.println("invoke called");
	System.out.println(this);
    }

    /**
     * サブシーケンスハンドラが失敗した際に呼ばれる.
     * @param msgContext 処理コンテキスト
     *
     */
    public void onFault(MessageContext msgContext) {
	System.out.println("onFault called." + msgContext);
	super.onFault(msgContext);
	System.out.println(msgContext);
    }

    /**
     * ハンドラの名前を設定する.
     * @param name ハンドラ名
     *
     */
    public void setName(String name) {
	System.out.println("parameter of setName = " + name);
	super.setName(name);
    }

    /**
     * ハンドラのオプションを設定する.
     * @param name オプション名
     * @param value 値
     *
     */
    public void setOption(String name, Object value) {
	System.out.println("parameter of setOption = " + name + " / " + value);
	super.setOption(name, value);
    }

    /**
     * オプションのデフォルト値を設定する.
     * 指定した名前のオプションで,値が既に設定されていれば,設定しない.
     * 指定した名前のオプションで,値が既に設定されていなければ,設定する.
     * @param name オプション名
     * @param value 値
     * @return このメソッド呼び出しによって,値が設定されたかどうか.
     *
     */
    public boolean setOptionDefault(String name, Object value) {
	System.out.println("parameter of setOptionDefault = " + name + " / " + value);
	boolean result = super.setOptionDefault(name, value);
	System.out.println("result o setOptionDefault = " + result);
	return result;
    }

    /**
     * オプションを設定する.
     * @param opts オプションの一覧
     *
     */
    public void	setOptions(Hashtable opts) {
	System.out.println("parameter of setOptions = " + opts);
	super.setOptions(opts);
    }

    /**
     * このハンドラが,オプションの格納にLookableHashtableを使用すべきか否かを設定する.
     * デフォルトはfalse.
     * @param makeLockable 設定値.
     *
     */
    protected void setOptionsLockable(boolean makeLockable) {
	System.out.println("parameter of setOptionsLockable = " + makeLockable);
	super.setOptionsLockable(makeLockable);
    }
}