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@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 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 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(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 inputParameters = null; tim@171: if (inputValuesList != null) { tim@171: inputParameters = new ArrayList(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, tim@171: OutputStream outputStream) throws TransitionException { tim@99: } tim@99: tim@99: /** tim@99: * @return tim@99: */ tim@99: protected Collection 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) (value.getObjectValue()); tim@99: } tim@99: } tim@99: return null; tim@99: } tim@182: tim@232: protected Collection getODVResult(String uuid) { tim@232: log.debug("OutputTransitionBase.getODVResult"); tim@232: // TODO add Caching? I think it's not nessessary tim@232: Collection 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, 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, 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, tim@182: OutputStream outputStream, String uuid, CallMeta callMeta) tim@182: throws TransitionException { tim@182: } tim@182: tim@182: tim@182: tim@64: }