tim@335: /** tim@335: * tim@335: */ tim@335: package de.intevation.gnv.state.profile.horizontalcrosssection; tim@335: tim@335: import java.io.IOException; tim@335: import java.io.OutputStream; tim@335: import java.io.OutputStreamWriter; tim@335: import java.io.UnsupportedEncodingException; tim@468: import java.util.Arrays; tim@335: import java.util.Collection; tim@335: import java.util.Iterator; tim@468: import java.util.List; tim@335: import java.util.Locale; tim@335: tim@335: import org.apache.log4j.Logger; tim@335: ingo@358: import org.jfree.chart.ChartTheme; tim@468: import org.w3c.dom.Node; tim@468: tim@468: import com.vividsolutions.jts.geom.Coordinate; tim@468: import com.vividsolutions.jts.geom.Envelope; tim@468: import com.vividsolutions.jts.geom.Polygon; tim@468: import com.vividsolutions.jts.io.ParseException; tim@468: import com.vividsolutions.jts.io.WKTReader; ingo@358: tim@335: import au.com.bytecode.opencsv.CSVWriter; tim@468: import de.intevation.gnv.artifacts.cache.CacheFactory; tim@468: import de.intevation.gnv.artifacts.context.GNVArtifactContext; tim@335: import de.intevation.gnv.chart.Chart; tim@335: import de.intevation.gnv.chart.ChartLabels; tim@335: import de.intevation.gnv.geobackend.base.Result; tim@468: import de.intevation.gnv.geobackend.base.query.QueryExecutor; tim@468: import de.intevation.gnv.geobackend.base.query.QueryExecutorFactory; tim@468: import de.intevation.gnv.geobackend.base.query.exception.QueryException; tim@459: import de.intevation.gnv.state.InputData; tim@335: import de.intevation.gnv.state.exception.StateException; tim@335: import de.intevation.gnv.state.timeseries.TimeSeriesOutputState; tim@335: import de.intevation.gnv.statistics.Statistics; tim@468: import de.intevation.gnv.utils.StringUtils; tim@468: import de.intevation.gnv.utils.WKTUtils; tim@335: tim@468: import de.intevation.artifactdatabase.Config; sascha@439: import de.intevation.artifacts.CallContext; sascha@439: tim@335: /** tim@335: * @author Tim Englich tim@335: * tim@335: */ tim@335: public class HorizontalCrossSectionMeshOutputState tim@335: extends TimeSeriesOutputState { tim@335: tim@335: private static Logger log = Logger tim@335: .getLogger(HorizontalCrossSectionMeshOutputState.class); tim@335: tim@335: /** tim@335: * The UID of this Class tim@335: */ tim@335: private static final long serialVersionUID = 3233620652465061860L; tim@468: tim@468: private String ijkQueryID = null; tim@335: tim@335: /** tim@335: * Constructor tim@335: */ tim@335: public HorizontalCrossSectionMeshOutputState() { tim@335: super(); ingo@343: super.domainLable = "chart.horizontalcrosssection.title.xaxis"; tim@335: } tim@335: tim@335: @Override tim@335: protected Chart getChart( tim@335: ChartLabels chartLables, ingo@358: ChartTheme theme, tim@335: Collection parameters, tim@335: Collection measurements, tim@335: Collection dates, ingo@429: Object result, tim@335: Locale locale, tim@335: String uuid, tim@335: boolean linesVisible, sascha@439: boolean shapesVisible, sascha@439: CallContext callContext tim@335: ) { tim@335: Chart chart = null; tim@335: tim@335: if (CACHE_CHART) { tim@335: log.info("Try to get horizontalcrosssection chart from cache."); sascha@439: chart = (Chart) getChartFromCache(uuid, callContext); tim@335: } tim@335: tim@335: if (chart != null) tim@335: return chart; tim@335: tim@335: log.info("Chart not in cache yet."); tim@335: tim@335: log.warn("This sort of chart is not implemented yet."); tim@335: /* TODO Implement a special chart for this sort of charts. tim@335: chart = new HorizontalProfileChart( tim@335: chartLables, tim@335: chartTheme, tim@335: parameters, tim@335: measurements, tim@335: result, tim@335: dates, tim@335: locale tim@335: ); tim@335: chart.generateChart(); tim@335: tim@335: if (CACHE_CHART) { tim@335: log.info("Put chart into cache."); tim@335: purifyChart(chart, uuid); tim@335: } tim@335: */ tim@459: tim@459: InputData meshPolygon = inputData.get("mesh_polygon"); tim@459: String meshPolygonWkt = null; tim@459: if (meshPolygon != null){ tim@459: meshPolygonWkt = meshPolygon.getValue(); tim@459: tim@459: } tim@459: log.debug("Used Polygon: "+meshPolygonWkt); tim@335: tim@335: return chart; tim@335: } tim@468: tim@468: /** tim@468: * @see de.intevation.gnv.state.OutputStateBase#getChartResult(java.lang.String, de.intevation.artifacts.CallContext) tim@468: */ tim@468: @Override tim@468: protected Object getChartResult(String uuid, CallContext callContext) { tim@468: log.debug("HorizontalProfileMeshCrossOutputState.getChartResult"); tim@468: Collection result = null; tim@468: if (CacheFactory.getInstance().isInitialized()) { tim@468: String key = uuid + super.getID(); tim@468: log.debug("Hash for Queryelements: " + key); tim@468: net.sf.ehcache.Element value = CacheFactory.getInstance().getCache().get(key); tim@468: if (value != null) { tim@468: result = (Collection) (value.getObjectValue()); tim@468: }else{ tim@335: tim@468: InputData meshPolygon = inputData.get("mesh_polygon"); tim@468: InputData meshId = inputData.get("meshid"); tim@468: tim@468: if (meshPolygon == null) { tim@468: log.error("mesh_polygon is not defined"); tim@468: throw new IllegalStateException("missing mesh_linestring"); tim@468: } tim@468: tim@468: if (meshId == null) { tim@468: log.error("meshid is not defined"); tim@468: throw new IllegalStateException("missing meshid"); tim@468: } sascha@471: sascha@471: Polygon p = WKTUtils.toPolygon(meshPolygon.getValue()); sascha@471: sascha@471: if (p == null) { sascha@471: log.error("no valid polygon"); sascha@471: throw new IllegalStateException("no valid polygon"); sascha@471: } sascha@471: tim@468: try { tim@468: Envelope env = p.getEnvelopeInternal(); sascha@471: sascha@471: Coordinate [] coords = new Coordinate [] { sascha@471: new Coordinate(env.getMinX(), env.getMinY()), sascha@471: new Coordinate(env.getMinX(), env.getMaxY()), sascha@471: new Coordinate(env.getMaxX(), env.getMaxY()), sascha@471: new Coordinate(env.getMaxX(), env.getMinY()) }; tim@468: tim@468: String additionWhere = tim@468: WKTUtils.worldEnvelopeCoordinatesToIndex( tim@468: coords, tim@468: result, tim@468: meshId.getValue(), tim@468: ijkQueryID); tim@468: tim@468: String[] addedFilterValues = StringUtils.append( tim@468: generateFilterValuesFromInputData(), tim@468: additionWhere); tim@468: tim@468: QueryExecutor queryExecutor = QueryExecutorFactory tim@468: .getInstance() tim@468: .getQueryExecutor(); tim@468: tim@468: result = process( tim@468: Arrays.asList(coords), tim@468: numSamples(callContext), tim@468: queryExecutor.executeQuery( sascha@471: queryID, sascha@471: addedFilterValues), sascha@471: p); sascha@471: } sascha@471: catch (QueryException e) { tim@468: log.error(e,e); tim@468: } tim@468: tim@468: if (CacheFactory.getInstance().isInitialized()) { tim@468: CacheFactory.getInstance().getCache().put(new net.sf.ehcache.Element(key, result)); tim@468: } tim@468: } tim@468: } tim@468: return result; tim@468: } tim@468: tim@468: public static Collection process( tim@468: List path, tim@468: int numSamples, tim@468: Collection input, tim@468: Polygon polygon tim@468: ) { tim@468: // TODO: IMPLEMENT ME INTEGRATE POLYGONCLIPPING tim@468: return null; tim@468: } tim@335: tim@335: /** tim@335: * @see de.intevation.gnv.state.timeseries.TimeSeriesOutputState#getStatisticsGenerator() tim@335: */ tim@335: @Override tim@335: protected Statistics getStatisticsGenerator() { tim@461: return null; //Statistics are not supported for this kind of OutputState. tim@335: } tim@335: tim@335: /** tim@335: * @see de.intevation.gnv.state.timeseries.TimeSeriesOutputState#createCSV(java.io.OutputStream, tim@335: * java.util.Collection) tim@335: */ tim@335: @Override tim@335: protected void createCSV(OutputStream outputStream, tim@335: Collection chartResult) tim@335: throws UnsupportedEncodingException, tim@335: IOException, tim@335: StateException { tim@335: if (chartResult != null) { tim@335: try { tim@335: CSVWriter writer = new CSVWriter(new OutputStreamWriter( tim@335: outputStream, "ISO-8859-1"), ','); tim@335: // USE THIS ENCODING BECAUSE OF tim@335: // PROBLEMS WITH EXCEL AND UTF-8 tim@335: Iterator it = chartResult.iterator(); tim@335: while (it.hasNext()) { tim@335: Result result = it.next(); tim@335: int i = 0; tim@335: String[] entries = new String[5]; tim@335: entries[i++] = result.getString("SHAPE"); tim@335: entries[i++] = result.getString("YORDINATE"); tim@335: entries[i++] = result.getString("IPOSITION"); tim@335: entries[i++] = result.getString("JPOSITION"); tim@335: entries[i++] = result.getString("KPOSITION"); tim@335: writer.writeNext(entries); tim@335: } tim@335: writer.close(); tim@335: } catch (Exception e) { tim@335: log.error(e,e); tim@335: throw new StateException( tim@335: "Exception occured while parsing an Point from WKT."); tim@335: } tim@335: } else { tim@335: log.error("No Data given for generating an CSV-File."); tim@335: throw new StateException( tim@335: "No Data given for generating an CSV-File."); tim@335: } tim@335: } tim@468: tim@468: /** tim@468: * @see de.intevation.gnv.state.timeseries.TimeSeriesOutputState#setup(org.w3c.dom.Node) tim@468: */ tim@468: @Override tim@468: public void setup(Node configuration) { tim@468: super.setup(configuration); tim@468: this.ijkQueryID = Config.getStringXPath(configuration,"queryID-ijk"); tim@468: tim@468: } tim@468: tim@468: private static int numSamples(CallContext callContext) { tim@468: GNVArtifactContext context = tim@468: (GNVArtifactContext)callContext.globalContext(); tim@468: Integer samples = (Integer)context.get( tim@468: GNVArtifactContext.HORIZONTAL_CROSS_SECTION_SAMPLES_KEY); tim@468: return samples != null tim@468: ? samples.intValue() tim@468: : GNVArtifactContext.DEFAULT_HORIZONTAL_CROSS_SECTION_SAMPLES; tim@468: } tim@335: tim@335: }