tim@335: /** tim@335: * tim@335: */ tim@335: package de.intevation.gnv.state; tim@335: sascha@480: import de.intevation.artifactdatabase.Config; sascha@480: sascha@480: import de.intevation.artifacts.CallContext; sascha@480: import de.intevation.artifacts.CallMeta; sascha@480: sascha@480: import de.intevation.gnv.artifacts.cache.CacheFactory; sascha@480: sascha@480: import de.intevation.gnv.artifacts.ressource.RessourceFactory; sascha@480: sascha@480: import de.intevation.gnv.geobackend.base.Result; sascha@480: sascha@480: import de.intevation.gnv.geobackend.base.query.QueryExecutor; sascha@480: import de.intevation.gnv.geobackend.base.query.QueryExecutorFactory; sascha@480: sascha@480: import de.intevation.gnv.geobackend.base.query.exception.QueryException; sascha@480: sascha@480: import de.intevation.gnv.state.exception.StateException; sascha@480: tim@335: import java.io.OutputStream; sascha@480: tim@335: import java.util.ArrayList; tim@335: import java.util.Collection; tim@335: import java.util.Locale; tim@335: sascha@480: import org.apache.log4j.Logger; tim@335: tim@335: import org.w3c.dom.Document; tim@335: import org.w3c.dom.Element; tim@335: import org.w3c.dom.Node; tim@335: import org.w3c.dom.NodeList; tim@335: tim@335: /** tim@335: * @author Tim Englich tim@335: * tim@335: */ sascha@480: public abstract class OutputStateBase sascha@480: extends StateBase sascha@480: implements OutputState sascha@480: { sascha@480: public static final String XPATH_OUTPUT_MODE = sascha@480: "/art:action/art:out/@name"; sascha@480: sascha@480: public static final String XPATH_MIME_TYPE = sascha@480: "/art:action/art:out/art:mime-type/@value"; tim@335: tim@335: /** tim@335: * The UID of this Class tim@335: */ tim@335: private static final long serialVersionUID = -1718732895737303823L; tim@335: tim@335: /** tim@335: * the logger, used to log exceptions and additonaly information tim@335: */ tim@335: private static Logger log = Logger.getLogger(OutputStateBase.class); tim@335: tim@335: /** tim@335: * The different Outputmodes which are provided by an OutputState tim@335: */ tim@335: protected Collection outputModes = null; tim@335: tim@335: protected String queryODVID = null; tim@335: tim@335: /** tim@335: * Constructor tim@335: */ tim@335: public OutputStateBase() { tim@335: super(); tim@335: } tim@335: tim@335: /** tim@335: * @see de.intevation.gnv.state.OutputState#getOutputModes() tim@335: */ tim@335: public Collection getOutputModes() { tim@335: log.debug("OutputStateBase.getOutputModes"); tim@335: return this.outputModes; tim@335: } tim@335: tim@335: /** tim@335: * @see de.intevation.gnv.state.StateBase#setup(org.w3c.dom.Node) tim@335: */ tim@335: @Override tim@335: public void setup(Node configuration) { tim@335: log.debug("OutputStateBase.setup"); tim@335: super.setup(configuration); tim@335: tim@335: this.queryODVID = Config.getStringXPath(configuration,"queryID-odv"); tim@335: tim@335: NodeList outputModeList = Config.getNodeSetXPath(configuration, tim@335: "outputsModes/outputsMode"); tim@335: if (outputModeList != null) { tim@335: log.debug(outputModeList.getLength() + " were found."); tim@335: this.outputModes = new ArrayList(outputModeList tim@335: .getLength()); tim@335: for (int i = 0; i < outputModeList.getLength(); i++) { tim@335: Element currentNode = (Element)outputModeList.item(i); tim@335: String name = currentNode.getAttribute("name"); tim@335: String description =currentNode.getAttribute("description"); tim@335: String mimeType = currentNode.getAttribute("mime-type"); tim@335: NodeList inputValuesList = Config.getNodeSetXPath(currentNode, tim@335: "parameters/inputvalue"); tim@335: Collection inputParameters = null; tim@335: if (inputValuesList != null) { tim@335: inputParameters = new ArrayList(inputValuesList tim@335: .getLength()); tim@335: for (int j = 0; j < inputValuesList.getLength(); j++) { tim@335: Element currentInputValuesNode = (Element)inputValuesList.item(j); tim@335: String inputValueName = currentInputValuesNode.getAttribute("name"); tim@335: String inputValueType = currentInputValuesNode.getAttribute("type"); tim@335: String defaultValue =currentInputValuesNode.getAttribute("value"); tim@335: boolean isMultiselect = false; tim@335: InputValue inputValue = new DefaultInputValue( tim@335: inputValueName, inputValueType, defaultValue, tim@335: isMultiselect); tim@335: inputParameters.add(inputValue); tim@335: } tim@335: } tim@335: tim@335: OutputMode outputMode = new DefaultOutputMode(name, tim@335: description, mimeType, inputParameters); tim@335: log.debug(outputMode.toString()); tim@335: this.outputModes.add(outputMode); tim@335: tim@335: } tim@335: } tim@335: } tim@335: tim@335: /** tim@335: * @see de.intevation.gnv.state.StateBase#advance() tim@335: */ tim@335: @Override ingo@493: public void advance(String uuid, CallContext context) ingo@493: throws StateException ingo@493: { tim@335: } tim@335: tim@335: @Override ingo@493: public void initialize(String uuid, CallContext context) ingo@493: throws StateException ingo@493: { tim@335: } tim@335: sascha@480: public void out( sascha@480: Document format, sascha@480: Collection inputData, sascha@480: OutputStream outputStream, sascha@480: String uuid, sascha@480: CallMeta callMeta sascha@480: ) sascha@480: throws StateException sascha@480: { tim@335: } tim@335: tim@335: /** tim@335: * @see de.intevation.gnv.state.OutputState#out(java.lang.String, tim@335: * java.util.Collection, java.io.OutputStream) tim@335: */ tim@335: public void out(String outputMode, Collection inputData, tim@335: OutputStream outputStream) throws StateException { tim@335: } tim@335: tim@335: /** tim@335: * @return tim@335: */ sascha@439: protected Object getChartResult(String uuid, CallContext callContext) { tim@335: log.debug("OutputStateBase.getChartResult"); sascha@439: Object result = null; tim@335: if (CacheFactory.getInstance().isInitialized()) { tim@335: String key = uuid + super.getID(); tim@335: log.debug("Hash for Queryelements: " + key); tim@335: net.sf.ehcache.Element value = CacheFactory.getInstance().getCache().get(key); tim@335: if (value != null) { sascha@439: result = value.getObjectValue(); tim@335: }else{ tim@335: result = this.getData(this.queryID); tim@335: if (CacheFactory.getInstance().isInitialized()) { tim@335: CacheFactory.getInstance().getCache().put(new net.sf.ehcache.Element(key, result)); tim@335: } tim@335: tim@335: } tim@335: } tim@335: return result; tim@335: } tim@335: sascha@439: protected Object getChartFromCache(String uuid, CallContext callContext) { tim@335: log.debug("Fetch chart [" + uuid + "] from cache"); tim@335: CacheFactory cacheFactory = CacheFactory.getInstance(); tim@335: if (cacheFactory.isInitialized()) { tim@335: String key = "chart_" + uuid + super.getID(); tim@335: net.sf.ehcache.Element object = cacheFactory.getCache().get(key); tim@335: tim@335: if (object != null) { tim@335: return object.getObjectValue(); tim@335: } tim@335: } tim@335: return null; tim@335: } tim@335: tim@335: protected Collection getODVResult(String uuid) { tim@335: log.debug("OutputStateBase.getODVResult"); tim@335: // TODO add Caching? I think it's not nessessary tim@335: Collection returnValue = null; tim@335: if (this.queryODVID != null){ tim@335: returnValue = this.getData(this.queryODVID); tim@335: }else{ tim@335: log.warn("No Query for ODV Data is defined."); tim@335: } tim@335: return returnValue; tim@335: } tim@335: tim@335: /** tim@335: * @param returnValue tim@335: * @return tim@335: */ tim@335: private Collection getData(String queryID) { tim@335: log.debug("OutputStateBase.getData"); tim@335: Collection returnValue = null; tim@335: try { tim@335: String[] filterValues = this.generateFilterValuesFromInputData(); tim@335: try { tim@335: QueryExecutor queryExecutor = QueryExecutorFactory tim@335: .getInstance() tim@335: .getQueryExecutor(); tim@335: returnValue = queryExecutor.executeQuery(queryID,filterValues); tim@335: } catch (RuntimeException e) { tim@335: log.error(e, e); tim@335: } tim@335: } catch (QueryException e) { tim@335: log.error(e, e); tim@335: } tim@335: return returnValue; tim@335: } tim@335: tim@335: protected void removeChartResult(String uuid) { tim@335: log.debug("OutputStateBase.getChartResult"); tim@335: if (CacheFactory.getInstance().isInitialized()) { tim@335: String key = uuid + super.getID(); tim@335: log.debug("Hash for Queryelements: " + key); tim@335: net.sf.ehcache.Element value = CacheFactory.getInstance().getCache().get(key); tim@335: if (value != null) { tim@335: CacheFactory.getInstance().getCache().remove(key); tim@335: } tim@335: } tim@335: } tim@335: tim@335: protected void removeChart(String uuid) { tim@335: log.debug("OutputStateBase.removeChart from cache"); tim@335: tim@335: CacheFactory cacheFactory = CacheFactory.getInstance(); tim@335: if (cacheFactory.isInitialized()) { tim@335: String key = "chart_" + uuid + super.getID(); tim@335: net.sf.ehcache.Element object = cacheFactory.getCache().get(key); tim@335: if (object != null) tim@335: cacheFactory.getCache().remove(key); tim@335: } tim@335: } tim@335: tim@335: protected void purifyChart(Object chart, String uuid) { tim@335: log.debug("Prufify chart [" + uuid + "]"); tim@335: CacheFactory cacheFactory = CacheFactory.getInstance(); tim@335: if (cacheFactory.isInitialized()) { tim@335: String key = "chart_" + uuid + getID(); tim@335: cacheFactory.getCache().put(new net.sf.ehcache.Element(key, chart)); tim@335: } tim@335: } tim@335: tim@335: /** tim@335: * @see de.intevation.gnv.state.StateBase#putInputData(java.util.Collection, java.lang.String) tim@335: */ tim@335: @Override tim@335: public void putInputData(Collection inputData, tim@335: String uuid) tim@335: throws StateException { tim@335: log.debug("OutputStateBase.putInputData"); tim@335: this.removeChartResult(uuid); tim@335: this.removeChart(uuid); tim@335: super.putInputData(inputData, uuid); tim@335: } tim@335: tim@335: public void out(String outputMode, Collection inputData, tim@335: OutputStream outputStream, String uuid, CallMeta callMeta) tim@335: throws StateException { tim@335: } tim@335: tim@335: tim@335: protected String getMessage(Locale locale, String key, String value) { tim@335: return RessourceFactory.getInstance().getRessource( tim@335: locale, tim@335: key, tim@335: value tim@335: ); tim@335: } tim@335: }