/*
    PCS - A Framework For Java Web Applications
    Copyright (C) 2002 Patrick Carl, patrick.carl@web.de
 
    This library is free software; you can redistribute it and/or
    modify it under the terms of the GNU Lesser General Public
    License as published by the Free Software Foundation; either
    version 2.1 of the License, or (at your option) any later version.
 
    This library is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
    Lesser General Public License for more details.
 
    You should have received a copy of the GNU Lesser General Public
    License along with this library; if not, write to the Free Software
    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 
 
    $Id: ActionResult.java,v 1.3 2003/01/19 23:41:36 pcs_org Exp $
 
 */

package de.spieleck.pcs.action;

import java.io.StringReader;
import java.util.Hashtable;
import javax.xml.transform.Source;
import javax.xml.transform.stream.StreamSource;
/**
 * This class represents the result of a performed Action.
 * An ActionResult consists of an XML representation and additional
 * properties carried in a Hashtable
 * @see Action
 * @author  Patrick Carl
 */
public class ActionResult {
    
    private String xml;
    
    private Hashtable parameters;
    
    /** Holds value of property source. */
    private Source source;
    
    /** Holds value of property styleSheet. */
    private String styleSheet;
    
    /** Creates a new instance of ActionResult */
    public ActionResult() {
        setXml(null);
        setParameters(new Hashtable());
        
    }
    
    /**
     * Creates an instance of ActionResult with the given properties
     * @param xml a XML-Source representing the ActionResult
     * @param parameters the additional parameters of the ActionResult
     * as a Hashtable
     * @param styleSheetKey key to lookup stylesheet for transformation
     */
    public ActionResult(String xml, Hashtable parameters){
        setXml(xml);
        setParameters(parameters);
    }
    
    /**
     * creates an ActionResult with the given values
     */
    public ActionResult(String xml, Hashtable parameters, String styleSheet){
        this(xml, parameters);
        setStyleSheet(styleSheet);
    }
    
    /**
     * creates an ActionResult with the given values
     */
    public ActionResult(Source source, Hashtable parameters){
        setSource(source);
        setParameters(parameters);
    }
    /**
     * creates an ActionResult with the given values
     */
    public ActionResult(Source source, Hashtable parameters, String styleSheet){
        this(source, parameters);
        setStyleSheet(styleSheet);
    }
    
    /**
     * convenience method for setting the ActionResult's XML data with an
     * StreamSource using the given String as input
     * @since 1.1
     */
    public void setXml(String xml) {
        this.xml = xml;
        if(xml != null)
            setSource(new StreamSource(new StringReader(xml)));
        else
            setSource(null);
    }
    
    /**
     * returns the xml data of the ActionResult as a String
     * @deprecated use getSource() instead
     * @since 1.1
     */
    public String getXml() {
        return xml;
    }
    
    /**
     * returns the parameters of this ActionResult as a Hashtable
     */
    public Hashtable getParameters() {
        return parameters;
    }
    
    /**
     * sets the parameters of this ActionResult
     */
    public void setParameters(Hashtable parameters) {
        this.parameters = parameters;
    }
    
    /** Getter for property source.
     * @return Value of property source.
     *
     */
    public Source getSource() {
        return this.source;
    }
    
    /** Setter for property source.
     * @param source New value of property source.
     *
     */
    public void setSource(Source source) {
        this.source = source;
    }
    
    /** returns the name of the stylesheet to be used with this ActionResult, can be
     * used for variable stylesheets (e.g. display the Results in a table overview or
     * in detail) and to overwrite the stylesheet setting of the service
     * @see de.spieleck.pcs.http.Service
     * @see de.spieleck.pcs.view.View
     * @return Value of property styleSheet.
     */
    public String getStyleSheet() {
        return this.styleSheet;
    }
    
    /** sets the name of the stylesheet to be used with this ActionResult
     * @param styleSheet New value of property styleSheet.
     *
     */
    public void setStyleSheet(String styleSheet) {
        this.styleSheet = styleSheet;
    }
}