tim@64: /**
tim@64:  *
tim@64:  */
tim@64: package de.intevation.gnv.transition;
tim@64: 
tim@99: import java.io.OutputStream;
tim@64: import java.util.ArrayList;
tim@64: import java.util.Collection;
tim@64: 
tim@99: 
tim@64: import org.apache.log4j.Logger;
tim@204: import org.w3c.dom.Element;
tim@64: import org.w3c.dom.Node;
tim@64: import org.w3c.dom.NodeList;
tim@64: 
tim@64: import de.intevation.artifactdatabase.Config;
tim@117: import de.intevation.artifacts.CallMeta;
tim@99: import de.intevation.gnv.artifacts.cache.CacheFactory;
tim@86: import de.intevation.gnv.geobackend.base.Result;
tim@232: import de.intevation.gnv.geobackend.base.query.QueryExecutor;
tim@232: import de.intevation.gnv.geobackend.base.query.QueryExecutorFactory;
tim@232: import de.intevation.gnv.geobackend.base.query.exception.QueryException;
tim@86: import de.intevation.gnv.transition.exception.TransitionException;
tim@64: 
tim@64: /**
tim@64:  * @author Tim Englich <tim.englich@intevation.de>
tim@171:  * 
tim@64:  */
tim@64: public abstract class OutputTransitionBase extends TransitionBase implements
tim@171:                                                                  OutputTransition {
tim@171: 
tim@86:     /**
tim@91:      * The UID of this Class
tim@86:      */
tim@86:     private static final long serialVersionUID = -1718732895737303823L;
tim@171: 
tim@64:     /**
tim@64:      * the logger, used to log exceptions and additonaly information
tim@64:      */
tim@64:     private static Logger log = Logger.getLogger(OutputTransitionBase.class);
tim@171: 
tim@86:     /**
tim@86:      * The different Outputmodes which are provided by an OutputTransition
tim@86:      */
tim@64:     protected Collection<OutputMode> outputModes = null;
tim@232:     
tim@232:     protected String queryODVID = null;
tim@171: 
tim@64:     /**
tim@64:      * Constructor
tim@64:      */
tim@64:     public OutputTransitionBase() {
tim@64:         super();
tim@64:     }
tim@64: 
tim@64:     /**
tim@64:      * @see de.intevation.gnv.transition.OutputTransition#getOutputModes()
tim@64:      */
tim@64:     public Collection<OutputMode> getOutputModes() {
tim@64:         log.debug("OutputTransitionBase.getOutputModes");
tim@64:         return this.outputModes;
tim@64:     }
tim@171: 
tim@86:     /**
tim@64:      * @see de.intevation.gnv.transition.TransitionBase#setup(org.w3c.dom.Node)
tim@64:      */
tim@64:     @Override
tim@64:     public void setup(Node configuration) {
tim@64:         log.debug("OutputTransitionBase.setup");
tim@64:         super.setup(configuration);
tim@232:         
tim@232:         this.queryODVID = Config.getStringXPath(configuration,"queryID-odv");
tim@232:         
tim@171:         NodeList outputModeList = Config.getNodeSetXPath(configuration,
tim@171:                 "outputsModes/outputsMode");
tim@171:         if (outputModeList != null) {
tim@171:             log.debug(outputModeList.getLength() + " were found.");
tim@171:             this.outputModes = new ArrayList<OutputMode>(outputModeList
tim@171:                     .getLength());
tim@171:             for (int i = 0; i < outputModeList.getLength(); i++) {
tim@204:                 Element currentNode = (Element)outputModeList.item(i);
tim@204:                 String name = currentNode.getAttribute("name");
tim@204:                 String description =currentNode.getAttribute("description");
tim@204:                 String mimeType = currentNode.getAttribute("mime-type");
tim@171:                 NodeList inputValuesList = Config.getNodeSetXPath(currentNode,
tim@171:                         "parameters/inputvalue");
tim@91:                 Collection<InputValue> inputParameters = null;
tim@171:                 if (inputValuesList != null) {
tim@171:                     inputParameters = new ArrayList<InputValue>(inputValuesList
tim@171:                             .getLength());
tim@171:                     for (int j = 0; j < inputValuesList.getLength(); j++) {
tim@204:                         Element currentInputValuesNode = (Element)inputValuesList.item(j);
tim@204:                         String inputValueName = currentInputValuesNode.getAttribute("name");
tim@204:                         String inputValueType = currentInputValuesNode.getAttribute("type");
tim@204:                         String defaultValue =currentInputValuesNode.getAttribute("value");
tim@91:                         boolean isMultiselect = false;
tim@171:                         InputValue inputValue = new DefaultInputValue(
tim@171:                                 inputValueName, inputValueType, defaultValue,
tim@171:                                 isMultiselect);
tim@91:                         inputParameters.add(inputValue);
tim@91:                     }
tim@91:                 }
tim@171: 
tim@171:                 OutputMode outputMode = new DefaultOutputMode(name,
tim@171:                         description, mimeType, inputParameters);
tim@64:                 log.debug(outputMode.toString());
tim@64:                 this.outputModes.add(outputMode);
tim@171: 
tim@64:             }
tim@64:         }
tim@64:     }
tim@171: 
tim@86:     /**
tim@86:      * @see de.intevation.gnv.transition.TransitionBase#advance()
tim@86:      */
tim@86:     @Override
tim@171:     public void advance(String uuid, CallMeta callMeta)
tim@171:                                                        throws TransitionException {
tim@86:         log.debug("OutputTransitionBase.advance");
tim@171:         if (this.getChartResult(uuid) == null) {
tim@117:             super.advance(uuid, callMeta);
tim@86:         }
tim@86:     }
tim@86: 
tim@86:     /**
tim@171:      * @see de.intevation.gnv.transition.OutputTransition#out(java.lang.String,
tim@171:      *      java.util.Collection, java.io.OutputStream)
tim@99:      */
tim@99:     public void out(String outputMode, Collection<InputData> inputData,
tim@171:                     OutputStream outputStream) throws TransitionException {
tim@99:     }
tim@99: 
tim@99:     /**
tim@99:      * @return
tim@99:      */
tim@99:     protected Collection<Result> getChartResult(String uuid) {
tim@99:         log.debug("OutputTransitionBase.getChartResult");
tim@171:         if (CacheFactory.getInstance().isInitialized()) {
tim@171:             String key = uuid + super.getID();
tim@171:             log.debug("Hash for Queryelements: " + key);
tim@204:             net.sf.ehcache.Element value = CacheFactory.getInstance().getCache().get(key);
tim@171:             if (value != null) {
tim@171:                 return (Collection<Result>) (value.getObjectValue());
tim@99:             }
tim@99:         }
tim@99:         return null;
tim@99:     }
tim@182:     
tim@232:     protected Collection<Result> getODVResult(String uuid) {
tim@232:         log.debug("OutputTransitionBase.getODVResult");
tim@232:         // TODO add Caching? I think it's not nessessary
tim@232:         Collection<Result> returnValue = null;
tim@232:         if (this.queryODVID != null){
tim@232:             try {
tim@232:                 String[] filterValues = this.generateFilterValuesFromInputData();
tim@232:                 try {
tim@232:                     QueryExecutor queryExecutor = QueryExecutorFactory
tim@232:                                                   .getInstance()
tim@232:                                                   .getQueryExecutor();
tim@232:                     returnValue  = queryExecutor.executeQuery(this.queryODVID,
tim@232:                                                               filterValues);
tim@232:                 } catch (RuntimeException e) {
tim@232:                     log.error(e, e);
tim@232:                 }
tim@232:             } catch (QueryException e) {
tim@232:                 log.error(e, e);
tim@232:             }
tim@232:         }else{
tim@232:             log.warn("No Query for ODV Data is defined.");
tim@232:         }
tim@232:         return returnValue;
tim@232:     }
tim@232:     
tim@182:     protected void removeChartResult(String uuid) {
tim@182:         log.debug("OutputTransitionBase.getChartResult");
tim@182:         if (CacheFactory.getInstance().isInitialized()) {
tim@182:             String key = uuid + super.getID();
tim@182:             log.debug("Hash for Queryelements: " + key);
tim@204:             net.sf.ehcache.Element value = CacheFactory.getInstance().getCache().get(key);
tim@182:             if (value != null) {
tim@182:                 CacheFactory.getInstance().getCache().remove(key);
tim@182:             }
tim@182:         }
tim@182:     }
tim@171: 
tim@99:     /**
tim@171:      * @see de.intevation.gnv.transition.TransitionBase#purifyResult(java.util.Collection,
tim@171:      *      java.lang.String)
tim@86:      */
tim@86:     @Override
tim@99:     protected void purifyResult(Collection<Result> result, String uuid) {
tim@99:         log.debug("OutputTransitionBase.purifyResult");
tim@171:         if (CacheFactory.getInstance().isInitialized()) {
tim@171:             String key = uuid + super.getID();
tim@171:             log.debug("Hash for Queryelements: " + key);
tim@204:             CacheFactory.getInstance().getCache().put(new net.sf.ehcache.Element(key, result));
tim@99:         }
tim@86:     }
tim@64: 
tim@182:     /**
tim@182:      * @see de.intevation.gnv.transition.TransitionBase#putInputData(java.util.Collection, java.lang.String)
tim@182:      */
tim@182:     @Override
tim@182:     public void putInputData(Collection<InputData> inputData, 
tim@182:                              String uuid)
tim@182:                                          throws TransitionException {
tim@182:         log.debug("OutputTransitionBase.putInputData");
tim@182:         this.removeChartResult(uuid);
tim@182:         super.putInputData(inputData, uuid);
tim@182:     }
tim@182: 
tim@182:     public void out(String outputMode, Collection<InputData> inputData,
tim@182:                     OutputStream outputStream, String uuid, CallMeta callMeta)
tim@182:                                                                               throws TransitionException {
tim@182:     }
tim@182:     
tim@182:     
tim@182: 
tim@64: }