/***
 *** Title: MispDefaultHandler.java
 *** Author: Itsuki Noda
 *** Date: 2006.08.18
 ***/

package daruma.xml.handler;

import java.io.OutputStream;

import org.xml.sax.XMLReader;

import daruma.xml.handler.XSAXDefaultHandler;

import daruma.wfs.ResponseInfo;

import daruma.util.Itk;

/* !!! [06/08/18 23:19 I.Noda] !!! 
 * 本来は wfs の下に置きたいが、XSAXDomCreateHandler の関係で、
 * ここに置かざる得ない。もし、XSAXDomCreateHandler が整理できた際には、
 * wfs へ移すこと。
 */
//======================================================================
/**
 * MISP 関係の SAX Handler の上位で機能をまとめるためのクラス。
 */
public class MispDefaultHandler extends XSAXDefaultHandler
{

    /* !!! [06/08/17 17:28 I.Noda] !!! 
     * transaction にユニークな ID を降る。
     * transaction のみで利用。
     */
    private String transactionURI ;
    private long transactionSN ; // transaction serial number

    /* !!! [06/08/19 03:27 I.Noda] !!! 
     * Response を返すためのDOM のコンテナ
     */
    private ResponseInfo response ;

    
    /* !!! [06/08/19 03:27 I.Noda] !!! 
     * 最新の Transaction URI を保持
     * Transaction 処理の際には、使ってはいけない。
     */
    private String mostRecentTransactionURI ;

    //------------------------------------------------------------
    /**
     * constructor
     */
    public MispDefaultHandler(OutputStream out, XMLReader parser,
			      boolean isTopLevelHandler ) {
	super(out, parser, isTopLevelHandler) ;

	this.transactionURI = null ;
	this.response = null ;

    }

    //------------------------------------------------------------
    /**
     * get my parent handler
     * !!! 危険な実装。
     */
    public MispDefaultHandler getMyParentHandler() {
	return (MispDefaultHandler)this.getParentHandler();
    }
    
    //------------------------------------------------------------
    /**
     * TransactionID の読み出し
     * Transaction URI が null で、親がいるばあい、そちらを探す。
     */
    public String getTransactionURI() {
	if(this.transactionURI == null && this.getParentHandler() != null) {
	    return this.getMyParentHandler().getTransactionURI() ;
	} else {
	    return this.transactionURI ;
	}
    }

    /* !!! [06/08/17 17:28 I.Noda] !!! */
    //------------------------------------------------------------
    /**
     * TransactionID の設定
     */
    public String setTransactionURI(String uri) {
	return this.transactionURI = uri ;
    }

    /* !!! [06/08/17 17:28 I.Noda] !!! */
    //------------------------------------------------------------
    /**
     * TransactionID をランダムに設定
     */
    public String setTransactionURI(){
	return setTransactionURI(Itk.genUriRandom()) ;
    }

    /* !!! [06/08/17 17:28 I.Noda] !!! */
    //------------------------------------------------------------
    /**
     * TransactionSN をランダムに取得
     * Transaction URI が null で、親がいるばあい、そちらを探す。
     */
    public long getTransactionSN() {
	if(this.transactionURI == null && this.getParentHandler() != null) {
	    return this.getMyParentHandler().getTransactionSN() ;
	} else {
	    return this.transactionSN ;
	}
    }

    /* !!! [06/08/17 17:28 I.Noda] !!! */
    //------------------------------------------------------------
    /**
     * TransactionSN をランダムに設置
     */
    public long setTransactionSN(long sn) {
	return this.transactionSN = sn ;
    }

    /* !!! [06/08/19 03:27 I.Noda] !!! */
    //------------------------------------------------------------
    /**
     * ResponseInfo を設定
     */
    public ResponseInfo setResponse(ResponseInfo response) {
	return this.response = response ;
    }

    //------------------------------------------------------------
    /**
     * ResponseInfo を取得
     */
    public ResponseInfo getResponse() {
	if(this.response == null && this.getParentHandler() != null) {
	    return this.getMyParentHandler().getResponse() ;
	} else {
	    return this.response ;
	}
    }

    //------------------------------------------------------------
    /**
     * ResponseInfo があるかどうかチェック
     */
    public boolean hasResponse() {
	return this.getResponse() != null ;
    }

    /* !!! [06/08/19 03:27 I.Noda] !!! */
    //------------------------------------------------------------
    /**
     * mostRecentTransactionURI を設定
     */
    public String setMostRecentTransactionURI(String uri) {
	return this.mostRecentTransactionURI = uri ;
    }

    //------------------------------------------------------------
    /**
     * mostRecentTransactionURI を取得
     */
    public String getMostRecentTransactionURI() {
	if(this.mostRecentTransactionURI == null && 
	   this.getParentHandler() != null) {
	    return this.getMyParentHandler().getMostRecentTransactionURI() ;
	} else {
	    return this.mostRecentTransactionURI ;
	}
    }




}
