# HG changeset patch # User Thomas Arendsen Hein # Date 1348827233 -7200 # Node ID 755dd2fa4a0aad86bdbfe7b8c440522851a7fe2c # Parent af3f56758f59055f8815b00ea82a53c63830d4d1# Parent f99d8f92a6407015dc3743356811b9413242340f merged geo-backend/0.5 diff -r f99d8f92a640 -r 755dd2fa4a0a gnv-artifacts/ChangeLog --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv-artifacts/ChangeLog Fri Sep 28 12:13:53 2012 +0200 @@ -0,0 +1,5550 @@ +2010-03-08 Ingo Weinzierl + + Issue186 + + * src/main/java/de/intevation/gnv/chart/AbstractXYLineChart.java: Adjusted + signature of method to store min/max ranges in x and y direction in + charts. + + * src/main/java/de/intevation/gnv/chart/TimeSeriesChart.java: Adjusted + method call to signature which has been changed in AbstractXYLineChart. + + * src/main/java/de/intevation/gnv/chart/HorizontalProfileChart.java: Added + some empty methods which overrides methods from parent which should not be + called on this class. + + * src/main/java/de/intevation/gnv/chart/VerticalProfileChart.java: Added + methods to store vertical min/max ranges in charts. After adding a new + series to this chart, we call prepareRangeAxis() to add an offset (5 + percent) between values and chart border. + +2010-03-08 Tim Englich + + * doc/conf/maptemplates/layer*.vm: + Added some basetemplates for Lines, Points and Polygons that will be used + if an WMS-layer of the Product Layer will be created. + + * src/main/java/de/intevation/gnv/utils/ShapeFileWriter.java (writeDataToFile): + Changed Method in taht way that it now will return the geometrytype of + this Layer instead of an boolean-value. + Null will determine that an Exception occured during the + Shapefilegeneration. + + * src/main/java/de/intevation/gnv/utils/MetaWriter.java (writeLayerMeta): + Added a new Method for writing the Metadatafile for WMS published by + the Product Layer. + Done som Refactoring work for reusing som Code-Snippets. + + * src/main/java/de/intevation/gnv/state/layer/LayerOutputState.java (getWMS): + Added the Basic-Support for publishing an WMS-Layer. + The Lookup of the Attributes which has to be put into the Shapefile and + the lookup of the Template which schould be used to symbolize the Layer + has to be implemented. + +2010-03-08 Ingo Weinzierl + + Issue195 + + * src/main/java/de/intevation/gnv/state/profile/verticalcrosssection/VerticalCrossSectionOutputState.java: + Use InputData stored at the current state to create chart titles. + +2010-03-08 Ingo Weinzierl + + Issue189 + + * src/main/java/de/intevation/gnv/state/profile/verticalcrosssection/VerticalCrossSectionOutputState.java: + Changed insufficient key to store results for chart generation in cache. + Use 'getHash()' method for this now, which have been implemented while + refactoring the cache mechanism. + +2010-03-06 Sascha L. Teichmann + + * src/main/java/de/intevation/gnv/artifacts/GNVArtifactBase.java, + src/main/java/de/intevation/gnv/state/StateBase.java, + src/main/java/de/intevation/gnv/state/MeasurementState.java, + src/main/java/de/intevation/gnv/state/timeseries/TimeSeriesOutputState.java: + Cleaned up imports. + +2010-03-05 Ingo Weinzierl + + * doc/conf/conf.xml: Set ttl to a better value. It has been set to 2min by + mistaken while working on mapfile generation. + +2010-03-05 Ingo Weinzierl + + Issue185 + + * src/main/java/de/intevation/gnv/state/MeasurementState.java: Added missing + parameter name in describe document. + +2010-03-05 Tim Englich + + * doc/conf/queries.properties: + Added some more Queries which are required to serve the Requests of the + Product Layer. + + * doc/conf/conf.xml: + Changed the Sourceid of the FIS Contis because of Changes in the Database. + + * doc/conf/products/layer/conf.xml: + Completed the Configuration for the Product Layer. + Added more Configurationdetails to the OutputStates. + * src/main/resources/lang/artifactMessages*.properties: + Added the required ressources for the Product Layer and the FIS Contis and + Nauthis into the Propertiesfiles. + + * src/main/java/de/intevation/gnv/utils/ShapeFileWriter.java (writeDataToFile): + Added an Method for writing g an Shapefile using an Collection of Results. + this Method must be extended that it could use the Result-object in an + generic Way. + At this Moment it is only be Possible to write the Geometry into the + Shapefile if it is given at the first Position of an Result. + All other Attributevalues will be ignored and not written into the Shapefile. + + * src/main/java/de/intevation/gnv/state/layer/LayerOutputState.java: + Added Support for writing Shapefiles and Export them as an Zipfile. + +2010-03-05 Tim Englich + * doc/conf/products/verticalprofile/conf_instantaneouspoint.xml: + ISSUE 191: Pdf, svg and png are now available. + +2010-03-04 Ingo Weinzierl + + * doc/conf/conf.xml: Added a section to configure MapServer relevant stuff. + + * src/main/java/de/intevation/gnv/artifacts/context/GNVArtifactContextFactory.java: + Store mapserver path in CallContext object to have access everywhere we + have a CallContext object (avoids reading config.xml all the time we want + to write mapfile). + + * src/main/java/de/intevation/gnv/artifacts/context/GNVArtifactContext.java: + Added key to store MapServer information into CallContext and fetch it + from it. + + * src/main/java/de/intevation/gnv/state/profile/horizontalcrosssection/HorizontalCrossSectionMeshOutputState.java: + Removed code to write meta information files (sourced out to MetaWriter). + This has been done with the intend to write meta information of CONTIS and + NAUTHIS using that class as well. + + * src/main/java/de/intevation/gnv/utils/MetaWriter.java: Helper class to + write meta information files used for mapfile generation. Write general + information about our wms service (MapServer) into meta information file. + This is used to give the user information about the place where he can + find the wms service and his generated wms layer. + +2010-03-04 Ingo Weinzierl + + * doc/conf/maptemplates/flow-velocity_polygons.class.vm, + doc/conf/maptemplates/water-levels_polygons.class.vm, + doc/conf/maptemplates/water-temperature_polygons.class.vm, + doc/conf/maptemplates/horizontalcrosssection_flow-velocity.vm, + doc/conf/maptemplates/flow-velocity_isolines.class.vm, + doc/conf/maptemplates/horizontalcrosssection_flow-velocity_isolines.vm, + doc/conf/maptemplates/horizontalcrosssection_water-levels.vm, + doc/conf/maptemplates/water-levels_isolines.class.vm, + doc/conf/maptemplates/horizontalcrosssection_water-temperature.vm, + doc/conf/maptemplates/water-temperature_isolines.class.vm, + doc/conf/maptemplates/horizontalcrosssection_water-levels_isolines.vm, + doc/conf/maptemplates/horizontalcrosssection_water-temperature_isolines.vm: + Added template files for water-levels, water-temperature and + flow-velocity. + +2010-03-04 Ingo Weinzierl + + Issue171 + + * src/main/java/de/intevation/gnv/chart/HorizontalProfileChart.java: Changed + the way to calculate the current distance from startpoint. We do not + calculate the distance between the current point and the last point and + add this value to a variable storing the total distance anymore, but + we take the distance between the current point and the start point. On + this way, we do not need a variable to store the total distance, because + current point - first point == total distance. And there is no + impreciseness in gaps of different layers (see issue171 for this). + +2010-03-04 Ingo Weinzierl + + * src/main/java/de/intevation/gnv/chart/VerticalProfileChart.java: Added + some more debug information for gap detection on grids. + + * src/main/java/de/intevation/gnv/chart/HorizontalProfileChart.java: Added + some more debug information for gap detection on grids. + +2010-03-03 Ingo Weinzierl + + * src/main/java/de/intevation/gnv/chart/TimeSeriesChart.java: Log important + values used for gap detection if debug level is enabled. + +2010-03-03 Ingo Weinzierl + + Issue146 + + * src/main/java/de/intevation/gnv/state/profile/horizontalcrosssection/HorizontalCrossSectionMeshOutputState.java: + Removed workaround to send a fake document if statistic is requested, + which is not available for this product type. + +2010-03-03 Ingo Weinzierl + + * src/main/java/de/intevation/gnv/state/timeseries/TimeSeriesOutputState.java: + Trigger pdf creation for histograms when an 'out' call arrives with output + mode 'histogram' and export mode 'pdf'. + + * src/main/java/de/intevation/gnv/exports/ChartExportHelper.java: + Implemented a method to export histograms as multipage pdf file. + + * doc/conf/products/timeseries/conf_mesh.xml, + doc/conf/products/horizontalprofile/conf_mesh.xml, + doc/conf/products/horizontalprofile/conf_instantaneouspoint.xml, + doc/conf/products/horizontalprofile/conf_mesh_cross.xml, + doc/conf/products/verticalprofile/conf_mesh.xml, + doc/conf/products/verticalprofile/conf_timeseriespoint.xml, + doc/conf/products/verticalprofile/conf_instantaneouspoint.xml: Added pdf + support for histogram charts. + +2010-03-02 Ingo Weinzierl + + * src/main/java/de/intevation/gnv/state/OutputStateBase.java: Added an xpath + expression for export modes. + + * src/main/java/de/intevation/gnv/state/timeseries/TimeSeriesOutputState.java: + Refactoring of 'out' to be able to add pdf and svg exports to histogram. + Now, there are just four output modes left (chart, histogram, csv, odv). + Export modes (pdf, svg, img) are part of these output modes. + Implemented svg export for histogram charts. + + * src/main/java/de/intevation/gnv/exports/ChartExportHelper.java: Helper + method to export histograms as svg via output stream. + + * doc/conf/products/timeseries/conf_mesh.xml, + doc/conf/products/timeseries/conf_timeseriespoint.xml, + doc/conf/products/horizontalprofile/conf_mesh.xml, + doc/conf/products/horizontalprofile/conf_instantaneouspoint.xml, + doc/conf/products/horizontalprofile/conf_mesh_cross.xml, + doc/conf/products/verticalprofile/conf_mesh.xml, + doc/conf/products/verticalprofile/conf_timeseriespoint.xml, + doc/conf/products/verticalprofile/conf_instantaneouspoint.xml: Added svg + as export mode to histogram output in configuration files. + +2010-03-02 Ingo Weinzierl + + Issue180 + + * src/main/java/de/intevation/gnv/state/profile/horizontal/NorthSouthEastWestState.java: + Removed CallMeta object from state which should not be serialized. + Implemented a little workarround to save localized strings on this state. + +2010-03-01 Ingo Weinzierl + + Issue182 + + * src/main/java/de/intevation/gnv/state/StateBase.java: Display the selected + value if there is no description available. WKT-strings will be displayed + in the static ui part again. + +2010-03-01 Ingo Weinzierl + + Issue179 + + * src/main/java/de/intevation/gnv/artifacts/GNVArtifactBase.java: Removed + code former used to append product select box. + + * src/main/java/de/intevation/gnv/state/StateBase.java: Just use all parent + states to render the static part of the user interfact - not the current + state itself! + +2010-03-01 Ingo Weinzierl + + * src/main/java/de/intevation/gnv/artifacts/GNVArtifactBase.java: Removed + methods which aren't used anymore (used before changing the caching + mechanism). + +2010-02-26 Ingo Weinzierl + + * doc/conf/products/timeseries/conf_timeseriespoint.xml: Changed the + configured state class from DefaultState to MeasurementState. + + * doc/conf/queries.properties: Select parameterid from db as well, when + fetching all measurement ids. + + * src/main/java/de/intevation/gnv/state/StateBase.java: Improved the way of + searching for descriptions in selected values (used in describe document). + + * src/main/java/de/intevation/gnv/state/MeasurementState.java: New state + object to create a describe document which can be used to render a + measurement-parameter-matrix. + + * src/main/java/de/intevation/gnv/state/InputData.java, + src/main/java/de/intevation/gnv/state/DefaultInputData.java: Added a new + method to fetch a description by key. + + * src/main/java/de/intevation/gnv/state/describedata/ExtendedKeyValueData.java: + This class extends DefaultKeyValueDescibeData. It is used by + MeasurementState to create a mapping between measurements and parameters. + Each key/value-pair has an extra attribute storing its parameter value. + +2010-02-25 Ingo Weinzierl + + * doc/conf/products/verticalcrosssection/conf_mesh.xml, + doc/conf/products/timeseries/conf_mesh.xml, + doc/conf/products/timeseries/conf_timeseriespoint.xml, + doc/conf/products/horizontalprofile/conf_mesh.xml, + doc/conf/products/horizontalprofile/conf_instantaneouspoint.xml, + doc/conf/products/horizontalprofile/conf_mesh_cross.xml, + doc/conf/products/verticalprofile/conf_mesh.xml, + doc/conf/products/verticalprofile/conf_timeseriespoint.xml, + doc/conf/products/verticalprofile/conf_instantaneouspoint.xml: Adapted + configuration. Pdf, svg, image exports got an own section in the + outputmodes node. Exports belong to an output mode, now. There are no + outputmodes 'pdf', 'svg', 'png' existing anymore. + +2010-02-25 Ingo Weinzierl + + * src/main/java/de/intevation/gnv/state/profile/verticalcrosssection/VerticalCrossSectionOutputState.java: + Changed the way of using cache to store verticalcrosssection chart data. + Now, this type of chart is working without cache, as well. + +2010-02-25 Ingo Weinzierl + + * src/main/java/de/intevation/gnv/state/OutputStateBase.java: Changed the + way of using the cache to store chart / histogram data. Now, output modes + 'chart' and 'histogram' are working without cache. + +2010-02-25 Ingo Weinzierl + + * src/main/java/de/intevation/gnv/artifacts/context/GNVArtifactContextFactory.java: + Better exception handling while cache configuration. The cache is not + initialized, if no cache is configured in conf.xml. There would have been + an exception without having a cache section in conf.xml. Now, it's + possible to use GNV without using a cache. + + * src/main/java/de/intevation/gnv/state/StateBase.java: Changed logger name + from irritating 'GNVArtifactBase' to 'StateBase'. + +2010-02-24 Ingo Weinzierl + + * src/main/java/de/intevation/gnv/state/timeseries/TimeSeriesOutputState.java: + Store request parameter in a map and put that map into other + classes/methods instead of putting each request parameter into an own + variable. + + * src/main/java/de/intevation/gnv/chart/DefaultHistogram.java: Implemented + logic to adjust number of bins in histogram charts. The user is able to + choose between the number of bins or the size of a single bin. + +2010-02-23 Ingo Weinzierl + + * contrib/palette2polygonVM.xsl: New. XSLT transformation to transform a + palette file into a style definition template used for mapfile creation. + Usage: + + $ xsltproc contrib/palette2polygonVM.xsl \ + doc/conf/palette/water-temperature.xml \ + > water-temperature.vm + +2010-02-23 Ingo Weinzierl + + * src/main/java/de/intevation/gnv/state/timeseries/TimeSeriesOutputState.java: + Removed a bug in pdf and svg creation. No data were drawn into chart. + +2010-02-23 Ingo Weinzierl + + * doc/conf/products/timeseries/conf_timeseriespoint.xml, + doc/conf/products/timeseries/conf_mesh.xml: Added an export mode section + in output modes and added an export mode 'pdf' for showcase. This work is + necessary to split up output modes (chart, histogram, ...) from export + modes (pdf, svg, png, ...). GUI components are now able to distinguish + between these modes and render each mode in an own section. + + * src/main/java/de/intevation/gnv/state/OutputStateBase.java: Read export + modes from configuration node. + + * src/main/java/de/intevation/gnv/artifacts/GNVArtifactBase.java: Write + export modes into describe document. + + * src/main/java/de/intevation/gnv/state/DefaultOutputMode.java, + src/main/java/de/intevation/gnv/state/OutputMode.java: Added export modes + as java.util.List. 'getExportModes()' will deliver this list. + + * src/main/java/de/intevation/gnv/state/DefaultExportMode.java, + src/main/java/de/intevation/gnv/state/ExportMode.java: Object storing + necessary information for export mode. + +2010-02-22 Ingo Weinzierl + + * doc/conf/conf.xml: Restructured configuration of shapfile and template + directories. Moved map-generator part into gnv section. + Moved shapefile-directory configuration to an own section and removed + duplicated shapefile-directory config from map-generator. + + * src/main/java/de/intevation/gnv/utils/MapfileGenerator.java: Adjusted + xpath expressions regarding the changes in conf.xml. MapfileGenerator got + some instance variables to store information about mapfile location, + velocity log file and shapefile and template directories. This avoids + reading conf.xml every single time while updating the mapfile. + + * src/main/java/de/intevation/gnv/artifacts/context/GNVArtifactContextFactory.java: + Adjusted xpath expression regaring the changes of shapefile-directory in + conf.xml. + +2010-02-22 Ingo Weinzierl + + * doc/conf/conf.xml: Added path for velocity logfile. + + * doc/conf/maptemplates/horizontalcrosssection_salinity.vm, + doc/conf/maptemplates/horizontalcrosssection_salinity_isolines.vm: Removed + absolute path in style includes. + + * src/main/java/de/intevation/gnv/utils/MapfileGenerator.java: Improved + velocity configuration regarding absolute pathes and logfile. + +2010-02-21 Sascha L. Teichmann + + * src/main/java/de/intevation/gnv/state/profile/horizontalcrosssection/HorizontalCrossSectionMeshOutputState.java: + Fixed file handle leak when writing meta data. + + * src/main/java/de/intevation/gnv/state/StateBase.java, + src/main/java/de/intevation/gnv/state/MinMaxState.java, + src/main/java/de/intevation/gnv/utils/MapfileGenerator.java, + src/main/java/de/intevation/gnv/chart/DefaultHistogram.java, + src/main/java/de/intevation/gnv/chart/AbstractHistogram.java, + src/main/java/de/intevation/gnv/exports/ChartExportHelper.java: + Clean up imports. + +2010-02-19 Ingo Weinzierl + + * src/main/java/de/intevation/gnv/state/profile/horizontalcrosssection/HorizontalCrossSectionMeshOutputState.java: + Write a meta information file after shapefile writing is finished. These + meta information are used to map the type of shapefiles to a specific + template and fill these layer-templates with data. + + * src/main/java/de/intevation/gnv/wms/LayerInfo.java: Class for storing meta + information for mapfile creation. + + * src/main/java/de/intevation/gnv/utils/MapfileGenerator.java: Implemented + method stubs. The MapfileGenerator starts searching for meta information + in filesystem after update() is called. These information are used to to + fill templates for the supported layers and a mapfile will be created out + of this. + + TODO: Configure Velocity. + + * pom.xml: Added Apache Velocity 1.6.1 for templating mapfiles. + + * doc/conf/conf.xml: Adapted a section to configure necessary directories + and filenames for mapfile generation. + + * doc/conf/maptemplates/mapfile.vm: Base template for mapfile. All required + layers will be included into this template. + + * doc/conf/maptemplates/horizontalcrosssection_salinity_isolines.vm, + doc/conf/maptemplates/horizontalcrosssection_salinity.vm, + doc/conf/maptemplates/salinity_isolines.class.vm, + doc/conf/maptemplates/salinity_polygons.class.vm: Template support for + salinity in horizontal crosssection wms. + +2010-02-17 Ingo Weinzierl + + * doc/conf/conf.xml: Added configuration section for writing mapfiles. + + * src/main/java/de/intevation/gnv/utils/MapfileGenerator.java: Singleton + generator for writing mapfiles. It runs in an own thread and has an + 'update' method which triggers the generator to search the filesystem for + shapefiles and meta information and update mapfiles out of these + information. A 'main' method can be invoked to update the mapfile without + an running artifact server. + + TODO: Implement method stubs. + + * src/main/java/de/intevation/gnv/state/profile/horizontalcrosssection/HorizontalCrossSectionMeshOutputState.java: + Call MapfileGenerator when writing or removing shapefiles (endOfLife). + +2010-02-15 Ingo Weinzierl + + * doc/conf/products/timeseries/conf_mesh.xml, + doc/conf/products/timeseries/conf_timeseriespoint.xml, + doc/conf/products/horizontalprofile/conf_mesh.xml, + doc/conf/products/horizontalprofile/conf_instantaneouspoint.xml, + doc/conf/products/horizontalprofile/conf_mesh_cross.xml, + doc/conf/products/verticalprofile/conf_mesh.xml, + doc/conf/products/verticalprofile/conf_timeseriespoint.xml, + doc/conf/products/verticalprofile/conf_instantaneouspoint.xml: Added + histogram as output mode. + + * doc/conf/charttemplate.xml: Added color of bars in histograms. + +2010-02-15 Ingo Weinzierl + + * src/main/java/de/intevation/gnv/state/timeseries/TimeSeriesOutputState.java: + Added code path to create and return histograms. + + * src/main/java/de/intevation/gnv/chart/AbstractHistogram.java, + src/main/java/de/intevation/gnv/chart/DefaultHistogram.java: New. Classes + for creating histograms. Each histogram contains exactly one parameter. + + * src/main/java/de/intevation/gnv/chart/XMLChartTheme.java: Added parsing + of histogram bar color. + + * src/main/java/de/intevation/gnv/exports/ChartExportHelper.java: Added a + new funcion to copy all histograms into a single image and send it to + output stream. + + * src/main/java/de/intevation/gnv/histogram/HistogramHelper.java: New. Added + helper function to split the result collections for each parameter and for + each measurement into pieces. + +2010-02-12 Tim Englich + + * doc/conf/queries.properties: + Integrated Queries for the Product Layer. + + * doc/conf/conf.xml: + Integrated the new FIS Nauthis and Contis and the required Link to the + Configuration for the new Product Layer. + + * doc/conf/products/layer/conf.xml: + Added Configuration for the new Product Layer. + * src/main/java/de/intevation/gnv/state/OutputStateBase.java (getData): + Changed Methodsignature from private to protected ro make it available + for extended Classes. + + * src/main/java/de/intevation/gnv/state/layer/LayerOutputState.java (LayerOutputState): + Added new State for generating the Output for the Product Layer. + This Class is not jet completly implemented and will not return any + result at this Moment. + + * src/main/java/de/intevation/gnv/layer/LayerArtifact.java: + Added new Artifactclass for the Product Layer. + +2010-02-12 Ingo Weinzierl + + * src/main/java/de/intevation/gnv/state/InputData.java, + src/main/java/de/intevation/gnv/state/DefaultInputData.java: Descriptions + of values are stored in an array, because one InputData object can contain + many data. + + * src/main/java/de/intevation/gnv/state/StateBase.java: Get a description + for each input parameter and use an array to store all descriptions in an + InputData object. Result of this is, that all user selected parameters are + displayed and charts are well drawn again. + + * src/main/java/de/intevation/gnv/state/timeseries/TimeSeriesOutputState.java: + Split up data values stored in InputData objects in search mechanism for + specific parameters and put them all as KeyValueDescibeData objects into a + collection. + +2010-02-12 Ingo Weinzierl + + * src/main/java/de/intevation/gnv/artifacts/GNVArtifactBase.java: Removed + useless method calls which removed elements from cache, because each state + puts its own elements into cache - not in one big piece. + + * src/main/java/de/intevation/gnv/state/StateBase.java: Adapted 'reset' + method. It removes the former user selection for this state, only. + +2010-02-12 Tim Englich + + * doc/conf/products/timeseries/conf_mesh.xml: + Added new Transitions so that the State for entering a CoordinateValue will + only be shown if no Point was inserted during the Instantiation of an Artifact. + (MapViewer-Interface) + The could be used in the FIS Modeldata using the Product TimeSeries. You also have + to use a Region in the RegionFilter. + +2010-02-12 Tim Englich + + * src/main/java/de/intevation/gnv/state/PreSettingsTransferState.java: + This new State ist Implemented for the Case that Values of the PreSettings + has to be used instead of InputValues. This States will look into the + Presettings and put Values identified by the configurable Names into the + InputData-Collection. + For the Configuration you can insert the following XML-Element into the + Configuration of a State. + + + * src/main/java/de/intevation/gnv/state/StateBase.java (getPreSettings), + src/main/java/de/intevation/gnv/state/State.java (getPreSettings): + Added a getter-method for the PreSettings that are set at the State. + Using this way e.g the PresettingsValueCompareTransition can reach the + Settings an can evaluate them. + + * src/main/java/de/intevation/gnv/transition/PresettingsValueCompareTransition.java (operator): + This transition will have a look at the Values which where ste during the + instantiation of an Artifact. If a defined Value is given an the Value is + Equal to the configured Value using the configured Operator the Transition + to the configured State could be used. Otherwise the Transition could not + be used. + +2010-02-11 Ingo Weinzierl + + * src/main/java/de/intevation/gnv/state/timeseries/TimeSeriesOutputState.java: + Replaced method call which removes non selected parameters from parameter + list. At this time, there are only selected parameters in the list, so + there is no need to clean it. The result: Charts are drawn. + +2010-02-11 Ingo Weinzierl + + * src/main/java/de/intevation/gnv/state/StateBase.java: Declared method as + 'protected' to be allowed to use it in derived classes. + + * src/main/java/de/intevation/gnv/state/OutputStateBase.java: Changed the + key to store into cache and restore data from it. Added a workarround to + find min and max value fields in InputData. + + * src/main/java/de/intevation/gnv/state/timeseries/TimeSeriesOutputState.java: + Adapted the search mechanism for specific parameter collections. This is + required, because the the former mechanism searched in the big cache blob + - which doesn't exist anymore. + + TODO: Repair chart generation. Although there are results existing for + chart generation, no chart in drawn. + +2010-02-11 Ingo Weinzierl + + * src/main/java/de/intevation/gnv/state/StateBase.java: Improved hash + creation of each state. The hash is created using the uuid, state-id and + the hash code of the input data required for the sql statement. + +2010-02-10 Ingo Weinzierl + + * src/main/java/de/intevation/gnv/state/StateBase.java: Append description + to InputData objects and use it while creating the describe document. The + description is displayed in the static GUI part. A nice side effect of + this is, that the subarea selection re-appears in the static GUI part. + Even if no subarea has been selected. Furthermore, removed some methods + which became useless after refactoring the caching and rendering + mechanism. + + * src/main/java/de/intevation/gnv/state/MinMaxState.java: Adapted method + signature regarding changes in upper class. + +2010-02-10 Ingo Weinzierl + + * src/main/java/de/intevation/gnv/state/State.java: New method 'feed' in + this interface. It should be used to feed this state with new data + selected by the user. + + * src/main/java/de/intevation/gnv/artifacts/GNVArtifactBase.java: Use new + method 'feed' instead of 'putInputData' to feed the state with new data. + + * src/main/java/de/intevation/gnv/state/profile/horizontal/NorthSouthEastWestState.java, + src/main/java/de/intevation/gnv/state/CoordinateSelectionState.java, + src/main/java/de/intevation/gnv/state/SingleInputState.java: Method + 'purifyResult' just cleans values from database and returns it. DO NOT + put these results into cache at this place! + + * src/main/java/de/intevation/gnv/state/InputData.java, + src/main/java/de/intevation/gnv/state/DefaultInputData.java: Some new + methods to store objects in such an InputData object. Objects are used to + store MinMaxDescribeData objects for example. And further new methods to + store a description for each InputData object. This is used to render the + static GUI part. Until now, this object stored the id's of the + selected parameter, only - which are useless to show in GUI. The + description should be the string shown in the GUI, later. + + * src/main/java/de/intevation/gnv/state/MinMaxState.java: This type of state + overrides 'feed' and 'appendToStaticNode'. 'feed' takes user input and + parses min and max values from it (used for time periods for example). + 'appendToStaticNode' will append these fields to the static GUI part. + + * src/main/java/de/intevation/gnv/state/StateBase.java: Removed the big + cache blob and parted it into pieces. Each state will now put its + database data into cache. In this way, we are able to reuse these data + when the user steps back in history. Data, inserted by the user, will be + stored via 'feed'. Special input fields like multi selection or ranges + need to override this method to parse the input data and store them in + special objects. + + TODOs: + - The output modes are based on this big cache blob and search for + parameterid, measurementid and dateid in it. + TimeSeriesOutputState.getCollection() needs to be adapted! + +2010-02-09 Tim Englich + + * src/main/java/de/intevation/gnv/artifacts/services/requestobjects/DefaultFIS.java (addParameter), + src/main/java/de/intevation/gnv/artifacts/services/requestobjects/FIS.java (addParameter): + Added the possibility to add Parameters to an existing FIS. + + * src/main/java/de/intevation/gnv/artifacts/services/MetaDataService.java (getFIS): + Added the support of the usecase that one FIS can be identified by different + MapServices. In that case the parameters will be merged into the existing + FIS. + +2010-02-09 Ingo Weinzierl + + * src/main/java/de/intevation/gnv/state/StateBase.java: Do not query the + cache / database for rendering the static part of the describe document - + just take the input data stored at each state. + + TODOs: + - Store 'description' of each chosen value. At the moment we are able to + render an id of value, only. + - Take care of input elements with multi selection. + - The subarea node disappears if we don't select any. + +2010-02-09 Tim Englich + + * doc/conf/conf.xml: + Switched the usage of DummyMetaDataService to MetaDataService because + the Service is now able to work properly. + * doc/conf/queries.properties: + Added the required SQL-Statements for fetching the Metadata from the + Database. + * src/main/java/de/intevation/gnv/artifacts/services/MetaDataService.java: + Added the Database-Lookup of FIS and Parameters. + Now the Metadata will be looked up using the specified Databaseschema as + defined in doc/schema/externalinterface_schema.sql + * src/main/java/de/intevation/gnv/artifacts/services/DummyMetaDataService.java + Removed Dummyservice because it is not required any more. + +2010-02-05 Ingo Weinzierl + + Issue170 + + * pom.xml: Changed log4j version to 1.2.14 (later version + causes errors and breaks maven build process). + +2010-02-05 Tim Englich + + * pom.xml: + Changed from ArcSDE version 9.2.5 to Version 9.3 + You have to Install the required Libraries as described in + https://bsh-intern.intevation.de/Mavenbuildprozess + +2010-02-05 Tim Englich + * doc/schema/externalinterface_testdata.sql: + Changed the Testdata for layerhasparameter according to the the changes of + the Tablestructure. + * doc/schema/externalinterface_schema.sql: + Changed id_layer Column in Table layerhasparameter from literal to number. + And added Column Layername to this Table. + This is nessessary because the Identifcation of an Layer is not the name + but the ID. + +2010-02-05 Tim Englich + * doc/conf/products/horizontalcrosssection/conf_mesh.xml: + ISSUE167 + Fixed Bug in Konfiguration. Now Regionfilters can be used without running + in an Exception. + +2010-02-02 Tim Englich + + * doc/conf/products/horizontalcrosssection/conf_mesh.xml, + doc/conf/products/horizontalprofile/conf_instantaneouspoint.xml, + doc/conf/products/horizontalprofile/conf_mesh_cross.xml, + doc/conf/products/horizontalprofile/conf_mesh.xml, + doc/conf/products/timeseries/conf_mesh.xml, + doc/conf/products/timeseries/conf_timeseriespoint.xml, + doc/conf/products/verticalcrosssection/conf_mesh.xml, + doc/conf/products/verticalprofile/conf_instantaneouspoint.xml, + doc/conf/products/verticalprofile/conf_mesh.xml, + doc/conf/products/verticalprofile/conf_timeseriespoint.xml: + Added the possibility to use the Informations (PreSettings) which are + send using the MapViewer-Interface in all States which are responsible to + manage the choice of Parameters during the Workflows of GNV-Artifacts. + +2010-02-02 Tim Englich + + * src/main/java/de/intevation/gnv/state/DefaultInputData.java (splitValue), + src/main/java/de/intevation/gnv/state/InputData.java (splitValue): + Added Method which spilts the Values using the same Separator which is + used to concart the Values. + + * src/main/java/de/intevation/gnv/state/StateBase.java: + Added the usage of the Presettings during the Loading of the Data + which is nessesary to describe the current State. + If Values are given in the Presettings which are identified by the + name wwhich is specified in the Configurationelement presettings-name + only the Intersection of the fetched Objects and the PresettingsObjects + are used. + + * src/main/java/de/intevation/gnv/state/State.java (setPreSettings): + Added new Method setPreSettings to be Able to put the Presettings from the + current Artifact to the different States. + + * src/main/java/de/intevation/gnv/artifacts/fis/SelectProductArtifact.java (setup): + The Method Setup now extracts the given PreSettingsparameter from the + XML-Document and put them to the ProductArtifacts which are instantiated in + the advance()-Method using the Methods of the PreSettingArtifact-Interface. + + * src/main/java/de/intevation/gnv/artifacts/PreSettingArtifact.java (setPreSettings): + New interfacedefinition. Artifacts which are implementing this Interface + are able to exchange the given Presettings using the given getter and + setter methods of this Interface. + + * src/main/java/de/intevation/gnv/artifacts/GNVArtifactBase.java: + The GNVArtifactBase now implements the Interface PreSettingsArtifacts. + So it is able to manage Data which is set during the construction of an + new ArtifactInstance. + It also put the PreSettings-data to the different States. So that they are + able to use it during their livecycle. + +2010-02-01 Tim Englich + + * doc/conf/conf.xml: + Added the Configuration-node for the MetaDataService into the Configuration + of the GNV-Artifact-Restserver. + At tis Moment it is only useful to use the DummyMetaDataService. + + * src/main/java/de/intevation/gnv/artifacts/services/requestobjects/DefaultLayer.java: + Defaultimplementation of the Interface Layer. + * src/main/java/de/intevation/gnv/artifacts/services/requestobjects/Layer.java: + Interfacedefinition for Objects that represents Layer and GroupLayer that + where parsed from the XML-Document which was sent to the MetaDataService + + * src/main/java/de/intevation/gnv/artifacts/services/requestobjects/DefaultMapService.java: + Defaultimplementation of the Interface MapService. + * src/main/java/de/intevation/gnv/artifacts/services/requestobjects/MapService.java: + Interfacedefinition for Objects that represents Mapservices that where + parsed from the XML-Document which was sent to the MetaDataService. + + * src/main/java/de/intevation/gnv/artifacts/services/requestobjects/DefaultParameter.java: + Defaultimplementation of the Interface Parameter. + * src/main/java/de/intevation/gnv/artifacts/services/requestobjects/Parameter.java: + Interfacedefinition for representing an Parameter which belongs to an FIS. + + * src/main/java/de/intevation/gnv/artifacts/services/requestobjects/DefaultFIS.java: + Defaultimplementation of the Interface FIS. + * src/main/java/de/intevation/gnv/artifacts/services/requestobjects/FIS.java: + Interfacedefinition for representing an FIS which will be used as an + ResultValue of the MetaDataService-Processing. + + * src/main/java/de/intevation/gnv/artifacts/services/MetaDataServiceException.java: + Exceptionclass for classifiing Exception which occurs during the processing + of an MetaDataService-Call. + + * src/main/java/de/intevation/gnv/artifacts/services/DummyMetaDataService.java: + DummyClass of an MetaDataService. This Class can be use to simulate an + MetaDataService-Call until the required Metadata for the prossessing are + available in the Database-Backend. + This Class only returns the given Mapservices as an FIS and the Layer + as an Parameter to a given FIS. + + * src/main/java/de/intevation/gnv/artifacts/services/MetaDataService.java: + This Class is an Implementation of the de.intevation.artifacts.Service + Interface. This Service should provide Informations which FIS are available + for given Mapservices an which FIS are intersecting a given Region + These Informations are required according to definition of the MapViewer + Interface. + +2010-02-01 Tim Englich + + * src/test/java/de/intevation/gnv/artifacts/TestArtifactDatabase.java (createArtifactWithFactory): + Fixed Compilance-Errors triggered by Interface-Modifications in the + Artifact-Module. + + * src/test/java/de/intevation/gnv/artifacts/TimeSeriesPointVerticalProfileTestCase.java (testArtifact), + src/test/java/de/intevation/gnv/artifacts/TimeSeriesPointTimeSeriesTestCase.java (testArtifact), + src/test/java/de/intevation/gnv/artifacts/MeshVerticalProfileTestCase.java (testArtifact), + src/test/java/de/intevation/gnv/artifacts/MeshVerticalCrossSectionTestCase.java (testArtifact), + src/test/java/de/intevation/gnv/artifacts/MeshTimeSeriesTestCase.java (testArtifact), + src/test/java/de/intevation/gnv/artifacts/MeshHorizontalProfileTestCase.java (testArtifact), + src/test/java/de/intevation/gnv/artifacts/MeshHorizontalCrossSectionTestCase.java (testArtifact), + src/test/java/de/intevation/gnv/artifacts/InstantaneousPointVerticalProfileTestCase.java (testArtifact), + src/test/java/de/intevation/gnv/artifacts/InstantaneousPointHorizontalProfileTestCase.java (testArtifact): + Refactored Artifact-Instantiation using the new createArtifact()-Method of the super-Class. + + * src/test/java/de/intevation/gnv/artifacts/GNVArtifactsTestCaseBase.java (createArtifact) + Added Method for instantiating an new Artifact using the given Artifactfactory. + Also fixed the Compilance-Errors triggered by Interface-Modifications in the + Artifact-Module. + +2010-02-01 Tim Englich + + * src/main/java/de/intevation/gnv/timeseries/TimeSeriesArtifact.java (setup), + src/main/java/de/intevation/gnv/profile/verticalcrosssection/VerticalCrossSectionMeshArtifact.java (setup), + src/main/java/de/intevation/gnv/profile/vertical/VerticalProfileArtifact.java (setup), + src/main/java/de/intevation/gnv/profile/horizontalcrosssection/HorizontalCrossSectionMeshArtifact.java (setup), + src/main/java/de/intevation/gnv/profile/horizontal/HorizontalProfileArtifact.java (setup), + src/main/java/de/intevation/gnv/artifacts/fis/SelectProductArtifact.java (setup), + src/main/java/de/intevation/gnv/artifacts/GNVProductArtifactFactory.java (createArtifact), + src/main/java/de/intevation/gnv/artifacts/GNVArtifactBase.java (setup): + Changed Method signatures because of Interfacemodifications in the + Artifact-Module. Now it is possible to retrieve the XML-Document which was + send by an Client during the create-Call. So it is possible to get further + Informations which could be used during the livecycle of an Artifact. + + +2010-01-31 Sascha L. Teichmann + + * src/main/java/de/intevation/gnv/artifacts/context/GNVArtifactContext.java, + src/main/java/de/intevation/gnv/artifacts/context/GNVArtifactContextFactory.java, + doc/conf/conf.xml: Added configuration for extrapolation in "Horizontalschnitte". + + Use gnv/horizontal-cross-section/extrapolation/@rounds with + integer rounds > 0 to turn extrapolation on (default: 0). + Rounds is a number of successive point extrapolations which means that + the grid is successively filled with missing points based on prior rounds. + The larger 'rounds' get more gaps are filled synthetic generated points. + + Set this to 2 to get good results for the model data FIS. + + * src/main/java/de/intevation/gnv/state/profile/horizontalcrosssection/HorizontalCrossSectionMeshOutputState.java: + Foward configuration to area interpolation. + + * src/main/java/de/intevation/gnv/math/AreaInterpolation.java: + Foward configuration to GridCell. + + * src/main/java/de/intevation/gnv/math/Point2d.java: Added method to extrapolate + point along a line spanned by two points. + Calculate Inverse Distance Weighting (IDW) for a given set of points on + z components. Added method to check if set of points are near a given + point. + + * src/main/java/de/intevation/gnv/math/GridCell.java: Before building the + i/j cells the grid is filled with synthetic generated points. The + position is estimated from the neighboring points. The parameter values + are calculated by IDW. Some care is taken to avoid invalid grid topologies. + + TODO: Implement this for the "Profillschnitt" too to keep the inner + symmetry. + +2010-01-29 Tim Englich + + * src/test/java/de/intevation/gnv/artifacts/MeshVerticalProfileTestCase.java (testArtifact), + * src/test/java/de/intevation/gnv/artifacts/MeshVerticalCrossSectionTestCase.java (testArtifact), + * src/test/java/de/intevation/gnv/artifacts/MeshHorizontalProfileTestCase.java (testArtifact), + * src/test/java/de/intevation/gnv/artifacts/MeshHorizontalCrossSectionTestCase.java (testArtifact): + Increases the number of steps that has to be done for the different products plus one. + + * src/test/ressources/verticalprofile_mesh/verticalprofile_step_11_out_statistics.xml, + src/test/ressources/verticalprofile_mesh/verticalprofile_step_11_out_odv.xml, + src/test/ressources/verticalprofile_mesh/verticalprofile_step_11_out_csv.xml, + src/test/ressources/verticalprofile_mesh/verticalprofile_step_11_out_chart.xml, + src/test/ressources/verticalprofile_mesh/verticalprofile_step_11_feed.xml, + src/test/ressources/verticalprofile_mesh/verticalprofile_step_11_advance.xml, + src/test/ressources/verticalprofile_mesh/verticalprofile_step_10_feed.xml, + src/test/ressources/verticalprofile_mesh/verticalprofile_step_10_advance.xml, + src/test/ressources/verticalprofile_mesh/verticalprofile_step_09_advance.xml: + Added Advance and Feed-Document for the State Year. + Changed the Advance to the State Year. + Moves the Last state to *11*.xml Documents. + + * src/test/ressources/verticalcrosssection_mesh/verticalcrosssection_step_07_out_odv.xml, + src/test/ressources/verticalcrosssection_mesh/verticalcrosssection_step_07_out_csv.xml, + src/test/ressources/verticalcrosssection_mesh/verticalcrosssection_step_07_out_chart.xml, + src/test/ressources/verticalcrosssection_mesh/verticalcrosssection_step_07_feed.xml, + src/test/ressources/verticalcrosssection_mesh/verticalcrosssection_step_07_advance.xml, + src/test/ressources/verticalcrosssection_mesh/verticalcrosssection_step_06_feed.xml, + src/test/ressources/verticalcrosssection_mesh/verticalcrosssection_step_06_advance.xml, + src/test/ressources/verticalcrosssection_mesh/verticalcrosssection_step_05_advance.xml: + Added Advance and Feed-Document for the State Year. + Changed the Advance to the State Year. + Moves the Last state to *07*.xml Documents. + + * src/test/ressources/horizontalProfile_mesh/horizontalprofile_step_11_out_statistics.xml, + src/test/ressources/horizontalProfile_mesh/horizontalprofile_step_11_out_odv.xml, + src/test/ressources/horizontalProfile_mesh/horizontalprofile_step_11_out_csv.xml, + src/test/ressources/horizontalProfile_mesh/horizontalprofile_step_11_out_chart.xml, + src/test/ressources/horizontalProfile_mesh/horizontalprofile_step_11_advance.xml, + src/test/ressources/horizontalProfile_mesh/horizontalprofile_step_10_feed.xml, + src/test/ressources/horizontalProfile_mesh/horizontalprofile_step_10_advance.xml, + src/test/ressources/horizontalProfile_mesh/horizontalprofile_step_09_advance.xml: + Added Advance and Feed-Document for the State Year. + Changed the Advance to the State Year. + Moves the Last state to *11*.xml Documents. + + * src/test/ressources/horizontalcrosssection_mesh/horizontalcrosssection_step_08_out_zip.xml, + src/test/ressources/horizontalcrosssection_mesh/horizontalcrosssection_step_08_out_wms.xml, + src/test/ressources/horizontalcrosssection_mesh/horizontalcrosssection_step_08_feed.xml, + src/test/ressources/horizontalcrosssection_mesh/horizontalcrosssection_step_08_advance.xml, + src/test/ressources/horizontalcrosssection_mesh/horizontalcrosssection_step_07_feed.xml, + src/test/ressources/horizontalcrosssection_mesh/horizontalcrosssection_step_07_advance.xml, + src/test/ressources/horizontalcrosssection_mesh/horizontalcrosssection_step_06_advance.xml: + Added Advance and Feed-Document for the State Year. + Changed the Advance to the State Year. + Moves the Last state to *08*.xml Documents. + +2010-01-27 Hans Plum + + RELEASE 0.4 + + * Changes, NEWS, ChangeLog: Summarized activities + +2010-01-27 Sascha L. Teichmann + + * Changes: Reordered items a bit + +2010-01-27 Ingo Weinzierl + + Issue164 + + * src/main/java/de/intevation/gnv/state/profile/horizontalcrosssection/HorizontalCrossSectionMeshOutputState.java: + Applied patch of SLT to remove shape files and directories of out-dated + artifacts. Therefor we need to store the artifact after an 'out' operation + - which is actually a read only operation - explicitly into the artifact + database to keep the directory path. + +2010-01-26 Ingo Weinzierl + + * src/main/java/de/intevation/gnv/state/timeseries/TimeSeriesOutputState.java: + Calculate results after reaching the final state and store them in cache. + This avoids long latencies for chart creation or exports. + +2010-01-26 Ingo Weinzierl + + Issue158 + + * src/main/java/de/intevation/gnv/state/timeseries/TimeSeriesOutputState.java: + Replaced old way to create ChartLabel objects with a method call + 'createChartLabels()'. + +2010-01-26 Ingo Weinzierl + + * src/main/java/de/intevation/gnv/chart/VerticalCrossSectionChart.java: + Set white border (border arround drawing area) as default for + 'Profilschnitte'. + +2010-01-26 Ingo Weinzierl + + * src/main/java/de/intevation/gnv/state/profile/verticalcrosssection/VerticalCrossSectionOutputState.java: + Calculate results after reaching the final state and store them in cache. + This avoids long latencies for chart creation or exports. + +2010-01-26 Ingo Weinzierl + + Issue162 + + * doc/conf/products/horizontalcrosssection/conf_mesh.xml, + doc/conf/queries.properties: Adapted transition model. Splitted date + selection of 'Horizontalschnitte' into two steps. + +2010-01-26 Ingo Weinzierl + + * doc/conf/products/verticalcrosssection/conf_mesh.xml: Removed csv export + from product 'Profilschnitt'. + +2010-01-26 Ingo Weinzierl + + * src/main/java/de/intevation/gnv/chart/VerticalProfileChart.java: Fixed an + ArrayIndexOutOfBounds-exception which occured if there are less than two + data points. + +2010-01-26 Ingo Weinzierl + + Issue161 + + * doc/conf/products/verticalprofile/conf_mesh.xml: Adapted transition model. + Splitted date selection into two steps. + +2010-01-25 Sascha L. Teichmann + + Fix/Workaround for gnv/issue159 + + * src/main/java/de/intevation/gnv/state/profile/horizontalcrosssection/HorizontalCrossSectionMeshOutputState.java, + src/main/java/de/intevation/gnv/state/profile/verticalcrosssection/VerticalCrossSectionOutputState.java, + src/main/java/de/intevation/gnv/state/profile/horizontal/HorizontalProfileMeshCrossOutputState.java: + Deactivated the index buffer by default because applying it gives to + less data points in some circumstances. When processing the + "horizontalen Schnittprofile", the "Profilschnitte" and the + "Horizontalschnitte" the whole set of mesh cells for + the given parameters are retrieved. This results in much + more traffic from database (~ 10x) but seems not to be much slower. + The memory consumption increases accordingly. + + To turn the index buffer on again use the boolean system properties: + + "gnv.horizontal.profile.mesh.cross.index.buffer" + "gnv.vertical.cross.section.index.buffer" + "gnv.horizontal.profile.mesh.cross.index.buffer" + + * src/main/java/de/intevation/gnv/math/Interpolation2D.java: Because much + more data is processed a more sophisticated point culling strategy is + implemented now. + + If the number of points are higher than a given threshold (system property + "gnv.interpolation2d.cull.point.threshold", default: 1000) a culling is + performed. Two cases: + + a) given a path P ("horizontales Schnittprofil", "Profilschnitt") + Calculates a bounding box B for P and continues with (b). + + b) a bounding box B ("Horizontalschnitt", and above after (a)) + Calculates a bounding box C for the input points. If the + area of B is greater than 80% of the area of C no culling is + performed. Else B is extended by 10% in each direction. + If the new area of B is smaller than 10% of the area of C + B is adjusted to have at least 10% the size of C. + + All input points that are not inside B are culled. Afterwards the + i/j grid cell units are created and pushed into a spatial index + as described below. + +2010-01-25 Ingo Weinzierl + + Issue157 + + * src/main/java/de/intevation/gnv/chart/VerticalCrossSectionChart.java: + Added method to adjust background color of this chart. + + * src/main/java/de/intevation/gnv/state/profile/verticalcrosssection/VerticalCrossSectionOutputState.java: + Set white background as all other charts have. + +2010-01-25 Ingo Weinzierl + + Issue160 + + * src/main/java/de/intevation/gnv/chart/TimeSeriesChart.java: Copied a + method from JFreeChart and adapted date formats. + +2010-01-25 Sascha L. Teichmann + + * doc/conf/arcsdeconnectionpool.properties: Set serverRoundtripInterval + to 5 seconds and serverInactiveInterval to 5 minutes. + +2010-01-25 Ingo Weinzierl + + * doc/conf/products/verticalcrosssection/conf_mesh.xml, + doc/conf/queries.properties: Splitted date selection into two steps - year + and concreate date in this year. Removed useless option to + disable/enable data points of chart and export output, because points + make no sense in such products. + +2010-01-25 Ingo Weinzierl + + * doc/conf/products/horizontalprofile/conf_mesh_cross.xml, + doc/conf/products/horizontalprofile/conf_mesh.xml: Added new state for + splitting the date selection into two parts - selection of year and + selection of a concrete date of this year. + + * doc/conf/queries.properties: Added new sql statement for querying years + and adapted statement to query concrete dates. + +2010-01-25 Ingo Weinzierl + + Issue156 + + * doc/conf/products/verticalcrosssection/conf_mesh.xml, + doc/conf/products/timeseries/conf_mesh.xml, + doc/conf/products/timeseries/conf_timeseriespoint.xml, + doc/conf/products/horizontalprofile/conf_mesh.xml, + doc/conf/products/horizontalprofile/conf_instantaneouspoint.xml, + doc/conf/products/horizontalprofile/conf_mesh_cross.xml, + doc/conf/products/verticalprofile/conf_mesh.xml, + doc/conf/products/verticalprofile/conf_timeseriespoint.xml, + doc/conf/products/verticalprofile/conf_instantaneouspoint.xml: Added some + parameter (width, height, and shapes) to output modes svg and pdf. Now, + these parameter will have an effect on svg and pdf exports. + +2010-01-24 Sascha L. Teichmann + + * doc/conf/conf.xml: Added attribute "fill-color" to + /artifact-database/gnv/vertical-cross-section/ground/ configure + the color of the seabed polygon. + + * src/main/java/de/intevation/gnv/math/Interpolation3D.java: + Adjusted column depth to the deepest interpolated position to + prevent gaps. + + * src/main/java/de/intevation/gnv/chart/VerticalCrossSectionChart.java: + Add ground polygon to the chart. + + * src/main/java/de/intevation/gnv/state/profile/verticalcrosssection/OutputHelper.java: + New. Contains code to create the ground polygon. + + * src/main/java/de/intevation/gnv/raster/PolygonDatasetProducer.java, + src/main/java/de/intevation/gnv/raster/IsoPolygonSeriesProducer.java: + Handle temporary vertices more efficiently. + + * src/main/java/de/intevation/gnv/artifacts/context/GNVArtifactContext.java, + src/main/java/de/intevation/gnv/artifacts/context/GNVArtifactContextFactory.java: + Added configuration to set the color of the seabed polygon. + + * src/main/java/de/intevation/gnv/chart/VerticalCrossSectionChart.java: + Handle the seabad polygon color. + +2010-01-24 Sascha L. Teichmann + + * contrib/palette2qgis.xsl: Cosmetic cleanups. + +2010-01-23 Sascha L. Teichmann + + * src/main/java/de/intevation/gnv/state/profile/horizontal/HorizontalProfileMeshCrossOutputState.java: + Fixed bug when accessing i and j columns of SQL dataset. This + prevented gap detection in "horizontale Schnittprofile" from working. + + * src/main/java/de/intevation/gnv/math/Interpolation2D.java: + "horizontale Schnittprofile" are now using the grid cell mechanism + too. This should fix all remaining problems to solve gnv/issue153. + The culling of too much points is controlled with the system property + "gnv.interpolation2d.cull.point.threshold" with the same semantics + as in 'Profilschnitt' and 'Horizontalschnitt'. + The spatial buffer size estimation code is removed because it is + not needed any longer. + + * src/main/java/de/intevation/gnv/math/Interpolation3D.java: Moved some + code to Interpolation2D. + + * src/main/java/de/intevation/gnv/math/GridCell.java: Added some + debug information about the number of found cells. + + * src/main/java/de/intevation/gnv/utils/WKTUtils.java: + Cleanup imports. + +2010-01-23 Sascha L. Teichmann + + * src/main/java/de/intevation/gnv/math/Interpolation3D.java: + Apply same logic about the number of points to "Profilschnitte" + too. If there are more "gnv.interpolation3d.cull.point.threshold" + points they are culled against a 5% extended bounding box around + the path. Default threshold: 1000. + +2010-01-23 Sascha L. Teichmann + + * src/main/java/de/intevation/gnv/math/AreaInterpolation.java: + - The lastest refactoring removed the evaluation of the + depth. Now its back in again. + + - If the number of incoming points is greater than + a given threshold (default: 1000) than the bounding box + of the interpolation is extend about 5% for a test + if the points are in this area. Points outside this + area are culled because its unlikely that they have + any influence on the result. Use the system property + "gnv.areainterpolation.cull.point.threshold" to modify + the threshold value. + + * src/main/java/de/intevation/gnv/math/GridCell.java: When + build the interpolation areas the points are culled against + extented bounding box. + +2010-01-23 Sascha L. Teichmann + + * contrib/palette2qgis.xsl: New. XSLT transformation to turn a + palette XML file into a style definition suitable to be used + in QGIS. Tested with QGIS 1.4.0-Enceladus. Usage: + + $ xsltproc contrib/palette2qgis.xsl \ + doc/conf/palette/water-temperature.xml \ + > water-temperature.qml + + Do similar to process salinity.xml et al. + + When you've loaded the "Horizontalschnitt" polygon layer + in QGIS, class it via the "CLASS" attribute, load the + according style and apply it. Voila! + +2010-01-22 Sascha L. Teichmann + + * src/main/java/de/intevation/gnv/math/Interpolation3D.java: + Make "Profilschnitte" work the same way like "Horzontalschnitte" + again. + +2010-01-22 Sascha L. Teichmann + + * src/main/java/de/intevation/gnv/math/GridCell.java: New. + A 4-tupel of neighbored points in the mesh. It is valid + to interpolate in this area. + + * src/main/java/de/intevation/gnv/math/AreaInterpolation.java: + The algorithm how neighbored points in the mesh are determined + has changed. Now all incoming points are tiled into GridCells. + If there are gaps in i,j the corresponding tile is omited. + These tiles are stored in an R tree. To lookup a point in + world coordinates the spatial index is queried. If no result + is found the point is ignore as a gap. If a fitting grid cell + is found the interpolation in done between the four points + of that cell is performed. Special gap checking is not needed any + longer. This fixes gnv/issue153 because there are no assumptions + about axis aligned points any more. + + * src/main/java/de/intevation/gnv/math/Interpolation2D.java: Used + euclid distance to estimate spatial buffer size. TODO: Remove + this code when adjusting the "Profilschnitte" to the same logic + as used in "Horzontalschnitte" now. + + * src/main/java/de/intevation/gnv/math/LinearFunction.java: Added + author's email. + + * src/main/java/de/intevation/gnv/chart/TimeSeriesChart.java, + src/main/java/de/intevation/gnv/state/profile/horizontal/HorizontalProfileOutputState.java: + Cleanup imports. + +2010-01-22 Ingo Weinzierl + + * src/main/java/de/intevation/gnv/artifacts/GNVArtifactBase.java: Removed + debug output which has been checked in by mistake. + +2010-01-22 Tim Englich + + * doc/conf/meshwidth.xml: + Added Description of the sense of the different Attributes. + +2010-01-22 Tim Englich + + Issue93 + + * doc/conf/meshwidth.xml: + Added file for the global Configuration of MeshWidths to the Project. + This file has to be edited if the mean Distance between two MeshPoints has + changed or a new Mesh will be introduced. + + * doc/conf/products/verticalprofile/conf_mesh.xml, + doc/conf/products/timeseries/conf_mesh.xml, + doc/conf/products/horizontalprofile/conf_mesh.xml: + Added Elemet with Link to the MeshWidth-Document to Configurations + for CoordinateSelectionStates. + + * src/main/java/de/intevation/gnv/state/CoordinateSelectionState.java : + Added the possibility to configure the different width of the Meshes. + +2010-01-22 Tim Englich + + * src/test/java/de/intevation/gnv/artifacts/TestArtifactDatabase.java (serviceNamesAndDescriptions),(process): + Fixed Compiler-Error after adding further Methods to the Interface ArtifactDatabase. + +2010-01-22 Tim Englich + * src/test/java/de/intevation/gnv/artifacts/util/ShapeFileWriterTestCase.java (testMultiLineStringWriter): + Fixed Compiler-Error after changes in the Method-Signature. + +2010-01-21 Ingo Weinzierl + + * src/main/java/de/intevation/gnv/state/profile/horizontal/HorizontalProfileOutputState.java: + Repaired revision. Removed try-catch of a never thrown exception. + +2010-01-21 Ingo Weinzierl + + Issue136 & Issue137 + + * src/main/resources/lang/artifactMessages.properties, + src/main/resources/lang/artifactMessages_de_DE.properties, + src/main/resources/lang/artifactMessages_en.properties, + src/main/resources/lang/artifactMessages_de.properties: Added templates + to format coordinates to a human readable output. + + * src/main/java/de/intevation/gnv/state/CoordinateSelectionState.java, + src/main/java/de/intevation/gnv/utils/WKTUtils.java: Moved function to + format coordinates from wkt string to human readalbe output to WKTUtils. + Modified the method: Read template out of the i18n files and use a Java + MessageFormatter to fill this template with string objects. A result of + this is a proper encoding (issue137). + + * src/main/java/de/intevation/gnv/state/profile/horizontal/HorizontalProfileOutputState.java: + Use the method described above to format coordinate output and display + this as chart subtitle (issue136). + +2010-01-21 Ingo Weinzierl + + Issue100 + + * src/main/java/de/intevation/gnv/chart/AbstractXYLineChart.java: If there + are more than one axis, each dataset is mapped to its own dataset after + adding it to the plot (one dataset for each parameter). In this way, we + get a well scaled axis for each parameter which is independent from other + axes (see range of salinity and air-pressure for example). + +2010-01-20 Ingo Weinzierl + + Issue152 + + * src/main/java/de/intevation/gnv/chart/TimeSeriesChart.java: Removed date + formatting from timeseries charts. Set locale of DateAxis instead to + localize chart axis. Advantage: JFreeChart defines intervals of axis + labels automatically. + +2010-01-20 Sascha L. Teichmann + + * src/main/java/de/intevation/gnv/state/profile/horizontalcrosssection/HorizontalCrossSectionMeshOutputState.java: + Trigger the calculation when the state is initialized. + +2010-01-20 Ingo Weinzierl + + Issue129 + + * src/main/resources/lang/artifactMessages.properties, + src/main/resources/lang/artifactMessages_de_DE.properties, + src/main/resources/lang/artifactMessages_en.properties, + src/main/resources/lang/artifactMessages_de.properties: Renamed I-axis to + 'West-East-axis' and J-axis to 'North-South-axis'. + +2010-01-20 Ingo Weinzierl + + Issue105 The option to enable/disable data points in charts is now + available in gui. + + * src/main/java/de/intevation/gnv/state/timeseries/TimeSeriesOutputState.java: + Parse optional chart parameter 'points' to adjust rendering of shapes. + + * doc/conf/products/verticalcrosssection/conf_mesh.xml, + doc/conf/products/timeseries/conf_mesh.xml, + doc/conf/products/timeseries/conf_timeseriespoint.xml, + doc/conf/products/horizontalprofile/conf_mesh.xml, + doc/conf/products/horizontalprofile/conf_instantaneouspoint.xml, + doc/conf/products/horizontalprofile/conf_mesh_cross.xml, + doc/conf/products/verticalprofile/conf_mesh.xml, + doc/conf/products/verticalprofile/conf_timeseriespoint.xml, + doc/conf/products/verticalprofile/conf_instantaneouspoint.xml: Added an + option to enable/disable data points in charts. + +2010-01-20 Sascha L. Teichmann + + * doc/conf/conf.xml: Set number of per axis samples to 1024 + because generation of "Horizontalschnitte" is much faster + now (60x). + + * src/main/java/de/intevation/gnv/math/Interpolation2D.java: + Added some kind of outlier test when guessing the buffer size + of the spatial index. The speed problem arose from the fact + that to much points are assumed to be neighbors of a given + point. Long distances which differ more than 40% from the + standard derivation are assumed to be outliers. + + * src/main/java/de/intevation/gnv/math/AreaInterpolation.java: Uses + the outlier aware buffer size guessing now. + + * src/main/java/de/intevation/gnv/raster/JTSMultiPolygonProducer.java, + src/main/java/de/intevation/gnv/raster/JTSMultiLineStringProducer.java: + Removed needless imports. + +2010-01-20 Ingo Weinzierl + + Issue148 + + * doc/conf/products/verticalcrosssection/conf_mesh.xml, + doc/conf/products/timeseries/conf_mesh.xml, + doc/conf/products/timeseries/conf_timeseriespoint.xml, + doc/conf/products/horizontalprofile/conf_mesh.xml, + doc/conf/products/horizontalprofile/conf_instantaneouspoint.xml, + doc/conf/products/horizontalprofile/conf_mesh_cross.xml, + doc/conf/products/verticalprofile/conf_mesh.xml, + doc/conf/products/verticalprofile/conf_timeseriespoint.xml, + doc/conf/products/verticalprofile/conf_instantaneouspoint.xml: Removed + mistakes in description and mimetype of svg export nodes. + +2010-01-20 Sascha L. Teichmann + + * src/main/java/de/intevation/gnv/raster/JTSMultiPolygonProducer.java, + src/main/java/de/intevation/gnv/raster/JTSMultiLineStringProducer.java: + Clip against given polygon. BTW: Geotools has problems with + writing clipped polygons in packed 2-tuple form, too. Therefore + polygons are also stores in the packed 3-tuple form. :-/ + + * src/main/java/de/intevation/gnv/state/profile/horizontalcrosssection/HorizontalCrossSectionMeshOutputState.java: + Forward clipping polygon to isoline and polygon generator. + +2010-01-19 Sascha L. Teichmann + + * trunk/pom.xml: Upgraded Geotools to 2.5.8 + + * trunk/src/main/java/de/intevation/gnv/utils/ShapeFileWriter.java: + Ported to Geotools 2.5.8 API. Write parameter id, date and layer + to shape files, too. + + * trunk/src/main/java/de/intevation/gnv/math/AreaInterpolation.java: + Flip upside down again because its not necessary. + + * trunk/src/main/java/de/intevation/gnv/raster/JTSMultiPolygonProducer.java: + XXX: There is a Geotools bug when writing multi lines strings + to shape files when the internal data representation are + packed 2-tuples. 2-tuples are enough in our use case but we + use 3-tuples for multi line line strings. multi polygons work + fine with 2-tuples. + Removed needless bug output. + + * src/main/java/de/intevation/gnv/raster/JTSMultiLineStringProducer.java: + Use packed 3-tuples as the internal representation. + + * src/test/java/de/intevation/gnv/artifacts/GNVArtifactsTestCaseBase.java, + src/main/java/de/intevation/gnv/state/timeseries/TimeSeriesOutputState.java: + Removed needless imports. + + * src/main/java/de/intevation/gnv/state/profile/horizontalcrosssection/HorizontalCrossSectionMeshOutputState.java: Write polygons and lines strings to shape files. + +2010-01-19 Sascha L. Teichmann + + * src/main/java/de/intevation/gnv/math/AreaInterpolation.java: + Removed import to make it compilable again. + +2010-01-19 Ingo Weinzierl + + Issue142 + + * src/main/java/de/intevation/gnv/chart/TimeSeriesChart.java: Fixed an issue + in timeseries chart caused by parameters with no value. Paid attention on + array length. + +2010-01-19 Sascha L. Teichmann + + * src/main/java/de/intevation/gnv/raster/RasterToPPM.java: New. + Class to write rasters with palettes to portable pixmaps. + Handy to debug raster outputs. + + * src/main/java/de/intevation/gnv/raster/Raster.java: Added + getValues() to access the backing data. + + * src/main/java/de/intevation/gnv/state/profile/horizontalcrosssection/HorizontalCrossSectionMeshOutputState.java: + Read parameter from input data correctly. + + * src/main/java/de/intevation/gnv/raster/JTSMultiPolygonProducer.java: Walk + rings of polygons in reversed order to produce correct JTS polygons. + Its not entierly clear why this is necessary. + + * src/main/java/de/intevation/gnv/math/AreaInterpolation.java: Clipp the + input points against an buffered version of the bounding box of + the given polygon to reduce the number of data. TODO: figure out why + upside down rendering in necessary. + +2010-01-19 Tim Englich + + * doc/schema/externalinterface_testdata.sql, + doc/schema/externalinterface_schema.sql: + Do some Bugfixes after testing the Schema and Testdata against an Oracle 10.2 DBMS. + +2010-01-19 Ingo Weinzierl + + * src/main/java/de/intevation/gnv/state/State.java, + src/main/java/de/intevation/gnv/state/StateBase.java, + src/main/java/de/intevation/gnv/state/profile/horizontal/NorthSouthEastWestState.java, + src/main/java/de/intevation/gnv/state/OutputStateBase.java: Changed some + method signatures. Use CallContext objects in some methods of the State + interface instead of CallMeta objects, which are a subset of CallContext. + + * src/main/java/de/intevation/gnv/artifacts/GNVArtifactBase.java: Adapted + method calls on State objects to the changes in the interface. + +2010-01-19 Ingo Weinzierl + + * src/main/java/de/intevation/gnv/state/profile/verticalcrosssection/VerticalCrossSectionOutputState.java, + src/main/java/de/intevation/gnv/state/timeseries/TimeSeriesOutputState.java: + Sourced creation of a ChartLabel object out to an own method which can be + overwritten in subclasses to adjust the labels in each chart type. + + * src/main/java/de/intevation/gnv/chart/ChartLabels.java: Added string for + labeling y axis and a parameter used in 'Profilschnitten'. + + * src/main/java/de/intevation/gnv/chart/VerticalCrossSectionChart.java: Read + labels from ChartLabel object and set chart and axes titles according to + these labels. + + * src/main/resources/lang/artifactMessages.properties, + src/main/resources/lang/artifactMessages_de_DE.properties, + src/main/resources/lang/artifactMessages_en.properties, + src/main/resources/lang/artifactMessages_de.properties: Added labels for + x and y axes of 'Profilschnitt' charts. + +2010-01-18 Ingo Weinzierl + + * src/main/java/de/intevation/gnv/artifacts/GNVDefaultArtifact.java: Add an + attribute 'fis' to the fis select node. If this attribute is found in + XSLT, a link to step back and select a new fis will be created. + +2010-01-18 Tim Englich + + * doc/schema/externalinterface_schema.sql: + Added Comments and further Informations. + +2010-01-18 Tim Englich + + * doc/schema/externalinterface_testdata.sql: + Added Testdata to demonstrate how the different Tables has to be filled. + + * doc/schema/externalinterface_schema.sql: + Added Schema for the DB-Schemaextention for providing the Data that is + required for the external Interface to the Mapviewer + + +2010-01-18 Ingo Weinzierl + + * src/main/java/de/intevation/gnv/artifacts/GNVDefaultArtifact.java: + Implements a single method to append the selected fis to ui's static part. + + * src/main/java/de/intevation/gnv/artifacts/fis/SelectProductArtifact.java, + src/main/java/de/intevation/gnv/artifacts/GNVArtifactBase.java: Inherit + from GNVDefaultArtifact to append the selected fis to static part of the + describe document. + + * src/main/java/de/intevation/gnv/state/StateBase.java: Do not create static + and dynamic nodes of the user interface any longer - fetch these nodes via + xpath expression. The creation of these nodes takes place in the artifact + itself. + + * src/main/resources/lang/artifactMessages.properties, + src/main/resources/lang/artifactMessages_de_DE.properties, + src/main/resources/lang/artifactMessages_en.properties, + src/main/resources/lang/artifactMessages_de.propertie: Added label for + fis. + +2010-01-18 Sascha L. Teichmann + + * ChangeLog: Fixed indention. + +2010-01-18 Tim Englich + + * src/test/ressources/horizontalcrosssection_mesh/horizontalcrosssection_step_07_out_chart.xml, + src/test/ressources/horizontalcrosssection_mesh/horizontalcrosssection_step_07_out_odv.xml, + src/test/ressources/horizontalcrosssection_mesh/horizontalcrosssection_step_07_out_csv.xml: + Removed Files, because they are not required any more. + * src/test/ressources/horizontalcrosssection_mesh/horizontalcrosssection_step_07_out_zip.xml: + Added new RequestFile for calling for retrieving a Zip-File from the Server. + * src/test/ressources/horizontalcrosssection_mesh/horizontalcrosssection_step_07_out_wms.xml: + Added new RequestFile for calling for an WMS-Result. + * src/test/ressources/horizontalcrosssection_mesh/horizontalcrosssection_step_04_feed.xml: + Added Polygon as WKT into the feed-Request. + +2010-01-18 Tim Englich + + * src/test/java/de/intevation/gnv/artifacts/TestArtifactDatabase.java (TestArtifactDatabase): + New: Added an Testimplementation of the ArtifactDatabase to the Tests to use it inside the + TestCallcontext to prevent NPEs during the Testzenarios. + + * src/test/java/de/intevation/gnv/artifacts/TestCallContext.java (TestCallContext): + Added Artifactfactory to the Methodsignature of the Context to use it inside the Context. + Added the Method getDatabase to resolve Compilationerrors. + + * src/test/java/de/intevation/gnv/artifacts/TimeSeriesPointVerticalProfileTestCase.java (testArtifact), + src/test/java/de/intevation/gnv/artifacts/TimeSeriesPointTimeSeriesTestCase.java (testArtifact), + src/test/java/de/intevation/gnv/artifacts/MeshVerticalProfileTestCase.java (testArtifact), + src/test/java/de/intevation/gnv/artifacts/MeshVerticalCrossSectionTestCase.java (testArtifact), + src/test/java/de/intevation/gnv/artifacts/MeshTimeSeriesTestCase.java (testArtifact), + src/test/java/de/intevation/gnv/artifacts/MeshHorizontalProfileTestCase.java (testArtifact), + src/test/java/de/intevation/gnv/artifacts/MeshHorizontalCrossSectionTestCase.java (testArtifact), + src/test/java/de/intevation/gnv/artifacts/InstantaneousPointVerticalProfileTestCase.java (testArtifact), + src/test/java/de/intevation/gnv/artifacts/InstantaneousPointHorizontalProfileTestCase.java (testArtifact), + src/test/java/de/intevation/gnv/artifacts/GNVArtifactsTestCaseBase.java (createCallContext): + Changed Methodsignature of createCallContext. Add the Artifactfactory to use it for creating + the CallContext. + +2010-01-18 Sascha L. Teichmann + + * src/main/java/de/intevation/gnv/raster/ExternalIndexConverter.java: + New. Helper to convert the internal palette indices + to the explicit configured external ones. + + * src/main/java/de/intevation/gnv/math/AttributedPoint2ds.java: + Store the JTS geometries too. + + * src/main/java/de/intevation/gnv/state/profile/horizontalcrosssection/HorizontalCrossSectionMeshOutputState.java: + Generate JTS multi polygons for parameter regions and multi line strings + for iso lines. TODO: Clip against incoming polygon. + +2010-01-18 Sascha L. Teichmann + + * src/main/java/de/intevation/gnv/raster/Palette.java: + load attribute "index" as external index. This + is useful to match color classes with external sources. + If no explicit index is given the order of ranges is + used as external index. + + * doc/conf/palette/flow-velocity.xml, + doc/conf/palette/water-levels.xml, + doc/conf/palette/salinity.xml, + doc/conf/palette/water-temperature.xml: Set explicit + external color class indices. + + * doc/conf/conf.xml: Set ground interpolation of "Horizontalschnitte" + to bilinear. + +2010-01-17 Sascha L. Teichmann + + * doc/conf/conf.xml: Reduced number of "Horizontalschnitt" + samples to 256 because its much too slow with higher resolutions. + This has to be improved. + + * doc/conf/queries.properties: Use point data to generate + "Horizontalschnitte". Added parameter id and date to results. + + * src/main/java/de/intevation/gnv/utils/WKTUtils.java: Made + reading to points more fault tolerant. + + * src/main/java/de/intevation/gnv/state/profile/horizontalcrosssection/HorizontalCrossSectionMeshOutputState.java: + Call the area interpolation. + + * src/main/java/de/intevation/gnv/math/AreaInterpolation.java: + Fixed bug with calculating points inside bounding box of polygon. + +2010-01-17 Sascha L. Teichmann + + * src/main/java/de/intevation/gnv/state/State.java: Added + support for end of life. + + * src/main/java/de/intevation/gnv/state/StateBase.java: Implemented + end of life trivial. + + * src/main/java/de/intevation/gnv/artifacts/GNVArtifactBase.java: + call end of life when leaving state. + + * src/main/java/de/intevation/gnv/state/timeseries/TimeSeriesOutputState.java: + Used XMLUtils.toStream() instead of own tranformer code. Removed + dead code. + + * src/main/java/de/intevation/gnv/state/profile/horizontalcrosssection/HorizontalCrossSectionMeshOutputState.java: + Implemented end of life. Remove shapefile directory from + file system belonging to concrete artifact. + Implemented download as ZIP file. Offer some link for + WMS integration. TODO: implement the real WMS publishing here. + +2010-01-17 Sascha L. Teichmann + + * doc/conf/products/horizontalcrosssection/conf_mesh.xml: + Only offer WMS layers and download ZIPs in output state. + + * src/main/java/de/intevation/gnv/utils/FileUtils.java: + New. Helper class to recursively delete files and directories + and create ZIP archives from files and directories. + + * src/main/java/de/intevation/gnv/utils/WKTUtils.java: Simpilied + signature of worldEnvelopeCoordinatesToIndex(). + + * src/main/java/de/intevation/gnv/state/OutputState.java: Cleanup + imports. Made source more readable. + + * src/main/java/de/intevation/gnv/state/OutputStateBase.java: + Cleanup imports. Made source more readable. Moved some + XPath stuff from TimeSeriesOutputState up into this base class. + + * src/main/java/de/intevation/gnv/state/timeseries/TimeSeriesOutputState.java: + Move some XPath stuff into base class. Made source more readable. + + * src/main/java/de/intevation/gnv/state/profile/horizontalcrosssection/HorizontalCrossSectionMeshOutputState.java: + Directly inherit from OutputStateBase now to break the implicit + constraints (chart styles, statisctics, etc.) of the + TimeSeriesOutputStates which not hold for this kind of state. + XXX: Added Workaround to circumvent gnv-intern/issue146 + + * src/main/java/de/intevation/gnv/math/AttributedXYColumns.java: Added + e-mail addresses for authors. Made querying for attributes more + robust. + + * src/main/java/de/intevation/gnv/math/AttributedPoint2ds.java: + New. Data carrier for the "Horizontalschnitte". Used for generation + of results and caching + +2010-01-15 Sascha L. Teichmann + + * src/main/java/de/intevation/gnv/artifacts/fis/product/Product.java, + src/main/java/de/intevation/gnv/artifacts/fis/product/DefaultProduct.java, + src/main/java/de/intevation/gnv/artifacts/fis/SelectProductArtifact.java, + src/main/java/de/intevation/gnv/artifacts/GNVProductArtifactFactory.java, + src/main/java/de/intevation/gnv/artifacts/GNVArtifactBase.java, + src/main/java/de/intevation/gnv/math/AreaInterpolation.java: + Cleaned up imports. + +2010-01-15 Ingo Weinzierl + + Added support to step back to the point where the user is able to choose + the product of a FIS. + + * src/main/java/de/intevation/gnv/artifacts/GNVArtifactFactory.java, + src/main/java/de/intevation/gnv/artifacts/GNVProductArtifactFactory.java: + Cleaned up factories regarding their tasks. GNVArtifactFactory creates + concrete products. GNVProductArtifactFactory handles all FIS and knows + the products of a FIS. + + * src/main/java/de/intevation/gnv/artifacts/fis/FISArtifact.java: Removed, + because it is not used anymore. + + * src/main/java/de/intevation/gnv/artifacts/fis/product/Product.java, + src/main/java/de/intevation/gnv/artifacts/fis/product/DefaultProduct.java: + A Product does no longer save its factory but the name of its factory as + string. + + * src/main/java/de/intevation/gnv/artifacts/fis/SelectProductArtifact.java: + This artifact will no longer read the config file to get information about + the products of a fis. The products are set via setter method out of the + ArtifactFactory where this artifact is build. + + * src/main/java/de/intevation/gnv/artifacts/GNVArtifactBase.java: Added the + possibility to step back to the point where the user can choose a product. + If the target of advance is 'product' we fetch the + GNVProductArtifactFactory from ArtifactDatabase and create a new + SelectProductArtifact, put it into the ProxyArtifact and clean up the ugly + cache. + + * doc/conf/conf.xml: Create top level FIS artifacts with + GNVProductArtifactFactory instead of GNVArtifactFactory. + +2010-01-15 Tim Englich + + * doc/conf/arcsdeconnectionpool.properties: + Added the Property serverRoundtripInterval to the Configuration an + set its Value to 15 Minutes. + +2010-01-15 Tim Englich + + * src/test/java/de/intevation/gnv/artifacts/TimeSeriesPointVerticalProfileTestCase.java (testArtifact): + Added new Step for querying the Years where measurements has been done into the + Testcase. + + * src/test/ressources/verticalprofile/verticalprofile_step_07_out_statistics.xml, + src/test/ressources/verticalprofile/verticalprofile_step_07_out_odv.xml, + src/test/ressources/verticalprofile/verticalprofile_step_07_out_csv.xml, + src/test/ressources/verticalprofile/verticalprofile_step_07_out_chart.xml, + src/test/ressources/verticalprofile/verticalprofile_step_07_feed.xml, + src/test/ressources/verticalprofile/verticalprofile_step_07_advance.xml, + src/test/ressources/verticalprofile/verticalprofile_step_06_feed.xml, + src/test/ressources/verticalprofile/verticalprofile_step_06_advance.xml, + src/test/ressources/verticalprofile/verticalprofile_step_05_feed.xml, + src/test/ressources/verticalprofile/verticalprofile_step_04_advance.xml, + src/test/ressources/verticalprofile/verticalprofile_step_05_advance.xml: + Added State-Ressource for the new step Year and modified the other Ressource-Files + so that the new Step is queued in the right direction. + +2010-01-13 Ingo Weinzierl + + * src/main/java/de/intevation/gnv/artifacts/fis/FISSelectArtifact.java, + src/main/java/de/intevation/gnv/artifacts/fis/SelectProductArtifact.java: + Renamed FISSelectArtifact to SelectProductArtifact which fits better, + because the intent of this artifact is to choose a product - not a FIS. + + * src/main/java/de/intevation/gnv/artifacts/GNVArtifactBase.java, + src/main/java/de/intevation/gnv/artifacts/GNVArtifactFactory.java: + Replaced FISSelectArtifact with SelectProductArtifact. + +2010-01-13 Sascha L. Teichmann + + * src/test/java/de/intevation/gnv/artifacts/util/ShapeFileWriterTestCase.java, + src/main/java/de/intevation/gnv/state/profile/verticalcrosssection/VerticalCrossSectionOutputState.java: + Removed needless imports. + + * src/main/java/de/intevation/gnv/math/AreaInterpolation.java: New. Interpolates + area for a given bounding box, taking gaps and DEM into account. + Not very fast. Use bilinear interpolation to match the "Profilschnitt". + Possible TODOs: + - speed up by assuming the grid is not sparse. + - use higher interpolation methods. + + * src/main/java/de/intevation/gnv/artifacts/context/GNVArtifactContext.java, + src/main/java/de/intevation/gnv/artifacts/context/GNVArtifactContextFactory.java: + Added configuration for ground interpolation. + + * src/main/java/de/intevation/gnv/state/profile/horizontalcrosssection/HorizontalCrossSectionMeshOutputState.java: + Add helper functions to access configuration. + + * src/main/java/de/intevation/gnv/math/Interpolation2D.java: Simplified Code. + + * src/main/java/de/intevation/gnv/math/L1Comparator.java: add setReference() + method. + +2010-01-13 Ingo Weinzierl + + * src/main/java/de/intevation/gnv/artifacts/GNVArtifactBase.java: 'advance' + method will now consider old states. We reset input data of target state + and clean cache from 'future data' before steping back to previous + states. + + TODO: Refactor caching mechanism which should take care of different + states' hash values to be able to use the cache more efficiently. + + * src/main/java/de/intevation/gnv/state/State.java: Added method to return + map which stores input data of the current state. + + * src/main/java/de/intevation/gnv/state/describedata/MinMaxDescribeData.java, + src/main/java/de/intevation/gnv/state/describedata/SingleValueDescribeData.java, + src/main/java/de/intevation/gnv/state/describedata/KeyValueDescibeData.java + src/main/java/de/intevation/gnv/state/describedata/DefaultSingleValueDescribeData.java, + src/main/java/de/intevation/gnv/state/describedata/DefaultMinMaxDescribeData.java, + src/main/java/de/intevation/gnv/state/describedata/DefaultKeyValueDescribeData.java: + Add current state's name when initializing new objects of these classes. + The name of a state is added as attribute to a node when creating the + describe-document. The xsl transformer will read this attribute and create + a link which allows the user to step back to previous states. + + * src/main/java/de/intevation/gnv/state/SingleInputState.java, + src/main/java/de/intevation/gnv/state/MinMaxState.java, + src/main/java/de/intevation/gnv/state/StateBase.java: + - Add state name when creating objects to store input data. + - Use XMLUtils.ElementCreator to write namespace aware xml elements. + - Add state names as attributes to xform elements. + - Append old states to list of reachable targets in describe-document. + - Remove data from cache which belong to future states after stepping + back to a previous state. + - Remove input data of current state after stepping back. + +2010-01-12 Sascha L. Teichmann + + * doc/conf/conf.xml, + src/main/java/de/intevation/gnv/artifacts/context/GNVArtifactContext.java, + src/main/java/de/intevation/gnv/artifacts/context/GNVArtifactContextFactory.java: + Added configuration od file system directory of generate "Horizontalschnitt" + shape files. + +2010-01-12 Sascha L. Teichmann + + * src/main/java/de/intevation/gnv/utils/WKTUtils.java, + src/main/java/de/intevation/gnv/state/profile/horizontalcrosssection/HorizontalCrossSectionMeshOutputState.java: + Code cleanup + +2010-01-12 Ingo Weinzierl + + * src/main/java/de/intevation/gnv/state/SingleInputState.java, + src/main/java/de/intevation/gnv/state/MinMaxState.java, + src/main/java/de/intevation/gnv/state/CoordinateSelectionState.java: + Data, describing the user interface, is stored in a list instead of a + collection, now. This makes it easier to remove the last element if we + advance back. + + * src/main/java/de/intevation/gnv/state/State.java, + src/main/java/de/intevation/gnv/state/StateBase.java: Added a 'reset' + method to clear data which has been inserted before returning to an old + state. This is called when we try to advance into the past. + + * src/main/java/de/intevation/gnv/artifacts/GNVArtifactBase.java: Now, it's + possible to advance to an earlier state. The 'advance' method first + searches for a given target name in the list of reachable targets. If no + future target has been found, the method looks for an old state with this + target name. The last option is to return to the initial step for choosing + the FIS, if the target name is 'start'. + +2010-01-12 Tim Englich + + * doc/conf/queries.properties: + Added Query for Years in VerticalProfiles in TimeSeriesPoints. + Modified the Query for Dates in VerticalProfiles in TimeSeriesPoints. + + * doc/conf/products/verticalprofile/conf_timeseriespoint.xml: + Added State for choosing the year and than it will only display + the Dates which are within the coosen year. + + * src/main/resources/lang/artifactMessages*.properties: + Added Ressource for diaplaying year. + +2010-01-12 Tim Englich + * src/main/java/de/intevation/gnv/artifacts/context/GNVArtifactContextFactory.java (configureHorizontalCrossSection): + Added the Method to load the Configurationsettings for horizontal-cross-sections + from the global Configuartion and put it into the Context. + + * src/main/java/de/intevation/gnv/artifacts/context/GNVArtifactContext.java: + Added static variables to define the Keys used for horizontal-cross-sections + + * src/main/java/de/intevation/gnv/state/profile/horizontalcrosssection/HorizontalCrossSectionMeshOutputState.java (getChartResult): + Integrated the Possibility to determin the required Snipped of an Mesh + using the ij-Index determined by the given Polygon. + Added the process-method which must still be implemented. + + * src/main/java/de/intevation/gnv/utils/WKTUtils.java (worldEnvelopeCoordinatesToIndex): + Added worldEnvelopeCoordinatesToIndex-Method for determining the ij-Coodinates + for a given Envelope. + Some refactoring-Work done for reuse some existing Code of this Class. + + * doc/conf/conf.xml: + Added the Configuration-Node for horizontal-cross-sections in this + File. + + * doc/conf/products/horizontalcrosssection/conf_mesh.xml: + Added ij-Query Node to OutputState to make the Querystring + available to this Product. + +2010-01-12 Ingo Weinzierl + + * src/main/java/de/intevation/gnv/state/timeseries/TimeSeriesOutputState.java: + Use XMLUtils to read evaluate xpath expressions. Adapted xpath + expressions regarding namespace and prefix. + +2010-01-11 Tim Englich + + * src/test/java/de/intevation/gnv/artifacts/GNVArtifactsTestCaseBase.java (readDocument): + Set NameSpaceAware to true to get the Unittests work again. + The Out-Calls doesn't work yet!!! + + +2010-01-11 Sascha L. Teichmann + + * pom.xml: Introduced dependency to GeoTools 2.4.5 (maybe a bit too old) + Needed to write traced polygons and line strings to shape files. + + * src/main/java/de/intevation/gnv/utils/Pair.java: New + simple pair tuple for type safety. + + * src/main/java/de/intevation/gnv/utils/ShapeFileWriter.java: + New. Writes multi polygons and multi line strings to + shapefiles. Writing the multi polygons works. + + !! Writing the multi line strings fails! + !! Its not clear by now if its a geotool bug or a + !! misunderstanding of the API. The polygon and + !! the line string export are coded symmetrically + !! but the line string export complains about invalid + !! FIDs states. + + * src/main/java/de/intevation/gnv/raster/AbstractProducer.java: + New. Abstract base class for multi line string/polygons producers + as backends of the vectorizer. + + * src/main/java/de/intevation/gnv/raster/PolygonDatasetProducer.java: + Inherits from AbstractProducer now. + + * src/main/java/de/intevation/gnv/raster/IsoProducer.java: + New. Common base class for the iso line producers, inherits + from AbstractProducer. + + * src/main/java/de/intevation/gnv/raster/IsoPolygonSeriesProducer.java: + Moved some code to new base class IsoProducer. + + * src/main/java/de/intevation/gnv/raster/DemuxRingsHandler.java: + New. Little helper class to demultiplex many ring handlers on + one single vectorizer. + + * src/main/java/de/intevation/gnv/raster/IsoAttributeGenerator.java: + The implemented AttributeGenerator interface is defined in IsoProducer + now. + + * src/main/java/de/intevation/gnv/raster/JTSMultiPolygonProducer.java: + New. Traces regions directly to JTS multi polygons. + + * src/main/java/de/intevation/gnv/raster/JTSMultiLineStringProducer.java: + New. Traces iso lines directly to JTS multi line strings. + + * src/main/java/de/intevation/gnv/math/QueriedXYDepth.java, + src/main/java/de/intevation/gnv/statistics/AbstractStatistics.java: + Removed needless imports. + +2010-01-09 Ingo Weinzierl + + * src/main/java/de/intevation/gnv/artifacts/fis/FISSelectArtifact.java: + Artifact used for the initial steps when no product is chosen. + + * src/main/java/de/intevation/gnv/artifacts/GNVArtifactFactory.java: Factory + to create artifacts. It is used to put a new FISSelectArtifact into the + ProxyArtifact for the initial steps when no product is chosen. + + * doc/conf/conf.xml: Use the ProxyArtifact instead of FISArtifact and + GNVArtifactFactory to create it. + + * src/main/java/de/intevation/gnv/artifacts/GNVArtifactBase.java: + - Defined XPath expressions at the top of the class instead of directly in + code. + - Use XMLUtils.ElementCreator to create new namespace aware nodes and + attributes. + - Defined 'describe' method to create user interface for initial steps. + + * src/main/java/de/intevation/gnv/profile/horizontalcrosssection/HorizontalCrossSectionMeshArtifact.java, + src/main/java/de/intevation/gnv/profile/verticalcrosssection/VerticalCrossSectionMeshArtifact.java, + src/main/java/de/intevation/gnv/profile/horizontal/HorizontalProfileArtifact.java, + src/main/java/de/intevation/gnv/profile/vertical/VerticalProfileArtifact.java, + src/main/java/de/intevation/gnv/timeseries/TimeSeriesArtifact.java: + Moved 'describe' methods which had no special code to super class. + + * src/main/java/de/intevation/gnv/state/StateBase.java: Use + XMLUtils.ElementCreator to create new elements in xml documents. + +2010-01-09 Sascha L. Teichmann + + * doc/conf/conf.xml: Added configuration for vertical cross + section ground interpolation. + + * src/main/java/de/intevation/gnv/math/QueriedXYDepth.java: Uses configured + interpolation method now. + + * src/main/java/de/intevation/gnv/artifacts/context/GNVArtifactContextFactory.java: + Read configuration for vertical cross section ground interpolation. + + * src/main/java/de/intevation/gnv/artifacts/context/GNVArtifactContext.java: + Added key and default for vertical cross section ground interpolation. + + * src/main/java/de/intevation/gnv/state/profile/verticalcrosssection/VerticalCrossSectionOutputState.java: + Forwards vertical cross section ground interpolation to QueriedXYDepth. + +2010-01-09 Sascha L. Teichmann + + * src/main/java/de/intevation/gnv/state/profile/verticalcrosssection/VerticalCrossSectionOutputState.java: + Prevent NPE if no results are produced by vertical cross sections. + + * src/main/java/de/intevation/gnv/math/QueriedXYDepth.java: Replaced + envelope checking by direct coordinate checking in tile cache. + Store the last used tile explicitly to save it from being collected + by the garbage collector. + +2010-01-08 Tim Englich + + Issue 137 + + * src/main/java/de/intevation/gnv/utils/InputValidator.java (getPointValue), + src/main/java/de/intevation/gnv/timeseries/gap/DefaultTimeGap.java (key), + src/main/java/de/intevation/gnv/state/profile/horizontalcrosssection/HorizontalCrossSectionMeshOutputState.java (getStatisticsGenerator), + src/main/java/de/intevation/gnv/state/StateBase.java (extractKVP), + src/main/java/de/intevation/gnv/state/CoordinateSelectionState.java (prepareInputData4RegionDBQuery), + src/main/java/de/intevation/gnv/artifacts/GNVArtifactBase.java (advance): + Removed Encodingerrors from listed Files. All Files are now UTF-8 compliant. + +2010-01-08 Tim Englich + * src/test/java/de/intevation/gnv/artifacts/GNVArtifactsTestSuite.java (suite): + Added a Testsuit for executing all Testcases at once. + + * src/test/ressources/verticalprofile_mesh/verticalprofile_step_10_feed.xml, + src/test/ressources/timeseries_mesh/timeseries_step_08_feed.xml, + src/test/ressources/horizontalProfile_mesh/horizontalprofile_step_10_feed.xml: + Changed the feeded Datevalues because the Values in the Database + have changed. TODO: Does it have an effect on the IDs? + + * src/test/ressources/verticalcrosssection_mesh/verticalcrosssection_step_03_advance.xml, + src/test/java/de/intevation/gnv/artifacts/MeshVerticalCrossSectionTestCase.java (testArtifact): + Switched Testcase to the new Condition that an LineString has to be entered. + + * src/test/ressources/horizontalcrosssection_mesh/horizontalcrosssection_step_*.xml, + src/test/java/de/intevation/gnv/artifacts/MeshHorizontalCrossSectionTestCase.java (testArtifact): + Switched Testcase to the new Condition that an Polygon has to be entered. + +2010-01-08 Tim Englich + + * src/main/resources/lang/artifactMessages.properties: + Added Ressources for the GUI for visualizing the Inputstate for + Polygons. + + * doc/conf/products/horizontalcrosssection/conf_mesh.xml: + Added State for the possibility to enter a Polygon which should clip + the data that will be visualized. + + * src/main/java/de/intevation/gnv/state/profile/horizontalcrosssection/HorizontalCrossSectionMeshOutputState.java (getChart): + Integrated the access to the Polygon which should be used to trim the Data which + should be visualized. + +2010-01-05 Sascha L. Teichmann + + * src/main/java/de/intevation/gnv/math/QueriedXYDepth.java: + - Simplified code + - Search tile cache in reversed order because its more likely + that last loaded tile is used more than once. + - Stores cached tiles under soft references to prevent the + possible case to flood the memory with hires tiles. + +2010-01-05 Tim Englich + + * src/main/java/de/intevation/gnv/math/QueriedXYDepth.java (depth): + Added the usage of the new RasterObject integrated in the geo-backend. + Now the Performance is much better accessing the depth to an coordinate. + +2010-01-04 Ingo Weinzierl + + * src/main/java/de/intevation/gnv/utils/ArtifactXMLUtilities.java: Declared + method to create a new xforms element as static to be able to use it + without instantiating an object of this class. + + * src/main/java/de/intevation/gnv/state/StateBase.java: Splitted code pathes + of static and dynamic nodes. Static nodes contain the selected value + only instead of transfering the complete stack of possible values again. + +2010-01-04 Tim Englich + + * src/main/java/de/intevation/gnv/state/profile/verticalcrosssection/VerticalCrossSectionOutputState.java (process): + Changed the XYDepth-Interface-Implementation to QueriedXYDepth + + * doc/conf/queries.properties: + Added the Query for Rasterdataaccess. + + * src/main/java/de/intevation/gnv/math/QueriedXYDepth.java (QueriedXYDepth): + Added Implementation of the XYDepth-Interface for Querying the height + of an Position using the geo-backend interface. + It is only nessesary to add a Query with the id rasterQuery to the query-Properties. + +2010-01-04 Sascha L. Teichmann + + * src/main/java/de/intevation/gnv/statistics/Statistics.java: + Changed interface to allow general object results as + input for statistic calculation. This is needed because + the vertical cross section produces no SQL like resultsets. + + * src/main/java/de/intevation/gnv/statistics/AbstractStatistics.java: + New. Added common base class for different kind of statistics. + TODO: Move more common code into this class. + + * src/main/java/de/intevation/gnv/statistics/VerticalCrossSectionStatistics.java: + New. Statistics for vertical cross sections. Does nothing + by now. + + * src/main/java/de/intevation/gnv/state/profile/verticalcrosssection/VerticalCrossSectionOutputState.java: + Creates a VerticalCrossSectionStatistics object as statistics + generator now. + + * src/main/java/de/intevation/gnv/statistics/TimeseriesStatistics.java: + Inherits from AbstractStatistics now. Some code moved to new + base class. + + * src/main/java/de/intevation/gnv/state/timeseries/TimeSeriesOutputState.java: + Cleaned up the usage of statistics. + +2010-01-04 Sascha L. Teichmann + + * src/main/java/de/intevation/gnv/math/Interpolation3D.java: + Fixed problem with running to max depth on every column. + +2010-01-04 Sascha L. Teichmann + + * src/main/java/de/intevation/gnv/state/timeseries/TimeSeriesOutputState.java: + Fix class cast exception to enable PDF export of + vertical cross section charts. + + * ChangeLog: Typo fixes. + +2010-01-04 Sascha L. Teichmann + + * src/main/java/de/intevation/gnv/jfreechart/PolygonRenderer.java: + Uses ValueAxis.valueToJava2D() to transform data values into chart + space. This is slower than doing it via the Java2D matrix stack + but its more the JFreeChart way and prevents transforming of + graphical attributes too. TODO: Speed this up again! + + * src/main/java/de/intevation/gnv/jfreechart/PolygonPlot.java: + Forward plot to polygon renderer to make domain and range + axis accessible. + + * src/main/java/de/intevation/gnv/math/XYColumn.java: Moved code a bit. + +2010-01-04 Sascha L. Teichmann + + * src/main/java/de/intevation/gnv/jfreechart/PolygonSeriesLabelGenerator.java: + New. Interface to generate labels for polygon series. + + * src/main/java/de/intevation/gnv/jfreechart/PolygonRenderer.java: + Added logic to generate and render labels of polygons. + The implemented layout algorithm is greedy. For all + polygons with labels the label is placed on the center of + the ring, which center in terms of the indices of the vertices. + If the bounding box of the label intersects the bounding box + of a an already placed one alternative places are tried. + In level order positions at 1/4, 3/4, 1/8, 3/8, 5/8, 7/8 and + so on are evaluated for non intersections with former placed labels. + This terminates if a free place is found or all index positions + are exhausted. If no free position is found the label is omitted. + + The visual result is okay but could be improved by a more clever + algorithm e.g. tension reduction in the graph of labels. + + TODO: Improve clipping against chart borders. + + * src/main/java/de/intevation/gnv/jfreechart/LevelOrderIndices.java: + New. Little helper class to generate the level order index + traversal used in the label layout. Placed in the jfreechart + package to keep it clean from gnv dependencies. + + * src/main/java/de/intevation/gnv/jfreechart/PolygonPlot.java: + Added some methods to access the domain and range axis and + there edge position. Mainly C&P from JFreeCahrts XYPlot + to ease the coordinate transformation between Java2D and + the value spaces of the chart. Call the label generation + of the polygon renderer. + + * src/main/java/de/intevation/gnv/chart/VerticalCrossSectionChart.java: + Added an implementation of PolygonSeriesLabelGenerator to + generate localized labels for the iso lines. + +2010-01-03 Sascha L. Teichmann + + * src/main/java/de/intevation/gnv/chart/VerticalCrossSectionChart.java: + Only add colors to scale which are in the chart. + + * src/main/java/de/intevation/gnv/raster/Palette.java: Added + getter for 'color' field of palette entry. + +2010-01-03 Sascha L. Teichmann + + * src/main/java/de/intevation/gnv/state/profile/verticalcrosssection/VerticalCrossSectionOutputState.java: + Generate iso line classes according gnv-issues/issue108: + + - If there are more than nine colors used in the chart + only the borders of the regions are traced. + - If there are less than ten colors each color region + is devided into two sub regions. + - If there are less than five colors each color region + is devided into five sub regions. + + Generate attribute per iso line class with the parameter value + of the iso line. + + * src/main/java/de/intevation/gnv/raster/IsoPolygonSeriesProducer.java: + Renamed inner interface from LabelGenerator to AttributeGenerator to + reflect the fact that the concrete label generation is a matter + of i18n too. The concrete label generation should be done when + the final chart is going to be created. TODO: Add + a JFreeChart style label generator to PolygonRenderer + + * src/main/java/de/intevation/gnv/raster/IsoAttributeGenerator.java: + New. Implements the AttributeGenerator interface. It takes + the indices of the neighboring regions, uses these values + to look into the iso palette and averages the parameter values + at the touching borders. This should help in cases where + two regions are neighbored in the chart which are not neighbored + in the palette which may happen by quantification artifacts. + + * src/main/java/de/intevation/gnv/raster/Palette.java: Added + getters to 'from' and 'to' fields. + + * src/main/java/de/intevation/gnv/math/XYColumn.java: Fixed + another silly bug with adding values at surface and ground. + + * ChangeLog: Typo fixes + +2010-01-01 Sascha L. Teichmann + + * src/main/java/de/intevation/gnv/state/profile/verticalcrosssection/VerticalCrossSectionOutputState.java: + Generate iso lines by dividing palette ranges in two + parts each and trace them. This shows that the ideas described + by K. Jancke in gnv-issues/issue108 are probably not the + right way to go. Applying this strategy there would be + locally too many isolines if there is a steep gradient. + On the other hand large areas are splitted in too less sections + by too less iso lines. A better way may be a splitting with + a look at the areas and shapes of the regions. Large, round + regions need more splits. Long, thin regions need less. + + * src/main/java/de/intevation/gnv/raster/IsoPolygonSeriesProducer.java: + Stabilized iso line hashing a bit. Added line width to + give iso lines a more appealing presentation in the chart. + The according value is stored in "line.width". + + * src/main/java/de/intevation/gnv/raster/Vectorizer.java: Fixed silly + bug when simplifying lines. This prevented iso lines + from rendering. + + * src/main/java/de/intevation/gnv/raster/Palette.java: Fixed index issue + when generating a divided palette. + + * src/main/java/de/intevation/gnv/jfreechart/PolygonSeries.java: + Do not crash with NPE any more when not having any series. + + * src/main/java/de/intevation/gnv/jfreechart/PolygonDataset.java: + Added method to add a whole collection of series. Useful to add + iso lines to dataset. + + * src/main/java/de/intevation/gnv/jfreechart/PolygonRenderer.java: + Set the "line.width" attribute when rendering lines. + +2010-01-01 Sascha L. Teichmann + + * doc/conf/conf.xml: Deactivated gauss filter because + it blurs no data areas too. Moreover gauss filtering does not + seem to be necessary at all. Possible TODO: Mask the no data + areas while filtering. + + * src/main/java/de/intevation/gnv/state/profile/verticalcrosssection/VerticalCrossSectionOutputState.java: + Added generation of polygon data suitable for PolygonPlot. + + * src/main/java/de/intevation/gnv/state/timeseries/TimeSeriesOutputState.java: + Some hacks to display the new Chart. XXX: This class is + a real mess ... but I've said that before. + + * src/main/java/de/intevation/gnv/chart/Chart.java: Made it + serializable. + + * src/main/java/de/intevation/gnv/chart/VerticalCrossSectionChart.java: + New. Chart for vertical cross sections. Mainly a copy of + Ingo's prototype implementation. TODO: parameter based i18n. + + * src/main/java/de/intevation/gnv/math/Interpolation3D.java: Code + simplification. Made it Serializable to be cachable persistently. + + * src/main/java/de/intevation/gnv/math/AttributedXYColumns.java: + Added fields for the interpolation and the generated PolygonDataset. + Its used as the data carrying object in cache now. + + * src/main/java/de/intevation/gnv/jfreechart/PolygonPlot.java: + Removed println debug code. + + * src/main/java/de/intevation/gnv/jfreechart/PolygonRenderer.java: + Added a little hack to draw the polygons of the interpolation. + The values are in y-direction all below zero (depth is given + by negative values) so the drawing is mirrored along y axis. + This special behavior is determined by the position of data + bounding box. At first I suspected a ccw issue here but some + initial tests falsified this hypothesis. We need to have a + deeper look at this but till than it works. + + * ChangeLog: Fixed some typos. + +2009-12-30 Sascha L. Teichmann + + * doc/conf/conf.xml: Fixed defect XML + + * src/main/java/de/intevation/gnv/state/profile/verticalcrosssection/VerticalCrossSectionOutputState.java: + Use configuration to generate JFreeChart compatible polygons. + + * src/main/java/de/intevation/gnv/raster/PaletteManager.java: + Add method to access base palette. + + * src/main/java/de/intevation/gnv/raster/Vectorizer.java: + Added logging and new constructor. + + * src/main/java/de/intevation/gnv/math/ConstantXYDepth.java: + "Simulates" DEM with a constant depth. + + * src/main/java/de/intevation/gnv/math/Interpolation2D.java: + Fixed bug with construction of buffer size. + + * src/main/java/de/intevation/gnv/math/Interpolation3D.java: + Some clean ups. New method to calculate max depth. + + * src/main/java/de/intevation/gnv/math/XYColumn.java: + Fixed bug with extrapolation. + +2009-12-30 Sascha L. Teichmann + + * doc/conf/conf.xml: Added section gnv/vertical-cross-section + to configure the "Profilschnitte". + configures the size of + the sample area. Defaults to 1024x768. + ... configures the + list of post processing filters applied to the sample area + after the interpolation is done. Defaults to empty list. + + * src/main/java/de/intevation/gnv/artifacts/context/GNVArtifactContext.java: + Added keys for vertical cross section samples and filters. + + * src/main/java/de/intevation/gnv/artifacts/context/GNVArtifactContextFactory.java: + Parse the configuration for the new parameters. + +2009-12-29 Sascha L. Teichmann + + * doc/conf/conf.xml: Added a gnv/horizontal-cross-section-profile + section to configure the "horizontalen Schnittprofile". + gives the number of samples the + interpolation track is divided into. Defaults to 250 + + * src/main/java/de/intevation/gnv/artifacts/context/GNVArtifactContext.java: + The names of the keys for fetching informations from the + configuration context are stored here now instead of the factory. + + * src/main/java/de/intevation/gnv/artifacts/context/GNVArtifactContextFactory.java: + Removed the lookup keys. Configure the "horizontalen Schnittprofile". + + * src/main/java/de/intevation/gnv/state/profile/horizontal/HorizontalProfileMeshCrossOutputState.java: + Fetch number of samples from config now instead of no longer supported + system property. + + * src/main/java/de/intevation/gnv/state/timeseries/TimeSeriesOutputState.java: + The key from chart template config is now in GNVArtifactContext, too. + +2009-12-29 Sascha L. Teichmann + + * doc/conf/conf.xml: Moved chart template and palette config + into new section 'gnv'. + + * src/main/java/de/intevation/gnv/artifacts/context/GNVArtifactContextFactory.java: + Adjusted to new 'gnv' section in config. + Stores chat template under 'gnv.chart.template' and palettes + under 'gnv.color.palettes'. + Added authors. + + * src/main/java/de/intevation/gnv/utils/StringUtils.java: Fixed + index out of bounds issue. + +2009-12-29 Sascha L. Teichmann + + * src/main/java/de/intevation/gnv/raster/Filter.java: New. + General filter mechanism raster in -> raster out. Useful + to chain processing. The Filter.Factory takes an + DOM element to configure itself. + + * src/main/java/de/intevation/gnv/raster/KernelFilter.java: + New. Implements raster filters based on kernel folding. Has + an inner class GaussFactory which acts as a factory to create + Gauss filters. The attributes "sigma" and "radius" are read + from the configuring DOM element to set up the parameters + of the kernel. + +2009-12-28 Sascha L. Teichmann + + * src/main/java/de/intevation/gnv/state/profile/horizontal/HorizontalProfileMeshCrossOutputState.java, + src/main/java/de/intevation/gnv/state/profile/verticalcrosssection/VerticalCrossSectionOutputState.java, + src/main/java/de/intevation/gnv/utils/WKTUtils.java: Refactored most + silly code like inefficent access to input data and redundant + WKT line string parsing. + + * src/main/java/de/intevation/gnv/raster/IsoPolygonSeriesProducer.java, + src/main/java/de/intevation/gnv/math/XYColumn.java: + Removed needless imports. + +2009-12-28 Sascha L. Teichmann + + * src/main/java/de/intevation/gnv/state/OutputStateBase.java, + src/main/java/de/intevation/gnv/state/timeseries/TimeSeriesOutputState.java, + src/main/java/de/intevation/gnv/state/profile/vertical/VerticalProfileOutputState.java, + src/main/java/de/intevation/gnv/state/profile/horizontal/HorizontalProfileOutputState.java, + src/main/java/de/intevation/gnv/state/profile/horizontal/HorizontalProfileMeshCrossOutputState.java, + src/main/java/de/intevation/gnv/state/profile/verticalcrosssection/VerticalCrossSectionOutputState.java, + src/main/java/de/intevation/gnv/state/profile/horizontalcrosssection/HorizontalCrossSectionMeshOutputState.java: + Bring CallContext down to the chart generation. This is necessary to + access the configuration. BTW: this a much cleaner way than + the omnipresent singletons all around in the code! + + Observation: All the stuff derived from OutputStateBase is coded very messy + ... even if your demands are not high about aesthetic :-/ + + * src/main/java/de/intevation/gnv/utils/StringUtils.java: New. + Some functions to ease working with strings. + +2009-12-28 Sascha L. Teichmann + + * src/main/java/de/intevation/gnv/raster/PaletteManager.java: New. + Used to manage several levels of palette subdivsions derived from + base palette. Contains name and description of palette, too. + + * src/main/java/de/intevation/gnv/raster/Palette.java: Removed + palette description because it is hold by the PaletteManager now. + + * src/main/java/de/intevation/gnv/artifacts/context/GNVArtifactContextFactory.java: + The palettes are not stored under the name of the palette any longer. + Instead the new attribute 'parameter-id' is splitted (comma separated) + into integers which are use as keys now. The values are PaletteManagers. + This should ease the access to an adequate PaletteManager when + generating a chart for a certain parameter. + + * doc/conf/conf.xml: Added the 'parameter-ids' for the four palettes. + The values are extracted from the gdiintern wiki. + + !!! This have to be in sync with the database parameter ids !!! + +2009-12-27 Sascha L. Teichmann + + * src/main/java/de/intevation/gnv/raster/IsoPolygonSeriesProducer.java: + New. Vectorizer rings callback which produces iso lines in + form of PolygonSeries. These series can be added to PolygonDatasets. + If a IsoPolygonSeriesProducer.LabelGenerator is given + each of the series has an attribute "label" which could be used + to label text on the plot. TODO: Add label rendering to plot. + + Iso line generation is a bit more sophisticated than pure + region tracing. Along a border of a region there could + be more than one type of neighborhood. This is due to quantification + errors introduced by the fact that steep value gradients + are sampled to less points. The only ways out would be an + increase of the sample resolution or an other algorithm + working directly on the interpolated floating point samples. + + * src/main/java/de/intevation/gnv/raster/Vectorizer.java: Made + line simplification work with open polygons, too. + + * src/main/java/de/intevation/gnv/math/IJKey.java: Added method + to sort (i, j) in place. + + * src/main/java/de/intevation/gnv/jfreechart/PolygonRenderer.java: + Do not close line shapes because iso lines are not closed shapes + in general. + + * src/main/java/de/intevation/gnv/raster/PolygonDatasetProducer.java: + Added author. Some reformatting. + +2009-12-26 Sascha L. Teichmann + + * src/main/java/de/intevation/gnv/raster/PolygonDatasetProducer.java: + New. Vectorizer rings callback which produces PolygonDatasets suitable + to be fed into PolygonPlot. + + * src/main/java/de/intevation/gnv/raster/Vectorizer.java: + Forward height to rings callback. + Made simplification of chains an option (default: true). + This should be turn off if generating iso lines. + Made edges hashable (handy to find neighbored edges in + iso line scanning). + + * src/main/java/de/intevation/gnv/jfreechart/PolygonSeries.java: + Added default constructor. Generate unique comparable long id + in thos constructor. + Added method to add a single ring. + + * src/main/java/de/intevation/gnv/jfreechart/PolygonDataset.java: + Added constructor to construct with a collection of polygon + series. + +2009-12-25 Sascha L. Teichmann + + * src/main/java/de/intevation/gnv/raster/Palette.java: Added + method subdive(N) to Palette class which creates a new + palette in which each interval is splitted into N + equal sized intervals. Infinity sized intervals are not + splitted. This is useful to fulfill the conditions of + gnv/issue108. + +2009-12-23 Sascha L. Teichmann + + * src/main/java/de/intevation/gnv/math/Interpolation2D.java: + Use local variable debug instead of asking log.isDebugEnabled() + more than once. + + * src/main/java/de/intevation/gnv/math/XYColumn.java: extrapolate + with boundary values. + + * src/main/java/de/intevation/gnv/math/Interpolation3D.java: + Implements a 3D interpolation called 'Profilschnitt' along a + track similiar to the 'Horizontaler Schnittprofil' which takes + all k layers into account. + + At the interpolated (x, y) points columns of parameter values + from surface to ground are interpolated. To do so the four + next neighbor of that columns are figured out. Four + cubic splines are fitted through these parameter values + of these neighbors. Now its possible to continuous eval + the parameter on each. Every entry in the interpolated column + is interpolated bilinear from the four cubic spline interpolated + neighbor values at the respective depth. + + The result is stored into a double valued raster. NaN values + indicate interpolation gaps. + +2009-12-23 Sascha L. Teichmann + + * src/main/java/de/intevation/gnv/math/XYColumn.java: Added a method + prepare() which generates an continues interpolator for the + given z values. if only one value is given a constant function + is assumed. If the larger z-value is below zero the + next lower value is supplemented at zero. Symmetrically + if the lowest z-value is above the depth at the given point + the lowest value is repeated at depth. This should guarantee + that the gradient is vansihing towards the surface and the + bottom of the ocean. + + If after the supplementation there are less than three points + a linear interpolation is performed. If there are more than three + points a higher degree interpolation is used instead. This defaults + to a cubic spline interpolation. Overwrite the getInterpolator() + function to replace this behavior. + + * src/main/java/de/intevation/gnv/math/ConstantFunction.java: New. + Constant function used in interpolation. + + * src/main/java/de/intevation/gnv/math/LinearFunction.java: Added + an inner class Univariate which fits into the interpolation + framework. + + * src/main/java/de/intevation/gnv/math/HeightValue.java: Sort + z-Values in descending order because we are below zero. + + * src/main/java/de/intevation/gnv/math/XYDepth.java: New. Interface + to figure out the depth (negative values below surface) for + a given coordinate. TODO: Implement this by query the DEM grid + of the ocean. + + * src/main/java/de/intevation/gnv/math/AttributedXYColumns.java: Added + authors. + +2009-12-23 Sascha L. Teichmann + + * src/main/java/de/intevation/gnv/state/profile/verticalcrosssection/VerticalCrossSectionOutputState.java: + When preprocessing database data only dissemble WKT points if we + have to. + Read z values as double value now. + Commented out CSV export because it takes the database data + as data which is not correct here. TODO: We need to implement some output + based on the interpolated data. + Added some type safety to better match the 2D code. + + * src/main/java/de/intevation/gnv/math/AttributedXYColumns.java: Stores + XYColumns in ArrayList for better reused of the 2D code. + + * src/main/java/de/intevation/gnv/math/XYColumn.java: Removed toArray() + method because its not needed any longer. + +2009-12-23 Sascha L. Teichmann + + * src/main/java/de/intevation/gnv/math/XYColumn.java: Extends from + Point2d now to make some of the code (x/y sorting, envelope, etc.) + reusable in 3D from 2D code. + + * src/main/java/de/intevation/gnv/math/IJKey.java: New: The (i, j) hashing + is now moved to this class because of the new inheritance of XYColumn. + + * src/main/java/de/intevation/gnv/state/profile/verticalcrosssection/VerticalCrossSectionOutputState.java: + Adjusted the (i, j) hashing. + + * src/main/java/de/intevation/gnv/math/Point2d.java: Added a new constructor + to make it easier to extend from it. + + * src/main/java/de/intevation/gnv/math/Interpolation2D.java: Made the buffer + extend calculation a static method to be reusable in 3D case. + +2009-12-22 Sascha L. Teichmann + + * doc/conf/conf.xml: Load salinity palette correctly. + +2009-12-22 Ingo Weinzierl + + * src/main/java/de/intevation/gnv/state/profile/verticalcrosssection/VerticalCrossSectionOutputState.java: + Preprocessing of data used for interpolation. + + * src/main/java/de/intevation/gnv/math/AttributedXYColumns.java: Data + wrapper. Contains preprocessed data used for interpolation and some + metadata used for chart creation. + + * src/main/java/de/intevation/gnv/math/XYColumn.java, + src/main/java/de/intevation/gnv/math/HeightValue.java: Made them + serializable and added hashCode() and equals() to XYColumn to use it as + key in HashMaps. + + * src/main/java/de/intevation/gnv/state/profile/horizontalcrosssection/HorizontalCrossSectionMeshOutputState.java, + src/main/java/de/intevation/gnv/state/profile/horizontal/HorizontalProfileMeshCrossOutputState.java, + src/main/java/de/intevation/gnv/state/profile/horizontal/HorizontalProfileOutputState.java, + src/main/java/de/intevation/gnv/state/profile/vertical/VerticalProfileOutputState.java, + src/main/java/de/intevation/gnv/state/timeseries/TimeSeriesOutputState.java, + src/main/java/de/intevation/gnv/state/OutputStateBase.java: Changed some + method signatures. + + * src/main/java/de/intevation/gnv/statistics/TimeseriesStatistics.java: + Improved error handling. Return empty statistic set if there are no input + data. + +2009-12-22 Ingo Weinzierl + + * doc/conf/products/verticalcrosssection/conf_mesh.xml: Adjusted + configuration for verticalcrosssection ('Profilschnitt') products. + + * doc/conf/queries.properties: Adjusted sql query for chart generation of + verticalcrosssection products. + + * src/main/java/de/intevation/gnv/state/StateBase.java, + src/main/java/de/intevation/gnv/statistics/TimeseriesStatistics.java: Code + refactoring and better error handling. + +2009-12-22 Ingo Weinzierl + + * src/main/java/de/intevation/gnv/math/HeightValue.java, + src/main/java/de/intevation/gnv/math/XYColumn.java: Added model classes to + store information for interpolation. + +2009-12-22 Sascha L. Teichmann + + * doc/conf/conf.xml: Added config section for palettes. + + * src/main/java/de/intevation/gnv/artifacts/context/GNVArtifactContextFactory.java: + load palettes at start up. + They are stored in a hash map under the key 'color.palettes'. The keys of + the map are the names from the configuration, the values are + de.intevation.gnv.raster.Palette objects. + Put configuration of chart template into own method. + + * src/main/java/de/intevation/gnv/raster/Palette.java: Added a palette + description. + +2009-12-21 Sascha L. Teichmann + + * src/main/java/de/intevation/gnv/state/profile/horizontal/HorizontalProfileMeshCrossOutputState.java: + Ignore invalid interpolations correctly. + +2009-12-21 Sascha L. Teichmann + + * src/main/java/de/intevation/gnv/raster/Raster.java: New. Models 2D double + rasters. Has some support for filtering with gauss kernels, building + iso classes, etc. + + * src/main/java/de/intevation/gnv/raster/Palette.java: New. Maps double + values to integer indices and colors. + + * src/main/java/de/intevation/gnv/raster/Vectorizer.java: New. Simple + vectorizer which traces regions in integer rasters. + + * pom.xml: Added dependency to GNU Trove 2.1.1 which is needed by the + vectorizer. + +2009-12-21 Ingo Weinzierl + + * src/main/java/de/intevation/gnv/utils/WKTUtils.java, + src/main/java/de/intevation/gnv/state/profile/horizontal/HorizontalProfileMeshCrossOutputState.java: + Moved some methods back to old place. + +2009-12-21 Sascha L. Teichmann + + Added Ingo Weinzierl's special JFreeChart classes. + + * src/main/java/de/intevation/gnv/jfreechart: New package. + Should contain general JFreeChart stuff. + + * src/main/java/de/intevation/gnv/jfreechart/PolygonPlot.java: New. + New type of plot to display multi-polygons with holes. + + * src/main/java/de/intevation/gnv/jfreechart/CompactXYItems.java: New. + Basic vertex data model: a ring of a polygon. ccw = shell, cw = hole. + + * src/main/java/de/intevation/gnv/jfreechart/PolygonSeries.java: New. + Attributes a set of rings with key/value pairs. + + * src/main/java/de/intevation/gnv/jfreechart/PolygonDataset.java: New + List of PolygonSeries which makes it a multi-polygon. + + * src/main/java/de/intevation/gnv/jfreechart/PolygonRenderer.java: New + A renderer to draw PolygonDatasets into a PolygonPlot. + +2009-12-21 Ingo Weinzierl + + * doc/conf/products/verticalcrosssection/conf_mesh.xml: Prepared states and + transitions of verticalcrosssection (german 'Profilschnitt'). + +2009-12-21 Ingo Weinzierl +a + * src/main/java/de/intevation/gnv/utils/WKTUtils.java + src/main/java/de/intevation/gnv/state/profile/horizontal/HorizontalProfileMeshCrossOutputState.java: + Outsourcing of some methods to prepare results for chart creation. + +2009-12-21 Sascha L. Teichmann + + * doc/conf/palette/flow-velocity.xml: + color palette for flow velocity "Fliessgeschwindigkeit". + * doc/conf/palette/water-levels.xml: + color palette for water levels "Wasserstaende". + * doc/conf/palette/salinity.xml: + color palette for salinity "Salzgehalt". + * doc/conf/palette/water-temperature.xml: + color palette for water temperature "Wassertemperatur". + +2009-12-21 Sascha L. Teichmann + + * src/main/java/de/intevation/gnv/state/profile/horizontal/HorizontalProfileMeshCrossOutputState.java: + Added some code to prevent needless null inserts if interpolating + over large gaps. + +2009-12-21 Ingo Weinzierl + + * src/main/java/de/intevation/gnv/chart/HorizontalCrossProfileChart.java: + Removed warning, which told the user that gap detection is not implemented + yet. + +2009-12-21 Ingo Weinzierl + + * src/main/java/de/intevation/gnv/state/profile/horizontal/HorizontalProfileMeshCrossOutputState.java, + src/main/java/de/intevation/gnv/math/Interpolation2D.java: Add 'null' + values for gap detection to result collection instead of omitting them. + + * src/main/java/de/intevation/gnv/chart/VerticalProfileChart.java, + src/main/java/de/intevation/gnv/statistics/TimeseriesStatistics.jav: + Handle null values - don't throw an exception. + +2009-12-17 Sascha L. Teichmann + + RELEASE 0.3 + + * Changes, NEWS, ChangeLog: Summarized activities + +2009-12-17 Sascha L. Teichmann + + * doc/conf/conf.xml: Bind REST server to localhost. + +2009-12-17 Sascha L. Teichmann + + * src/test/ressources/lang/artifactMessages_de_DE.properties, + src/main/resources/lang/artifactMessages_de_DE.properties, + src/main/resources/lang/artifactMessages_de.properties: + s/Modeldaten/Modelldaten + +2009-12-17 Sascha L. Teichmann + + * src/main/resources/lang/artifactMessages_de_DE.properties, + src/main/resources/lang/artifactMessages_de.properties: Removed + wkt line strings. + +2009-12-17 Ingo Weinzierl + + * doc/conf/queries.properties: Added K-position to sql statement for + verticalprofile charts on meshes. + + * src/main/java/de/intevation/gnv/chart/VerticalProfileChart.java, + src/main/java/de/intevation/gnv/chart/HorizontalProfileChart.java: Changed + the depending axis for gap detection on meshes for verticalprofile charts. + +2009-12-17 Ingo Weinzierl + + Issue 106 + + * src/main/java/de/intevation/gnv/artifacts/context/GNVArtifactContextFactory.java: + Fixed a file-leak bug while reading chart template. Sourced parsing of xml + file out to XMLUtils of de.intevation.artifactdatabase.XMLUtils. + +009-12-17 Ingo Weinzierl + + * src/main/java/de/intevation/gnv/state/profile/horizontal/HorizontalProfileOutputState.java, + src/main/java/de/intevation/gnv/state/profile/vertical/VerticalProfileOutputState.java, + src/main/java/de/intevation/gnv/state/timeseries/TimeSeriesOutputState.java: + Added column labels for csv export. + +2009-12-17 Hans Plum + + Issue 129: Release 0.2: Verbesserung der �bersetzungen + + * src/main/resources/lang/artifactMessages_de_DE.properties, + src/main/resources/lang/artifactMessages_de.properties: + Fixed i18n strings for german language + +2009-12-16 Sascha L. Teichmann + + * src/main/java/de/intevation/gnv/math/Interpolation2D.java: + Fixed index error in i-gab detection between neighbors. + +2009-12-16 Ingo Weinzierl + + * src/main/java/de/intevation/gnv/state/profile/horizontal/HorizontalProfileMeshCrossOutputState.java: + Override method to create chart. Fixed some bugs for interpolation. + + * src/main/java/de/intevation/gnv/chart/HorizontalCrossProfileChart.java: + Chart class for generating horizontal crossprofile charts. Horizontal + crossprofile charts are a subclass of horizontal profile charts. + + * src/main/java/de/intevation/gnv/math/Point2d.java: Changed epsilon value. + + * src/main/java/de/intevation/gnv/math/Interpolation2D.java: Fixed some bugs + regarding buffer size to limit data for interpolation. + + TODO: At the moment, there is no gap detection for horizontal crossprofile + charts. + +2009-12-16 Ingo Weinzierl + + Issue100 + + * src/main/java/de/intevation/gnv/chart/TimeSeriesChart.java, + src/main/java/de/intevation/gnv/chart/VerticalProfileChart.java, + src/main/java/de/intevation/gnv/chart/AbstractXYLineChart.java: + Workarround: Store information about max range of data for each parameter + while iterating over all data values. Set the max range at the end of + chart generation. + + NOTE: NumberAxis.setAutoRange(true) doesn't seem to work properly. + +2009-12-16 Ingo Weinzierl + + * src/main/java/de/intevation/gnv/state/profile/verticalcrosssection/VerticalCrossSectionOutputState.java: + Removed useless import of VerticalCrossSectionChartFactory. + + * src/main/java/de/intevation/gnv/chart/HorizontalCrossSectionChartFactory.java, + src/main/java/de/intevation/gnv/chart/VerticalProfileChartFactory.java, + src/main/java/de/intevation/gnv/chart/VerticalCrossSectionChartFactory.java, + src/main/java/de/intevation/gnv/chart/HorizontalProfileChartFactory.java, + src/main/java/de/intevation/gnv/chart/ChartFactory.java: Removed useless + chart factory classes. + +2009-12-16 Sascha L. Teichmann + + * src/main/java/de/intevation/gnv/utils/DistanceCalculator.java: + Added method to calculate distance of path. + TODO: Move this class into math package and and add + an slerp interpolator so it can be used as a metric inside + the interpolation code. + + * src/main/java/de/intevation/gnv/state/profile/horizontal/HorizontalProfileMeshCrossOutputState.java: + Added code to disassemble the incoming result set, interpolate + along a given path and returns an adjusted result set. + The (i, j) got lost on this track because we don't travel along + the main axis of the grid any more. The test for gaps has to be + adjusted because, because the dx/dy on the path depends on how + many steps are made on the way [*]. This is controlled by the system + property 'interpolation.step.width'. It is set in meters + and defaults to 100m. TODO: This should be configurable + in the conf.xml file. + + [*] I opt strongly for integration of the outlier test based gap + detection to overcome this problem. + +2009-12-15 Sascha L. Teichmann + + * src/main/java/de/intevation/gnv/math/LinearToMap.java: + Uses JTS Coordinate as geometry model now. + + * src/main/java/de/intevation/gnv/math/Metrics.java, + src/main/java/de/intevation/gnv/math/Interpolator.java: New. + Moved from inner class of LinearToMap to top level class + to be more reusable. Uses JTS Coordinate as geometry model now. + + * src/main/java/de/intevation/gnv/math/Point2d.java: New. + Extends JTS Coordinate to have an additional (i, j) + to model the topological neighborhood within the mesh, too. + + * src/main/java/de/intevation/gnv/math/Interpolation2D.java: New. + Has a method interpolate() which takes a path line string in form + of a list of JTS Coordinates, a list of grid points (Point2d + to carry the topology, too), a linear range in diagram coordinate + space, a metric to cope with the projection. It reports + interpolated points to an implementor of the new inner interface + Consumer as a JTS Coordinate. (x, y) of this coordinate is the + postion on the map, the z value is the interpolated attribute. + + To speed up the search for the neighbors the input points are + sorted into a quadtree and are queried first level with a buffer of + size (max(abs(p[i].x - p[i+1].x)), max(abs(p[i].y - p[i+1].y))) + around the point to be interpolated. The second level filter + is performed by an inverse L1-ordering with region coding, so + that only the nearest four neighbors are taken into acount. + Only if all four neighbors are present and no + i- or j-gaps exist the interpolation is performed. TODO: Create + a better extrapolation strategy in these cases were these conditions + are not fulfilled. + + * src/main/java/de/intevation/gnv/state/profile/horizontal/HorizontalProfileMeshCrossOutputState.java: + Added a process() method to perform the interpolation. It does + nothing by now. TODO: bring it to life. + +2009-12-15 Sascha L. Teichmann + + * src/main/java/de/intevation/gnv/math/LinearToMap.java: Map linear + coordinates (from, to) to world coordinates (x, y) along a line string + given by a set of java.awt.geom.Point2D points. + + * src/main/java/de/intevation/gnv/math/LinearMetrics.java: Implements + Euclidean metric used by LinearToMap. TODO: Do same for WGS84 to + be more precise. + +2009-12-15 Tim Englich + + * src/main/java/de/intevation/gnv/statistics/TimeseriesStatistics.java (calculateStatistics): + Issue96 Resloved big that one entry is missiing in the Statitic. + The last row of the ResultSet was never used. + +2009-12-15 Ingo Weinzierl + + Issue106 + + * doc/conf/conf.xml: Added charttemplate to global configuration. + + * src/main/java/de/intevation/gnv/utils/ArtifactXMLUtilities.java: Made + method static to call it without initiating an object of its class. + + * src/main/java/de/intevation/gnv/artifacts/context/GNVArtifactContextFactory.java: + Create ChartTheme at startup of artifact server and put it into global + context. The theme is created one time on this way. + + * src/main/java/de/intevation/gnv/state/OutputState.jav, + src/main/java/de/intevation/gnv/artifacts/GNVArtifactBase.java: Changed + signature of 'out'-method. Call 'out' with CallContext instead of + CallMeta, which is contained in CallContext. CallContext is needed to + fetch the ChartTheme out of it. + + * src/main/java/de/intevation/gnv/state/profile/horizontalcrosssection/HorizontalCrossSectionMeshOutputState.java, + src/main/java/de/intevation/gnv/state/profile/verticalcrosssection/VerticalCrossSectionOutputState.java, + src/main/java/de/intevation/gnv/state/profile/horizontal/HorizontalProfileOutputState.java, + src/main/java/de/intevation/gnv/state/profile/vertical/VerticalProfileOutputState.java: + Changed signature of 'getChart'-method which now gets the CallContext + containing the ChartTheme. + + * src/main/java/de/intevation/gnv/state/timeseries/TimeSeriesOutputState.java: + Get ChartTheme from CallContext instead of reading the XML file here. + +2009-12-15 Sascha L. Teichmann + + * src/main/java/de/intevation/gnv/state/profile/horizontal/HorizontalProfileMeshCrossOutputState.java: + If a few (i, j) values are not available (gaps in the grid) try + to fill the holes with guessing the values by the ones which could + be fetched. We are using a componentwise linear function here. + This is surely slightly wrong because world coordinates are + in WGS84 which is ellipsoid in nature. TODO: Look at the errors + and if needed compensate them by using cubic polynonial or ellipsoid + function terms. + + * src/main/java/de/intevation/gnv/math/LinearFunction.java: New. + Linear function to be used in curve fitting process. + +2009-12-15 Tim Englich + + * doc/conf/queries.properties: + Added the Unit of the Parameter to the Query for Parameters in + all Parameterqueries where it was still missing. Now the Unit will + be displaied in the Combobox and in the Diagramm-Axis-Description. + +2009-12-15 Sascha L. Teichmann + + * pom.xml: Upgraded to Apache Commons Math 2.0. Needed for + curve fitting (splines e.g) + + * src/main/java/de/intevation/gnv/statistics/TimeseriesStatistics.java: + Use 'new DescriptiveStatistics()' instead of + 'DescriptiveStatistics().newInstance()' to be compatible with new + math api. + +2009-12-15 Tim Englich + + Added the Unit of the Parameter to the Query for Parameters in + TimeSeries. Now teh Unit will be displaied in the Combobox and + in the Diagramm-Axis-Description. + + * src/main/resources/lang/artifactMessages*.properties: + Added the name Productname for "horizontale Schnittprofile". to the + Resources so that it could be displaied properly in the GUI + +2009-12-15 Tim Englich + + * src/main/resources/lang/artifactMessages*.properties: + Added the required Resources for the Outputelements of "horizontale Schnittprofile". + * doc/conf/queries.properties: + Added the specialized Queries for getting the Data and the depths for + generating "horizontale Schnittprofile". + * src/main/java/de/intevation/gnv/state/profile/horizontal/HorizontalProfileMeshCrossOutputState.java (log): + Added an new OutputTransition to handle the special Way to d detremine the required + Data for generating "horizontale Schnittprofile". + * doc/conf/conf.xml, + doc/conf/products/horizontalprofile/conf_mesh_cross.xml, + src/main/java/de/intevation/gnv/profile/horizontal/HorizontalProfileMeshCrossArtifact.java: + Added Support for "Horizontales Schnittprofil"-Artifacts to the Project + +2009-12-15 Ingo Weinzierl + + Issue102 + + * src/main/java/de/intevation/gnv/chart/AbstractXYLineChart.java: + Reset 'nextColor' at the beginning of chart creation. Now, color of lines + in charts are stable, which means, that an export will look like the chart + in the gui itself. + +2009-12-14 Ingo Weinzierl + + Issue101 + + * src/main/java/de/intevation/gnv/chart/TimeSeriesChart.java: Changed date + representation in timeseries charts. Date format is sourced out to + ressource files. German date representation is now 'dd-MMM-yyyy' (eg + 31-12-2009) and the english date representation is 'yyyy-MMM-dd' (eg + 2009-12-31). + + * src/main/resources/lang/artifactMessages.properties, + src/main/resources/lang/artifactMessages_de_DE.properties, + src/main/resources/lang/artifactMessages_en.properties, + src/main/resources/lang/artifactMessages_de.properties: Added date format + strings for timeseries charts. + +2009-12-14 Sascha L. Teichmann + + * src/main/java/de/intevation/gnv/utils/IndexBuffer.java: + Creates SQL-WHERE clauses for buffers around a list of + line segments in index (i, j) space. + +2009-12-11 Ingo Weinzierl + + * src/main/java/de/intevation/gnv/state/profile/horizontal/HorizontalProfileOutputState.java: + Exception handling while creating subtitle of horizontalprofile charts. + Included the case, that there is no start and no end date. + +2009-12-11 Sascha L. Teichmann + + * src/test/java/de/intevation/gnv/artifacts/TimeSeriesPointTimeSeriesTestCase.java, + src/main/java/de/intevation/gnv/chart/TimeSeriesChart.java: + Removed needless imports. + +2009-12-11 Tim Englich + + * doc/conf/queries.properties: + Added Z-Value to verticalcrosssection_mesh_chart_data. + +2009-12-11 Tim Englich + * src/test/java/de/intevation/gnv/artifacts/GNVArtifactsTestCaseBase.java, + src/test/java/de/intevation/gnv/artifacts/InstantaneousPointHorizontalProfileTestCase.java, + src/test/java/de/intevation/gnv/artifacts/InstantaneousPointVerticalProfileTestCase.java, + src/test/java/de/intevation/gnv/artifacts/MeshHorizontalCrossSectionTestCase.java, + src/test/java/de/intevation/gnv/artifacts/MeshHorizontalProfileTestCase.java, + src/test/java/de/intevation/gnv/artifacts/MeshTimeSeriesTestCase.java, + src/test/java/de/intevation/gnv/artifacts/MeshVerticalCrossSectionTestCase.java, + src/test/java/de/intevation/gnv/artifacts/TimeSeriesPointTimeSeriesTestCase.java, + src/test/java/de/intevation/gnv/artifacts/TimeSeriesPointVerticalProfileTestCase.java, + src/test/java/de/intevation/gnv/artifacts/MeshVerticalProfileTestCase.java: + Split all Unittestcases in separat Classes. Now it is easier to uses the UnitTests with Maven. + +2009-12-11 Ingo Weinzierl + + * src/main/java/de/intevation/gnv/chart/AbstractXYLineChart.java: Fade out + gridlines of range axis in charts if there are more than one axis. + +2009-12-11 Ingo Weinzierl + + * src/main/resources/lang/artifactMessages.properties, + src/main/resources/lang/artifactMessages_de_DE.properties, + src/main/resources/lang/artifactMessages_en.properties, + src/main/resources/lang/artifactMessages_de.properties: Added axis labels + for horizontalprofile, verticalprofile, horizontalcrosssection and + verticalcrosssection charts. + + * src/main/java/de/intevation/gnv/state/profile/horizontalcrosssection/HorizontalCrossSectionMeshOutputState.java, + src/main/java/de/intevation/gnv/state/profile/verticalcrosssection/VerticalCrossSectionOutputState.java, + src/main/java/de/intevation/gnv/state/profile/horizontal/HorizontalProfileOutputState.java, + src/main/java/de/intevation/gnv/state/profile/vertical/VerticalProfileOutputState.java: + Read axis labels from ressources instead of hard coded strings in code. + +2009-12-11 Ingo Weinzierl + + Cleared Issue104. + + * src/main/resources/lang/artifactMessages.properties, + src/main/resources/lang/artifactMessages_de_DE.properties, + src/main/resources/lang/artifactMessages_en.properties, + src/main/resources/lang/artifactMessages_de.properties: Added axis label + for timeseries charts. + + * src/main/java/de/intevation/gnv/state/timeseries/TimeSeriesOutputState.java: + Removed hard coded axis label of timeseries charts. Read label from + ressources. + +2009-12-09 Ingo Weinzierl + + * src/main/java/de/intevation/gnv/chart/VerticalProfileChart.java, + src/main/java/de/intevation/gnv/chart/HorizontalProfileChart.java: Added + gap detection for horizontal and vertical profile charts. + +2009-12-09 Sascha L. Teichmann + + * doc/conf/conf.xml: Expanded the time to live of inactive artifacts + to 3600000ms (= 1h). Dead artifacts are removed from databasse + only every 15mins now. Improved the description on the artifact + factories. + +2009-12-08 Tim Englich + + * doc/conf/queries.properties: + Added the Unit of the Parameter to the Query for Parameters in + TimeSeries. Now teh Unit will be displaied in the Combobox and + in the Diagramm-Axis-Description. + +2009-12-08 Tim Englich + * src/main/java/de/intevation/gnv/transition/profile: + Removed empty needless package. + * src/main/java/de/intevation/gnv/transition/TransitionFactory.java: + src/main/java/de/intevation/gnv/transition/ValueCompareTransition.java, + src/main/java/de/intevation/gnv/transition/TransitionBase.java, + src/main/java/de/intevation/gnv/transition/Transition.java, + src/main/java/de/intevation/gnv/transition/DefaultTransition.java: + The new Transitions which has the only job to provide the connectios between + the different States and look if it is Possible to go the different Ways. + * src/main/java/de/intevation/gnv/state/StateBase.java, + src/main/java/de/intevation/gnv/state/State.java: + Removed the Logic to descide which State is be reacable as next. + Now the Transition configured in the Artifacts will do that according + to the modified TransitionModel. + * src/main/java/de/intevation/gnv/artifacts/GNVArtifactBase.java (transitions): + Added the Transitions to the Artifact and changed the Logic. + Now the Transition is able to decide if it could be uses or not. + * doc/conf/products/verticalprofile/*.xml: + Modified the Configuration. Splitted States and Transitions into + different XML-Fragments according to the modified Transitionmodel. + +2009-12-08 Ingo Weinzierl + + * doc/conf/queries.properties: Added marker ('DATAID') for different data + sources. + +2009-12-08 Tim Englich + + * doc/conf/products/*.xml: + Switched all Package and Classnames to the new Names. + * src/main/java/de/intevation/gnv/artifacts/GNVArtifactBase.java: + Switched Imports from de.intevation.gnv.transition to de.intevation.gnv.state + and renamed all Mebers and local Variables from *transition* to *state* + * src/main/java/de/intevation/gnv/utils/ArtifactXMLUtilities.java: + Changed the Class for the loggeer from TimeseriesoutputTransition + to ArtifactXMLUtilities because it was wrong. + * src/main/java/de/intevation/gnv/artifacts/fis/FISArtifact.java, + src/main/java/de/intevation/gnv/artifacts/fis/product/DefaultProduct.java, + src/main/java/de/intevation/gnv/artifacts/fis/product/Product.java, + src/main/java/de/intevation/gnv/statistics/VerticalProfileStatistics.java, + src/main/java/de/intevation/gnv/statistics/TimeseriesStatistics.java, + src/main/java/de/intevation/gnv/statistics/Statistics.java, + src/main/java/de/intevation/gnv/statistics/HorizontalProfileStatistics.java, + src/main/java/de/intevation/gnv/exports/SimpleOdvDataCollector.java, + src/main/java/de/intevation/gnv/exports/ShapeDataCollector.java, + src/main/java/de/intevation/gnv/exports/Export.java, + src/main/java/de/intevation/gnv/exports/DefaultExport.java, + src/main/java/de/intevation/gnv/exports/DefaultDataCollector.java, + src/main/java/de/intevation/gnv/chart/VerticalProfileChartFactory.java, + src/main/java/de/intevation/gnv/chart/VerticalProfileChart.java, + src/main/java/de/intevation/gnv/chart/VerticalCrossSectionChartFactory.java, + src/main/java/de/intevation/gnv/chart/TimeSeriesChart.java, + src/main/java/de/intevation/gnv/chart/HorizontalProfileChartFactory.java, + src/main/java/de/intevation/gnv/chart/HorizontalCrossSectionChartFactory.java, + src/main/java/de/intevation/gnv/chart/ChartFactory.java, + src/main/java/de/intevation/gnv/chart/AbstractXYLineChart.java: + Changed import from de.intevation.gnv.transition.* to de.intevation.gnv.state.* + according to refactoring Work in the Transitionsmodel. + * de.intevation.gnv.transition.* + Moved to de.intevation.gnv.state.* + and renamed all Mebers, local Variables, and Methodsignatures from *transition* to *state* + +2009-12-07 Ingo Weinzierl + + * src/main/java/de/intevation/gnv/transition/timeseries/TimeSeriesOutputTransition.java: + Remove unselected parameters from parameters list before initiating + charts. Parameter names are used as axis labels. + + * src/main/java/de/intevation/gnv/chart/TimeSeriesChart.java, + src/main/java/de/intevation/gnv/chart/VerticalProfileChart.java, + src/main/java/de/intevation/gnv/chart/HorizontalProfileChart.java: Changed + the way of adding data to charts: same parameters are stored in the same + dataset. Now, each parameter has only one axis. Axes and renderer are + adjusted one time after collecting data - not after creating every + single series. + + * src/main/java/de/intevation/gnv/chart/AbstractXYLineChart.java: Added some + more colors to distinguish between different parameters/attributes. + Changed method to adjust rendering options regarding the changes of + datasets described above. + +2009-12-07 Ingo Weinzierl + + * src/main/java/de/intevation/gnv/chart/TimeSeriesChart.java: Changed method + generateChart to initChart, which just created a new timeseries chart. + General chart stuff is done in AbstractXYLineChart. + + * src/main/java/de/intevation/gnv/chart/AbstractXYLineChart.java: Sourced + ChartFactory call out to a new initChart method. This has been done, + because TimeSeriesCharts needs to initiate another type of chart than + horizontal or vertical charts. + +2009-12-04 Ingo Weinzierl + + * src/main/java/de/intevation/gnv/artifacts/ressource/RessourceFactory.java: + Added method to fetch a string from ressource bundle with a specified + locale. Before, there just have been existing a method to fetch string + from ressource bundle on basis of the first locale in a list of locales. + + * src/main/java/de/intevation/gnv/transition/OutputTransitionBase.java: + Added method to fetch strings from ressource bundle from RessourceFactory + with a specified locale, a key and a default value, if there is no string + matching key in bundle. + + * src/main/java/de/intevation/gnv/transition/timeseries/TimeSeriesOutputTransition.java: + Added methods for creating title and subtitle of charts. FIS name is + fetched from ressource bundle with best locale (regarding supported server + and client locales) instead of first locale in list of supported locales + of the server. + + * src/main/java/de/intevation/gnv/transition/profile/horizontal/HorizontalProfileOutputTransition.java: + Changed title of charts. The main title contains FIS and station name. The + subtitle contains the time period, the cruise, the depth and the position + of a chart. + + * src/main/java/de/intevation/gnv/chart/ChartLabels.java: Added subtitle as + parameter in class and constructor. + + * src/main/java/de/intevation/gnv/chart/AbstractXYLineChart.java: Added a + subtitle to charts. Titles and subtitles are stored in a ChartLabels + object. + + * src/main/resources/lang/artifactMessages.properties, + src/main/resources/lang/artifactMessages_de_DE.properties, + src/main/resources/lang/artifactMessages_en.properties, + src/main/resources/lang/artifactMessages_de.properties: Added strings for + chart title. + +2009-12-04 Sascha L. Teichmann + + * ChangeLog: Cleaned up a bit. + +2009-12-02 Ingo Weinzierl + + * src/main/java/de/intevation/gnv/chart/TimeSeriesChart.java: Added time gap + detection. If a time gap is detected, a null value will be inserted to + break the current line. + +2009-12-02 Ingo Weinzierl + + * pom.xml: Added JBoss repository for JFreeChart 1.0.13 and removed explicit + JCommon dependency which is now needless. Now, it is no more necessary to + install JFreeChart into the local maven repository on your own. + +2009-12-02 Ingo Weinzierl + + * doc/conf/charttemplate.xml: Added lines to configure rendering of lines + and points in charts (visibility of lines/points and size of points). + + * src/main/java/de/intevation/gnv/chart/XMLChartTheme.java: Added method + parsing the rendering options for lines and points in charts. + + * src/main/java/de/intevation/gnv/chart/AbstractChart.java: Added boolean + member attributes which are used to control the visibility of lines and + points in charts. + + * src/main/java/de/intevation/gnv/chart/VerticalProfileChart.java, + src/main/java/de/intevation/gnv/chart/TimeSeriesChart.java, + src/main/java/de/intevation/gnv/chart/HorizontalProfileChart.java: + Constructor needs two further boolean parameter to control the visibility + of lines and points in charts. + + * src/main/java/de/intevation/gnv/chart/AbstractXYLineChart.java: The + renderer controlling the style of a series is adjusted after adding a + new series to the chart. + + * src/main/java/de/intevation/gnv/transition/profile/horizontalcrosssection/HorizontalCrossSectionMeshOutputTransition.java, + src/main/java/de/intevation/gnv/transition/profile/verticalcrosssection/VerticalCrossSectionOutputTransition.jav, + src/main/java/de/intevation/gnv/transition/profile/horizontal/HorizontalProfileOutputTransition.java, + src/main/java/de/intevation/gnv/transition/profile/vertical/VerticalProfileOutputTransition.java, + src/main/java/de/intevation/gnv/transition/timeseries/TimeSeriesOutputTransition.java: + Adjusted method calls regarding the constructor changes in *Chart classes. + + TODO: Lines and points in charts will both always be rendered at the + moment. This needs to be changed as soon as a new gui option is + implemented to control the visibility of lines/points. + +2009-12-01 Tim Englich + + * src/test/java/de/intevation/gnv/artifacts/GNVArtifactsTestCase.java: + Added one more Transitionstep to each Testcase according to the refactored Transitionmodel. + * src/test/ressources/verticalprofile/verticalprofile_step_*_advance.xml, + src/test/ressources/verticalprofile_instantaneouspoint/verticalprofile_step_*_advance.xml, + src/test/ressources/verticalprofile_mesh/verticalprofile_step_*_advance.xml, + src/test/ressources/verticalcrosssection_mesh/verticalcrosssection_step_*_advance.xml, + src/test/ressources/timeseries_mesh/timeseries_step_*_advance.xml, + src/test/ressources/timeseries/timeseries_step_*_advance.xml, + src/test/ressources/horizontalProfile_mesh/horizontalprofile_step_*_advance.xml, + src/test/ressources/horizontalProfile_instantaneouspoint/horizontalprofile_step_*_advance.xml, + src/test/ressources/horizontalcrosssection_mesh/horizontalcrosssection_step_*_advance.xml: + Moved each Adancedocument plus one according to the refactored Transitionmodel. + Added the first advanced Call for the Product-Artifact + +2009-12-01 Tim Englich + + * src/main/java/de/intevation/gnv/transition/OutputTransitionBase.java: + All Data which is required to generate the Charts is now fetched using the + Method getChartResult. The Method advance and initialize now have nothing to do. + + * src/main/java/de/intevation/gnv/transition/timeseries/TimeSeriesOutputTransition.java (out): + Removed the advance call because all Data which is required to generate the Charts is + fetched using the Method getChartResult. + * src/main/java/de/intevation/gnv/transition/profile/horizontal/NorthSouthEastWestTransition.java (initialize): + Use Method instantiate instead of Advance to add the required Data for describe + and feed this Transition. + + * src/main/java/de/intevation/gnv/transition/TransitionBase.java (initialize), + src/main/java/de/intevation/gnv/transition/Transition.java (initialize): + Added new Method Initaialize which will be callcall to Initailize the current + Transition. In this step all Data will be fetched which is required to Ddescribe and + feed each Transition. + Also the AlternativeTransition was removed because it is not longer required. + + * src/main/java/de/intevation/gnv/artifacts/fis/FISArtifact.java (advance): + Switched to the usage of the Method initialize instead of Advance while instantiating + a new Productartifact, according to the Refactoring work wich is done in the + TransitionModel. + + * src/main/java/de/intevation/gnv/artifacts/GNVArtifactBase.java (initialize): + Added new Function Initialize so that it is possible to Initialize an Artifact + without doing this in the Constructor. That is nessessary because some Artifacts need + some Metadata (e.g. SourceID) befor it can be initialized. + + * doc/conf/products/verticalprofile/conf_timeseriespoint.xml, + doc/conf/products/verticalprofile/conf_mesh.xml, + doc/conf/products/verticalprofile/conf_instantaneouspoint.xml, + doc/conf/products/verticalcrosssection/conf_mesh.xml, + doc/conf/products/timeseries/conf_timeseriespoint.xml, + doc/conf/products/timeseries/conf_mesh.xml, + doc/conf/products/horizontalprofile/conf_mesh.xml, + doc/conf/products/horizontalprofile/conf_instantaneouspoint.xml, + doc/conf/products/horizontalcrosssection/conf_mesh.xml: + Some Refactoring work done according to the Refactoring Work wich + was done in the Transitionmodel. + +2009-11-30 Ingo Weinzierl + + * src/main/java/de/intevation/gnv/artifacts/ressource/RessourceFactory.java, + src/main/java/de/intevation/gnv/chart/HorizontalProfileChart.java, + src/main/java/de/intevation/gnv/transition/profile/horizontalcrosssection/HorizontalCrossSectionMeshOutputTransition.java, + src/main/java/de/intevation/gnv/transition/profile/verticalcrosssection/VerticalCrossSectionOutputTransition.java, + src/main/java/de/intevation/gnv/transition/profile/horizontal/HorizontalProfileOutputTransition.java, + src/main/java/de/intevation/gnv/transition/profile/vertical/VerticalProfileOutputTransition.java: + Removed needless imports. + +2009-11-30 Ingo Weinzierl + + * pom.xml: Updated batik dependencies to 1.7 + + * src/main/java/de/intevation/gnv/exports/ChartExportHelper.java: Use + java native DOMImplementation instead of Batik's SVGDOMImplementation, + which is not present in batik 1.7 libs. + +2009-11-30 Ingo Weinzierl + + * doc/conf/products/horizontalcrosssection/conf_mesh.xml, + doc/conf/products/verticalcrosssection/conf_mesh.xml, + doc/conf/products/timeseries/conf_mesh.xml, + doc/conf/products/timeseries/conf_timeseriespoint.xml, + doc/conf/products/horizontalprofile/conf_mesh.xml, + doc/conf/products/horizontalprofile/conf_instantaneouspoint.xml, + doc/conf/products/verticalprofile/conf_mesh.xml, + doc/conf/products/verticalprofile/conf_timeseriespoint.xml, + doc/conf/products/verticalprofile/conf_instantaneouspoint.xml: Added svg + to output modes (MimeType image/svg+xml). + + * pom.xml: Added batik 1.6.1 dependencies which are used to create svg + exports. + + * src/main/java/de/intevation/gnv/exports/ChartExportHelper.java: + Implemented chart export to svg. + + * src/main/java/de/intevation/gnv/transition/timeseries/TimeSeriesOutputTransition.java: + Output mode 'svg' will call svg export of ChartExportHelper. + +2009-11-30 Ingo Weinzierl + + * pom.xm: Added iText 2.1.7 dependency (to create pdf's). + + * src/main/java/de/intevation/gnv/exports/ChartExportHelper.java: + Implemented chart export to pdf using iText library. The chart fills the + complete page. A boolean system property "export.pdf.landscape" can be + used to adjust the page orientation (portrait or landscape, default is + landscape). + + * src/main/java/de/intevation/gnv/transition/timeseries/TimeSeriesOutputTransition.java: + Added method for exporting chart to pdf. Calls the new method of + ChartExportHelper. + +2009-11-27 Tim Englich + + * src/test/java/de/intevation/gnv/artifacts/GNVArtifactsTestCase.java + (testHorizontalProfileInstantaneousPointArtifact), + src/test/ressources/horizontalProfile_instantaneouspoint/horizontalprofile_step_*.xml: + Added new stapes using the RegionFilter into the Tescase of HorizontalProfiles Instantaneous Point. + * src/test/ressources/verticalcrosssection_mesh/verticalcrosssection_step_08_feed.xml, + src/test/ressources/horizontalcrosssection_mesh/horizontalcrosssection_step_06_feed.xml: + Bugfix: Removed second dateid. horizontalcrosssection and verticalcrosssection only provide the usage of one dateid. + * doc/conf/products/horizontalprofile/conf_instantaneouspoint.xml: + Added the RegionFilters into the configuration of the Products for + Horizontalprofiles IntantaneousPoints. + * doc/conf/queries.properties: + Query to select only Ships, Cruises, Tracks which are within an Region. + * src/main/java/de/intevation/gnv/transition/TransitionBase.java (extractKVP): + Added Row-Number lookup for ColumnNames for Performanceimprofements. + +2009-11-26 Ingo Weinzierl + + * src/main/java/de/intevation/gnv/exports/ChartExportHelper.java: Helper + class to export charts. Dependencies on JFreeChart and iText are capsuled + here, no further dependencies in OutputTransitions. Export methods for + images and pdf already implemented. + + * src/main/java/de/intevation/gnv/chart/Chart.java, + src/main/java/de/intevation/gnv/chart/AbstractChart.java: Outsourcing of + export methods to ChartExportHelper. + + * src/main/java/de/intevation/gnv/transition/timeseries/TimeSeriesOutputTransition.java: + Adapted current export of charts. + +2009-11-26 Ingo Weinzierl + + * doc/conf/products/horizontalcrosssection/conf_mesh.xml, + doc/conf/products/verticalcrosssection/conf_mesh.xml, + doc/conf/products/timeseries/conf_mesh.xml, + doc/conf/products/timeseries/conf_timeseriespoint.xml, + doc/conf/products/horizontalprofile/conf_mesh.xml, + doc/conf/products/horizontalprofile/conf_instantaneouspoint.xml, + doc/conf/products/verticalprofile/conf_mesh.xml, + doc/conf/products/verticalprofile/conf_timeseriespoint.xml, + doc/conf/products/verticalprofile/conf_instantaneouspoint.xml: Added pdf + as export format. + +2009-11-26 Ingo Weinzierl + + * TODO: Added point in TODO regarding tick units and distance between tick + units in timeseries charts. + +2009-11-26 Ingo Weinzierl + + * src/main/java/de/intevation/gnv/chart/AbstractXYLineChart.java: Localized + chart axis. Two method have been added - method to localize y-axis of + charts, abstract method to localize x-axis of charts. + + * src/main/java/de/intevation/gnv/chart/VerticalProfileChart.java, + src/main/java/de/intevation/gnv/chart/TimeSeriesChart.java: Override + abstract method to localize x-axis. + + * src/main/java/de/intevation/gnv/transition/timeseries/TimeSeriesOutputTransition.java: + Call algorithm to determine the best locale regarding intersection of + supported server and browser locales. This locale is used to create + localized charts. + +2009-11-26 Ingo Weinzierl + + * src/main/java/de/intevation/gnv/artifacts/ressource/RessourceFactory.java: + New method getLocales() which returns an array of locales which are + supported by the server. + + * src/main/resources/lang/lang.conf: Config-file for supported languages. + The resource bundles for localized text should be configured here. It is + used to determine the best locale regarding the supported locales by + server and browser. + +2009-11-25 Ingo Weinzierl + + * src/main/java/de/intevation/gnv/chart/TimeSeriesChart.java: Override + method generateChart to instantiate TimeSeries charts instead of XY + charts. Before these changes, timeseries charts did not have a valid date + axis. + +2009-11-24 Ingo Weinzierl + + * src/main/java/de/intevation/gnv/chart/VerticalProfileChart.java, + src/main/java/de/intevation/gnv/chart/AbstractChart.java, + src/main/java/de/intevation/gnv/chart/TimeSeriesChart.java, + src/main/java/de/intevation/gnv/chart/HorizontalProfileChart.java: Added + timegap definitions, adapted constructors. + + * src/main/java/de/intevation/gnv/transition/profile/horizontalcrosssection/HorizontalCrossSectionMeshOutputTransition.java, + src/main/java/de/intevation/gnv/transition/profile/verticalcrosssection/VerticalCrossSectionOutputTransition.java, + src/main/java/de/intevation/gnv/transition/profile/horizontal/HorizontalProfileOutputTransition.java, + src/main/java/de/intevation/gnv/transition/profile/vertical/VerticalProfileOutputTransition.java, + src/main/java/de/intevation/gnv/transition/timeseries/TimeSeriesOutputTransition.java: + Adapted creation of charts regarding changes of constructors. + +2009-11-24 Tim Englich + + * src/test/ressources/verticalprofile_mesh/verticalprofile_step_10_feed.xml, + src/test/ressources/verticalcrosssection_mesh/verticalcrosssection_step_08_feed.xml, + src/test/ressources/timeseries_mesh/timeseries_step_08_feed.xml, + src/test/ressources/horizontalProfile_mesh/horizontalprofile_step_10_feed.xml, + src/test/ressources/horizontalcrosssection_mesh/horizontalcrosssection_step_06_feed.xml, + src/test/ressources/timeseries/timeseries_step_06_out_chart.xml: + Added new Timevalues because the Data in the DWH has changed. + +2009-11-24 Ingo Weinzierl + + * pom.xml: Added dependencies for esri and ibm libraries required for unit + tests. + +2009-11-24 Tim Englich + + * src/test/ressources/timeseries/timeseries_step_06_out_chart.xml: + Added mime-type to get a propper output-result and not an NPE + * src/main/java/de/intevation/gnv/chart/AbstractXYLineChart.java (findValueTitle): + Added null-value check to prevent NPEs. + * src/main/java/de/intevation/gnv/transition/profile/verticalcrosssection/VerticalCrossSectionOutputTransition.java (getChart), + src/main/java/de/intevation/gnv/transition/profile/vertical/VerticalProfileOutputTransition.java (getChart), + src/main/java/de/intevation/gnv/transition/profile/horizontalcrosssection/HorizontalCrossSectionMeshOutputTransition.java (getChart), + src/main/java/de/intevation/gnv/transition/profile/horizontal/HorizontalProfileOutputTransition.java (getChart): + Changed Method-Signature to this one which the base method provide. + Now the Methods will be used again. + +2009-11-24 Tim Englich + + * src/test/java/de/intevation/gnv/artifacts/TestCallContext.java (TestCallContext): + Removed Compilationerrors that were triggert by API-Changes in + Module Artifact-Database. + + * doc/conf/queries.properties, + doc/conf/products/timeseries/conf_mesh.xml: + Removed Meshpoint from SQL-Query because the same value will be + insert by using the depthid. + depthid on layer 1 = featureid + In the old configuration only Charts on Layer 1 were drawn. + issue91 + +2009-11-23 Ingo Weinzierl + + * src/main/java/de/intevation/gnv/transition/OutputTransitionBase.java: + Remove chart from cache when data which is displayed has changed. + +2009-11-23 Ingo Weinzierl + + * doc/conf/charttemplate.xml: Added configuration file for chart themes. + + * src/main/java/de/intevation/gnv/chart/XMLChartTheme.java: Theme class for + reading xml files which describe chart styles. It extends the + StandardChartTheme class of JFreeChart which defines default values for + chart parameters. It is possible to apply different xml configurations for + different charts. + + * src/main/java/de/intevation/gnv/chart/AbstractXYLineChart.java, + src/main/java/de/intevation/gnv/transition/timeseries/TimeSeriesOutputTransition.java: + Before creating a new chart, an instance of XMLChartTheme is initialized + which is responsible for the chart style. + + NOTE: 'charttemplate.xml' is used by artifact server and has to be placed + in the config directory. + +2009-11-20 Ingo Weinzierl + + * src/main/java/de/intevation/gnv/transition/timeseries/TimeSeriesOutputTransition.java: + Export format of charts (png, jpeg, gif) depends on mime-type. + + * src/main/java/de/intevation/gnv/chart/Chart.java, + src/main/java/de/intevation/gnv/chart/AbstractChart.java: Renamed export + method, because it doesn't export just png anymore, but jpeg or gif as + well. + +2009-11-20 Ingo Weinzierl + + * src/test/ressources/horizontalProfile_instantaneouspoint/horizontalprofile_step_06_out_chart.xml, + src/test/ressources/verticalprofile_instantaneouspoint/verticalprofile_step_05_out_chart.xml, + src/test/ressources/horizontalcrosssection_mesh/horizontalcrosssection_step_06_out_chart.xml, + src/test/ressources/verticalcrosssection_mesh/verticalcrosssection_step_08_out_chart.xml, + src/test/ressources/timeseries_mesh/timeseries_step_08_out_chart.xml, + src/test/ressources/horizontalProfile_mesh/horizontalprofile_step_10_out_chart.xml, + src/test/ressources/verticalprofile_mesh/verticalprofile_step_10_out_chart.xml, + src/test/ressources/verticalprofile/verticalprofile_step_06_out_chart.xml: + Removed mistake in xml structure of artifact protocol. Mime-type node was + called 'out' instead of 'mime-type'. + +2009-11-20 Ingo Weinzierl + + * src/main/java/de/intevation/gnv/artifacts/GNVArtifactBase.java, + src/main/java/de/intevation/gnv/chart/VerticalProfileChart.java, + src/main/java/de/intevation/gnv/chart/AbstractXYLineChart.java, + src/main/java/de/intevation/gnv/chart/AbstractChart.java, + src/main/java/de/intevation/gnv/exports/Export.java, + src/main/java/de/intevation/gnv/exports/ShapeDataCollector.java, + src/main/java/de/intevation/gnv/exports/SimpleOdvDataCollector.java, + src/main/java/de/intevation/gnv/exports/DefaultProfile.java, + src/main/java/de/intevation/gnv/exports/DefaultExport.java, + src/main/java/de/intevation/gnv/transition/profile/horizontalcrosssection/HorizontalCrossSectionMeshOutputTransition.java, + src/main/java/de/intevation/gnv/transition/profile/horizontal/HorizontalProfileOutputTransition.java, + src/main/java/de/intevation/gnv/transition/profile/vertical/VerticalProfileOutputTransition.java, + src/main/java/de/intevation/gnv/transition/timeseries/TimeSeriesOutputTransition.java: + Removed duplicated and needless imports. + +2009-11-20 Ingo Weinzierl + + * src/main/java/de/intevation/gnv/transition/OutputTransitionBase.java: + Added methods for caching charts. + + * src/main/java/de/intevation/gnv/transition/profile/horizontal/HorizontalProfileOutputTransition.java, + src/main/java/de/intevation/gnv/transition/profile/vertical/VerticalProfileOutputTransition.java, + src/main/java/de/intevation/gnv/transition/profile/horizontalcrosssection/HorizontalCrossSectionMeshOutputTransition.java, + src/main/java/de/intevation/gnv/transition/profile/verticalcrosssection/VerticalCrossSectionOutputTransition.java, + src/main/java/de/intevation/gnv/transition/timeseries/TimeSeriesOutputTransition.java: + Changed chart generation. Charts will now be generated in a central place + in TimeSeriesOutputTransition which is the parent class of other + OutputTransitions. Each OutputTransition got a new method to serve its own + special chart class. + + * TODO: Added hint for caching charts. Verticalcrosssection and + orizontalcrosssection charts aren't implemented yet. + + NOTE: Charts can be cached. This could be useful if the user exports + charts as svg, png or pdf. The caching of charts is configured via system + property 'cache.chart' at the moment. + +2009-11-19 Ingo Weinzierl + + * src/main/java/de/intevation/gnv/artifacts/GNVArtifactBase.java, + src/main/java/de/intevation/gnv/transition/OutputTransition.java, + src/main/java/de/intevation/gnv/transition/timeseries/TimeSeriesOutputTransition.java: + Changed parameter of 'out'-method of OutputTransition. Now, the + OutputTransition gets the complete xml document of the request (before + just the target name). The mime type of this xml ist used to distinguish + between different output formats of charts (png, jpeg). + +2009-11-19 Ingo Weinzierl + + * src/main/java/de/intevation/gnv/chart/TimeSeriesChart.java, + src/main/java/de/intevation/gnv/chart/VerticalProfileChart.java, + src/main/java/de/intevation/gnv/chart/HorizontalProfileChart.java: + Classes for creating charts of different output transitions, inherit from + AbstractXYLineChart. The subclasses should only implement special code. + General configurations should be done in AbstractChart or + AbstractXYLineChart. + + TODO: Take care of gaps between two values. + +2009-11-19 Ingo Weinzierl + + * src/main/java/de/intevation/gnv/chart/Chart.java: Interface, which + declares basic method to create charts and export it in different formats. + + * src/main/java/de/intevation/gnv/chart/AbstractChart.java, + src/main/java/de/intevation/gnv/chart/AbstractXYLineChart.java: Abstract + chart classes which declare basic methods for chart creation and implement + general methods used by subclasses. + +2009-11-19 Ingo Weinzierl + + * src/main/java/de/intevation/gnv/utils/DistanceCalculator.java: Declared a + method as static, which can be used without instantiating an object of its + class. + +2009-11-17 Ingo Weinzierl + + * pom.xml: Changed version of JFreeChart from 1.0.12 to 1.0.13 and added + dependency of JCommon 1.0.15, which is used by JFreeChart. + + NOTE: The JFreeChart 1.0.13 jar has to be installed on your own for the + time the central maven repository is broken. + +2009-11-17 Ingo Weinzierl + + * pom.xml: Changed version of JFreeChart from 1.0.7 to 1.0.12, which + includes the template mechanism to configure the style of charts. + + NOTE: JFreeChart 1.0.13 is the newest release, but the maven repository + does not contain a pom.xml file. Created an issue on + (http://jira.codehaus.org/browse/MEV-647). + +2009-11-16 Ingo Weinzierl + + * bin/run.sh: Added start-script to version control. + +2009-11-13 Hans Plum + + * RELEASE 0.2: + Summarized activities in NEWS, Changes + +2009-11-13 Hans Plum + + * ChangeLog: + Unified style of ChangeLog descriptions refering to issues. + +2009-11-13 Tim Englich + + * doc/conf/products/timeseries/conf_timeseriespoint.xml: + Moved Comment according to Instantiationerrors loading Artifact. + +2009-11-13 Tim Englich + + * doc/conf/log4j.properties,, + doc/conf/conf.xml, + doc/conf/arcsdeconnectionpool.properties, + doc/conf/products/timeseries/conf_timeseriespoint.xml: + Added Documentation of Configuration-Files. + +2009-11-13 Tim Englich + + * doc/conf/products/verticalcrosssection/conf_mesh.xml, + doc/conf/products/horizontalcrosssection/conf_mesh.xml: + Removed statistics as possible out-Variant from Configuration + according to TG_0030.061 + + * src/test/ressources/verticalcrosssection_mesh/verticalcrosssection_step_08_out_statistics.xml, + src/test/ressources/horizontalcrosssection_mesh/horizontalcrosssection_step_06_out_statistics.xml, + src/test/java/de/intevation/gnv/artifacts/GNVArtifactsTestCase.java (testHorizontalCrossSectionMeshArtifact), + (testVerticalCrossSectionMeshArtifact): + Removed Statistics-Test on This Artifact-Test because no Statistic is required + for this Producttyp. + + * src/main/java/de/intevation/gnv/transition/profile/horizontalcrosssection/ + HorizontalCrossSectionMeshOutputTransition.java (createCSV): + No Statistics for this Output is required. + + * src/main/java/de/intevation/gnv/statistics/HorizontalCrossSectionStatistics.java: + Removed becaus the Statistics for ths product is not required. + +2009-11-12 Tim Englich + + * src/main/java/de/intevation/gnv/statistics/HorizontalCrossSectionStatistics.java (calculateXOrdinateValue), + src/main/java/de/intevation/gnv/statistics/HorizontalProfileStatistics.java (calculateXOrdinateValue), + src/main/java/de/intevation/gnv/statistics/VerticalProfileStatistics.java (calculateXOrdinateValue), + src/main/java/de/intevation/gnv/statistics/TimeseriesStatistics.java : + Added the previous Row to the Method for calculating the GAP between + those Rows. Also added Calculation of the Distance between two Points in + HorizontalProfileStatistic and returning the Depth in VerticalProfileStatistics. + Also added the Metjod clearStatistics to restet the Object if an new Calculation + will started. + +2009-11-12 Tim Englich + + * src/main/java/de/intevation/gnv/transition/TransitionBase.java (extractKVP): + Translated "Keine Auswahl" to "No Selection" according to the Specification that + the primary Language is english. Please note that the Values that are currently + displaied are almost in german. + +2009-11-12 Tim Englich + + * src/main/java/de/intevation/gnv/transition/timeseries/TimeSeriesOutputTransition.java (writeStatistics2XML): + Changed XML-Syntaxt according to the new Structure of StatisticValues. + (out): + Changed Call of calculateStatistics according to the new Methodsignature. + + * src/main/java/de/intevation/gnv/statistics/HorizontalProfileStatistics.java, + src/main/java/de/intevation/gnv/statistics/VerticalProfileStatistics.java. + src/main/java/de/intevation/gnv/statistics/TimeseriesStatistics.java, + src/main/java/de/intevation/gnv/statistics/Statistics.java: + Extended Methods calculateStatistics to put Lable-Values into the + Calculation. Now for each Group of Statistics is it possible + to calclulate a separat name which is simmilar to the name of + the Diagramm-Series-Name. + Also the Representation of the Statistics has changed so each Group + will be stored in one StatisticSet + + * src/main/java/de/intevation/gnv/statistics/StatisticSet.java: + Bean for Storing the Statistic to one Group and also storing the + Name of the Statistic. + +2009-11-11 Tim Englich + + Issue 19: Validation of max. min value order + + * src/main/java/de/intevation/gnv/transition/TransitionBase.java (putInputData): + Added Validation if a given maxvalue is greater than a given minvalue issue19 + * src/main/java/de/intevation/gnv/utils/InputValidator.java (isInputValid): + Added new Method for validating if a maxvalue is greater than a minvalue. issue19 + +2009-11-11 Tim Englich + + Issue 81: Keeping input values in coordinate input fields + + * src/main/java/de/intevation/gnv/transition/describedata/DefaultSingleValueDescribeData.java + (setValue), src/main/java/de/intevation/gnv/transition/describedata/SingleValueDescribeData.java: + Added setValue-Method + for setting the Value which was sent back to the Server using the feed-request. issue81 + + * src/main/java/de/intevation/gnv/transition/TransitionBase.java (getDescribeData): + Added SingleValueDescribeData to the method for storing InputValues for + Describeoutput issue81 + +2009-11-11 Tim Englich + + * src/main/java/de/intevation/gnv/transition/describedata/MinMaxDescribeData.java, + src/main/java/de/intevation/gnv/transition/describedata/DefaultMinMaxDescribeData.java: + Added getName and added Constants for minValue and maxValue Id to + enable the storage of this Values which would be put using the + feed command. + + * src/main/java/de/intevation/gnv/transition/TransitionBase.java (describe): + Changed the usage of the Name of the MinMaxTransition from getMinName to getName. + + * src/main/java/de/intevation/gnv/transition/MinMaxTransition.java (purifyResult): + Changed the Constructor of MinMaxTransition according to API-Changes of + DefaultMinMaxDescribeData + +2009-11-11 Tim Englich + + Issue 76: Improving XML config documents + + * doc/conf/products/verticalprofile/conf_mesh.xml, + doc/conf/products/verticalprofile/conf_instantaneouspoint.xml, + doc/conf/products/verticalcrosssection/conf_mesh.xml, + doc/conf/products/timeseries/conf_mesh.xml, + doc/conf/products/horizontalprofile/conf_mesh.xml, + doc/conf/products/horizontalcrosssection/conf_mesh.xml: + Removed unnecessary characters 'v' from the Documents. issue76 + +2009-11-10 Tim Englich + + * src/main/resources/lang/artifactMessages_*.properties: + Added Ressources for the AreaFilter Ids areaid and subareid + +2009-11-10 Tim Englich + + Issue 68: Improving ODV Export + + * src/main/java/de/intevation/gnv/transition/timeseries/TimeSeriesOutputTransition.java (TIMESERIES_ODV_PROFILE_NAMES): + Sort Columns to the given order of the ODV-Specification + and added the Columns DATAVALUE and PARAMETER to the output + according to issue68 + + * doc/conf/queries.properties: + Changed Column-alias in Query for HorizontalProfile ODV-Exports in Meshes + from PARAMETERID to PARAMETER to be able to use in only on ODV-Export-Profile + +2009-11-10 Tim Englich + + * src/test/java/de/intevation/gnv/artifacts/GNVArtifactsTestCase.java (testVerticalCrossSectionMeshArtifact): + Added the ODV-Export to the Unit-Testcase for VerticalCrossSection-Mesh. + Some Refactoring Work done. + * doc/conf/products/verticalcrosssection/conf_mesh.xml: + Added QueryID for ODV-Exports to the Configuration of an + Mesh-VerticalCrossSection-Artifacts + * doc/conf/queries.properties: + Added Query for VerticalCrossSection ODV-Exports in Meshes. + * src/test/ressources/verticalcrosssection_mesh/verticalcrosssection_step_08_feed.xml: + Changed Datevalue, because the old value was out of range to the Data. + * src/test/ressources/verticalcrosssection_mesh/verticalcrosssection_step_08_out_odv.xml: + Added Out-Request for ODV-Export to the JUnitTest Configuration for + VerticalCrossSection Mesh. + +2009-11-10 Tim Englich + + * src/test/java/de/intevation/gnv/artifacts/GNVArtifactsTestCase.java (testHorizontalCrossSectionMeshArtifact): + Added the ODV-Export to the Unit-Testcase for HorizontalCrossSection-Mesh. + Some Refactoring Work done. + * doc/conf/queries.properties: + Added Query for HorizontalCrossSection ODV-Exports in Meshes. + * doc/conf/products/horizontalcrosssection/conf_mesh.xml: + Added QueryID for ODV-Exports to the Configuration of an + Mesh-HorizontalCrossSection-Artifacts + * src/test/ressources/horizontalcrosssection_mesh/horizontalcrosssection_step_06_feed.xml: + Changed Datevalue, because the old value was out of range to the Data. + * src/test/ressources/horizontalcrosssection_mesh/horizontalcrosssection_step_06_out_odv.xml: + Added Out-Request for ODV-Export to the JUnitTest Configuration for + HorizontalCrossSection Mesh. + +2009-11-10 Tim Englich + + * src/test/java/de/intevation/gnv/artifacts/GNVArtifactsTestCase.java (testHorizontalProfileInstantaneousPointArtifact): + Added the ODV-Export to the Unit-Testcase for HorizontalProfile-InstantaneousPoint. + Some Refactoring Work done. + * src/test/ressources/horizontalProfile_instantaneouspoint/horizontalprofile_step_06_out_odv.xml: + Added Out-Request for ODV-Export to the JUnitTest Configuration for + HorizontalProfiles InstantaneousPoint. + * doc/conf/products/horizontalprofile/conf_instantaneouspoint.xml: + Added QueryID for ODV-Exports to the Configuration of an + InstantaneousPoint-HorizontalProfile-Artifacts + * doc/conf/queries.properties: + Added Query for HorizontalProfile ODV-Exports in InstantaneousPoint + +2009-11-10 Tim Englich + * src/test/java/de/intevation/gnv/artifacts/GNVArtifactsTestCase.java (testVerticalProfileInstantaneousPointArtifact): + Added the ODV-Export to the Unit-Testcase for VerticalProfile-InstantaneousPoint. + Some Refactoring Work done. + * doc/conf/products/verticalprofile/conf_instantaneouspoint.xml: + Added QueryID for ODV-Exports to the Configuration of an + InstantaneousPoint-VerticalProfile-Artifacts + * doc/conf/queries.properties: + Added Query for VerticalProfile ODV-Exports in InstantaneousPoint + * src/test/ressources/verticalprofile_instantaneouspoint/verticalprofile_step_05_out_odv.xml: + Added Out-Request for ODV-Export to the JUnitTest Configuration for VerticalProfiles InstantaneousPoint. + +2009-11-10 Tim Englich + + * src/test/java/de/intevation/gnv/artifacts/GNVArtifactsTestCase.java (testHorizontalProfileMeshPointArtifact): + Added the ODV-Export to the Unit-Testcase for HorizontalProfile-Mesh. + Some Refactoring Work done. + * doc/conf/products/horizontalprofile/conf_mesh.xml: + Added QueryID for ODV-Exports to the Configuration of an + Mesh-HorizontalProfile-Artifacts + * doc/conf/queries.properties: + Added Query for HorizontalProfile ODV-Exports in Meshes + * src/test/ressources/horizontalProfile_mesh/horizontalprofile_step_10_out_odv.xml: + Added Out-Request for ODV-Export to the JUnitTest Configuration for HorizontalProfiles Mesh. + * src/test/ressources/horizontalProfile_mesh/horizontalprofile_step_02_feed.xml: + BugFix: Changed missspelled Input-Name + +2009-11-09 Tim Englich + + * src/main/java/de/intevation/gnv/transition/timeseries/TimeSeriesOutputTransition.java (TIMESERIES_ODV_PROFILE_NAMES): + Changed the Order of Columnlookup for ODV-Exports and added column "Depth" to the Export + * src/test/java/de/intevation/gnv/artifacts/GNVArtifactsTestCase.java (testTimeSeriesMeshArtifact): + Added the ODV-Export to the Unit-Testcase for TimeSeries-Mesh. + Some Refactoring Work done. + * doc/conf/queries.properties: + Added Query for VerticalProfile ODV-Exports in Meshes + * doc/conf/products/verticalprofile/conf_mesh.xml: + Added QueryID for ODV-Exports to the Configuration of an + Mesh-VerticalProfile-Artifacts + * src/test/ressources/verticalprofile_mesh/verticalprofile_step_10_out_odv.xml, + src/test/ressources/verticalprofile/verticalprofile_step_06_out_odv.xml: + Added Out-Request for ODV-Export to the JUnitTest Configuration for VerticalProfiles. + +2009-11-09 Tim Englich + + * src/test/java/de/intevation/gnv/artifacts/GNVArtifactsTestCase.java (testTimeSeriesMeshArtifact): + Added the ODV-Export to the Unit-Testcase for TimeSeries-Mesh. + Some Refactoring Work done. + + * src/test/ressources/timeseries_mesh/timeseries_step_08_out_odv.xml: + Added Out-request for ODV-Export to the JUnitTest Configuration for TimeSeries Mesh. + + * doc/conf/products/timeseries/conf_mesh.xml: + Added QueryID for ODV-Exports to the Configuration of an Mesh-TimeSeries-Artifacts + + * doc/conf/queries.properties: Added Query for TimeSeries ODV-Exports in Meshes + +2009-11-09 Ingo Weinzierl + + * src/main/java/de/intevation/gnv/exports/Export.java + src/main/java/de/intevation/gnv/exports/DefaultProfile.java + src/main/java/de/intevation/gnv/exports/DefaultExport.java: Added the + possibility to print column labels in the first line of an export. + + * src/main/java/de/intevation/gnv/transition/profile/horizontal/HorizontalProfileOutputTransition.java, + src/main/java/de/intevation/gnv/transition/timeseries/TimeSeriesOutputTransition.java: + Adjusted instantiation of the DefaultExport object and added column labels + for odv export. + +2009-11-09 Ingo Weinzierl + + * src/main/java/de/intevation/gnv/exports/SimpleOdvDataCollector.java: + Implemented a DataCollector for Odv exports. + + * src/main/java/de/intevation/gnv/transition/timeseries/TimeSeriesOutputTransition.java: + OEV-export uses a SimpleOdvDataCollector to collect export data. + +2009-11-09 Ingo Weinzierl + + * src/main/java/de/intevation/gnv/exports/ShapeDataCollector.java, + src/main/java/de/intevation/gnv/exports/HorizontalProfileDataCollector.java: + Renamed HorizontalProfileDataCollector into ShapeDataCollector, because it + will be used by other transitions as well. + + * src/main/java/de/intevation/gnv/transition/profile/horizontal/HorizontalProfileOutputTransition.java: + Adjusted class name of DataCollector after renaming. + +2009-11-09 Ingo Weinzierl + + * src/main/java/de/intevation/gnv/exports/HorizontalProfileDataCollector.java: + Special DataCollector for fetching data used for horizontal profile + exports. + + * src/main/java/de/intevation/gnv/transition/profile/horizontal/HorizontalProfileOutputTransition.java: + Uses the an exporter for csv export. + +2009-11-09 Ingo Weinzierl + + * src/main/java/de/intevation/gnv/exports/Export.java, + src/main/java/de/intevation/gnv/exports/DefaultDataCollector.java: + Implemented a DataCollector to collect all data used to create exports. + DefaultCollector fetches data with help of its headers. For special + exports, where a header returns more than one value, special + DataCollectors needs to be implemented (overwritung the 'getData' method). + + * src/main/java/de/intevation/gnv/exports/DefaultProfile.java, + src/main/java/de/intevation/gnv/exports/DefaultExport.java: Export now + uses a DataCollector to get the data. + + * src/main/java/de/intevation/gnv/transition/timeseries/TimeSeriesOutputTransition.java: + Adjusted exports of csv export. + +2009-11-09 Tim Englich + + * doc/conf/queries.properties: + Added SQLStatemenet for ODV-Data for VerticalProfiles + on TimeSeriesPoints. + * doc/conf/products/verticalprofile/conf_timeseriespoint.xml: + Added QueryID for ODV-Data-Query + +2009-11-09 Tim Englich + + * src/test/ressources/timeseries/timeseries_step_06_out_*.xml: + Added the missing out-Modes to the Testcase and rename it to + the common used way in this TestCases. + * src/test/java/de/intevation/gnv/artifacts/GNVArtifactsTestCase.java (testTimeSeriesArtifact): + Added the ODV-Export to the Unit-Testcase. + Some Refactoring Work done. + * src/main/java/de/intevation/gnv/transition/timeseries/TimeSeriesOutputTransition.java (out): + The Method for generating ODV-Export now reads its Data from + the special Method which delivers the adapted Data. + * src/main/java/de/intevation/gnv/transition/TransitionBase.java (generateFilterValuesFromInputData): + Extracted the Generation of the FilterValues for the geo-backend + to use it in several methods. + * src/main/java/de/intevation/gnv/transition/OutputTransitionBase.java (getODVResult): + Added Method for getting the rquired Data for ODV-Exports + * doc/conf/products/timeseries/conf_timeseriespoint.xml: + Added separat QueryID Lookup for ODV-Data-Queryies + * doc/conf/queries.properties: + DB-Queries for ODV-Support TimeSeries on TimeSeriesPoints added. + +2009-11-06 Ingo Weinzierl + + * src/main/java/de/intevation/gnv/exports, + src/main/java/de/intevation/gnv/exports/Export.java, + src/main/java/de/intevation/gnv/exports/DefaultProfile.java, + src/main/java/de/intevation/gnv/exports/DefaultExport.java: Implemented an + Exporter for odv and csv exports. Each exports just needs a Profile, which + describes the output. + + * src/main/java/de/intevation/gnv/transition/timeseries/TimeSeriesOutputTransition.java: + Added an exemplary export for CSV and ODV formats of + TimeSeriesOutputTransition. + + TODO: ODV exporter exports the same data as CSV exporter does. This needs + to be adapted. + +2009-11-06 Tim Englich + + * src/test/java/de/intevation/gnv/artifacts/GNVArtifactsTestCase.java: + Added and moved Workflowsteps because of changes in the Workflow of these Artifacts. + Now the Region-Filter is added to the Workflow an can be tested using + this UnitTestCases. + + * src/test/ressources/horizontalcrosssection_mesh/horizontalcrosssection_step_*.xml, + src/test/ressources/horizontalProfile_mesh/horizontalprofile_step_*.xml, + src/test/ressources/timeseries/timeseries_step_*.xml, + src/test/ressources/timeseries_mesh/timeseries_step_*.xml, + src/test/ressources/verticalprofile/verticalprofile_step_*.xml, + src/test/ressources/verticalprofile_mesh/verticalprofile_step_*.xml: + Added and moved Files because of changes in the Workflow of these Artifacts. + Now the Region-Filter is added to the Workflow an can be tested using + the UnitTestCases. + +2009-11-06 Ingo Weinzierl + + * doc/conf/products/horizontalcrosssection/conf_mesh.xml, + doc/conf/products/timeseries/conf_mesh.xml, + doc/conf/products/timeseries/conf_timeseriespoint.xml, + doc/conf/products/horizontalprofile/conf_mesh.xml, + doc/conf/products/horizontalprofile/conf_instantaneouspoint.xml, + doc/conf/products/verticalprofile/conf_mesh.xml, + doc/conf/products/verticalprofile/conf_timeseriespoint.xml, + doc/conf/products/verticalprofile/conf_instantaneouspoint.xml: Added odv + as output format. + +2009-11-06 Tim Englich + + * src/main/java/de/intevation/gnv/chart/ChartFactory.java (calculateMaxGap): + Bugfix Gap-Calculation moved maxGap into negative Valies because of + overflow of Long-Variable. + +2009-11-05 Tim Englich + + * doc/conf/queries.properties: + Query to select only those TimeSeriesPoints + which are within an Region + + * doc/conf/products/timeseries/conf_timeseriespoint.xml, + doc/conf/products/verticalprofile/conf_timeseriespoint.xml: + Added the RegionFilters into the configuration of the Products + for TimeSeriesPoints. + +2009-11-05 Tim Englich + + * doc/conf/queries.properties: + Added new Queries to fill the Lists for the + Regionfilters and one Query to select only those Meshes + which are within an Region. + + * doc/conf/products/verticalprofile/conf_mesh.xml, + doc/conf/products/verticalcrosssection/conf_mesh.xml, + doc/conf/products/timeseries/conf_mesh.xml, + doc/conf/products/horizontalprofile/conf_mesh.xml, + doc/conf/products/horizontalcrosssection/conf_mesh.xml: + Added the RegionFilters into the configuration of the Products + for Meshes. + +2009-11-05 Tim Englich + + * src/test/ressources/*_describe.xml: + Added the DescribeRequestBodies to each TestCaseData. + * src/test/java/de/intevation/gnv/artifacts/GNVArtifactsTestCase.java: + Added the DescribeRequestBody to Describe-Calls in the Test + * src/main/java/de/intevation/gnv/transition/TransitionBase.java: + Added the possibility to switch to an alternative Transition if no value was choosen. + + * src/main/java/de/intevation/gnv/utils/InputValidator.java (isInputValid): + Added that the Inputvalue is valid if it fullfills the confitions of "no value choosen" (n/n) + + * src/main/java/de/intevation/gnv/statistics/HorizontalProfileStatistics.java (calculateXOrdinateValue): + Added Dummyvalue for X-OrdinateValue + src/main/java/de/intevation/gnv/timeseries/TimeSeriesArtifact.java (describe), + src/main/java/de/intevation/gnv/profile/verticalcrosssection/VerticalCrossSectionMeshArtifact.java (describe), + src/main/java/de/intevation/gnv/profile/vertical/VerticalProfileArtifact.java (describe), + src/main/java/de/intevation/gnv/profile/horizontalcrosssection/HorizontalCrossSectionMeshArtifact.java (describe), + src/main/java/de/intevation/gnv/profile/horizontal/HorizontalProfileArtifact.java (describe), + src/main/java/de/intevation/gnv/artifacts/fis/FISArtifact.java (describe), + src/main/java/de/intevation/gnv/artifacts/GNVArtifactBase.java (createDescibeOutput): + Added the possibility to exclude the UI from the DescribeRequest. + +2009-11-03 Tim Englich + + * src/main/java/de/intevation/gnv/chart/ChartFactory.java (getTimeGapValue): + Integrated special case for TimeGaps in Meshes. There is no Gap defined in + Meshes so we have to use Long.MAXVALE to define a Gap for a Mesh which value + canno be reached. + +2009-11-02 Tim Englich + + * src/main/java/de/intevation/gnv/transition/profile/horizontalcrosssection/HorizontalCrossSectionMeshOutputTransition.java + (createCSV): Code Cleanup: Removed obsoled TODO Flag + + * src/main/java/de/intevation/gnv/transition/TransitionBase.java (setSelection): + Changed the Value of the min and maxvalue of the Request to the Value which is unsed to name + the Inputfields in the DescribeOutput. + + * src/main/java/de/intevation/gnv/transition/timeseries/TimeSeriesOutputTransition.java, + src/main/java/de/intevation/gnv/transition/profile/horizontal/NorthSouthEastWestTransition.java, + src/main/java/de/intevation/gnv/transition/Transition.java, + src/main/java/de/intevation/gnv/transition/SingleInputTransition.java, + src/main/java/de/intevation/gnv/transition/OutputTransitionBase.java, + src/main/java/de/intevation/gnv/transition/MinMaxTransition.java, + src/main/java/de/intevation/gnv/transition/DefaultTransition.java, + src/main/java/de/intevation/gnv/transition/CoordinateSelectionTransition.java, + src/main/java/de/intevation/gnv/artifacts/GNVArtifactBase.java (advance), + CodeCleanup: Removed needless Method validate from Transition, + because it had always returned true + +2009-10-30 Tim Englich + + * src/test/ressources/horizontalcrosssection_mesh/horizontalcrosssection_step_*.xml: + Added the Testdata for the Unittest for HorizontalCrossSectionMeshArtifacts. + * src/test/java/de/intevation/gnv/artifacts/GNVArtifactsTestCase.java (testHorizontalCrossSectionMeshArtifact): + Added the UnitTest-Case for HorizontalCrossSectionMeshArtifacts + +2009-10-30 Tim Englich + + * doc/conf/queries.properties: + Added the Query for selecting the Data for generating Outputs of + HorizontalCrossSectionMeshOutputTransition + * doc/conf/products/horizontalcrosssection/conf_mesh.xml: + Added the configuration for the HorizontalCrossSectionMeshOutputTransition + * src/main/java/de/intevation/gnv/transition/profile/horizontalcrosssection/HorizontalCrossSectionMeshOutputTransition.java: + Added the OutputTransition for generating /HorizontalCrossSections. + * src/main/java/de/intevation/gnv/statistics/HorizontalCrossSectionStatistics.java: + The Class for generating the Statistics to HorizontalCrossSections + * src/main/java/de/intevation/gnv/chart/HorizontalCrossSectionChartFactory.java: + The Class Stub for generating HorizontalCrossSections Charts. + +2009-10-29 Tim Englich + + Issue 45: Defining gaps for spatial and temporal gaps + + * doc/conf/products/timeseries/timegap_definition.xml, + doc/conf/products/timeseries/conf_timeseriespoint.xml: + Added the Configuration for TimeGaps to the TimeSeries-Configurations. issue45 + + * doc/conf/queries.properties: + Added TimeGapIp to the Queries for the Resultdata of TimeSeriesArtifacts. issue45 + + * src/main/java/de/intevation/gnv/timeseries/gap/DefaultTimeGap.java, + src/main/java/de/intevation/gnv/timeseries/gap/TimeGap.java, + src/main/java/de/intevation/gnv/transition/timeseries/TimeSeriesOutputTransition.java (setup): + src/main/java/de/intevation/gnv/chart/ChartFactory.java (calculateMaxGap): + Added configurable TimeGap Support to the TimeSeries-Chart-Generation. issue45 + + * src/main/java/de/intevation/gnv/artifacts/GNVArtifactBase.java, + src/main/java/de/intevation/gnv/utils/ArtifactXMLUtilities.java (readConfiguration): + Moved Method from GNVArtifactBase to make it assesible for more Objects. issue45 + +2009-10-28 Tim Englich + + * src/main/java/de/intevation/gnv/profile/horizontalcrosssection/ + HorizontalCrossSectionMeshArtifact.java (HorizontalCrossSectionMeshArtifact), + doc/conf/queries.properties, doc/conf/conf.xml, + doc/conf/products/horizontalcrosssection/conf_mesh.xml, + src/main/resources/lang/artifactMessages* .properties: + Added Workflow for determining the Query-Parameters for Horizontal cross-sections. + +2009-10-28 Tim Englich + + * doc/conf/conf.xml: + Added Configuration for two new FIS. Current Meter and Ice Station Reports + + * src/main/resources/lang/artifactMessages*.properties: + Added Ressources for two new FIS. Current Meter and Ice Station Reports + +2009-10-27 Tim Englich + + * doc/conf/conf.xml: + Added Configuration for two new FIS. Sea State and SEACAT + + * src/main/resources/lang/artifactMessages*.properties: + Added Ressources for two new FIS. Sea State and SEACAT + +2009-10-27 Tim Englich + + Issue 61: Vertical profile (Meshes): Selection of minimal and maximal + depths zones + + * src/main/resources/lang/artifactMessages*.properties: + Added Ressources for the minimal and maximal Layer to use in VerticalProfiles of Meshes issue61 + + * doc/conf/products/verticalprofile/conf_mesh.xml: + Added two new Transitions for selecting the min and max-Layer to use. issue61 + + * doc/conf/queries.properties: + Added Queries for Selecting the Depth for selecting the minimum and the maximum Layer to use + Drawing the Chart. issue61 + + * src/test/java/de/intevation/gnv/artifacts/GNVArtifactsTestCase.java (testVerticalProfileMeshArtifact): + Integrated two further Transitions-Steps according to changes in Workflow of + VerticalProfiles in Meshes. issue61 + + * src/test/ressources/verticalprofile_mesh/verticalprofile_step_*.xml: + New Testdata generated according to changes in Workflow of VerticalProfiles in Meshes. issue61 + +2009-10-26 Tim Englich + + Issue 31: TG_0020.018: Input of manual depth zones + + * src/main/resources/lang/artifactMessages_de_DE.properties: + Added Ressources for the minimal and maximal value of the depth + + * src/test/ressources/verticalprofile_instantaneouspoint/verticalprofile_step_05_out_statistics.xml (renamed), + src/test/ressources/verticalprofile_instantaneouspoint/verticalprofile_step_05_out_csv.xml (renamed), + src/test/ressources/verticalprofile_instantaneouspoint/verticalprofile_step_05_out_chart.xml(renamed), + src/test/ressources/verticalprofile_instantaneouspoint/verticalprofile_step_05_feed.xml, + src/test/ressources/verticalprofile_instantaneouspoint/verticalprofile_step_04_advance.xml, + src/test/ressources/verticalprofile_instantaneouspoint/verticalprofile_step_03_advance.xml, + src/test/ressources/verticalprofile/verticalprofile_step_05_out_statistics.xml(renamed), + src/test/ressources/verticalprofile/verticalprofile_step_05_out_csv.xml(renamed), + src/test/ressources/verticalprofile/verticalprofile_step_05_out_chart.xml(renamed), + src/test/ressources/verticalprofile/verticalprofile_step_05_feed.xml, + src/test/ressources/verticalprofile/verticalprofile_step_04_advance.xml, + src/test/ressources/verticalprofile/verticalprofile_step_03_advance.xml, + src/test/java/de/intevation/gnv/artifacts/GNVArtifactsTestCase.java: + Edited the RestCases for VerticalProfiles according to the requirement that + the user should be able to enter the minimal and maximal Value of the depth that + should be show n in the charts. issue31 + + * doc/conf/queries.properties, + doc/conf/products/verticalprofile/conf_timeseriespoint.xml, + doc/conf/products/verticalprofile/conf_instantaneouspoint.xml: + Adding required Configuration-Parts to get the possible to enter the minmum + and maximum depth value that should be shown in the charts. issue31 + +2009-10-23 Tim Englich + + * src/test/ressources/timeseries_mesh/timeseries_step_07_feed.xml: + The Timeperiod of the Modeldata has changed. so it was nessessarry to change + the Unittest to get propper Results + +2009-10-23 Tim Englich + + * doc/conf/queries.properties: + Some Queryimproofments done. Inner-Selects has been removed where it was possible. + +2009-10-23 Tim Englich + + Issue 3: Artifact: Storing the internal state instead of results + + * src/main/java/de/intevation/gnv/artifacts/GNVArtifactBase.java, + src/main/java/de/intevation/gnv/timeseries/TimeSeriesArtifact.java (describe), + src/main/java/de/intevation/gnv/profile/verticalcrosssection/VerticalCrossSectionMeshArtifact.java (describe), + src/main/java/de/intevation/gnv/profile/vertical/VerticalProfileArtifact.java (describe), + src/main/java/de/intevation/gnv/profile/horizontal/HorizontalProfileArtifact.java (describe): + Use super.identifier as uuid. issue3 + +2009-10-23 Tim Englich + + * src/test/ressources/verticalprofile/verticalprofile_step_04_feed.xml, + src/test/ressources/verticalprofile/verticalprofile_step_03_advance.xml, + src/test/ressources/verticalprofile/verticalprofile_step_04_out_*.xml, + src/test/ressources/timeseries_mesh/timeseries_step_07_out_*.xml, + src/test/ressources/horizontalProfile_instantaneouspoint/horizontalprofile_step_06_out_*.xml: + Changed the uuid because the new Storage shows that there were different ones in one Testcase + + * src/main/java/de/intevation/gnv/transition/timeseries/TimeSeriesOutputTransition.java: + Put the UUID into the Resultlookup + + * src/main/java/de/intevation/gnv/transition/TransitionBase.java: + Removed the Storage of Results in the Object and put them into the ehcache + + * src/main/java/de/intevation/gnv/transition/Transition.java: + Removed some needless Methods that were not longer Required + + * src/main/java/de/intevation/gnv/transition/profile/horizontal/NorthSouthEastWestTransition.java + (advance), src/main/java/de/intevation/gnv/transition/SingleInputTransition.java + (purifyResult), src/main/java/de/intevation/gnv/transition/MinMaxTransition.java + (purifyResult), src/main/java/de/intevation/gnv/transition/CoordinateSelectionTransition.java + (extractKVP), src/main/java/de/intevation/gnv/timeseries/TimeSeriesArtifact.java + (describe), src/main/java/de/intevation/gnv/profile/verticalcrosssection/VerticalCrossSectionMeshArtifact.java + (describe), src/main/java/de/intevation/gnv/profile/vertical/VerticalProfileArtifact.java + (describe), src/main/java/de/intevation/gnv/profile/horizontal/HorizontalProfileArtifact.java + (describe), src/main/java/de/intevation/gnv/artifacts/GNVArtifactBase.java (uuid): + Lookup the Results from ehcache and centralize the Lookup to one methode. + +2009-10-23 Tim Englich + + * doc/conf/queries.properties: + Optimized Query horizontalprofile_instantaneouspoint_cruise because it is not warranted + that the name of an cruise is set. issue60 + +2009-10-22 Tim Englich + + * src/main/java/de/intevation/gnv/transition/CoordinateSelectionTransition.java + (extractKVP): Added the possiblility to fetch an further Column with + the alias Value to display it together with the Coordinatevalues + + * doc/conf/queries.properties: + Added the Coordinates to an Measuementpoint to display it. + + * doc/conf/products/verticalprofile/conf_instantaneouspoint.xml: + Change TransitionType for displaying Coordinatevalues aditionaly to + the Time of an Measurement + +2009-10-22 Tim Englich + + Issue 40: Instantiation of artifacts slow + + * doc/conf/conf.xml, doc/conf/products/*/conf_*.xml: + Split the Configuration of the ArtifactDatabase in several Configurationfiles. + For Each Product-Artifact one single File to make it easier to administer the System. + + * src/main/java/de/intevation/gnv/transition/TransitionFactory.java (createTransition), + src/main/java/de/intevation/gnv/transition/TransitionBase.java (setup), + src/main/java/de/intevation/gnv/transition/OutputTransitionBase.java (setup), + src/main/java/de/intevation/gnv/artifacts/fis/FISArtifact.java (setup): + Lookup of XML-Attributes was changed from XPath-lookup to direct + Access on the fetched Element to speed up the Artifactinstantiation issue40 + + * src/main/java/de/intevation/gnv/artifacts/GNVArtifactBase.java (getConfigurationFragment): + Read Configuration information for the Productartifact from a separat folder if an xlink:href + Attribute exists in tne Configurationnode of the Artifact. + This was inserted to speed up the Artifactinstantiation and to split the Configuration + in several Configurationfiles that where smallaer issue40 + Also the lookup of XML-Attributes was changed from XPath-lookup to direct + Access on the fetched Element + +2009-10-21 Tim Englich + + Issue 59: Added relative pathnames to central config document + + * doc/conf/conf.xml: + Added relative locations for further required configurationfiles . issue59 + * src/main/java/de/intevation/gnv/artifacts/context/GNVArtifactContextFactory.java (createArtifactContext): + Added the prossibility to configure the location of required configurationfiles not absolute. issue59 + +2009-10-21 Tim Englich + + * doc/conf/arcsdeconnectionpool.properties: + Added separat ConnectionPoolProperties to this Project. + * doc/conf/*: + Moved ConfigurationFiles from src/test/ressources to doc/conf + * src/test/java/de/intevation/gnv/artifacts/GNVArtifactsTestCase.java (configurationDir): + Changed Configuration Folder to doc/conf + +2009-10-20 Tim Englich + + * doc/conf: + Added Folder for the Configuration of the gnv-artifacts. + +2009-10-20 Tim Englich + + * src/test/java/de/intevation/gnv/artifacts/GNVArtifactsTestCase.java (testVerticalCrossSectionMeshArtifact): + Added Testcase for testing the Workflow for generating VerticalCrossSections. + * src/test/ressources/queries.properties: + Added the required Queries for providing VerticalCrossSection using Meshes. + * src/test/ressources/conf.xml: + Added the Configuration for an VerticalCrossSection using Meshes. + * src/test/ressources/verticalcrosssection_mesh/verticalcrosssection_step_*.xml: + Adding Requestdocuments for testing the Workflow of Generating an VerticalCrossSection. + * src/main/java/de/intevation/gnv/transition/profile/verticalcrosssection/VerticalCrossSectionOutputTransition.java : + Added an OutputTransition for renedering the Data of VerticalCrossSections. + * src/main/java/de/intevation/gnv/profile/verticalcrosssection/VerticalCrossSectionMeshArtifact.java: + Added Class for the Representation of VerticalCrossSection Artifacts into the Project. + * src/main/java/de/intevation/gnv/chart/VerticalCrossSectionChartFactory.java (createProfileChart): + Put Class-Sub for the Chart generation of VerticalCrossSections into the Project. + +2009-10-20 Tim Englich + + Issue 54: Errors in diagramms for time series in IMIS + + * src/test/ressources/queries.properties: + Bugfix for TIMESERIESPOINT the first and the last value weren't used + in the Query which was integrated from the Prototyp to the Project + ussue54 + +2009-10-19 Tim Englich + + Issue 55: Harmoization of coordinate values for input fields + + * src/main/java/de/intevation/gnv/transition/TransitionBase.java (describe): + Added uniform Visualization of Single Input-Elements to MinMax-Elements. issue55 + +2009-10-19 Tim Englich + + Issue 56: Error - Behavior of a form without constraint values + + * src/main/java/de/intevation/gnv/artifacts/GNVArtifactBase.java (feed): + Catch Exception that the Calling Program could not put no InputData + into the feed Request.issue56 + +2009-10-19 Tim Englich + + Issue 19: Validation of date and double values + + * src/main/java/de/intevation/gnv/chart/ChartFactory.java (createDataset), + src/main/java/de/intevation/gnv/chart/VerticalProfileChartFactory.java (createDataset): + Adding empty Series into Chart to prevent NPE issue 19 + +2009-10-19 Tim Englich + + Issue 35: Wrong date values force the panel to start from beginning + + * src/main/java/de/intevation/gnv/transition/TransitionBase.java (putInputData): + Correct misspelled Exception-Message as an Result of fixing issue35 + +2009-10-19 Tim Englich + + Issue 50: Adding the layer number for depth information + + * src/test/ressources/queries.properties: + Changed the Value of Layer and Depth range visualization of Meshes + according to issue50 + +2009-10-19 Tim Englich + + Issue 47: Translation of strings for time series + + * src/main/resources/lang/artifactMessages*.properties: + Changed the displayed-Values as defined in issue47 + * src/test/ressources/conf.xml: + Changed the Key for the DataName of MIN-Max-Transitions to put a propper Name + into the UI-Describeoutput issue47 + * src/main/java/de/intevation/gnv/transition/TransitionBase.java (describe): + Added the X-Forms-Group-Element to surround the MinMaxDescibeObject-output to Give the + Group of Objects a propper Name issue47 + * src/main/java/de/intevation/gnv/transition/MinMaxTransition.java (purifyResult): + Added the name of the Data to the MinMaxDescibeObject to put it into the UI-output + +2009-10-16 Tim Englich + + Issue 53: Changing of strings in parameter panel + + * src/test/ressources/timeseries_mesh/timeseries_step_05_feed.xml: + src/test/ressources/conf.xml: + src/main/resources/lang/artifactMessages*.properties: + Conformation to the tanslation of the MeshObjects issue53 + +2009-10-16 Tim Englich + + Issue 49: Integration of FIS to Meshes + + * src/test/ressources/queries.properties: + There are different FIS in the Relation Median.Mesh so it is + nessessary to sepcify which FIS should be selected by using the sourceid + issue49 + * src/test/ressources/conf.xml: + Adding two further FIS to the Configuration which are based on Meshes. + Added the Sourceid to the ModelData issue49 + * src/main/resources/lang/artifactMessages*.properties: + Adding the Names of the two new FIS to the Propertiesfiles issue49 + +2009-10-16 Tim Englich + + * src/main/java/de/intevation/gnv/chart/HorizontalProfileChartFactory.java (createXYSeries): + Adding 5% bigger Valuearea to the Chart according to GT0030.011 + +2009-10-16 Tim Englich + + * src/main/java/de/intevation/gnv/transition/profile/vertical/VerticalProfileOutputTransition.java (VerticalProfileOutputTransition): + Changed Domainlable for Verticalprofiles according to the Specification GT_0030.005 + * src/test/java/de/intevation/gnv/artifacts/util/DistanceCalculatorTestCase.java (testDistanceCalculator): + Added Testcase for the DistanceCalculation + * src/main/java/de/intevation/gnv/chart/HorizontalProfileChartFactory.java (createXYSeries): + * src/main/java/de/intevation/gnv/utils/DistanceCalculator.java (calculateDistance): + Added Calculation of the Distance in the unit km for Geodetic-Coordinates according to the Specification GT_0030.005 + * src/main/java/de/intevation/gnv/transition/profile/horizontal/HorizontalProfileOutputTransition.java (HorizontalProfileOutputTransition): + Changed Domainlable for Horizintalprofiles according to the Specification GT_0030.005 + +2009-10-16 Tim Englich + + * src/test/ressources/queries.properties: + The Levelnumber of Meshes will also be visualized in the choose of depth GT_0020.0020 + +2009-10-16 Tim Englich + + * src/test/ressources/conf.xml: + Added Coordinate-Values to Title of the TimeseriesDiagramm for Meshes + +2009-10-16 Tim Englich + + * src/main/java/de/intevation/gnv/transition/OutputTransitionBase.java (putInputData): + Bugfix ChartValues were not Recalculated after feed was called second Time. + +2009-10-16 Tim Englich + + * src/test/ressources/conf.xml: + Bugfix in MinMaxTransition the Maxvalue was not the correct Value. + +2009-10-16 Tim Englich + + Issue 38: Horizontal profiles: Visualization of distances in km + + * src/main/java/de/intevation/gnv/transition/CoordinateSelectionTransition.java (convert2DisplayCoordinate): + Added Transformation from WKT-Coordinate Reperesentation to BSH-Coordinate Representation. issue38 + +2009-10-15 Tim Englich + + * src/main/java/de/intevation/gnv/chart/HorizontalProfileChartFactory.java, + src/main/java/de/intevation/gnv/chart/VerticalProfileChartFactory.java, + src/main/java/de/intevation/gnv/transition/profile/horizontal/HorizontalProfileOutputTransition.java, + src/main/java/de/intevation/gnv/transition/profile/vertical/VerticalProfileOutputTransition.java, + src/main/java/de/intevation/gnv/transition/timeseries/TimeSeriesOutputTransition.java, + src/test/ressources/queries.properties, src/test/ressources/conf.xml: + Added missing Class Description Values to the Horizontal Profile Charts + +2009-10-15 Tim Englich + + * src/main/java/de/intevation/gnv/transition/timeseries/TimeSeriesOutputTransition.java (getFisName): + Added Method for lookup FIS Names + * src/main/resources/lang/artifactMessages*.properties: + Added further Key-Value-Pairs for FIS + * src/test/ressources/conf.xml: + Changed Configuratioon to get the ID of an FIS to the Chartgeneration + +2009-10-15 Tim Englich + + * src/test/java/de/intevation/gnv/artifacts/GNVArtifactsTestCase.java (testHorizontalProfileMeshPointArtifact): + Activate Tests for CSV and Statistics on HorizontalProfiles + + * + src/main/java/de/intevation/gnv/transition/profile/horizontal/HorizontalProfileOutputTransition.java + (createCSV), + src/main/java/de/intevation/gnv/transition/timeseries/TimeSeriesOutputTransition.java + (createCSV): + Integrated special CSV-Export for HorizontalProfiles + +2009-10-14 Tim Englich + + * src/main/java/de/intevation/gnv/chart/HorizontalProfileChartFactory.java (createXYSeries): + Load WKT from ResultSet and calculate Distance to last point. + * src/test/ressources/queries.properties: + Switch Chart-Queries to Spatial-Queries. + +2009-10-13 Tim Englich + + Issue 33: Improved logging for time-interval queries + + * src/test/ressources/queries.properties, + src/test/ressources/conf.xml: + Added Parameter-Usage in Time-Interval-Query ISSUE-33 + +2009-10-13 Tim Englich + + * src/test/ressources/verticalprofile_mesh/verticalprofile_step_*_feed.xml, + src/test/ressources/horizontalProfile_mesh/horizontalprofile_step_*_feed.xml: + Switched to Szenario where it is possible to select Data using the Coordinate. + * src/test/ressources/conf.xml, + src/test/ressources/queries.properties: + Switched to SFS-Conformant-Queries in HorzintalProfile- and VerticalProfile-Mesh + +2009-10-13 Tim Englich + + * src/main/resources/lang/artifactMessages_*.properties: + Switched to better Description of an Coordinate-Input-Field + + * src/test/ressources/timeseries_mesh/timeseries_*_feed.xml: + Switched to Szenario where it is possible to select Data using the Coordinate. + + * src/test/ressources/queries.properties, src/test/ressources/conf.xml: + Switched to SFS-Conformant-Queries in Timeseries-Mesh + + * pom.xml: + Added dependency to JTS 1.9 + + * src/main/java/de/intevation/gnv/utils/exception/ValidationException.java + (ValidationException), src/main/java/de/intevation/gnv/utils/InputValidator.java + (getPointValue), src/main/java/de/intevation/gnv/transition/TransitionBase.java + (prepareInputData4RegionDBQuery): + Added the Support for specialized Handling of InputValues of type Coordinate. + + * src/main/java/de/intevation/gnv/transition/CoordinateSelectionTransition.java: + Added Transition for the Support of Coordinateinput handling. + +2009-10-12 Sascha L. Teichmann + + * src/main/java/de/intevation/gnv/artifacts/context/GNVArtifactContextFactory.java: + Closed small file descriptor leak. + +2009-10-09 Tim Englich + + * src/main/java/de/intevation/gnv/**/*.java Edited: + Code Formatting and Cleanup. + +2009-10-09 Tim Englich + + * src/test/ressources/queries.properties Edited: + Add Parameters to the Queries to select only the Dates where + the Parameters has been measured. + * src/test/ressources/conf.xml Edited: + Set that the ParameterIds should be used in the Query of the Dates. + +2009-10-07 Sascha L. Teichmann + + RELEASE 0.1 + + * Changes, NEWS: Summarized changes. + +2009-10-06 Tim Englich + + * src/main/java/de/intevation/gnv/transition/profile/horizontal/HorizontalProfileOutputTransition.java (HorizontalProfileOutputTransition) Edited : + Switch Lable-Value for Domain-Axis. + * src/main/java/de/intevation/gnv/artifacts/ressource/RessourceFactory.java (getRessource) Edited: + Added missing Import + * src/main/java/de/intevation/gnv/transition/profile/horizontal/NorthSouthEastWestTransition.java (advance) Edited: + Added i18n Support + * src/main/resources/lang/artifactMessages*.properties Edited: + Added some missing RessourceValues + +2009-10-06 Sascha L. Teichmann + + * src/test/ressources/verticalprofile_instantaneouspoint/verticalprofile_step_04_out_csv.xml, + src/test/ressources/conf.xml, + src/test/ressources/timeseries_mesh/timeseries_step_07_out_csv.xml, + src/test/ressources/verticalprofile_mesh/verticalprofile_step_06_out_csv.xml, + src/test/ressources/horizontalProfile_mesh/horizontalprofile_step_08_out_csv.xml, + src/test/ressources/verticalprofile/verticalprofile_step_04_out_csv.xml: + s@test/plain@text/plain@g to correct MIME type of CSV export + +2009-10-06 Sascha L. Teichmann + + * src/main/java/de/intevation/gnv/artifacts/ressource/*.properties: + Deleted. + + * src/main/resources/lang/*.properties: Re-inserted here. Maven now + includes them in the jar package. + + * src/main/java/de/intevation/gnv/artifacts/ressource/RessourceFactory.java: + Make code more robust. TODO: We need a better implementation here. + + * Changelog -> ChangeLog: To make eclipse happy. Unified changelog style. + + * pom.xml: xmllint-ed and set encoding of filtered resources to UTF-8 + +2009-10-06 Tim Englich + + * src/test/ressources/queries.properties Edited: + Bugfix in Query for getting Data for the Output. + Now the Values will be sorted Correcly. Timevalue + has been removed from the Query because it is not a + Parameter which could be choosen from the User. + Also dummies for XCOORD-Value and YCOORD-Value integrated so + that is now Possible to visualize the Profile + gnv/issue21 + +2009-10-05 Tim Englich + + * src/main/java/de/intevation/gnv/artifacts/ressource/artifactMessages*.properties Edited: + Added further Ressourec Values. + * src/test/java/de/intevation/gnv/artifacts/GNVArtifactsTestCase.java (testVerticalProfileInstantaneousPointArtifact) Edited: + Changed ArtifactName to real FIS. + * src/test/ressources/timeseries_mesh/timeseries_step_01_feed.xml Edited: + Changed Product-Name from timeSeriesMesh to timeSeries to provide a General-Naming-Structure + * src/main/java/de/intevation/gnv/transition/timeseries/TimeSeriesOutputTransition.java (setup) Edited, + src/main/java/de/intevation/gnv/transition/profile/horizontal/HorizontalProfileOutputTransition.java Edited, + src/main/java/de/intevation/gnv/transition/profile/vertical/VerticalProfileOutputTransition.java Edited: + Added Configurationsupport for the Labeling Data. Now it is possible do define the + value-names in the Configurationfile. + * src/test/ressources/verticalprofile_instantaneouspoint/verticalprofile_step_03_feed.xml Edited, + src/test/ressources/verticalprofile_instantaneouspoint/verticalprofile_step_02_feed.xml Edited, + src/test/ressources/queries.properties Edited: + Changed the Queries for the VerticalProfileInstantaneusPoint to the FIS-Query Mode. + This Mode was send by Mr. Schulz-Ohlberg. + * src/test/ressources/conf.xml: + Changed the Workflow for the VerticalProfileInstantaneusPoint to the FIS-Query Mode. + This Mode was send by Mr. Schulz-Ohlberg. + Also Added the support for value-names to the Configuration of VerticalProfileInstantaneusPoint. + +2009-10-05 Tim Englich + + * src/main/java/de/intevation/gnv/artifacts/ressource/artifactMessages_en.properties Renamed: + Renamed from artifactMessages_en_EN.properties to artifactMessages_en.properties to get a + propper support for PreferedLocale + * src/main/java/de/intevation/gnv/artifacts/ressource/RessourceFactory.java (getRessource) Edited, + * src/test/java/de/intevation/gnv/artifacts/ressource/RessourceFactoryTestCase.java (setUp) Edited, + * src/main/java/de/intevation/gnv/transition/TransitionBase.java (describe) Edited, + * src/main/java/de/intevation/gnv/artifacts/fis/FISArtifact.java (createSelectBox) Edited: + Changed Method Signature from Locale to PreferedLocale[] to put all Useable Languages to + the RessourceFactory + +2009-10-02 Tim Englich + + * src/test/java/de/intevation/gnv/artifacts/ressource/RessourceFactoryTestCase.java Added: + TestCase for Testing the RessourceFactory + + * src/main/java/de/intevation/gnv/artifacts/ressource/artifactMessages*.properties Added, + src/main/java/de/intevation/gnv/artifacts/ressource/RessourceFactory.java Added: + Added Factory and Propertiesfiles for getting the localized Values + + * src/main/java/de/intevation/gnv/transition/timeseries/TimeSeriesOutputTransition.java Edited, + src/main/java/de/intevation/gnv/transition/profile/horizontal/NorthSouthEastWestTransition.java Edited, + src/main/java/de/intevation/gnv/transition/TransitionBase.java Edited, + src/main/java/de/intevation/gnv/transition/Transition.java Edited, + src/main/java/de/intevation/gnv/transition/OutputTransitionBase.java Edited, + src/main/java/de/intevation/gnv/transition/OutputTransition.java Edited, + src/main/java/de/intevation/gnv/timeseries/TimeSeriesArtifact.java Edited, + src/main/java/de/intevation/gnv/profile/vertical/VerticalProfileArtifact.java Edited, + src/main/java/de/intevation/gnv/profile/horizontal/HorizontalProfileArtifact.java Edited, + src/main/java/de/intevation/gnv/artifacts/fis/FISArtifact.java Edited, + src/main/java/de/intevation/gnv/artifacts/GNVArtifactBase.java Edited: + LanguageSupport Integrated + + * src/test/java/de/intevation/gnv/artifacts/GNVArtifactsTestCase.java (createCallContext) Edited: + Extracted Method and Put CallMeta with Language German to the CallContext. Otherwise + TestCase will produce NPEs. + * src/test/java/de/intevation/gnv/artifacts/TestCallContext.java Edited: + Added Real CallMeta to the Method for usage in Artifacts. Otherwise + TestCase will produce NPEs. + * src/test/ressources/horizontalProfile_mesh/horizontalprofile_step_02_feed.xml Edited, + src/test/ressources/timeseries_mesh/timeseries_step_02_feed.xml Edited, + src/test/ressources/verticalprofile_mesh/verticalprofile_step_02_feed.xml Edited, + src/test/ressources/conf.xml Edited: + Changed som Identifiers for Localisation. + +2009-10-02 Tim Englich + + * src/test/ressources/conf.xml Edited: + Added the Configuration of the Horizontal-Profile.Mesh. + Also Edited the Workflowq for HorizontalProfile-Instantaneouspoint and + Put three n ew FIS into the Configuration which represents HorizontalProfile-Instantaneouspoint. + * src/test/ressources/horizontalProfile_instantaneouspoint/*.xml Edited, + src/test/java/de/intevation/gnv/artifacts/GNVArtifactsTestCase.java (testHorizontalProfileInstantaneousPointArtifact) Edited: + Edited the Workflowlogic given by new Specification of the BSH. + * src/test/ressources/horizontalProfile_mesh/*.xml Added: + The Request for do an Workflow for an HorizontalProfile-Mesh + * src/test/java/de/intevation/gnv/artifacts/GNVArtifactsTestCase.java (testHorizontalProfileMeshPointArtifact) Edited: + Added TestCase for HorizontalProfiles of Type Mesh. + * src/test/java/de/intevation/gnv/artifacts/TestCallContext.java (getMeta) Edited: + Added new Method which is defined in the implemented Interface. + * src/main/java/de/intevation/gnv/utils/InputValidator.java (isInputValid) Edited: + Added the Validation of InputValues from Type AttributeName which should represent + an QueryValue of Type String which must not put into "'". + * src/main/java/de/intevation/gnv/transition/profile/horizontal/NorthSouthEastWestTransition.java Added: + Transition to provide the possibility of choosing the axis of an Grid that should be used. + * src/main/java/de/intevation/gnv/transition/TransitionBase.java (dataMultiSelect) Edited: + Changed from private to protected so that this mMeber could be accessed by within extending Classes. + * src/main/java/de/intevation/gnv/profile/horizontal/HorizontalProfileMeshArtifact.java Added: + Class for the Representation of Horizontal Profiles for the Type Mesh. + * src/main/java/de/intevation/gnv/chart/HorizontalProfileChartFactory.java (HorizontalProfileChartFactory) Edited: + Changed PlotOrientation so that the Profile is displayed correctly. + * src/main/java/de/intevation/gnv/artifacts/GNVArtifactBase.java (advance) Edited: + Added Log-Message for better Workflowanalyzis. + +2009-10-01 Sascha L. Teichmann + + * src/main/java/de/intevation/gnv/artifacts/fis/FISArtifact.java, + src/main/java/de/intevation/gnv/artifacts/GNVArtifactBase.java, + src/main/java/de/intevation/gnv/utils/ArtifactFactoryUtilities.java, + src/main/java/de/intevation/gnv/timeseries/TimeSeriesArtifact.java, + src/main/java/de/intevation/gnv/transition/MinMaxTransition.java, + src/main/java/de/intevation/gnv/transition/profile/vertical/VerticalProfileOutputTransition.java, + src/main/java/de/intevation/gnv/statistics/TimeseriesStatistics.java: + Removed needless imports. + + * src/main/java/de/intevation/gnv/utils/InputValidator.java: + Import org.apache.commons.validator.GenericValidator instead of + absolute usage in methods. + +2009-09-30 Tim Englich + + * src/test/ressources/queries.properties Edited: + Added the Queries for HorizontalProfiles of InstantaneousPoints. + * src/test/ressources/conf.xml Edited: + Added the Configuration for HorizontalProfilArtifact for InstantaneousPoints + * src/test/ressources/horizontalProfile_instantaneouspoint/*.xml Added: + Added XML-Requests for the TestCase of HorizontalProfiles of InstantaneousPoints. + * src/test/java/de/intevation/gnv/artifacts/GNVArtifactsTestCase.java (testHorizontalProfileInstantaneousPointArtifact) Edited: + Added TestCase for HorizontalProfiles of InstantaneousPoints. + +2009-09-30 Tim Englich + + * src/main/java/de/intevation/gnv/utils/InputValidator.java (isInputValid) Edited: + Added the Validation for Double-Values. + * src/main/java/de/intevation/gnv/transition/profile/vertical/VerticalProfileOutputTransition.java (createChart) Edited: + The Name of the Method for generaing Charts has changed. + * src/main/java/de/intevation/gnv/transition/profile/horizontal/HorizontalProfileOutputTransition.java Added: + New outputTransition for HorizontalProfiles + * src/main/java/de/intevation/gnv/statistics/HorizontalProfileStatistics.java Added: + Class which calculates the Statistics for Horizontal Profiles. + * src/main/java/de/intevation/gnv/profile/horizontal/HorizontalProfileInstantaneousPointArtifact.java Added, + * src/main/java/de/intevation/gnv/profile/horizontal/HorizontalProfileArtifact.java Added: + Classes which represents HorizontalProfileArtifacts + * src/main/java/de/intevation/gnv/chart/VerticalProfileChartFactory.java (plotOrientation) Edited: + Added Member for the representation of the Plotorientation to overwrite it in + extende Classes + Rename Method for generatim the Charts in a common Name. + * src/main/java/de/intevation/gnv/chart/HorizontalProfileChartFactory.java Added: + Class for drawing Horzontal Profiles + +2009-09-30 Sascha L. Teichmann + + * src/test/ressources/conf.xml: s@test/xml@text/xml@g + +2009-09-29 Tim Englich + + * src/test/java/de/intevation/gnv/artifacts/GNVArtifactsTestCase.java (doNextStep) Edited: + Add Responsevalidation for feed-Requests. + * pom.xml Edited: + Add required Library ORO to the Dependencies which is required by Commons-Validator + to do matchRegexp Requests. + * src/main/java/de/intevation/gnv/utils/InputValidator.java (isInputValid) Edited: + Add a Validator for the type Point + * src/test/ressources/conf.xml Edited: + Changed mesh_coordinate from type Integer to type Point + +2009-09-29 Tim Englich + + * src/main/java/de/intevation/gnv/chart/VerticalProfileChartFactory.java (findValueTitle): + Key of KeyValueDescribeData is a String. So it is not nessessary to parse the + id into an Integer Value. + Also some NP-Access removed. + +2009-09-29 Tim Englich + + * src/test/java/de/intevation/gnv/artifacts/GNVArtifactsTestCase.java Edited: + Some Coderedundances refactored. + +2009-09-29 Tim Englich + + * src/test/ressources/queries.properties Edited: + Bug fixed: Mesh TimeSeries will now Handle Charts with multiple Depth-Values properly. + +2009-09-29 Tim Englich + + * src/test/ressources/timeseries_mesh/*.xml Added : + TestCaseRequests for Timeseries FIS Mesh + * src/test/java/de/intevation/gnv/artifacts/GNVArtifactsTestCase.java (testTimeSeriesMeshArtifact) Edited: + Add Testcase for Timeseries Mesh + +2009-09-29 Tim Englich + + * src/test/java/de/intevation/gnv/artifacts/GNVArtifactsTestCase.java (check4ExceptionReport) edited: + ExceptionTest for Responsdocuments added. + UnitTest will now fail if the Artifact delivers an ExceptionReport using the advance Request. + +2009-09-29 Tim Englich + + * src/test/java/de/intevation/gnv/artifacts/GNVArtifactsTestCase.java (testVerticalProfileMeshArtifact) Edited: + Added TestCase for Vertical Profiles for Mesh + * src/test/ressources/verticalprofile_mesh/*.xml Added: + TestCaseRequests for VerticalProfile FIS Mesh + +2009-09-29 Tim Englich + + * src/main/java/de/intevation/gnv/utils/InputValidator.java (isInputValid) Edited: + Bugfix: Remove leading- and trailingwhitspaces from Date- and Integervalues + +2009-09-29 Tim Englich + + * src/test/java/de/intevation/gnv/artifacts/GNVArtifactsTestCase.java (testVerticalProfileArtifact): + (testVerticalProfileInstantaneousPointArtifact) Edited: + Added Testcases for VerticalProfile and VerticalProfile Instantaneouspoint + * src/test/ressources/verticalprofile_instantaneouspoint/*.xml Added: + TestCaseRequests for VerticalProfile Instantaneouspoint + * src/test/ressources/verticalprofile/*.xml Added: + TestCaseRequests for VerticalProfile FIS Marnet + +2009-09-29 Tim Englich + + * src/test/ressources/queries.properties Edited: + Remove to_date from TimeSeries-Quueries becaus of Changes in the conf.xml-File + * src/test/ressources/conf.xml Edited: + Correct Types for min- and max-Values from Integer to Date + * src/test/java/de/intevation/gnv/artifacts/GNVArtifactsTestCase.java (testTimeSeriesArtifact) Edited: + Add CallContext to the Tests. + * src/test/java/de/intevation/gnv/artifacts/TestCallContext.java Add: + A CallContext used only in Junit-Tests + +2009-09-29 Tim Englich + + * pom.xml Edited: + Added the dependency to Apache-Commons-Validator Version 1.3.1 which is + used for the InputValoue-validation. + * src/main/java/de/intevation/gnv/utils/InputValidator.java Added : + An InputValidator for Validating InputValues. + At this Moment only Integer, String and Date is supported. + * src/main/java/de/intevation/gnv/transition/TransitionBase.java (putInputData) Edited: + Add the InputValidator to validate the incomming Values from the Clients. + +2009-09-28 Tim Englich + + * src/main/java/de/intevation/gnv/chart/ChartFactory.java (createTimeSeries) Edited: + Performanceimprovement: The Loop will be interrupted if the Pointer is bigger than the + last Pointer of the Value that must be visualised. + +2009-09-28 Tim Englich + + * pom.xml Edited: + Added the Dependeny to the ehcache-Library + * src/test/ressources/ehcache.xml Added: + The ehcache-Configuration. + * src/test/ressources/conf.xml Edited: + Added the Link to the ehcache-Configuration. + * src/main/java/de/intevation/gnv/artifacts/context/GNVArtifactContextFactory.java (createArtifactContext) Edited: + Added the Initialisation of the CacheManager. + + * src/main/java/de/intevation/gnv/artifacts/cache/CacheFactory.java Added: + An Fractoryimplementation for the central access to the Cache. + + * src/main/java/de/intevation/gnv/transition/MinMaxTransition.java (purifyResult) Edited, + * src/main/java/de/intevation/gnv/transition/SingleInputTransition.java (purifyResult) Edited, + * src/main/java/de/intevation/gnv/transition/Transition.java Edited, + * src/main/java/de/intevation/gnv/transition/TransitionBase.java Edited, + * src/main/java/de/intevation/gnv/artifacts/GNVArtifactBase.java Edited: + Signature of Methods purifyResults, advanced and feed Changed to put the uuid to the Transition + * src/main/java/de/intevation/gnv/transition/profile/vertical/VerticalProfileOutputTransition.java (createChart) Edited: + Methodsignatur of getChartResult change for putting the uuid of an Artifact into it + * src/main/java/de/intevation/gnv/transition/OutputTransition.java (out) Edited, + src/main/java/de/intevation/gnv/transition/timeseries/TimeSeriesOutputTransition.java (out) Edited: + Method Signature Changed for putting the uuid of an Artifact to the Transition. + stored + * src/main/java/de/intevation/gnv/transition/OutputTransitionBase.java Edited: + removed the persitence of the Chartresults and put them into an Cache instance. + +2009-09-28 Tim Englich + + * src/main/java/de/intevation/gnv/transition/timeseries/TimeSeriesOutputTransition.java (getStatisticsGenerator) Edited: + Extracted the Instantiation of the Statistics-object to an protected Methode + to make it possible that extending Classes could change it. + * src/main/java/de/intevation/gnv/transition/profile/vertical/VerticalProfileOutputTransition.java (getStatisticsGenerator) Edited: + Overwrite getStatisticsGenerator to instantiate the VerticalProfileStatistics- + * src/main/java/de/intevation/gnv/statistics/VerticalProfileStatistics.java Added: + Class for Calculating Statistics for VerticalProfiles- The Only thing whisch differs to + TimeSeriesStatists is that the XoordinateValue is an double and not an Date-Value + * src/main/java/de/intevation/gnv/statistics/TimeseriesStatistics.java (calculateXOrdinateValue) Edited: + Added the Methode calculateXOrdinateValue to this Class to switch is Values in extending Classes. + * src/main/java/de/intevation/gnv/statistics/Statistics.java (calculateStatistics) Edited: + Added methodsignature to Interface for usage in different Implementations of Statistics. + +2009-09-28 Tim Englich + + * src/main/java/de/intevation/gnv/statistics/TimeseriesStatistics.java (calculateStatistics) Edited: + Bug fixed. Now all Values will be used to calculate the Statistics + +2009-09-28 Tim Englich + + * src/test/ressources/conf.xml Edited : + Changed the Output-format of Statistics from text/plain to text/xml. + +2009-09-28 Tim Englich + + * src/main/java/de/intevation/gnv/statistics/TimeseriesStatistics.java Edited: + Moved the calculating-Methods from the Conmstructor to an separat Method. + Switched the ResultContainer from Array to Collection + * src/main/java/de/intevation/gnv/transition/timeseries/TimeSeriesOutputTransition.java (out) Edited: + Added the Output-Variante for generating Statistics + +2009-09-28 Tim Englich + + * pom.xml Edited: + Added Link to Apache-Commons-Math to get the required Classes for the calculation + of Statistics. + * src/main/java/de/intevation/gnv/statistics/exception/StatisticsException.java Added: + Specified ExceptionClass for the Statistics Part of the gnv-artifacts + * src/main/java/de/intevation/gnv/statistics/TimeseriesStatistics.java Edited: + Remove compileErrors and switch to new Datastructure + +2009-09-28 Tim Englich + + * src/main/java/de/intevation/gnv/statistics/Statistic.java Added , + src/main/java/de/intevation/gnv/statistics/Statistics.java Added , + src/main/java/de/intevation/gnv/statistics/TimeseriesStatistics.java Added: + Imported Statistics-Classes from old Project. Revision: 3101 Does not compile + +2009-09-25 Tim Englich + + * src/test/ressources/conf.xml Edited: + Added with and height Inputparameter to each Chart-OutputMode. + + * src/main/java/de/intevation/gnv/transition/timeseries/TimeSeriesOutputTransition.java (out) Edited: + Added the usage of the Parameters revieved from the client for the ChartRendering + + * src/main/java/de/intevation/gnv/transition/DefaultInputValue.java (DefaultInputValue) (getDefaultValue) Edited , + src/main/java/de/intevation/gnv/transition/InputValue.java (getDefaultValue) Edited: + Added the Method getDefaultValue to the Interface for getting the + deafultvalue of an Parameter. + + * src/main/java/de/intevation/gnv/transition/DefaultOutputMode.java Edited, + src/main/java/de/intevation/gnv/transition/OutputMode.java (getInputParameters) Edited: + Added the Method getInputParameters to the OutputMode for Handling the required Parameters + of an OutputMode. + + * src/main/java/de/intevation/gnv/transition/OutputTransition.java (out) Edited: + Put the InputParameter recived from the Client to the Methodsignature so that + they can be used during the outputprocessing. + + * src/main/java/de/intevation/gnv/transition/OutputTransitionBase.java Edited: + Read rquired Outputparameters from the Configuration + + * src/main/java/de/intevation/gnv/artifacts/GNVArtifactBase.java Edited: + Added support for Parameters in OutputNode of Describe-Artifact + +2009-09-24 Tim Englich + + * pom.xml Edited: + Added Library for CSV-Support + * src/main/java/de/intevation/gnv/transition/timeseries/TimeSeriesOutputTransition.java (out) Edited: + Add support for CSV-Export + * src/main/java/de/intevation/gnv/artifacts/GNVArtifactBase.java (out) Edited: + Add Fag on Context for storing the Artifact status after out. + +2009-09-24 Tim Englich + + * src/main/java/de/intevation/gnv/utils/ArtifactXMLUtilities.java (createSuccessReport) Edited: + Added a centraL Method for creating an Successreoprt. + * src/main/java/de/intevation/gnv/artifacts/GNVArtifactBase.java Edited, + src/main/java/de/intevation/gnv/artifacts/fis/FISArtifact.java Edited: + Add ResultReporting to the different Metshods of an Artifact + +2009-09-24 Tim Englich + + * src/main/java/de/intevation/gnv/chart/VerticalProfileChartFactory.java Edited: + Obsolet TODOs removed + * src/main/java/de/intevation/gnv/artifacts/GNVArtifactBase.java Edited, + src/main/java/de/intevation/gnv/artifacts/fis/FISArtifact.java Edited, + src/main/java/de/intevation/gnv/transition/TransitionBase.java Edited: + Create Exception Report added + * src/main/java/de/intevation/gnv/utils/ArtifactXMLUtilities.java (createExceptionReport) Edited: + Method for creating Exceptionreports added. + +2009-09-24 Tim Englich + + * src/test/ressources/queries.properties Edited: + Queries formatted so that they can be analysed and extended easier. + Some Bugs removed + +2009-09-24 Tim Englich + + * src/main/java/de/intevation/gnv/chart/VerticalProfileChartFactory.java Edited, + src/main/java/de/intevation/gnv/chart/ChartLabels.java Edited, + src/main/java/de/intevation/gnv/chart/ChartFactory.java Edited: + Removed obsolet Parameters an Methods. + Use the ChartLable to put the DomainAxisLable into the Chart. + + * src/main/java/de/intevation/gnv/transition/OutputTransitionBase.java Edited: + Some more Loggingoutput integrated. + Some Performanceimprovements done. The ResultData will only be refreshed if + the InputValues has changed. + Some Refactoring Work done. Move some Members into from extending Classes + into this implementation. + * src/main/java/de/intevation/gnv/transition/profile/vertical/VerticalProfileOutputTransition.java Edited, + src/main/java/de/intevation/gnv/transition/timeseries/TimeSeriesOutputTransition.java Edited: + Dummywerte fuer Diagrammgenerierung durch Echtwerte ersetzt. + Obsolete Uebergabeparameter entfernt. + +2009-09-23 Tim Englich + + * src/test/ressources/queries.properties Edited: + Statements for InstantaneousPoint Vertical Profiles added + * src/test/ressources/conf.xml Edited: + Configuration for Vertikal Profiles for InstantaneousPoints added + * src/main/java/de/intevation/gnv/profile/vertical/VerticalProfileInstantaneousPointArtifact.java (VerticalProfileInstantaneousPointArtifact) Added: + New Artifact-Class Reperesenting Artifacts for InstantaneousPoints Creating VerticalProfiles added. + +2009-09-23 Tim Englich + + * src/main/java/de/intevation/gnv/transition/TransitionBase.java (prepareInputData4DateDBQuery) Edited: + Bug Fixed, now all Inputvalues of String and Date will be put into the Query + +2009-09-23 Tim Englich + + * src/main/java/de/intevation/gnv/chart/VerticalProfileChartFactory.java (createXYSeries) Edited: + Bug fixed. Now all Values will be Renderd to the Chart + * src/main/java/de/intevation/gnv/profile/vertical/VerticalProfileMeshArtifact.java Added: + Artifact-class for VerticalProfile Mesh added + * src/main/java/de/intevation/gnv/transition/TransitionBase.java Edited: + Support for StringQuieries and OracleDateQueries added + * src/test/ressources/queries.properties Edited: + Queries for VerticalProfile Mesh integrated + * src/test/ressources/conf.xml Edited: + Artifact for VerticalProfile Mesh integrated + +2009-09-22 Tim Englich + + * src/test/ressources/queries.properties Edited: + Added Queries for the Workfloe of collecting the + required Information to generate a vertical Profile + * src/test/ressources/conf.xml Edited: + Added the Configuration of the VerticalProfileArtifact + * src/main/java/de/intevation/gnv/transition/timeseries/TimeSeriesOutputTransition.java (getCollection) Edited: + Some Codrefactoring done for reuse of Functionality in extended Classes. + * src/main/java/de/intevation/gnv/transition/profile/vertical/VerticalProfileOutputTransition.java Added: + Outputtransition for the Support of VerticalPropfiles + * src/main/java/de/intevation/gnv/transition/describedata/KeyValueDescibeData.java (getKey), + src/main/java/de/intevation/gnv/transition/describedata/DefaultKeyValueDescribeData.java (getKey) Edietd, + src/main/java/de/intevation/gnv/transition/TransitionBase.java (purifyResult) Edited: + Change KEY-Attribute of KeyValueDescribeData from Integer to String for the required + Representation of Date-KeyValue-Pairs + * src/main/java/de/intevation/gnv/profile/vertical/VerticalProfileArtifact.java Added: + ArtifactClass for the representation of VerticalProfiles + * src/main/java/de/intevation/gnv/artifacts/fis/FISArtifact.java (createSelectBox) Edited: + Added support for selected Products in static UI. + * src/main/java/de/intevation/gnv/chart/VerticalProfileChartFactory.java Added: + Factory for producing VerticalCharts added. + * src/main/java/de/intevation/gnv/chart/ChartFactory.java Edited: + Names of Getter for Columns Changed. + +2009-09-21 Tim Englich + + * src/test/ressources/queries.properties Edited: + Queryie for TimeSeriesMesh added. + * src/test/ressources/conf.xml Edited: + New Artifact representing the TimeSeries-Mesh added to the Configuration. + * src/main/java/de/intevation/gnv/transition/timeseries/TimeSeriesOutputTransition.java Edited: + Inputdata for the Chartgeneration will now be allocated by name and not by position in Transitionorder. + * src/main/java/de/intevation/gnv/transition/describedata/SingleValueDescribeData.java Added, + src/main/java/de/intevation/gnv/transition/describedata/DefaultSingleValueDescribeData.java Added, + src/main/java/de/intevation/gnv/transition/SingleInputTransition.java Added: + New Class for Representing a single Input Transition + * src/main/java/de/intevation/gnv/transition/TransitionBase.java Edited: + Added support of usage inputValues none or multiple times in Queries. + Added support for SingleInputTransitions in Describe-Output + * src/main/java/de/intevation/gnv/transition/InputValue.java Edited, + src/main/java/de/intevation/gnv/transition/DefaultInputValue.java Edited: + An InputValue now is possible to use none or multiple times in Queries. + * src/main/java/de/intevation/gnv/timeseries/TimeSeriesMeshArtifact.java Added: + ArtifactClass for the Representation of an Mesh-Timeseries-Artifact + +2009-09-17 Tim Englich + + * src/test/ressources/conf.xml Edited: + Database Cleanup Interval set to 5 minutes. + +2009-09-17 Tim Englich + * src/test/ressources/conf.xml Edited: + Some structurechanges done. + + * src/main/java/de/intevation/gnv/utils/ArtifactXMLUtilities.java Edited: + Fixed Bug supporting UTF-8 Documents properly. + * src/main/java/de/intevation/gnv/transition/describedata/DefaultKeyValueDescribeData.java Edited, + * src/main/java/de/intevation/gnv/transition/describedata/KeyValueDescibeData.java Edited, + Added Methods for setting and getting the selection-state of this objects. + + * src/main/java/de/intevation/gnv/transition/describedata/DefaultMinMaxDescribeData.java Edited, + src/main/java/de/intevation/gnv/transition/describedata/MinMaxDescribeData.java Edited: + Added setter for min an max-Values and getters an setters for minName and maxName + + * src/main/java/de/intevation/gnv/transition/describedata/NamedCollection.java Added, + src/main/java/de/intevation/gnv/transition/describedata/NamedArrayList.java Added: + Collection ans an Implementation of this Collection for Storing Name of the Collection and if + the Values in it are multiselectable. + + * src/main/java/de/intevation/gnv/transition/TransitionBase.java : + Static UI-Support and valid SelectionStorage added. + I added also an imporvement of the multiselect Methods for Datasets + * src/main/java/de/intevation/gnv/transition/MinMaxTransition.java Edited: + Storage of changed Values added + + * src/main/java/de/intevation/gnv/artifacts/fis/FISArtifact.java Edited: + Static UI Support Added + + +2009-09-16 Tim Englich + + * src/test/ressources/conf.xml Edited, + src/main/java/de/intevation/gnv/transition/TransitionBase.java (describe) Edited, + src/main/java/de/intevation/gnv/transition/InputValue.java (isMultiselect) Edited, + src/main/java/de/intevation/gnv/transition/InputData.java (concartValue) Edited, + src/main/java/de/intevation/gnv/transition/DefaultInputValue.java (isMultiselect) Edited, + src/main/java/de/intevation/gnv/transition/DefaultInputData.java (concartValue)Edited, + src/main/java/de/intevation/gnv/artifacts/fis/FISArtifact.java (createUserInterface) Edited, + src/main/java/de/intevation/gnv/artifacts/GNVArtifactBase.java (parseInputData) Edited: + Added Multiselectsupport for InputValues + +2009-09-16 Tim Englich + + * src/main/java/de/intevation/gnv/artifacts/GNVArtifactBase.java (setup) Edited: + Bug Fixed because of Infrastructure Changes in the Artifact-Module + + * src/main/java/de/intevation/gnv/transition/TransitionBase.java Edited: + Put only the last DescribeData to the UI-Output bnecause auf Renderingproblems in the Client + + * src/main/java/de/intevation/gnv/transition/describedata/DefaultKeyValueDescribeData.java Edited, + src/main/java/de/intevation/gnv/transition/describedata/DefaultMinMaxDescribeData.java Edited, + src/main/java/de/intevation/gnv/transition/describedata/KeyValueDescibeData.java Edited: + Made Interface Serializable, add UIDs to the Implementations of the Interface + +2009-09-15 Tim Englich + + * src/main/java/de/intevation/gnv/artifacts/fis/FISArtifact.java (createUserInterface) Edited: + Integrate UI-Representation for Describe into the FISArtifact. + * src/main/java/de/intevation/gnv/utils/ArtifactXMLUtilities.java (createXFormElement) Refactoring, + src/main/java/de/intevation/gnv/transition/TransitionBase.java (describe) Refactoring: + Extract the Element-Creation of XForms Nodes into a Common Class to make them available for + other Classes which have to create XForm-Fragments + +2009-09-14 Tim Englich + + * src/main/java/de/intevation/gnv/transition/Transition.java Edited, + src/main/java/de/intevation/gnv/transition/InputData.java Edited, + src/main/java/de/intevation/gnv/transition/OutputMode.java Edited, + src/main/java/de/intevation/gnv/transition/InputValue.java Edited, + src/main/java/de/intevation/gnv/artifacts/fis/product/Product.java Edited, + src/main/java/de/intevation/gnv/utils/ArtifactXMLUtilities.java Edited, + src/main/java/de/intevation/gnv/transition/describedata/DescribeData.java Edited: + Make the Interfaces Serializable to make them usable in the Artifactdatabase + +2009-09-14 Tim Englich + + * src/test/java/de/intevation/gnv/artifacts/GNVArtifactsTestCase.java Edited, + src/main/java/de/intevation/gnv/transition/timeseries/TimeSeriesOutputTransition.java Edited, + src/main/java/de/intevation/gnv/transition/OutputTransition.java Edited , + src/main/java/de/intevation/gnv/timeseries/TimeSeriesArtifact.java Edited, + src/main/java/de/intevation/gnv/artifacts/fis/FISArtifact.java Edited, + src/main/java/de/intevation/gnv/artifacts/GNVArtifactBase.java Edited: + Refactoring Work depending on Infrastructurchanges in the Artifact-Module + +2009-09-10 Tim Englich + + * src/test/java/de/intevation/gnv/artifacts/GNVArtifactsTestCase.java Edited, + src/test/ressources/timeseries/timeseries_step_01_feed.xml Edited, + src/test/ressources/timeseries/timeseries_step_01_advance.xml Edited, + src/test/ressources/conf.xml Edited: + TestCase moced from TimeSeriesArtifact to FISArtifact. Used FIS: Marnet + +2009-09-10 Tim Englich + + * src/main/java/de/intevation/gnv/utils/ArtifactXMLUtilities.java Added: + Utilities-Class for some XML-Stuff that is only for gnv-artifacts + + * src/main/java/de/intevation/gnv/utils/ArtifactFactoryUtilities.java Added: + Factory to Instantiiate an ArtifactFactory (TODO: Should be moved to Artifact-database) + + * src/main/java/de/intevation/gnv/artifacts/fis/product/Product.java Added, + src/main/java/de/intevation/gnv/artifacts/fis/product/DefaultProduct.java Added: + Interfcaedefinition and Defaultimplementation for the Representation of the different + Products in an FIS. + + * src/main/java/de/intevation/gnv/artifacts/fis/FISArtifact.java Added: + Artifact to Repersent an FIS. This Artifact is able to switch between different + SubArtifacts for handling the different Products of an FIS. + + * src/main/java/de/intevation/gnv/artifacts/GNVArtifactBase.java Edited: + Refactoring Work done because of changes in the artifact-modules + +2009-09-10 Tim Englich + + * src/main/java/de/intevation/gnv/artifacts/GNVArtifactBase.java Edited, + src/main/java/de/intevation/gnv/timeseries/TimeSeriesArtifact.java Edited: + Refactoringwork done because of changes in the artifact-module + +2009-09-10 Tim Englich + + * src/test/java/de/intevation/gnv/artifacts/GNVArtifactsTestCase.java Edited: + src/test/ressources/conf.xml Renamed: + Project Structure changed in artifact-database. So we have to rename + the Testconfigurationfile in conf.xml. + + * src/test/ressources/results Added: + Integrated Folder for temporal storing Resultfiles of the TestCases + + * src/test/ressources/queries.properties Edited: + Further Queries for Testcases integrated + * src/test/ressources/timeseries/timeseries_step_05_out.xml Added, + src/test/ressources/timeseries/timeseries_step_05_feed.xml Added: + Integrated the last step of the TimeSeries-Workflow. + Now the TestCase is able to render Charts. + + * src/test/ressources/timeseries/timeseries_step_04_feed.xml Edited, + src/test/ressources/timeseries/timeseries_step_03_feed.xml Edited: + Names of the feed-Parametes changed to the Syntax of BSH-Spelling + +2009-09-09 Tim Englich + + * src/main/java/de/intevation/gnv/transition/timeseries/TimeSeriesOutputTransition.java: + Chart Rendering completed with some Fixes to do + * src/main/java/de/intevation/gnv/transition/TransitionBase.java: + Integrated usage of KeyValueDescibeData + * src/main/java/de/intevation/gnv/transition/OutputTransition.java (getOutputModes): + Errorhandling integrated + * src/main/java/de/intevation/gnv/timeseries/TimeSeriesArtifact.java Edited, + * src/main/java/de/intevation/gnv/artifacts/GNVArtifactBase.java Edited: + Refactored out-Method from Extending Class + +2009-09-09 Tim Englich + + * src/main/java/de/intevation/gnv/chart/exception/TechnicalChartException.java Added, + src/main/java/de/intevation/gnv/chart/ChartFactory.java Edited: + Refactoring of the ChartFactory so that it colud be use and it is possible to compile + this class. + + * src/main/java/de/intevation/gnv/transition/describedata/KeyValueDescibeData.java Added, + src/main/java/de/intevation/gnv/transition/describedata/DefaultKeyValueDescribeData.java Added: + Added an new Representation of Describedata for Key Value Pairs using for the Parameter Lists + of the Transitions an put it into the Chartgeneration + +2009-09-09 Tim Englich + + * pom.xml Edited: + Added JfreeChart Dependency to pom-file + +2009-09-09 Tim Englich + + * src/main/java/de/intevation/gnv/chart/Insets.java Added, + src/main/java/de/intevation/gnv/chart/ChartStyle.java Added, + src/main/java/de/intevation/gnv/chart/ChartLabels.java Added, + src/main/java/de/intevation/gnv/chart/ChartFactory.java Added: + Insert Chart-Classes from OLD-Repository Revision: 3101 Does not compile + +2009-09-09 Tim Englich + + * src/main/java/de/intevation/gnv/transition/timeseries/TimeSeriesOutputTransition.java Added: + The specifed OutputTransition for the Product TimeSeries. + + * src/main/java/de/intevation/gnv/artifacts/GNVArtifactBase.java Edited: + Integration of the OutputModes in the DescriberesultDocument. + + * src/main/java/de/intevation/gnv/transition/OutputTransitionBase.java Added, + src/main/java/de/intevation/gnv/transition/OutputTransition.java Added: + The Interface and the abstract Basicimplementation of an Transition which + can produce different outputs. + + * src/main/java/de/intevation/gnv/transition/DefaultOutputMode.java Added, + src/main/java/de/intevation/gnv/transition/OutputMode.java Added: + Interfacestructur and Defaultimplementation for the Representation of the + Different OutputModes given in an Artifact. + +2009-09-09 Tim Englich + + * src/main/java/de/intevation/gnv/transition/TransitionBase.java (describe) Edited: + Changed DateoutputFormat from German- to Anericanstyle + +2009-09-09 Tim Englich + + * src/test/ressources/timeseries/timeseries_step_04_feed.xml Added, + * src/test/ressources/timeseries/timeseries_step_04_advance.xml Added: + Two more ArtifactCommands for the next Step in TimeSeriesArtifactTestCase + * src/test/ressources/queries.properties Edited: + New Queries for timeseries_timeinterval added. + Also use KEY ,VALUE, MIN and MAX as Identifiers for the different Columns. + * src/test/ressources/GNVArtifactsTestCase_Configuration.xml Edited, + * src/test/java/de/intevation/gnv/artifacts/GNVArtifactsTestCase.java Edited: + Modified the TimeseriesArtifact and added one further TransitionStep + +2009-09-09 Tim Englich + + * src/main/java/de/intevation/gnv/transition/describedata/DefaultMinMaxDescribeData.java , + * src/main/java/de/intevation/gnv/transition/describedata/MinMaxDescribeData.java, + * src/main/java/de/intevation/gnv/transition/describedata/DescribeData.java Added: + Interface Structure and Defaultimplementation for Representing DescribeData of an + Transition added. In this Way we are able to switch between different Renderingmethods + for descibe. + * src/main/java/de/intevation/gnv/transition/MinMaxTransition.java Added: + Added MinMaxTransition for representing Min-/Max-Value Results in a Tansition + * src/main/java/de/intevation/gnv/transition/TransitionBase.java Edited: + Integrated Min- / MAX-Value Support for Describe. Also done some Refactoring Work + for easy creating Extensions of this Class. + * src/main/java/de/intevation/gnv/artifacts/GNVArtifactBase.java Edited: + Userinterface Informations were integrated in the wrong Method. Now the + Informations are put into the ui-Node + +2009-09-08 Tim Englich + + * src/test/ressources/timeseries/timeseries_step_01_advance.xml Edited, + src/test/ressources/timeseries/timeseries_step_01_feed.xml Edited, + src/test/ressources/timeseries/timeseries_step_02_advance.xml Added, + src/test/ressources/timeseries/timeseries_step_02_feed.xml Added, + src/test/ressources/timeseries/timeseries_step_03_advance.xml Added, + src/test/ressources/timeseries/timeseries_step_03_feed.xml Added, + src/test/ressources/GNVArtifactsTestCase_Configuration.xml: Edited, + src/test/ressources/queries.properties Added, + src/test/java/de/intevation/gnv/artifacts/GNVArtifactsTestCase.java Edited: + TestCase implemented until Choosing the TimeInetval of an TimeSeries + + One Entry is Missing + +2009-09-08 Tim Englich + + * src/main/java/de/intevation/gnv/transition/TransitionBase.java Edited, + src/main/java/de/intevation/gnv/transition/Transition.java Edited, + src/main/java/de/intevation/gnv/artifacts/GNVArtifactBase.java Edited, + src/test/java/de/intevation/gnv/artifacts/GNVArtifactsTestCase.java Edited, + src/test/ressources/GNVArtifactsTestCase_Configuration.xml Edited, + src/test/ressources/timeseries/timeseries_step_01_feed.xml Added , + src/test/ressources/timeseries/timeseries_step_01_advance.xml Added : + Artifact.advance initial implementiert + +2009-09-08 Tim Englich + + * src/main/java/de/intevation/gnv/timeseries/TimeSeriesArtifact.java Edited, + src/main/java/de/intevation/gnv/transition/DefaultInputData.java Added, + src/main/java/de/intevation/gnv/transition/InputData.java Added, + src/main/java/de/intevation/gnv/transition/exception/TransitionException.java Added, + src/main/java/de/intevation/gnv/transition/TransitionBase.java Edited, + src/main/java/de/intevation/gnv/transition/Transition.java Edited, + src/main/java/de/intevation/gnv/artifacts/GNVArtifactBase.java Edited: + Funktionalitat Feed initial bereitgestellt. + +2009-09-08 Tim Englich + + * src/test/ressources/GNVArtifactsTestCase_Configuration.xml, + src/main/java/de/intevation/gnv/artifacts/GNVArtifactBase.java, + src/main/java/de/intevation/gnv/transition/TransitionBase.java, + src/main/java/de/intevation/gnv/transition/DefaultInputValue.java Edited: + Required Inputelements integrated in BasicArtifact-Descibe-Output + +2009-09-08 Tim Englich + + * src/main/java/de/intevation/gnv/transition/DefaultInputValue.java Added, + src/main/java/de/intevation/gnv/transition/InputValue.java Added, + src/main/java/de/intevation/gnv/transition/TransitionBase.java Edited, + src/main/java/de/intevation/gnv/transition/Transition.java Edited, + src/test/ressources/GNVArtifactsTestCase_Configuration.xml Edited: + Constructs for the required Inputvalues for an Transition created + +2009-09-08 Tim Englich + + * src/test/java/de/intevation/gnv/artifacts/GNVArtifactsTestCase.java, + * src/main/java/de/intevation/gnv/timeseries/TimeSeriesArtifact.java:, + * src/main/java/de/intevation/gnv/artifacts/GNVArtifactBase.java: Edited + Added Output for Describe to the Artifactimplementation + +2009-09-08 Tim Englich + + * src/test/ressources/GNVArtifactsTestCase_Configuration.xml, + src/main/java/de/intevation/gnv/transition/Transition.java (getDescription), + src/main/java/de/intevation/gnv/transition/TransitionBase.java (setup), (getDescription): + Added Description to a Transition + +2009-09-07 Tim Englich + + * src/test/ressources/GNVArtifactsTestCase_Configuration.xml, + src/test/java/de/intevation/gnv/artifacts/GNVArtifactsTestCase.java: ADD + TestClass for GNV-Artifacts an TimeSeriesArtifacs + + * src/main/java/de/intevation/gnv/transition/TransitionFactory.java, + src/main/java/de/intevation/gnv/transition/TransitionBase.java, + src/main/java/de/intevation/gnv/transition/Transition.java, + src/main/java/de/intevation/gnv/transition/DefaultTransition.java: ADD + Transitionimplementation for handling the substeps of an Artifact Livecycle + + * src/main/java/de/intevation/gnv/timeseries/TimeSeriesArtifact.java: ADD + The Artifact for handling the TimeSeries + * src/main/java/de/intevation/gnv/artifacts/context/GNVArtifactContextFactory.java, + src/main/java/de/intevation/gnv/artifacts/context/GNVArtifactContext.java, + src/main/java/de/intevation/gnv/artifacts/GNVArtifactBase.java: + The Basic-Classes for providing GNC Artifacts. this Classes should be the Fundament + for the Implementation of Specialized Artifacts e.g. TimeSeries + * pom: Edited Projectreferences to the other GNV-Projects added + +2009-09-04 Tim Englich + + * src/main/java/de/intevation/gnv/artifacts/ArtifactFactoryBase.java: + Implementation of the General ArtifactFactory + +2009-09-04 Tim Englich + + * pom.xml: Created with maven and put the Moduledependencies into it + * target | .settings | .project | .classpath: Add to SVN-Ignore + * Changes | Changelog | NEWS | README | TODO: Added + * src/**: Added to the Project diff -r f99d8f92a640 -r 755dd2fa4a0a gnv-artifacts/Changes --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv-artifacts/Changes Fri Sep 28 12:13:53 2012 +0200 @@ -0,0 +1,118 @@ +2010-01-27 RELEASE 0.4 + + New: + + * Added entire infrastructure for interpolation pipeline: + * Rasterizers on a configurable grid resolution (x and y). + * Vectorizer producing geoemetries from rasterized data + (introducting dependency to GNU Trove 2.2.1) + * Color palette handling + * Support for using DEM (seabed) in interpolation + * helper script for converting color palettes to + QGIS 1.4 styling format + + * Diagrams: + + * 'Profilschnitte' (via JFreeChart compatible Vectorizer output) + * 'Horizontalschnitte' (via JTS compatible Vectorizer output) + * Multi-polygons: Classes determined by palette values + * Multi-linestrings: Iso lines determined with rules of #108 + + * Support for 2D diagrams with multi-polygons (with shells and holes) + and multi-linestrings (essentially what is called "Simple Feature") + * Improved labeling (heading, subheading) of all diagrams + + * Added support for ProxyArtifact to support access to history of states + * Added support for writing Shapefiles with GeoTools (introducing + dependency to GeoTools 3.5.8) + + Fixed: + + * Generation of vertical profiles failed on Marnet (#142) + * Using correct MIME-type for SVG-Export in configuration (#148) + * Enabling/Disabling points in GUI (#105) + * Reanming values for selcting the direction of an axis (#129) + * Adapting granularity for labels for timeseries (#152) + * adapting range of values for data series with identical name + and different time ranges (#136/137)i + * Corrected interpolation based on horizontal cross-section (#153) + * Enabling/Disabling points in diagrams with PDF export (#156) + * Harmonized background color in 2D diagrams (#157) + * Adding label for axis for 2D diagrams (#158) + + +2009-12-17 RELEASE 0.3 + + New: + + * SVG export for charts (introducing Apache Batik dependency) + * PDF export for charts. (introducing iText dependency) + * style templating for charts via XML. + * Units are now localized and added to the charts + * Gap detection for horizontal and vertical profile charts. + + * 'Horizontale Schnittprofile' + + * Added region filters + + Fixed: + + * Various i18n messages. (Issue 129) + * problems with verticalprofile charts. + * TG_0030.008: "Unterscheidung bei Farben wechselt + zwischen verschiedenen Ausgabeprodukten bei gleicher Parameterwahl" + * TG_0030.004: "Jahreszahlen an der Abszisse werden nicht angezeigt" + * TG_0030.004 : i18n funktioniert an Abzissenbeschriftung noch nicht (Issue 104) + + Changed: + + * The configuration system to define the workflows + with artifacts. Cleaner separation states vs. transistions. + + * Default configuration of ttl of artifacts is more realistic now. + + * Used more recent versions of JFreeChart and Apache Common Math. + + * Local caching of data is now used more consequently + + Removed: + + * Old conterra charting code. + +2009-11-13 RELEASE 0.2 + + * Adding support for relative pathnames relating to central + config document (issue 59) + + * Splitting of configuration documents (Issue 40) + + * Corrected data model of artifacs (issue 3) + + * Added FIS Sea State, SEACAT, Current Meter, Ice Station Reports + + * Implemented gaps for spatial and temportal gaps (issue 45) + + * TG_0040.005: Added a first ODV support + + * Added more input validation to make it more user-friendly + + * Added a first documentation of configuration documents + + +2009-10-07 RELEASE 0.1 + + * Initial release of the artifacts special for the + BSH Generic Viewer. They are to be configured to live + inside an artifact database via conf.xml. + + * The collection of parameters is modelled by transistions + inside the XML. + + * src/test/ressources/conf.xml gives a setup to use all + the provided artifacts. + + * Products can be produced for following FIS: + Marnet, IMIS, STAUN, Modeldata, Delphin, Thermosalinograph, + Chemusurvey, GTS, CTD, CBT in form of time series, + vertical profiles and horizontal profiles on meshes + and instantaneous points. diff -r f99d8f92a640 -r 755dd2fa4a0a gnv-artifacts/NEWS --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv-artifacts/NEWS Fri Sep 28 12:13:53 2012 +0200 @@ -0,0 +1,106 @@ +2010-01-27 RELEASE 0.4 + + Processing: + * Added central support for the entire interpolation infrastructure + with a lot of configuration capabilities: + * rasterizing input data sets + * calculating interpolation paying attention to different boundary + conditions: Less than 3 point, extrapolating to the ground, water + surface, ... + * tracing isolines + * clipping geometries + * exporting interpolated polygons and isolines + * rendering of 2D-diagrams and export of Shapefiles + + for "Horizontales Schnittprofil", Vertical- and Horizontal Cross + Section. Made parts of the interpolation configurable like + resolution of interpolation raster; color palettes. + + * Optimizing of runtime of interpolations + + * Diagramm specific: + * Made color paletts configurable for rendering Vertical-Cross + Sections. Added helper script to convert same palettes to QGIS (at + least version 1.4 supported) styling format + + * Support for 2D diagrams with multipolygons with holes and shells + + * Made color of seabed configurable for vertical cross-sections + + * Added special renderer for labeling isolines in dense areas + in order to avoid overlaps + + + * Dependency to GUI generation: + * Splitting date selections in a 2 step transition: year, exact + point of time as required in the webclient + + + * Cleaning up internal model of steps to correspond to internal + objects in cache + + + * Add support for a wizard-based model of states in order to support + a 1-step back history in a first step; preparation for + multistep-history done. + + + * Configuration: + * Configuration: Enhanced configuration for connection testing of + SDE. So fare, now stable for reusing connections. + + * Configurability of Mesh-Width per data model + + * Others: + * Added support for exporting shapefiles and integrating into + artefact-lifecycle in order to remove files/directories after + end-of-life + + * Support for a MapViewer interfaced based on a database-based + configuration + + * Added support for raster data to taking into account sea + topography + + +2009-12-17 RELEASE 0.3 + + * PDF export + + * SVG export + + * Chart Templating + + * 'Horizontale Schnittprofile' + + * various i18n fixes + +2009-11-13 RELEASE 0.2 + + * Added support for all required FIS: + Marnet, IMIS, STAUN, Modelldaten, Eisklimatologie, Eismeldungen, SST, + Delphin, Thermosalinograph, Chemusurvey, GTS, CTD, XBT, SeaCat, + Seegangsarchiv, Strommesser (Req. TG_0020.001) + + * Added support for vertical profiles (Chapter 3.3.3.2.2) + + * Added support for horizontal profiles (Chapter 3.3.3.2.3); + part independent of MapViewer + + * Added a first support for ODV format (Req. TG_0040.005) + + * Enabling client for multi-instances (Req. 00_0000.007) + + * Adding of support of internal area filter (Req. TG_0020.012 b) + + * Added more support for internationalization (TG_0050.004) + + * Improved error handling with more user-friendly messages + + * Added required statistical support (Chapter 3.3.3.3.1) + + +2009-10-07 RELEASE 0.1 + + * Initial release of the artifacts special for the Generic BSH Viewer. + diff -r f99d8f92a640 -r 755dd2fa4a0a gnv-artifacts/TODO --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv-artifacts/TODO Fri Sep 28 12:13:53 2012 +0200 @@ -0,0 +1,7 @@ +TODO: + * Caching of charts is configured via system property. This should be done + in another way. (Property: -Dcache.chart) + * charts for verticalcrosssection and horizontalcrosssection need to be + implemented + * distance of tick units in timeseries charts are in form of "dd-MMM". This + needs to be adapted depending on range of x-axis. diff -r f99d8f92a640 -r 755dd2fa4a0a gnv-artifacts/bin/run.sh --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv-artifacts/bin/run.sh Fri Sep 28 12:13:53 2012 +0200 @@ -0,0 +1,16 @@ +#!/bin/bash + +DIR=`dirname $0`/.. +CLASSPATH= +for l in `find -name \*.jar -print`; do + CLASSPATH=$CLASSPATH:$l +done + +export CLASSPATH + +exec java -Xmx256m \ + -server \ + -Djava.io.tmpdir=/tmp/ \ + -Dartifact.database.dir="$DIR/conf" \ + de.intevation.artifactdatabase.App \ + 2>&1 > /dev/null diff -r f99d8f92a640 -r 755dd2fa4a0a gnv-artifacts/contrib/palette2polygonVM.xsl --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv-artifacts/contrib/palette2polygonVM.xsl Fri Sep 28 12:13:53 2012 +0200 @@ -0,0 +1,21 @@ + + + + + + + + + + + CLASS + NAME " - " + EXPRESSION ("[CLASS]"="") + STYLE + COLOR "" + END + END + + + diff -r f99d8f92a640 -r 755dd2fa4a0a gnv-artifacts/contrib/palette2qgis.xsl --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv-artifacts/contrib/palette2qgis.xsl Fri Sep 28 12:13:53 2012 +0200 @@ -0,0 +1,138 @@ + + + + + + + + + + + + + + + + 10 + 11 + 12 + 13 + 14 + 15 + + + + + + + + + + + + + + + + + + + + + hard:circle + 2 + pixels + + + + + NoPen + 0.26 + + + + + + + + + + SolidPattern + + + + + + 255 + CLASS + + + + + hard:circle + 2 + pixels + + + + + DashDotDotLine + 0.26 + + SolidPattern + + + + CLASS + + + + + + + + + + + PARAMETER + + + + + + + + diff -r f99d8f92a640 -r 755dd2fa4a0a gnv-artifacts/doc/conf/arcsdeconnectionpool.properties --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv-artifacts/doc/conf/arcsdeconnectionpool.properties Fri Sep 28 12:13:53 2012 +0200 @@ -0,0 +1,35 @@ +############################################################################### +############################################################################### +# In this File it is possible to configure the Connectionpool to the the +# ArcSDE-DataBackend. +# maxActive: Number of maximal Connection which can be used. +# testOnBorrow: Should the Pool test the Connection which will be borrowed +# if it is Valid +# testOnReturn: Should the Pool test the Connection which will be returned +# if it is Valid +# testWhileIdle: Should the Pool test the Connection while it is Idl +# if it is Valid +# timeBetweenEvictionRunsMillis : Time in Milliseconds which is allowed +# to reused a returned Connection. +# serverRoundtripInterval : The Timea ArcSDE-Connection must nor be used until +# the Connection will test if it is valid. +# server: The URL of the Server where the Database is reachable. +# username: The Username which should be used to Connect to the Databackend. +# credentials: The Credentials to the given username +# port: The Communicationport which must be used to connect to the Databackend +# database: The Name of the Instance which should be connected to. +############################################################################### +############################################################################### + +maxActive=2 +testOnBorrow=true +testOnReturn=false +testWhileIdle=false +timeBetweenEvictionRunsMillis=360000 +serverRoundtripInterval=5 +serverInactiveInterval=300 +server=localhost +username=gast +credentials=gast +port=22119 +database=esri_sde diff -r f99d8f92a640 -r 755dd2fa4a0a gnv-artifacts/doc/conf/charttemplate.xml --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv-artifacts/doc/conf/charttemplate.xml Fri Sep 28 12:13:53 2012 +0200 @@ -0,0 +1,86 @@ + + + + + + + + + + + + <font> + <size value="20" /> + <type value="Tahoma" /> + <color value="0x000000" /> + <bold value="true" /> + </font> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 5 + 5 + 5 + 5 + + + + + + + + + + + + + + + + + + + + + + diff -r f99d8f92a640 -r 755dd2fa4a0a gnv-artifacts/doc/conf/conf.xml --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv-artifacts/doc/conf/conf.xml Fri Sep 28 12:13:53 2012 +0200 @@ -0,0 +1,534 @@ + + + de.intevation.gnv.artifacts.context.GNVArtifactContextFactory + + de.intevation.gnv.artifacts.GNVProductArtifactFactory + de.intevation.gnv.artifacts.GNVProductArtifactFactory + de.intevation.gnv.artifacts.GNVProductArtifactFactory + de.intevation.gnv.artifacts.GNVProductArtifactFactory + de.intevation.gnv.artifacts.GNVProductArtifactFactory + de.intevation.gnv.artifacts.GNVProductArtifactFactory + de.intevation.gnv.artifacts.GNVProductArtifactFactory + de.intevation.gnv.artifacts.GNVProductArtifactFactory + de.intevation.gnv.artifacts.GNVProductArtifactFactory + de.intevation.gnv.artifacts.GNVProductArtifactFactory + de.intevation.gnv.artifacts.GNVProductArtifactFactory + de.intevation.gnv.artifacts.GNVProductArtifactFactory + de.intevation.gnv.artifacts.GNVProductArtifactFactory + de.intevation.gnv.artifacts.GNVProductArtifactFactory + de.intevation.gnv.artifacts.GNVProductArtifactFactory + de.intevation.gnv.artifacts.GNVProductArtifactFactory + de.intevation.gnv.artifacts.GNVProductArtifactFactory + de.intevation.gnv.artifacts.GNVProductArtifactFactory + + + de.intevation.artifactdatabase.DefaultServiceFactory + + + + + + + + + de.intevation.gnv.artifacts.GNVArtifactFactory + + + + + + + de.intevation.gnv.artifacts.GNVArtifactFactory + + + + + + + + + + + + de.intevation.gnv.artifacts.GNVArtifactFactory + + + + + + + + + + + + de.intevation.gnv.artifacts.GNVArtifactFactory + + + + + + + + + + + + de.intevation.gnv.artifacts.GNVArtifactFactory + + + + + + + + + + + + de.intevation.gnv.artifacts.GNVArtifactFactory + + + + + + + de.intevation.gnv.artifacts.GNVArtifactFactory + + + + + + + + + + + + de.intevation.gnv.artifacts.GNVArtifactFactory + + + + + + + de.intevation.gnv.artifacts.GNVArtifactFactory + + + + + + + + + + + + de.intevation.gnv.artifacts.GNVArtifactFactory + + + + + + + de.intevation.gnv.artifacts.GNVArtifactFactory + + + + + + + de.intevation.gnv.artifacts.GNVArtifactFactory + + + + + + + de.intevation.gnv.artifacts.GNVArtifactFactory + + + + + + + de.intevation.gnv.artifacts.GNVArtifactFactory + + + + + + + de.intevation.gnv.artifacts.GNVArtifactFactory + + + + + + + + + + + + de.intevation.gnv.artifacts.GNVArtifactFactory + + + + + + + de.intevation.gnv.artifacts.GNVArtifactFactory + + + + + + + de.intevation.gnv.artifacts.GNVArtifactFactory + + + + + + + + + + + + de.intevation.gnv.artifacts.GNVArtifactFactory + + + + + + + + + + + + de.intevation.gnv.artifacts.GNVArtifactFactory + + + + + + + + + + de.intevation.gnv.artifacts.GNVArtifactFactory + + + + + + + + + + de.intevation.gnv.artifacts.GNVArtifactFactory + + + + + + + + + + + + + + + de.intevation.gnv.artifacts.GNVArtifactFactory + + + + + + + + + + + + + de.intevation.gnv.artifacts.GNVArtifactFactory + + + + + + + + + + + + + de.intevation.gnv.artifacts.GNVArtifactFactory + + + + + + + + + + + + + de.intevation.gnv.artifacts.GNVArtifactFactory + + + + + + + de.intevation.gnv.artifacts.GNVArtifactFactory + + + + + + + + + + + + de.intevation.gnv.artifacts.GNVArtifactFactory + + + + + + + + + + + + de.intevation.gnv.artifacts.GNVArtifactFactory + + + + + + + + + + + + de.intevation.gnv.artifacts.GNVArtifactFactory + + + + + + + + + + + + de.intevation.gnv.artifacts.GNVArtifactFactory + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ${artifacts.config.dir}/charttemplate.xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ${artifacts.config.dir}/maptemplates + mapfile.vm + + + + + + + + + + + + + + + + ${artifacts.config.dir}/ehcache.xml + + + + + ${artifacts.config.dir}/arcsdeconnectionpool.properties + ${artifacts.config.dir}/queries.properties + + + + 8181 + localhost + + + + 60000 + + + SA + + + + + diff -r f99d8f92a640 -r 755dd2fa4a0a gnv-artifacts/doc/conf/ehcache.xml --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv-artifacts/doc/conf/ehcache.xml Fri Sep 28 12:13:53 2012 +0200 @@ -0,0 +1,9 @@ + + + + + diff -r f99d8f92a640 -r 755dd2fa4a0a gnv-artifacts/doc/conf/log.conf --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv-artifacts/doc/conf/log.conf Fri Sep 28 12:13:53 2012 +0200 @@ -0,0 +1,4 @@ +.level=FINEST +handlers=java.util.logging.ConsoleHandler +java.util.logging.FileHandler.formatter=java.util.logging.SimpleFormatter +java.util.logging.FileHandler.pattern=rest-%u-%g.log diff -r f99d8f92a640 -r 755dd2fa4a0a gnv-artifacts/doc/conf/log4j.properties --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv-artifacts/doc/conf/log4j.properties Fri Sep 28 12:13:53 2012 +0200 @@ -0,0 +1,17 @@ +############################################################################### +# Developmentconfiguration for the Loggingengine. +# The Configuration will only log the Information to the Console. +# For Test- and Productionenviroment it is necessary to create a +# separate Configuration which will be log the Informations e.g. into +# a File (RolingFileAppender). +############################################################################### + +# Set root logger level to DEBUG and its only appender to A1. +log4j.rootLogger=DEBUG, A1 + +# A1 is set to be a ConsoleAppender. +log4j.appender.A1=org.apache.log4j.ConsoleAppender + +# A1 uses PatternLayout. +log4j.appender.A1.layout=org.apache.log4j.PatternLayout +log4j.appender.A1.layout.ConversionPattern=%d [%t] %-5p %c - %m%n diff -r f99d8f92a640 -r 755dd2fa4a0a gnv-artifacts/doc/conf/maptemplates/flow-velocity_isolines.class.vm --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv-artifacts/doc/conf/maptemplates/flow-velocity_isolines.class.vm Fri Sep 28 12:13:53 2012 +0200 @@ -0,0 +1,20 @@ + CLASS + NAME "DEFAULT" + LABEL + TYPE TRUETYPE + FONT FreeSans + SIZE 10 + MAXSIZE 10 + MINSIZE 7 + COLOR 0 0 0 + MINDISTANCE 250 + ANGLE AUTO + POSITION CC + MINFEATURESIZE AUTO + OUTLINECOLOR 255 255 255 + PARTIALS False + END + STYLE + COLOR "#000000" + END + END diff -r f99d8f92a640 -r 755dd2fa4a0a gnv-artifacts/doc/conf/maptemplates/flow-velocity_polygons.class.vm --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv-artifacts/doc/conf/maptemplates/flow-velocity_polygons.class.vm Fri Sep 28 12:13:53 2012 +0200 @@ -0,0 +1,107 @@ + CLASS + NAME "-inf - 0.025" + EXPRESSION ("[CLASS]"="0") + STYLE + COLOR "#38a800" + END + END + + + CLASS + NAME "0.025 - 0.05" + EXPRESSION ("[CLASS]"="1") + STYLE + COLOR "#56b800" + END + END + + + CLASS + NAME "0.05 - 0.1" + EXPRESSION ("[CLASS]"="2") + STYLE + COLOR "#74c700" + END + END + + + CLASS + NAME "0.1 - 0.3" + EXPRESSION ("[CLASS]"="3") + STYLE + COLOR "#96d600" + END + END + + + CLASS + NAME "0.3 - 0.5" + EXPRESSION ("[CLASS]"="4") + STYLE + COLOR "#bfe600" + END + END + + + CLASS + NAME "0.5 - 0.7" + EXPRESSION ("[CLASS]"="5") + STYLE + COLOR "#e9f500" + END + END + + + CLASS + NAME "0.7 - 0.9" + EXPRESSION ("[CLASS]"="6") + STYLE + COLOR "#ffea00" + END + END + + + CLASS + NAME "0.9 - 1.1" + EXPRESSION ("[CLASS]"="7") + STYLE + COLOR "#ffbb00" + END + END + + + CLASS + NAME "1.1 - 1.3" + EXPRESSION ("[CLASS]"="8") + STYLE + COLOR "#ff8c00" + END + END + + + CLASS + NAME "1.3 - 1.5" + EXPRESSION ("[CLASS]"="9") + STYLE + COLOR "#ff5e00" + END + END + + + CLASS + NAME "1.5 - 1.7" + EXPRESSION ("[CLASS]"="10") + STYLE + COLOR "#ff2f00" + END + END + + + CLASS + NAME "1.7 - inf" + EXPRESSION ("[CLASS]"="11") + STYLE + COLOR "#ff0000" + END + END + diff -r f99d8f92a640 -r 755dd2fa4a0a gnv-artifacts/doc/conf/maptemplates/horizontalcrosssection_flow-velocity.vm --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv-artifacts/doc/conf/maptemplates/horizontalcrosssection_flow-velocity.vm Fri Sep 28 12:13:53 2012 +0200 @@ -0,0 +1,7 @@ +LAYER + NAME "$info.getName()" + TYPE $info.getType() + DATA "${info.getName()}/${info.getData()}" + STATUS $info.getStatus() + #include("flow-velocity_polygons.class.vm") +END diff -r f99d8f92a640 -r 755dd2fa4a0a gnv-artifacts/doc/conf/maptemplates/horizontalcrosssection_flow-velocity_isolines.vm --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv-artifacts/doc/conf/maptemplates/horizontalcrosssection_flow-velocity_isolines.vm Fri Sep 28 12:13:53 2012 +0200 @@ -0,0 +1,9 @@ +LAYER + NAME "$info.getName()_isolines" + GROUP "$info.getName()" + DATA "${info.getName()}/${info.getData()}" + TYPE $info.getType() + STATUS $info.getStatus() + LABELITEM VALUE + #include("flow-velocity_isolines.class.vm") +END diff -r f99d8f92a640 -r 755dd2fa4a0a gnv-artifacts/doc/conf/maptemplates/horizontalcrosssection_salinity.vm --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv-artifacts/doc/conf/maptemplates/horizontalcrosssection_salinity.vm Fri Sep 28 12:13:53 2012 +0200 @@ -0,0 +1,7 @@ +LAYER + NAME "$info.getName()" + TYPE $info.getType() + DATA "${info.getName()}/${info.getData()}" + STATUS $info.getStatus() + #include("salinity_polygons.class.vm") +END diff -r f99d8f92a640 -r 755dd2fa4a0a gnv-artifacts/doc/conf/maptemplates/horizontalcrosssection_salinity_isolines.vm --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv-artifacts/doc/conf/maptemplates/horizontalcrosssection_salinity_isolines.vm Fri Sep 28 12:13:53 2012 +0200 @@ -0,0 +1,9 @@ +LAYER + NAME "$info.getName()_isolines" + GROUP "$info.getName()" + DATA "${info.getName()}/${info.getData()}" + TYPE $info.getType() + STATUS $info.getStatus() + LABELITEM VALUE + #include("salinity_isolines.class.vm") +END diff -r f99d8f92a640 -r 755dd2fa4a0a gnv-artifacts/doc/conf/maptemplates/horizontalcrosssection_water-levels.vm --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv-artifacts/doc/conf/maptemplates/horizontalcrosssection_water-levels.vm Fri Sep 28 12:13:53 2012 +0200 @@ -0,0 +1,7 @@ +LAYER + NAME "$info.getName()" + TYPE $info.getType() + DATA "${info.getName()}/${info.getData()}" + STATUS $info.getStatus() + #include("water-levels_polygons.class.vm") +END diff -r f99d8f92a640 -r 755dd2fa4a0a gnv-artifacts/doc/conf/maptemplates/horizontalcrosssection_water-levels_isolines.vm --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv-artifacts/doc/conf/maptemplates/horizontalcrosssection_water-levels_isolines.vm Fri Sep 28 12:13:53 2012 +0200 @@ -0,0 +1,9 @@ +LAYER + NAME "$info.getName()_isolines" + GROUP "$info.getName()" + DATA "${info.getName()}/${info.getData()}" + TYPE $info.getType() + STATUS $info.getStatus() + LABELITEM VALUE + #include("water-levels_isolines.class.vm") +END diff -r f99d8f92a640 -r 755dd2fa4a0a gnv-artifacts/doc/conf/maptemplates/horizontalcrosssection_water-temperature.vm --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv-artifacts/doc/conf/maptemplates/horizontalcrosssection_water-temperature.vm Fri Sep 28 12:13:53 2012 +0200 @@ -0,0 +1,7 @@ +LAYER + NAME "$info.getName()" + TYPE $info.getType() + DATA "${info.getName()}/${info.getData()}" + STATUS $info.getStatus() + #include("water-temperature_polygons.class.vm") +END diff -r f99d8f92a640 -r 755dd2fa4a0a gnv-artifacts/doc/conf/maptemplates/horizontalcrosssection_water-temperature_isolines.vm --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv-artifacts/doc/conf/maptemplates/horizontalcrosssection_water-temperature_isolines.vm Fri Sep 28 12:13:53 2012 +0200 @@ -0,0 +1,9 @@ +LAYER + NAME "$info.getName()_isolines" + GROUP "$info.getName()" + DATA "${info.getName()}/${info.getData()}" + TYPE $info.getType() + STATUS $info.getStatus() + LABELITEM VALUE + #include("water-temperature_isolines.class.vm") +END diff -r f99d8f92a640 -r 755dd2fa4a0a gnv-artifacts/doc/conf/maptemplates/layer_linestring.vm --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv-artifacts/doc/conf/maptemplates/layer_linestring.vm Fri Sep 28 12:13:53 2012 +0200 @@ -0,0 +1,13 @@ +LAYER + NAME "$info.getName()" + TYPE $info.getType() + DATA "${info.getName()}/${info.getData()}" + STATUS $info.getStatus() + + CLASS + NAME "Layer" + STYLE + COLOR "#870087" + END + END +END diff -r f99d8f92a640 -r 755dd2fa4a0a gnv-artifacts/doc/conf/maptemplates/layer_point.vm --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv-artifacts/doc/conf/maptemplates/layer_point.vm Fri Sep 28 12:13:53 2012 +0200 @@ -0,0 +1,13 @@ +LAYER + NAME "$info.getName()" + TYPE $info.getType() + DATA "${info.getName()}/${info.getData()}" + STATUS $info.getStatus() + + CLASS + NAME "Layer" + STYLE + COLOR "#870087" + END + END +END diff -r f99d8f92a640 -r 755dd2fa4a0a gnv-artifacts/doc/conf/maptemplates/layer_polygon.vm --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv-artifacts/doc/conf/maptemplates/layer_polygon.vm Fri Sep 28 12:13:53 2012 +0200 @@ -0,0 +1,13 @@ +LAYER + NAME "$info.getName()" + TYPE $info.getType() + DATA "${info.getName()}/${info.getData()}" + STATUS $info.getStatus() + + CLASS + NAME "Layer" + STYLE + COLOR "#870087" + END + END +END diff -r f99d8f92a640 -r 755dd2fa4a0a gnv-artifacts/doc/conf/maptemplates/mapfile.vm --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv-artifacts/doc/conf/maptemplates/mapfile.vm Fri Sep 28 12:13:53 2012 +0200 @@ -0,0 +1,17 @@ +MAP + NAME "GNV-Map" + STATUS ON + SIZE 600 400 + EXTENT -1 53 11 58 + UNITS DD + SHAPEPATH "../shapefiles" + FONTSET "fontset.txt" + IMAGECOLOR 255 255 255 + PROJECTION + "init=epsg:4326" + END + + ## Don't change the following lines. + $LAYERS + +END diff -r f99d8f92a640 -r 755dd2fa4a0a gnv-artifacts/doc/conf/maptemplates/salinity_isolines.class.vm --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv-artifacts/doc/conf/maptemplates/salinity_isolines.class.vm Fri Sep 28 12:13:53 2012 +0200 @@ -0,0 +1,20 @@ + CLASS + NAME "DEFAULT" + LABEL + TYPE TRUETYPE + FONT FreeSans + SIZE 10 + MAXSIZE 10 + MINSIZE 7 + COLOR 0 0 0 + MINDISTANCE 250 + ANGLE AUTO + POSITION CC + MINFEATURESIZE AUTO + OUTLINECOLOR 255 255 255 + PARTIALS False + END + STYLE + COLOR "#000000" + END + END diff -r f99d8f92a640 -r 755dd2fa4a0a gnv-artifacts/doc/conf/maptemplates/salinity_polygons.class.vm --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv-artifacts/doc/conf/maptemplates/salinity_polygons.class.vm Fri Sep 28 12:13:53 2012 +0200 @@ -0,0 +1,253 @@ + + + CLASS + NAME "-inf - 2.0" + EXPRESSION ("[CLASS]"="0") + STYLE + COLOR "#02db00" + END + END + + + CLASS + NAME "2.0 - 3.0" + EXPRESSION ("[CLASS]"="1") + STYLE + COLOR "#01e600" + END + END + + + CLASS + NAME "3.0 - 4.0" + EXPRESSION ("[CLASS]"="2") + STYLE + COLOR "#02f200" + END + END + + + CLASS + NAME "4.0 - 5.0" + EXPRESSION ("[CLASS]"="3") + STYLE + COLOR "#00ff00" + END + END + + + CLASS + NAME "5.0 - 6.0" + EXPRESSION ("[CLASS]"="4") + STYLE + COLOR "#23fd22" + END + END + + + CLASS + NAME "6.0 - 7.0" + EXPRESSION ("[CLASS]"="5") + STYLE + COLOR "#47fe46" + END + END + + + CLASS + NAME "7.0 - 8.0" + EXPRESSION ("[CLASS]"="6") + STYLE + COLOR "#5afd59" + END + END + + + CLASS + NAME "8.0 - 9.0" + EXPRESSION ("[CLASS]"="7") + STYLE + COLOR "#6ffe6e" + END + END + + + CLASS + NAME "9.0 - 10.0" + EXPRESSION ("[CLASS]"="8") + STYLE + COLOR "#89fd88" + END + END + + + CLASS + NAME "10.0 - 12.0" + EXPRESSION ("[CLASS]"="9") + STYLE + COLOR "#a5fea4" + END + END + + + CLASS + NAME "12.0 - 14.0" + EXPRESSION ("[CLASS]"="10") + STYLE + COLOR "#b3feb3" + END + END + + + CLASS + NAME "14.0 - 16.0" + EXPRESSION ("[CLASS]"="11") + STYLE + COLOR "#c2fec2" + END + END + + + CLASS + NAME "16.0 - 18.0" + EXPRESSION ("[CLASS]"="12") + STYLE + COLOR "#e0fee0" + END + END + + + CLASS + NAME "18.0 - 20.0" + EXPRESSION ("[CLASS]"="13") + STYLE + COLOR "#ffffff" + END + END + + + CLASS + NAME "20.0 - 24.0" + EXPRESSION ("[CLASS]"="14") + STYLE + COLOR "#fef5ef" + END + END + + + CLASS + NAME "24.0 - 28.0" + EXPRESSION ("[CLASS]"="15") + STYLE + COLOR "#feede0" + END + END + + + CLASS + NAME "28.0 - 30.0" + EXPRESSION ("[CLASS]"="16") + STYLE + COLOR "#fee5d1" + END + END + + + CLASS + NAME "30.0 - 32.0" + EXPRESSION ("[CLASS]"="17") + STYLE + COLOR "#fdd8ba" + END + END + + + CLASS + NAME "32.0 - 34.0" + EXPRESSION ("[CLASS]"="18") + STYLE + COLOR "#fecca4" + END + END + + + CLASS + NAME "34.0 - 34.5" + EXPRESSION ("[CLASS]"="19") + STYLE + COLOR "#fdbe8b" + END + END + + + CLASS + NAME "34.5 - 35.0" + EXPRESSION ("[CLASS]"="20") + STYLE + COLOR "#feb073" + END + END + + + CLASS + NAME "35.0 - 35.2" + EXPRESSION ("[CLASS]"="21") + STYLE + COLOR "#fda35b" + END + END + + + CLASS + NAME "35.2 - 35.4" + EXPRESSION ("[CLASS]"="22") + STYLE + COLOR "#fe9846" + END + END + + + CLASS + NAME "35.4 - 35.6" + EXPRESSION ("[CLASS]"="23") + STYLE + COLOR "#fd8422" + END + END + + + CLASS + NAME "35.6 - 35.8" + EXPRESSION ("[CLASS]"="24") + STYLE + COLOR "#fe7100" + END + END + + + CLASS + NAME "35.8 - 36.0" + EXPRESSION ("[CLASS]"="25") + STYLE + COLOR "#fe6900" + END + END + + + CLASS + NAME "36.0 - 37.0" + EXPRESSION ("[CLASS]"="26") + STYLE + COLOR "#fe6100" + END + END + + + CLASS + NAME "37.0 - inf" + EXPRESSION ("[CLASS]"="27") + STYLE + COLOR "#fe5900" + END + END + diff -r f99d8f92a640 -r 755dd2fa4a0a gnv-artifacts/doc/conf/maptemplates/water-levels_isolines.class.vm --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv-artifacts/doc/conf/maptemplates/water-levels_isolines.class.vm Fri Sep 28 12:13:53 2012 +0200 @@ -0,0 +1,20 @@ + CLASS + NAME "DEFAULT" + LABEL + TYPE TRUETYPE + FONT FreeSans + SIZE 10 + MAXSIZE 10 + MINSIZE 7 + COLOR 0 0 0 + MINDISTANCE 250 + ANGLE AUTO + POSITION CC + MINFEATURESIZE AUTO + OUTLINECOLOR 255 255 255 + PARTIALS False + END + STYLE + COLOR "#000000" + END + END diff -r f99d8f92a640 -r 755dd2fa4a0a gnv-artifacts/doc/conf/maptemplates/water-levels_polygons.class.vm --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv-artifacts/doc/conf/maptemplates/water-levels_polygons.class.vm Fri Sep 28 12:13:53 2012 +0200 @@ -0,0 +1,217 @@ + + + CLASS + NAME "-inf - 5" + EXPRESSION ("[CLASS]"="0") + STYLE + COLOR "#870087" + END + END + + + CLASS + NAME "-5.0 - -4.5" + EXPRESSION ("[CLASS]"="1") + STYLE + COLOR "#c700c7" + END + END + + + CLASS + NAME "-4.5 - -4.0" + EXPRESSION ("[CLASS]"="2") + STYLE + COLOR "#ff00ff" + END + END + + + CLASS + NAME "-4.0 - -3.5" + EXPRESSION ("[CLASS]"="3") + STYLE + COLOR "#bb00ff" + END + END + + + CLASS + NAME "-3.5 - -3.0" + EXPRESSION ("[CLASS]"="4") + STYLE + COLOR "#7700ff" + END + END + + + CLASS + NAME "-3.0 - -2.5" + EXPRESSION ("[CLASS]"="5") + STYLE + COLOR "#0000ff" + END + END + + + CLASS + NAME "-2.5 - -2.0" + EXPRESSION ("[CLASS]"="6") + STYLE + COLOR "#0000e8" + END + END + + + CLASS + NAME "-2.0 - -1.5" + EXPRESSION ("[CLASS]"="7") + STYLE + COLOR "#0082d9" + END + END + + + CLASS + NAME "-1.5 - -1.0" + EXPRESSION ("[CLASS]"="8") + STYLE + COLOR "#00b2ff" + END + END + + + CLASS + NAME "-1.0 - -0.5" + EXPRESSION ("[CLASS]"="9") + STYLE + COLOR "#00ddff" + END + END + + + CLASS + NAME "-0.5 - 0.0" + EXPRESSION ("[CLASS]"="10") + STYLE + COLOR "#00ffff" + END + END + + + CLASS + NAME "0.0 - 0.5" + EXPRESSION ("[CLASS]"="11") + STYLE + COLOR "#49d1cd" + END + END + + + CLASS + NAME "0.5 - 1.0" + EXPRESSION ("[CLASS]"="12") + STYLE + COLOR "#20b0a9" + END + END + + + CLASS + NAME "1.0 - 1.5" + EXPRESSION ("[CLASS]"="13") + STYLE + COLOR "#14c76d" + END + END + + + CLASS + NAME "1.5 - 2.0" + EXPRESSION ("[CLASS]"="14") + STYLE + COLOR "#09e03b" + END + END + + + CLASS + NAME "2.0 - 2.5" + EXPRESSION ("[CLASS]"="15") + STYLE + COLOR "#00ff1a" + END + END + + + CLASS + NAME "2.5 - 3.0" + EXPRESSION ("[CLASS]"="16") + STYLE + COLOR "#aeff00" + END + END + + + CLASS + NAME "3.0 - 3.5" + EXPRESSION ("[CLASS]"="17") + STYLE + COLOR "#f2ff00" + END + END + + + CLASS + NAME "3.5 - 4.0" + EXPRESSION ("[CLASS]"="18") + STYLE + COLOR "#ffc800" + END + END + + + CLASS + NAME "4.0 - 4.5" + EXPRESSION ("[CLASS]"="19") + STYLE + COLOR "#ff8800" + END + END + + + CLASS + NAME "4.5 - 5.0" + EXPRESSION ("[CLASS]"="20") + STYLE + COLOR "#ff4400" + END + END + + + CLASS + NAME "5.0 - 5.5" + EXPRESSION ("[CLASS]"="21") + STYLE + COLOR "#ff0000" + END + END + + + CLASS + NAME "5.5 - 6.0" + EXPRESSION ("[CLASS]"="22") + STYLE + COLOR "#c70000" + END + END + + + CLASS + NAME "6.0 - inf" + EXPRESSION ("[CLASS]"="23") + STYLE + COLOR "#870000" + END + END + diff -r f99d8f92a640 -r 755dd2fa4a0a gnv-artifacts/doc/conf/maptemplates/water-temperature_isolines.class.vm --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv-artifacts/doc/conf/maptemplates/water-temperature_isolines.class.vm Fri Sep 28 12:13:53 2012 +0200 @@ -0,0 +1,20 @@ + CLASS + NAME "DEFAULT" + LABEL + TYPE TRUETYPE + FONT FreeSans + SIZE 10 + MAXSIZE 10 + MINSIZE 7 + COLOR 0 0 0 + MINDISTANCE 250 + ANGLE AUTO + POSITION CC + MINFEATURESIZE AUTO + OUTLINECOLOR 255 255 255 + PARTIALS False + END + STYLE + COLOR "#000000" + END + END diff -r f99d8f92a640 -r 755dd2fa4a0a gnv-artifacts/doc/conf/maptemplates/water-temperature_polygons.class.vm --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv-artifacts/doc/conf/maptemplates/water-temperature_polygons.class.vm Fri Sep 28 12:13:53 2012 +0200 @@ -0,0 +1,253 @@ + + + CLASS + NAME "-inf - -1" + EXPRESSION ("[CLASS]"="0") + STYLE + COLOR "#ff33ff" + END + END + + + CLASS + NAME "-1 - 0" + EXPRESSION ("[CLASS]"="1") + STYLE + COLOR "#ff98ff" + END + END + + + CLASS + NAME "0 - 1" + EXPRESSION ("[CLASS]"="2") + STYLE + COLOR "#3300cc" + END + END + + + CLASS + NAME "1 - 2" + EXPRESSION ("[CLASS]"="3") + STYLE + COLOR "#3366ff" + END + END + + + CLASS + NAME "2 - 3" + EXPRESSION ("[CLASS]"="4") + STYLE + COLOR "#3399ff" + END + END + + + CLASS + NAME "3 - 4" + EXPRESSION ("[CLASS]"="5") + STYLE + COLOR "#33ccff" + END + END + + + CLASS + NAME "4 - 5" + EXPRESSION ("[CLASS]"="6") + STYLE + COLOR "#33ffff" + END + END + + + CLASS + NAME "5 - 6" + EXPRESSION ("[CLASS]"="7") + STYLE + COLOR "#007800" + END + END + + + CLASS + NAME "6 - 7" + EXPRESSION ("[CLASS]"="8") + STYLE + COLOR "#009900" + END + END + + + CLASS + NAME "7 - 8" + EXPRESSION ("[CLASS]"="9") + STYLE + COLOR "#00ba00" + END + END + + + CLASS + NAME "8 - 9" + EXPRESSION ("[CLASS]"="10") + STYLE + COLOR "#00de00" + END + END + + + CLASS + NAME "9 - 10" + EXPRESSION ("[CLASS]"="11") + STYLE + COLOR "#00ff00" + END + END + + + CLASS + NAME "10 - 11" + EXPRESSION ("[CLASS]"="12") + STYLE + COLOR "#ffff33" + END + END + + + CLASS + NAME "11 - 12" + EXPRESSION ("[CLASS]"="13") + STYLE + COLOR "#ffee33" + END + END + + + CLASS + NAME "12 - 13" + EXPRESSION ("[CLASS]"="14") + STYLE + COLOR "#ffdd33" + END + END + + + CLASS + NAME "13 - 14" + EXPRESSION ("[CLASS]"="15") + STYLE + COLOR "#ffcc33" + END + END + + + CLASS + NAME "14 - 15" + EXPRESSION ("[CLASS]"="16") + STYLE + COLOR "#ffbb33" + END + END + + + CLASS + NAME "15 - 16" + EXPRESSION ("[CLASS]"="17") + STYLE + COLOR "#ffaa00" + END + END + + + CLASS + NAME "16 - 17" + EXPRESSION ("[CLASS]"="18") + STYLE + COLOR "#ff9900" + END + END + + + CLASS + NAME "17 - 18" + EXPRESSION ("[CLASS]"="19") + STYLE + COLOR "#ff7700" + END + END + + + CLASS + NAME "18 - 19" + EXPRESSION ("[CLASS]"="20") + STYLE + COLOR "#ff0000" + END + END + + + CLASS + NAME "19 - 20" + EXPRESSION ("[CLASS]"="21") + STYLE + COLOR "#ed0000" + END + END + + + CLASS + NAME "20 - 21" + EXPRESSION ("[CLASS]"="22") + STYLE + COLOR "#cc0000" + END + END + + + CLASS + NAME "21 - 22" + EXPRESSION ("[CLASS]"="23") + STYLE + COLOR "#ba0000" + END + END + + + CLASS + NAME "22 - 23" + EXPRESSION ("[CLASS]"="24") + STYLE + COLOR "#ab0000" + END + END + + + CLASS + NAME "23 - 24" + EXPRESSION ("[CLASS]"="25") + STYLE + COLOR "#990000" + END + END + + + CLASS + NAME "24 - 25" + EXPRESSION ("[CLASS]"="26") + STYLE + COLOR "#870000" + END + END + + + CLASS + NAME "25 - inf" + EXPRESSION ("[CLASS]"="27") + STYLE + COLOR "#ab0089" + END + END + diff -r f99d8f92a640 -r 755dd2fa4a0a gnv-artifacts/doc/conf/meshwidth.xml --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv-artifacts/doc/conf/meshwidth.xml Fri Sep 28 12:13:53 2012 +0200 @@ -0,0 +1,14 @@ + + + + + + + + + + + \ No newline at end of file diff -r f99d8f92a640 -r 755dd2fa4a0a gnv-artifacts/doc/conf/palette/flow-velocity.xml --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv-artifacts/doc/conf/palette/flow-velocity.xml Fri Sep 28 12:13:53 2012 +0200 @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff -r f99d8f92a640 -r 755dd2fa4a0a gnv-artifacts/doc/conf/palette/salinity.xml --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv-artifacts/doc/conf/palette/salinity.xml Fri Sep 28 12:13:53 2012 +0200 @@ -0,0 +1,31 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff -r f99d8f92a640 -r 755dd2fa4a0a gnv-artifacts/doc/conf/palette/water-levels.xml --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv-artifacts/doc/conf/palette/water-levels.xml Fri Sep 28 12:13:53 2012 +0200 @@ -0,0 +1,27 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + diff -r f99d8f92a640 -r 755dd2fa4a0a gnv-artifacts/doc/conf/palette/water-temperature.xml --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv-artifacts/doc/conf/palette/water-temperature.xml Fri Sep 28 12:13:53 2012 +0200 @@ -0,0 +1,31 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff -r f99d8f92a640 -r 755dd2fa4a0a gnv-artifacts/doc/conf/products/horizontalcrosssection/conf_mesh.xml --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv-artifacts/doc/conf/products/horizontalcrosssection/conf_mesh.xml Fri Sep 28 12:13:53 2012 +0200 @@ -0,0 +1,192 @@ + + + + + area_filter + areaid + false + true + + + + + + + + + + + + + + + + + + + + subarea_filter + subareaid + false + + + + + + + + + + + + + + + verticalprofile_mesh + meshid + false + + + + + + + + + + + + + + + verticalprofile_mesh_with_area + meshid + false + + + + + + + + + + + + + + + mesh_polygon + false + + + + + + + + + + + + + + horizontalcrosssection_meshpoint_depth + depthid + false + + + + + + + + + + + + + + + verticalprofile_mesh_parameter + parameterid + parameter + false + + + + + + + + + + + + + + + + horizontalcrosssection_mesh_year + yearid + false + + + + + + + + + + + + + + + + + horizontalcrosssection_mesh_date + dateid + false + + + + + + + + + + + + + + + + + + horizontalcrosssection_mesh_data + horizontalprofile_meshpoint_cross_ij + horizontalcrosssection_mesh_odv_data + + + + + + + + + + + + + + + + + + + + + diff -r f99d8f92a640 -r 755dd2fa4a0a gnv-artifacts/doc/conf/products/horizontalprofile/conf_instantaneouspoint.xml --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv-artifacts/doc/conf/products/horizontalprofile/conf_instantaneouspoint.xml Fri Sep 28 12:13:53 2012 +0200 @@ -0,0 +1,253 @@ + + + + + area_filter + areaid + false + true + + + + + + + + + + + + + + + + + + + + subarea_filter + subareaid + false + + + + + + + + + + + + + + + + horizontalprofile_instantaneouspoint_vehicle_with_area + vehicleid + false + + + + + + + + + + + + + + + horizontalprofile_instantaneouspoint_cruise_with_area + cruiseid + false + + + + + + + + + + + + + + + + horizontalprofile_instantaneouspoint_track_with_area + trackid + false + + + + + + + + + + + + + + + + horizontalprofile_instantaneouspoint_vehicle + vehicleid + false + + horizontalprofile_instantaneouspoint_cruise + + + + + + + + + + + + + + + horizontalprofile_instantaneouspoint_cruise + cruiseid + false + + + + + + + + + + + + + + + horizontalprofile_instantaneouspoint_track + trackid + false + + + + + + + + + + + + + + horizontalprofile_instantaneouspoint_surveyinfo + surveyid + false + + + + + + + + + + + + + + + horizontalprofile_instantaneouspoint_parameter + parameterid + parameter + true + + + + + + + + + + + + + + + + horizontalprofile_instantaneouspoint_depth + measurementid + true + + + + + + + + + + + + + + + + + horizontalprofile_instantaneouspoint_chart_data + horizontalprofile_instantaneouspoint_odv_data + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff -r f99d8f92a640 -r 755dd2fa4a0a gnv-artifacts/doc/conf/products/horizontalprofile/conf_mesh.xml --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv-artifacts/doc/conf/products/horizontalprofile/conf_mesh.xml Fri Sep 28 12:13:53 2012 +0200 @@ -0,0 +1,254 @@ + + + + + area_filter + areaid + false + true + + + + + + + + + + + + + + + + + + + + subarea_filter + subareaid + false + + + + + + + + + + + + + + + verticalprofile_mesh + meshid + false + + + + + + + + + + + + + + verticalprofile_mesh_with_area + meshid + false + + + + + + + + + + + + + + + mesh_coordinate + false + + + + + + + + + + + + + + verticalprofile_mesh_point + mesh_point + false + + + + + + + + + + + + + + + + axisid + false + + + + + + + + + + + + + + + verticalprofile_mesh_parameter + parameterid + parameter + true + + + + + + + + + + + + + + + + horizontalprofile_meshpoint_depth + depthid + true + + + + + + + + + + + + + + + + + verticalprofile_mesh_year + yearid + true + + + + + + + + + + + + + + + + + + verticalprofile_mesh_date + dateid + true + + + + + + + + + + + + + + + + + + + horizontalprofile_mesh_chart_data + horizontalprofile_mesh_odv_data + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff -r f99d8f92a640 -r 755dd2fa4a0a gnv-artifacts/doc/conf/products/horizontalprofile/conf_mesh_cross.xml --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv-artifacts/doc/conf/products/horizontalprofile/conf_mesh_cross.xml Fri Sep 28 12:13:53 2012 +0200 @@ -0,0 +1,220 @@ + + + + + area_filter + areaid + false + true + + + + + + + + + + + + + + + + + + + + subarea_filter + subareaid + false + + + + + + + + + + + + + + + verticalprofile_mesh + meshid + false + + + + + + + + + + + + + + verticalprofile_mesh_with_area + meshid + false + + + + + + + + + + + + + + + mesh_linestring + false + + + + + + + + + + + + + + + + + verticalprofile_mesh_parameter + parameterid + parameter + true + + + + + + + + + + + + + + + horizontalprofile_meshpoint_depth + depthid + true + + + + + + + + + + + + + + + + verticalprofile_mesh_year + yearid + true + + + + + + + + + + + + + + + + + + verticalprofile_mesh_date + dateid + true + + + + + + + + + + + + + + + + + + horizontalprofile_mesh_cross_chart_data + horizontalprofile_meshpoint_cross_ij + horizontalprofile_mesh_odv_data + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff -r f99d8f92a640 -r 755dd2fa4a0a gnv-artifacts/doc/conf/products/layer/conf.xml --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv-artifacts/doc/conf/products/layer/conf.xml Fri Sep 28 12:13:53 2012 +0200 @@ -0,0 +1,107 @@ + + + + + area_filter + areaid + false + true + + + + + + + + + + + + + + + + + + + + subarea_filter + subareaid + false + + + + + + + + + + + + + + + layer + layerid + false + + + + + + + + + + + + + + layer_request_data + layer_data + + + + + + + + + + + + layer + layerid + false + + + + + + + + + + + + + + + layer_request_data + layer_data_with_geom + geometry_for_subareafilter + subareaid + + + + + + + + + + + + + diff -r f99d8f92a640 -r 755dd2fa4a0a gnv-artifacts/doc/conf/products/timeseries/conf_mesh.xml --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv-artifacts/doc/conf/products/timeseries/conf_mesh.xml Fri Sep 28 12:13:53 2012 +0200 @@ -0,0 +1,243 @@ + + + + + area_filter + areaid + false + true + + + + + + + + + + + + + + + + + + + + subarea_filter + subareaid + false + + + + + + + + + + + + + + + verticalprofile_mesh + meshid + false + + + + + + + + + + + + + + verticalprofile_mesh_with_area + meshid + false + + + + + + + + + + + + + + + + + + + + + + + mesh_coordinate + false + + + + + + + + + + + + + + timeseries_meshpoint + mesh_point + false + + + + + + + + + + + + + + + + + timeseries_meshpoint + mesh_point + false + + + + + + + + + + + + + + + + timeseries_meshpoint_depth + depthid + true + + + + + + + + + + + + + + + timeseries_mesh_parameter + parameterid + parameter + true + + + + + + + + + + + + + + + + timeseries_mesh_interval + timeinterval + false + + + + + + + + + + + + + + + + + + timeseries_mesh_chart_data + timeseries_mesh_odv_data + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff -r f99d8f92a640 -r 755dd2fa4a0a gnv-artifacts/doc/conf/products/timeseries/conf_timeseriespoint.xml --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv-artifacts/doc/conf/products/timeseries/conf_timeseriespoint.xml Fri Sep 28 12:13:53 2012 +0200 @@ -0,0 +1,229 @@ + + + + + + + + + + + + + area_filter + + + areaid + + + false + + + true + + + + + + + + + + + + + + + + + + + + + + subarea_filter + subareaid + false + + + + + + + + + + + + + + + timeseries_timeseriespoint + featureid + false + + + + + + + + + + + + + + timeseries_timeseriespoint_with_area + featureid + false + + + + + + + + + + + + + + + timeseries_parameter + parameterid + parameter + true + + + + + + + + + + + + + + timeseries_depth_height + measurementid + true + + + + + + + + + + + + + + + timeseries_interval + timeinterval + false + + + + + + + + + + + + + + + + + timeseries_chart_data + timeseries_odv_data + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff -r f99d8f92a640 -r 755dd2fa4a0a gnv-artifacts/doc/conf/products/timeseries/timegap_definition.xml --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv-artifacts/doc/conf/products/timeseries/timegap_definition.xml Fri Sep 28 12:13:53 2012 +0200 @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff -r f99d8f92a640 -r 755dd2fa4a0a gnv-artifacts/doc/conf/products/verticalcrosssection/conf_mesh.xml --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv-artifacts/doc/conf/products/verticalcrosssection/conf_mesh.xml Fri Sep 28 12:13:53 2012 +0200 @@ -0,0 +1,181 @@ + + + + + area_filter + areaid + false + true + + + + + + + + + + + + + + + + + + + + subarea_filter + subareaid + false + + + + + + + + + + + + + + + verticalprofile_mesh + meshid + false + + + + + + + + + + + + + + verticalprofile_mesh_with_area + meshid + false + + + + + + + + + + + + + + + mesh_linestring + false + + + + + + + + + + + + + + verticalprofile_mesh_parameter + parameterid + parameter + false + + + + + + + + + + + + + + + verticalcrosssection_mesh_year + yearid + false + + + + + + + + + + + + + + + + + + verticalcrosssection_mesh_date + dateid + false + + + + + + + + + + + + + + + + + + + verticalcrosssection_mesh_chart_data + verticalcrosssection_mesh_odv_data + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff -r f99d8f92a640 -r 755dd2fa4a0a gnv-artifacts/doc/conf/products/verticalprofile/conf_instantaneouspoint.xml --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv-artifacts/doc/conf/products/verticalprofile/conf_instantaneouspoint.xml Fri Sep 28 12:13:53 2012 +0200 @@ -0,0 +1,122 @@ + + + + + verticalprofile_instantaneouspoint_series + seriesid + false + + + + + + + + + + + + + + verticalprofile_instantaneouspoint_point + instantaneouspoint_point + false + + + + + + + + + + + + + + + verticalprofile_instantaneouspoint_parameter + parameterid + parameter + true + + + + + + + + + + + + + + + verticalprofile_instantaneouspoint_minmaxdepth + depthrange + true + + + + + + + + + + + + + + + + + verticalprofile_instantaneouspoint_chart_data + verticalprofile_instantaneouspoint_odv_data + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff -r f99d8f92a640 -r 755dd2fa4a0a gnv-artifacts/doc/conf/products/verticalprofile/conf_mesh.xml --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv-artifacts/doc/conf/products/verticalprofile/conf_mesh.xml Fri Sep 28 12:13:53 2012 +0200 @@ -0,0 +1,258 @@ + + + + + area_filter + areaid + false + true + + + + + + + + + + + + + + + + + + + + subarea_filter + subareaid + false + + + + + + + + + + + + + + + verticalprofile_mesh + meshid + false + + + + + + + + + + + + + + verticalprofile_mesh_with_area + meshid + false + + + + + + + + + + + + + + + mesh_coordinate + false + + + + + + + + + + + + + + verticalprofile_mesh_point + mesh_point + false + + + + + + + + + + + + + + + + verticalprofile_mesh_mindepth + mindepthid + false + + + + + + + + + + + + + + + verticalprofile_mesh_maxdepth + maxdepthid + false + + verticalprofile_meshpoint_parameter + + + + + + + + + + + + + + + + + verticalprofile_mesh_parameter + parameterid + parameter + true + + + + + + + + + + + + + + + + + verticalprofile_mesh_year + yearid + true + + + + + + + + + + + + + + + + + + verticalprofile_mesh_date + dateid + true + + + + + + + + + + + + + + + + + + + verticalprofile_mesh_chart_data + verticalprofile_mesh_odv_data + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff -r f99d8f92a640 -r 755dd2fa4a0a gnv-artifacts/doc/conf/products/verticalprofile/conf_timeseriespoint.xml --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv-artifacts/doc/conf/products/verticalprofile/conf_timeseriespoint.xml Fri Sep 28 12:13:53 2012 +0200 @@ -0,0 +1,196 @@ + + + + + area_filter + areaid + false + true + + + + + + + + + + + + + + + + + + + + subarea_filter + subareaid + false + + + + + + + + + + + + + + + verticalprofile_point + featureid + false + + + + + + + + + + + + + + timeseries_timeseriespoint_with_area + featureid + false + + + + + + + + + + + + + + + verticalprofile_parameter + parameterid + parameter + true + + + + + + + + + + + + + + verticalprofile_year + yearid + true + + + + + + + + + + + + + + + verticalprofile_date + dateid + true + + + + + + + + + + + + + + + + verticalprofile_minmaxdepth + depthrange + true + + + + + + + + + + + + + + + + + verticalprofile_chart_data + verticalprofile_odv_data + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff -r f99d8f92a640 -r 755dd2fa4a0a gnv-artifacts/doc/conf/queries.properties --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv-artifacts/doc/conf/queries.properties Fri Sep 28 12:13:53 2012 +0200 @@ -0,0 +1,1249 @@ +############################################# +############################################# +########## Zeitserie ############## +############################################# +############################################# + +timeseries_timeseriespoint=SELECT DISTINCT \ + tsp.FEATUREID KEY, \ + tsp.NAME VALUE \ + FROM MEDIAN.TIMESERIESPOINT tsp, \ + MEDIAN.MEASUREMENT mmt \ + WHERE tsp.FEATUREID = mmt.FEATUREID AND \ + mmt.SOURCEID = ? \ + order by tsp.name + +timeseries_timeseriespoint_with_area=SELECT \ + MEDIAN.TIMESERIESPOINT.FEATUREID KEY, \ + MEDIAN.TIMESERIESPOINT.NAME VALUE \ + FROM MEDIAN.TIMESERIESPOINT, \ + MEDIAN.MEASUREMENT MMT \ + WHERE MEDIAN.TIMESERIESPOINT.FEATUREID = MMT.FEATUREID AND \ + MMT.SOURCEID = ? AND \ + INTERSECTS(SHAPE, \ + (SELECT st_astext(SHAPE) \ + FROM MEDIAN.FEATUREAREA \ + WHERE (FEATURETYPE = 7 OR FEATURETYPE = 8) AND \ + FEATURECODE = ? )\ + )\ + ORDER BY MEDIAN.TIMESERIESPOINT.NAME + +timeseries_parameter=SELECT DISTINCT \ + p.PARAMETERID KEY, \ + p.GERMANNAME || ' ['|| p.UNIT ||']' VALUE, \ + p.GERMANNAME \ + FROM MEDIAN.PARAMETER P, \ + MEDIAN.TIMESERIES TS, \ + MEDIAN.TIMESERIESVALUE TSV, \ + MEDIAN.MEASUREMENT M, \ + MEDIAN.TIMESERIESPOINT TSP \ + WHERE M.FEATUREID = TSP.FEATUREID AND \ + M.MEASUREMENTID = TSV.MEASUREMENTID AND \ + TS.TIMESERIESID = TSV.TIMESERIESID AND \ + P.PARAMETERID = TS.PARAMETERID AND \ + TSP.FEATUREID = ? \ + ORDER BY P.GERMANNAME + +timeseries_depth_height=SELECT DISTINCT \ + M.MEASUREMENTID KEY, \ + M.ZLOCATION VALUE, \ + P.PARAMETERID PARAMETERID \ + FROM MEDIAN.MEASUREMENT M, \ + MEDIAN.TIMESERIESVALUE TSV, \ + MEDIAN.TIMESERIES T, \ + MEDIAN.PARAMETER P \ + WHERE M.MEASUREMENTID = TSV.MEASUREMENTID AND \ + TSV.TIMESERIESID = T.TIMESERIESID AND \ + T.PARAMETERID = P.PARAMETERID AND \ + M.FEATUREID = ? AND \ + P.PARAMETERID IN (?)\ + ORDER BY m.ZLOCATION DESC + +timeseries_interval=select min(tv.TIMEVALUE) MIN, \ + max(tv.TIMEVALUE) MAX \ + from MEDIAN.TIMESERIES t, \ + MEDIAN.TIMESERIESVALUE tv \ + where tv.TIMESERIESID = t.TIMESERIESID AND \ + t.PARAMETERID IN ( ? ) AND \ + tv.MEASUREMENTID IN ( ? ) + +timeseries_chart_data=SELECT tv.TIMEVALUE XORDINATE, \ + tv.DATAVALUE YORDINATE, \ + t.PARAMETERID GROUP1, \ + tv.MEASUREMENTID GROUP2, \ + tv.TIMESERIESID GROUP3, \ + t.TIMEINTERVAL GAPID \ + FROM MEDIAN.TIMESERIESVALUE tv, \ + MEDIAN.TIMESERIES t \ + WHERE tv.TIMESERIESID = t.TIMESERIESID AND \ + t.PARAMETERID IN ( ? ) AND \ + tv.MEASUREMENTID IN ( ? ) AND \ + tv.TIMEVALUE >= ? AND \ + tv.TIMEVALUE <= ? \ + ORDER BY tv.MEASUREMENTID, \ + tv.TIMESERIESID, \ + t.PARAMETERID, \ + tv.TIMEVALUE + +timeseries_odv_data = SELECT SI.NAME CRUISE, \ + MEDIAN.TIMESERIESPOINT.NAME STATION, \ + '*' TYPE, \ + ST_ASTEXT(SHAPE), \ + 0 BOTDEPTH, \ + (M.ZLOCATION *-1) DEPTH, \ + TSV.TIMEVALUE, \ + TSV.DATAVALUE, \ + TS.PARAMETERID PARAMETER, \ + TSV.MEASUREMENTID, \ + TSV.TIMESERIESID \ + FROM MEDIAN.TIMESERIESPOINT, \ + MEDIAN.TIMESERIESVALUE TSV, \ + MEDIAN.TIMESERIES TS, \ + MEDIAN.MEASUREMENT M, \ + MEDIAN.SOURCEINFO SI \ + WHERE SI.SOURCEID = M.SOURCEID AND \ + M.FEATUREID = MEDIAN.TIMESERIESPOINT.FEATUREID AND \ + M.MEASUREMENTID = TSV.MEASUREMENTID AND \ + TSV.TIMESERIESID = TS.TIMESERIESID AND \ + TS.PARAMETERID IN ( ? ) AND \ + TSV.MEASUREMENTID IN ( ? ) AND \ + TSV.TIMEVALUE >= ? AND \ + TSV.TIMEVALUE <= ? \ + ORDER BY TSV.MEASUREMENTID, \ + TSV.TIMESERIESID, \ + TS.PARAMETERID, \ + TSV.TIMEVALUE + +############################################# +############################################# +########## Zeitserie Mesh ############## +############################################# +############################################# + +timeseries_mesh = SELECT OBJECTID KEY, \ + m.NAME VALUE \ + FROM MEDIAN.MESH m \ + WHERE SOURCEID IN (?) \ + ORDER BY m.NAME +timeseries_meshpoint = SELECT MEDIAN.MESHPOINT.FEATUREID, \ + ST_ASTEXT(SHAPE) \ + FROM MEDIAN.MESHPOINT, \ + MEDIAN.MESH M \ + WHERE MEDIAN.MESHPOINT.MESHID = M.MESHID AND \ + KPOSITION = 1 AND \ + M.OBJECTID = ? AND \ + INTERSECTS(SHAPE,"?") + +timeseries_meshpoint_depth = SELECT MP.FEATUREID KEY, \ + 'Layer ' || ML.KPOSITION || ': ' || -ML.UPPERZLOCATION || ' - '|| -ML.LOWERZLOCATION VALUE \ + from MEDIAN.MESHLAYER ML, \ + MEDIAN.MESHPOINT MP, \ + MEDIAN.MESH M \ + WHERE ML.KPOSITION = MP.KPOSITION AND \ + ML.MESHID = MP.MESHID AND \ + M.OBJECTID = ? AND \ + MP.MESHID = M.MESHID AND \ + IPOSITION = (select IPOSITION from MEDIAN.MESHPOINT where FEATUREID = ?) AND \ + JPOSITION = (select JPOSITION from MEDIAN.MESHPOINT where FEATUREID = ?) \ + ORDER BY ML.UPPERZLOCATION DESC + +timeseries_mesh_parameter=SELECT distinct \ + p.PARAMETERID KEY, \ + p.GERMANNAME || ' ['|| p.UNIT ||']' VALUE, \ + p.GERMANNAME \ + from MEDIAN.PARAMETER p, \ + MEDIAN.MESHSCALARVALUE msc, \ + MEDIAN.MESH m \ + where m.OBJECTID = ? AND \ + msc.PARTID = m.PARTIDMIN AND \ + msc.PARAMETERID = p.PARAMETERID \ + order by p.GERMANNAME +timeseries_mesh_interval=select /*+ parallel(TIMEVALUE,5) */ \ + min(TIMEVALUE) MIN, \ + max(TIMEVALUE) MAX \ + from MEDIAN.MESHSCALARVALUE msc, \ + MEDIAN.MESH m \ + where m.OBJECTID = ? AND \ + msc.PARTID >= m.PARTIDMIN AND \ + msc.PARTID <= m.PARTIDMAX AND \ + msc.PARAMETERID IN (?) + +timeseries_mesh_chart_data=select /*+ parallel(timevalue,10) */ \ + msv.TIMEVALUE XORDINATE, \ + msv.DATAVALUE YORDINATE, \ + msv.PARAMETERID GROUP1, \ + msv.FEATUREID GROUP2, \ + mp.FEATUREID GROUP3, \ + -1 GAPID \ + from MEDIAN.MESHSCALARVALUE msv, \ + MEDIAN.MESHPOINT mp, \ + MEDIAN.MESH m \ + where (m.OBJECTID = ? AND \ + msv.PARTID >= m.PARTIDMIN AND \ + msv.PARTID <= m.PARTIDMAX ) AND \ + msv.FEATUREID = mp.FEATUREID AND \ + msv.PARAMETERID in ( ? ) AND \ + mp.FEATUREID in ( ? ) AND \ + msv.TIMEVALUE >= ? AND \ + msv.TIMEVALUE <= ? \ + order by mp.FEATUREID, \ + msv.FEATUREID, \ + msv.PARAMETERID, \ + msv.TIMEVALUE + +timeseries_mesh_odv_data = select /*+ parallel(timevalue,10) */ \ + SI.NAME CRUISE, \ + m.MESHID || '-' || MEDIAN.MESHPOINT.IPOSITION || '-' || MEDIAN.MESHPOINT.JPOSITION STATION, \ + '*' TYPE, \ + ST_ASTEXT(SHAPE), \ + 0 BOTDEPTH, \ + (((ML.UPPERZLOCATION + ML.LOWERZLOCATION) / 2)*-1) DEPTH, \ + msv.TIMEVALUE, \ + msv.DATAVALUE, \ + msv.PARAMETERID PARAMETER \ + from MEDIAN.MESHSCALARVALUE msv, \ + MEDIAN.MESHPOINT, \ + MEDIAN.MESH m, \ + MEDIAN.SOURCEINFO SI, \ + MEDIAN.MESHLAYER ML \ + where (m.OBJECTID = ? AND \ + msv.PARTID >= m.PARTIDMIN AND \ + msv.PARTID <= m.PARTIDMAX ) AND \ + m.SOURCEID = SI.SOURCEID AND \ + ML.MESHID = MEDIAN.MESHPOINT.MESHID AND \ + ML.KPOSITION = MEDIAN.MESHPOINT.KPOSITION AND \ + msv.FEATUREID = MEDIAN.MESHPOINT.FEATUREID AND \ + msv.PARAMETERID in (? ) AND \ + MEDIAN.MESHPOINT.FEATUREID in ( ? ) AND \ + msv.TIMEVALUE >= ? AND \ + msv.TIMEVALUE <= ? \ + order by MEDIAN.MESHPOINT.FEATUREID, \ + msv.FEATUREID, \ + msv.PARAMETERID, \ + msv.TIMEVALUE + + +############################################# +############################################# +########## Vertikalprofil ############## +############################################# +############################################# + +verticalprofile_point=SELECT DISTINCT \ + tsp.FEATUREID KEY, \ + tsp.NAME VALUE \ + FROM MEDIAN.TIMESERIESPOINT tsp, \ + MEDIAN.MEASUREMENT mmt \ + WHERE tsp.FEATUREID = mmt.FEATUREID AND \ + mmt.SOURCEID = ? \ + order by tsp.name + +verticalprofile_parameter=SELECT DISTINCT \ + p.PARAMETERID KEY, \ + p.GERMANNAME || ' ['|| p.UNIT ||']' VALUE, \ + p.GERMANNAME \ + from MEDIAN.PARAMETER p, \ + MEDIAN.TIMESERIES ts, \ + MEDIAN.TIMESERIESVALUE tsv, \ + MEDIAN.MEASUREMENT m \ + where ts.PARAMETERID = p.PARAMETERID and \ + ts.TIMESERIESID = tsv.TIMESERIESID and \ + m.MEASUREMENTID = tsv.MEASUREMENTID and \ + m.FEATUREID = ? \ + ORDER BY p.GERMANNAME + +verticalprofile_minmaxdepth= SELECT min(M.ZLOCATION) MIN, \ + max(M.ZLOCATION) MAX \ + FROM MEDIAN.MEASUREMENT M, \ + MEDIAN.TIMESERIES TS, \ + MEDIAN.TIMESERIESVALUE TSV \ + WHERE TS.TIMESERIESID = TSV.TIMESERIESID and \ + M.MEASUREMENTID = TSV.MEASUREMENTID and \ + M.FEATUREID = ? and \ + TS.PARAMETERID IN ( ? ) + + +verticalprofile_year=select distinct \ + to_char(tsv.TIMEVALUE,'YYYY') KEY, \ + to_char(tsv.TIMEVALUE,'YYYY') VALUE \ + from MEDIAN.TIMESERIES ts, \ + MEDIAN.TIMESERIESVALUE tsv, \ + MEDIAN.MEASUREMENT m \ + where ts.TIMESERIESID = tsv.TIMESERIESID and \ + m.MEASUREMENTID = tsv.MEASUREMENTID and \ + m.FEATUREID = ? and \ + ts.PARAMETERID IN ( ? ) \ + order by to_char(tsv.TIMEVALUE,'YYYY') + +verticalprofile_date=select distinct \ + tsv.TIMEVALUE KEY, \ + tsv.TIMEVALUE VALUE \ + from MEDIAN.TIMESERIES ts, \ + MEDIAN.TIMESERIESVALUE tsv, \ + MEDIAN.MEASUREMENT m \ + where ts.TIMESERIESID = tsv.TIMESERIESID and \ + m.MEASUREMENTID = tsv.MEASUREMENTID and \ + m.FEATUREID = ? and \ + ts.PARAMETERID IN ( ? ) and \ + to_char(tsv.TIMEVALUE,'YYYY') IN (?) \ + order by tsv.TIMEVALUE + +verticalprofile_chart_data= SELECT M.ZLOCATION XORDINATE, \ + TSV.DATAVALUE YORDINATE, \ + TS.PARAMETERID GROUP1, \ + TSV.TIMEVALUE GROUP2, \ + 1 GROUP3, \ + 1 DATAID \ + from MEDIAN.TIMESERIES TS, \ + MEDIAN.TIMESERIESVALUE TSV, \ + MEDIAN.MEASUREMENT M \ + where TS.TIMESERIESID = TSV.TIMESERIESID AND \ + M.MEASUREMENTID = TSV.MEASUREMENTID AND \ + M.FEATUREID = ? AND \ + TS.PARAMETERID IN ( ? ) AND \ + TSV.TIMEVALUE IN (?) AND \ + M.ZLOCATION >= ? AND \ + M.ZLOCATION <= ? \ + ORDER BY TSV.TIMEVALUE, \ + TSV.TIMESERIESID, \ + TS.PARAMETERID, \ + TSV.TIMEVALUE + +verticalprofile_odv_data = SELECT SI.NAME CRUISE, \ + MEDIAN.TIMESERIESPOINT.NAME STATION, \ + '*' TYPE, \ + ST_ASTEXT(SHAPE), \ + 0 BOTDEPTH, \ + (M.ZLOCATION *-1) DEPTH, \ + TSV.TIMEVALUE, \ + TSV.DATAVALUE, \ + TS.PARAMETERID PARAMETER, \ + TSV.MEASUREMENTID, \ + TSV.TIMESERIESID \ + FROM MEDIAN.TIMESERIESPOINT, \ + MEDIAN.TIMESERIESVALUE TSV, \ + MEDIAN.TIMESERIES TS, \ + MEDIAN.MEASUREMENT M, \ + MEDIAN.SOURCEINFO SI \ + WHERE SI.SOURCEID = M.SOURCEID AND \ + M.FEATUREID = MEDIAN.TIMESERIESPOINT.FEATUREID AND \ + M.MEASUREMENTID = TSV.MEASUREMENTID AND \ + TSV.TIMESERIESID = TS.TIMESERIESID AND \ + M.FEATUREID = ? AND \ + TS.PARAMETERID IN ( ? ) AND \ + TSV.TIMEVALUE IN (?) AND \ + M.ZLOCATION >= ? AND \ + M.ZLOCATION <= ? \ + ORDER BY TSV.MEASUREMENTID, \ + TSV.TIMESERIESID, \ + TS.PARAMETERID, \ + TSV.TIMEVALUE + +############################################# +############################################# +########## Vertikalprofil Mesh ############## +############################################# +############################################# + +verticalprofile_mesh = SELECT OBJECTID KEY, \ + m.NAME VALUE \ + FROM MEDIAN.MESH m \ + WHERE SOURCEID IN (?) \ + order by m.NAME + +verticalprofile_mesh_with_area = SELECT M.OBJECTID KEY, \ + M.NAME VALUE \ + FROM MEDIAN.MESHPOINT, \ + MEDIAN.MESH M \ + WHERE M.SOURCEID IN (?) AND \ + M.MESHID = MEDIAN.MESHPOINT.MESHID AND \ + INTERSECTS(SHAPE, \ + (SELECT st_astext(SHAPE) \ + FROM MEDIAN.FEATUREAREA \ + WHERE (FEATURETYPE = 7 OR FEATURETYPE = 8) AND \ + FEATURECODE = ? )\ + ) \ + order by M.NAME + +verticalprofile_mesh_point = SELECT FEATUREID, \ + ST_ASTEXT(SHAPE) \ + FROM MEDIAN.MESHPOINT \ + WHERE MESHID in \ + (SELECT DISTINCT MESHID \ + FROM MEDIAN.MESH \ + WHERE OBJECTID = ?) AND \ + KPOSITION = 1 AND \ + INTERSECTS(SHAPE,"?") + +verticalprofile_mesh_mindepth = SELECT MP.KPOSITION KEY, \ + 'Layer ' || ML.KPOSITION || ': ' || -ML.UPPERZLOCATION || ' - '|| -ML.LOWERZLOCATION VALUE \ + from MEDIAN.MESHLAYER ML, \ + MEDIAN.MESHPOINT MP, \ + MEDIAN.MESH M \ + WHERE ML.KPOSITION = MP.KPOSITION AND \ + ML.MESHID = MP.MESHID AND \ + M.OBJECTID = ? AND \ + MP.MESHID = M.MESHID AND \ + IPOSITION = (select IPOSITION from MEDIAN.MESHPOINT where FEATUREID = ?) AND \ + JPOSITION = (select JPOSITION from MEDIAN.MESHPOINT where FEATUREID = ?) \ + ORDER BY ML.UPPERZLOCATION DESC + +verticalprofile_mesh_maxdepth = SELECT MP.KPOSITION KEY, \ + 'Layer ' || ML.KPOSITION || ': ' || -ML.UPPERZLOCATION || ' - '|| -ML.LOWERZLOCATION VALUE \ + from MEDIAN.MESHLAYER ML, \ + MEDIAN.MESHPOINT MP, \ + MEDIAN.MESH M \ + WHERE ML.KPOSITION = MP.KPOSITION AND \ + ML.MESHID = MP.MESHID AND \ + M.OBJECTID = ? AND \ + MP.MESHID = M.MESHID AND \ + IPOSITION = (select IPOSITION from MEDIAN.MESHPOINT where FEATUREID = ?) AND \ + JPOSITION = (select JPOSITION from MEDIAN.MESHPOINT where FEATUREID = ?) AND \ + MP.KPOSITION < ? \ + ORDER BY ML.UPPERZLOCATION DESC + +verticalprofile_mesh_parameter=SELECT distinct \ + p.PARAMETERID KEY, \ + p.GERMANNAME || ' ['|| p.UNIT ||']' VALUE, \ + p.GERMANNAME \ + from MEDIAN.PARAMETER p, \ + MEDIAN.MESHSCALARVALUE msc, \ + MEDIAN.MESH m \ + where m.OBJECTID = ? AND \ + m.PARTIDMIN = msc.PARTID AND \ + msc.PARAMETERID = p.PARAMETERID \ + order by p.GERMANNAME + +verticalprofile_mesh_year= select distinct \ + to_char(msv.TIMEVALUE,'YYYY') KEY, \ + to_char(msv.TIMEVALUE,'YYYY') VALUE \ + from MEDIAN.MESHSCALARVALUE msv, \ + MEDIAN.MESH m \ + where m.OBJECTID = ? AND \ + msv.PARTID >= m.PARTIDMIN AND \ + msv.PARTID <= m.PARTIDMAX AND \ + msv.PARAMETERID in (?) \ + order by to_char(msv.TIMEVALUE, 'YYYY') + +verticalprofile_mesh_date= select distinct \ + msv.TIMEVALUE KEY, \ + msv.TIMEVALUE VALUE \ + from MEDIAN.MESHSCALARVALUE msv, \ + MEDIAN.MESH m \ + where m.OBJECTID = ? AND \ + msv.PARTID >= m.PARTIDMIN AND \ + msv.PARTID <= m.PARTIDMAX AND \ + msv.PARAMETERID in (?) AND \ + to_char(msv.TIMEVALUE,'YYYY') in (?) \ + order by msv.TIMEVALUE + +verticalprofile_mesh_chart_data=select ml.UPPERZLOCATION XORDINATE, \ + msv.DATAVALUE YORDINATE, \ + mp.KPOSITION KPOSITION, \ + msv.PARAMETERID GROUP1, \ + msv.TIMEVALUE GROUP2, \ + 1 GROUP3, \ + 2 DATAID \ + from MEDIAN.MESHLAYER ml, \ + MEDIAN.MESHPOINT mp, \ + MEDIAN.MESH m, \ + MEDIAN.MESHSCALARVALUE msv \ + where msv.FEATUREID = mp. FEATUREID AND \ + ml.KPOSITION = mp.KPOSITION and \ + ml.MESHID = mp.MESHID and \ + m.MESHID = mp.MESHID AND \ + m.PARTIDMIN <= msv.PARTID AND \ + m.PARTIDMAX >= msv.PARTID AND \ + msv.PARAMETERID in (?) AND \ + msv.TIMEVALUE in (?) AND \ + m.OBJECTID = ? AND \ + mp.FEATUREID in \ + ( select FEATUREID \ + from MEDIAN.MESHPOINT mp, \ + MEDIAN.MESH m \ + where m.OBJECTID = ? AND \ + mp.MESHID = m.MESHID AND \ + IPOSITION = (select IPOSITION from MEDIAN.MESHPOINT where FEATUREID = ?) and \ + JPOSITION = (select JPOSITION from MEDIAN.MESHPOINT where FEATUREID = ?)) AND \ + mp.KPOSITION <= ? AND \ + mp.KPOSITION >= ? \ + order by msv.PARAMETERID, \ + msv.TIMEVALUE, \ + ml.UPPERZLOCATION + +verticalprofile_mesh_odv_data=select SI.NAME CRUISE, \ + m.MESHID || '-' || MEDIAN.MESHPOINT.IPOSITION || '-' || MEDIAN.MESHPOINT.JPOSITION STATION, \ + '*' TYPE, \ + ST_ASTEXT(SHAPE), \ + 0 BOTDEPTH, \ + (((ML.UPPERZLOCATION + ML.LOWERZLOCATION) / 2)*-1) DEPTH, \ + msv.DATAVALUE, \ + msv.PARAMETERID PARAMETER, \ + msv.TIMEVALUE \ + from MEDIAN.MESHLAYER ml, \ + MEDIAN.MESHPOINT, \ + MEDIAN.MESH m, \ + MEDIAN.MESHSCALARVALUE msv, \ + MEDIAN.SOURCEINFO SI \ + where m.SOURCEID = SI.SOURCEID AND \ + msv.FEATUREID = MEDIAN.MESHPOINT. FEATUREID AND \ + ml.KPOSITION = MEDIAN.MESHPOINT.KPOSITION and \ + ml.MESHID = MEDIAN.MESHPOINT.MESHID and \ + m.MESHID = MEDIAN.MESHPOINT.MESHID AND \ + m.PARTIDMIN <= msv.PARTID AND \ + m.PARTIDMAX >= msv.PARTID AND \ + msv.PARAMETERID in (?) AND \ + msv.TIMEVALUE in (?) AND \ + m.OBJECTID = ? AND \ + MEDIAN.MESHPOINT.FEATUREID in \ + ( select FEATUREID \ + from MEDIAN.MESHPOINT mp, \ + MEDIAN.MESH m \ + where m.OBJECTID = ? AND \ + mp.MESHID = m.MESHID AND \ + IPOSITION = (select IPOSITION from MEDIAN.MESHPOINT where FEATUREID = ?) and \ + JPOSITION = (select JPOSITION from MEDIAN.MESHPOINT where FEATUREID = ?)) AND \ + MEDIAN.MESHPOINT.KPOSITION <= ? AND \ + MEDIAN.MESHPOINT.KPOSITION >= ? \ + order by msv.PARAMETERID, \ + msv.TIMEVALUE, \ + ml.UPPERZLOCATION + +############################################# +############################################# +##### Vertikalprofil InstantaneousPoint ##### +############################################# +############################################# + +verticalprofile_instantaneouspoint_series = SELECT DISTINCT \ + S.SERIESID KEY, \ + S.DESCRIPTION VALUE \ + FROM MEDIAN.SERIES S, \ + MEDIAN.INSTANTANEOUSPOINT I, \ + MEDIAN.MEASUREMENT M \ + WHERE S.SERIESID = I.SERIESID AND \ + I.POINTSPEC = 4 AND \ + I.FEATUREID = M.FEATUREID AND \ + M.SOURCEID= ? \ + ORDER BY S.DESCRIPTION + +verticalprofile_instantaneouspoint_series_with_area = SELECT \ + S.SERIESID KEY, \ + S.DESCRIPTION VALUE \ + FROM MEDIAN.INSTANTANEOUSPOINT, \ + MEDIAN.SERIES S, \ + MEDIAN.MEASUREMENT M \ + WHERE S.SERIESID = MEDIAN.INSTANTANEOUSPOINT.SERIESID AND \ + MEDIAN.INSTANTANEOUSPOINT.POINTSPEC = 4 AND \ + MEDIAN.INSTANTANEOUSPOINT.FEATUREID = M.FEATUREID AND \ + M.SOURCEID= ? AND \ + INTERSECTS(SHAPE, \ + (SELECT st_astext(SHAPE) \ + FROM MEDIAN.FEATUREAREA \ + WHERE (FEATURETYPE = 7 OR FEATURETYPE = 8) AND \ + FEATURECODE = ? )\ + ) \ + ORDER BY S.DESCRIPTION + +verticalprofile_instantaneouspoint_point = SELECT \ + MEDIAN.INSTANTANEOUSPOINT.FEATUREID, \ + to_char(MEDIAN.INSTANTANEOUSPOINT.TIMEVALUE,'DD.MM.YYYY HH24:MI') VALUE, \ + MEDIAN.INSTANTANEOUSPOINT.TIMEVALUE, \ + ST_ASTEXT(SHAPE) \ + FROM MEDIAN.INSTANTANEOUSPOINT, \ + MEDIAN.MEASUREMENT M \ + WHERE MEDIAN.INSTANTANEOUSPOINT.SERIESID = ? AND \ + MEDIAN.INSTANTANEOUSPOINT.POINTSPEC = 4 AND \ + MEDIAN.INSTANTANEOUSPOINT.FEATUREID = M.FEATUREID AND \ + M.SOURCEID = ? \ + ORDER BY MEDIAN.INSTANTANEOUSPOINT.FEATUREID, \ + MEDIAN.INSTANTANEOUSPOINT.TIMEVALUE + +verticalprofile_instantaneouspoint_parameter = SELECT DISTINCT \ + P.PARAMETERID KEY, \ + p.GERMANNAME || ' ['|| p.UNIT ||']' VALUE, \ + p.GERMANNAME \ + FROM MEDIAN.PARAMETER P, \ + MEDIAN.INSTANTANEOUSPOINT IP, \ + MEDIAN.MEASUREMENT M, \ + MEDIAN.MEASUREDSCALARVALUE MSV \ + WHERE IP.FEATUREID = M.FEATUREID AND \ + M.MEASUREMENTID = MSV.MEASUREMENTID AND \ + MSV.PARAMETERID = P.PARAMETERID AND \ + IP.FEATUREID = ? \ + ORDER BY P.GERMANNAME + +verticalprofile_instantaneouspoint_minmaxdepth = SELECT min(M.ZLOCATION) MIN, \ + max(M.ZLOCATION) MAX \ + FROM MEDIAN.INSTANTANEOUSPOINT IP, \ + MEDIAN.MEASUREMENT M, \ + MEDIAN.MEASUREDSCALARVALUE MSV \ + WHERE IP.FEATUREID = M.FEATUREID AND \ + M.MEASUREMENTID = MSV.MEASUREMENTID AND \ + IP.FEATUREID = ? AND \ + MSV.PARAMETERID in (?) + +verticalprofile_instantaneouspoint_chart_data = SELECT M.ZLOCATION XORDINATE, \ + MSV.DATAVALUE YORDINATE, \ + MSV.PARAMETERID GROUP1, \ + IP.TIMEVALUE GROUP2, \ + 1 GROUP3, \ + 3 DATAID \ + FROM MEDIAN.INSTANTANEOUSPOINT IP, \ + MEDIAN.MEASUREMENT M, \ + MEDIAN.MEASUREDSCALARVALUE MSV \ + WHERE IP.FEATUREID = M.FEATUREID AND \ + M.MEASUREMENTID = MSV.MEASUREMENTID AND \ + IP.FEATUREID = ? AND \ + MSV.PARAMETERID in (?) AND \ + M.ZLOCATION >= ? AND \ + M.ZLOCATION <= ? \ + ORDER BY IP.TIMEVALUE, \ + MSV.PARAMETERID, \ + M.ZLOCATION + +verticalprofile_instantaneouspoint_odv_data = SELECT S.DESCRIPTION CRUISE, \ + MEDIAN.INSTANTANEOUSPOINT.FEATUREID STATION, \ + '*' TYPE, \ + ST_ASTEXT(SHAPE), \ + 0 BOTDEPTH, \ + (M.ZLOCATION * -1) DEPTH, \ + MSV.DATAVALUE, \ + MSV.PARAMETERID PARAMETER, \ + MEDIAN.INSTANTANEOUSPOINT.TIMEVALUE \ + FROM MEDIAN.SERIES S, \ + MEDIAN.INSTANTANEOUSPOINT, \ + MEDIAN.MEASUREMENT M, \ + MEDIAN.MEASUREDSCALARVALUE MSV \ + WHERE S.SERIESID = MEDIAN.INSTANTANEOUSPOINT.SERIESID AND \ + MEDIAN.INSTANTANEOUSPOINT.FEATUREID = M.FEATUREID AND \ + M.MEASUREMENTID = MSV.MEASUREMENTID AND \ + MEDIAN.INSTANTANEOUSPOINT.FEATUREID = ? AND \ + MSV.PARAMETERID in (?) AND \ + M.ZLOCATION >= ? AND \ + M.ZLOCATION <= ? \ + ORDER BY MEDIAN.INSTANTANEOUSPOINT.TIMEVALUE, \ + MSV.PARAMETERID, \ + M.ZLOCATION + +############################################# +############################################# +#### Horizontalprofil InstantaneousPoint #### +############################################# +############################################# +horizontalprofile_instantaneouspoint_vehicle = SELECT DISTINCT \ + V.VEHICLEID KEY, \ + V.NAME VALUE \ + FROM MEDIAN.VEHICLE V, \ + MEDIAN.CRUISE C, \ + MEDIAN.TRACK T, \ + MEDIAN.SURVEYINFO S, \ + MEDIAN.INSTANTANEOUSPOINT I, \ + MEDIAN.MEASUREMENT M \ + WHERE V.VEHICLEID = C.VEHICLEID AND \ + C.CRUISEID = T.CRUISEID AND \ + T.TRACKID = S.TRACKID AND \ + S.SURVEYID = I.SURVEYID AND \ + I.FEATUREID = M.FEATUREID AND \ + M.SOURCEID = ? \ + ORDER BY V.NAME + +horizontalprofile_instantaneouspoint_vehicle_with_area = SELECT V.VEHICLEID KEY, \ + V.NAME VALUE \ + FROM MEDIAN.TRACK, \ + MEDIAN.VEHICLE V, \ + MEDIAN.CRUISE C \ + WHERE V.VEHICLEID = C.VEHICLEID AND \ + C.CRUISEID = MEDIAN.TRACK.CRUISEID AND \ + MEDIAN.TRACK.TRACKID IN \ + (SELECT DISTINCT S.TRACKID \ + FROM MEDIAN.MEASUREMENT M ,\ + MEDIAN.INSTANTANEOUSPOINT I, \ + MEDIAN.SURVEYINFO S \ + WHERE M.SOURCEID = ? AND \ + I.FEATUREID = M.FEATUREID AND \ + S.SURVEYID = I.SURVEYID)AND \ + INTERSECTS(SHAPE, \ + (SELECT st_astext(SHAPE) \ + FROM MEDIAN.FEATUREAREA \ + WHERE (FEATURETYPE = 7 OR FEATURETYPE = 8) AND \ + FEATURECODE = ? )\ + ) \ + ORDER BY V.NAME +horizontalprofile_instantaneouspoint_cruise = SELECT DISTINCT \ + C.CRUISEID KEY, \ + V.NAME || ' ' || \ + C.NAME || ' ' || \ + TO_CHAR(C.STARTDATE,'DD.MM.YYYY') || ' - ' || \ + TO_CHAR(C.ENDDATE,'DD.MM.YYYY') VALUE, \ + V.NAME, \ + C.NAME \ + FROM MEDIAN.CRUISE C, \ + MEDIAN.VEHICLE V, \ + MEDIAN.TRACK T, \ + MEDIAN.SURVEYINFO S, \ + MEDIAN.INSTANTANEOUSPOINT I, \ + MEDIAN.MEASUREMENT M \ + WHERE C.VEHICLEID = V.VEHICLEID AND \ + C.CRUISEID = T.CRUISEID AND \ + T.TRACKID = S.TRACKID AND \ + S.SURVEYID = I.SURVEYID AND \ + I.FEATUREID = M.FEATUREID AND \ + C.VEHICLEID = ? AND \ + M.SOURCEID = ? \ + ORDER BY V.NAME, C.NAME + +horizontalprofile_instantaneouspoint_cruise_with_area = SELECT C.CRUISEID KEY, \ + V.NAME || ' ' || \ + C.NAME || ' ' || \ + TO_CHAR(C.STARTDATE,'DD.MM.YYYY') || ' - ' || \ + TO_CHAR(C.ENDDATE,'DD.MM.YYYY') VALUE, \ + V.NAME, \ + C.NAME \ + FROM MEDIAN.TRACK, \ + MEDIAN.VEHICLE V, \ + MEDIAN.CRUISE C \ + WHERE V.VEHICLEID = C.VEHICLEID AND \ + C.CRUISEID = MEDIAN.TRACK.CRUISEID AND \ + MEDIAN.TRACK.TRACKID IN \ + (SELECT DISTINCT S.TRACKID \ + FROM MEDIAN.MEASUREMENT M ,\ + MEDIAN.INSTANTANEOUSPOINT I, \ + MEDIAN.SURVEYINFO S \ + WHERE M.SOURCEID = ? AND \ + C.VEHICLEID = ? AND \ + I.FEATUREID = M.FEATUREID AND \ + S.SURVEYID = I.SURVEYID)AND \ + INTERSECTS(SHAPE, \ + (SELECT st_astext(SHAPE) \ + FROM MEDIAN.FEATUREAREA \ + WHERE (FEATURETYPE = 7 OR FEATURETYPE = 8) AND \ + FEATURECODE = ? )\ + ) \ + ORDER BY V.NAME +horizontalprofile_instantaneouspoint_track= SELECT \ + T.TRACKID KEY, \ + to_char(T.STARTDATE,'DD.MM.YYYY HH24:MI') || ' - '|| to_char(T.ENDDATE,'DD.MM.YYYY HH24:MI') || ' - '|| T.NAME VALUE \ + FROM MEDIAN.TRACK T \ + WHERE T.CRUISEID = ? \ + ORDER BY T.STARTDATE, \ + T.ENDDATE, \ + T.NAME + +horizontalprofile_instantaneouspoint_track_with_area = SELECT \ + MEDIAN.TRACK.TRACKID KEY, \ + to_char(STARTDATE,'DD.MM.YYYY HH24:MI') || ' - '|| to_char(ENDDATE,'DD.MM.YYYY HH24:MI') || ' - '|| NAME VALUE, \ + NAME \ + FROM MEDIAN.TRACK \ + WHERE MEDIAN.TRACK.CRUISEID = ? AND \ + INTERSECTS(SHAPE, \ + (SELECT st_astext(SHAPE) \ + FROM MEDIAN.FEATUREAREA \ + WHERE (FEATURETYPE = 7 OR FEATURETYPE = 8) AND \ + FEATURECODE = ? )\ + ) \ + ORDER BY STARTDATE, \ + ENDDATE, \ + NAME +horizontalprofile_instantaneouspoint_surveyinfo = SELECT \ + SURVEYID KEY, \ + to_char(STARTDATE,'DD.MM.YYYY HH24:MI') || ' - '|| to_char(ENDDATE,'DD.MM.YYYY HH24:MI') || ' - '|| DESCRIPTION VALUE \ + FROM MEDIAN.SURVEYINFO \ + WHERE TRACKID = ? \ + ORDER BY STARTDATE, \ + ENDDATE, \ + DESCRIPTION +horizontalprofile_instantaneouspoint_parameter = SELECT DISTINCT \ + P.PARAMETERID KEY, \ + p.GERMANNAME || ' ['|| p.UNIT ||']' VALUE, \ + p.GERMANNAME \ + FROM MEDIAN.PARAMETER P, \ + MEDIAN.MEASUREMENT M, \ + MEDIAN.INSTANTANEOUSPOINT IP, \ + MEDIAN.MEASUREDSCALARVALUE MSV \ + WHERE P.PARAMETERID = MSV.PARAMETERID AND \ + MSV.MEASUREMENTID = M.MEASUREMENTID AND \ + M.FEATUREID = IP.FEATUREID AND \ + IP.SURVEYID = ? \ + ORDER BY P.GERMANNAME +horizontalprofile_instantaneouspoint_depth = SELECT DISTINCT \ + M.ZLOCATION KEY, \ + M.ZLOCATION VALUE \ + FROM MEDIAN.MEASUREMENT M, \ + MEDIAN.INSTANTANEOUSPOINT IP \ + WHERE M.FEATUREID = IP.FEATUREID AND \ + IP.SURVEYID = ? \ + ORDER BY M.ZLOCATION +horizontalprofile_instantaneouspoint_chart_data = SELECT ST_ASTEXT(SHAPE), \ + MEDIAN.INSTANTANEOUSPOINT.TIMEVALUE TIME, \ + MSV.DATAVALUE YORDINATE, \ + MSV.PARAMETERID GROUP1, \ + ZLOCATION GROUP2, \ + 1 GROUP3, \ + 3 DATAID \ + FROM MEDIAN.INSTANTANEOUSPOINT, \ + MEDIAN.MEASUREMENT M, \ + MEDIAN.MEASUREDSCALARVALUE MSV \ + WHERE MEDIAN.INSTANTANEOUSPOINT.FEATUREID = M.FEATUREID AND \ + M.MEASUREMENTID = MSV.MEASUREMENTID AND \ + MEDIAN.INSTANTANEOUSPOINT.SURVEYID = ? AND \ + M.ZLOCATION IN (?) AND \ + MSV.PARAMETERID in (?) \ + ORDER BY MSV.PARAMETERID, \ + M.ZLOCATION, \ + MEDIAN.INSTANTANEOUSPOINT.TIMEVALUE +horizontalprofile_instantaneouspoint_odv_data = SELECT V.NAME || ' ' || C.NAME CRUISE, \ + MEDIAN.InstantaneousPoint.FEATUREID STATION, \ + '*' TYPE, \ + 0 BOTDEPTH, \ + (M.ZLOCATION * -1) DEPTH, \ + ST_ASTEXT(SHAPE), \ + MEDIAN.INSTANTANEOUSPOINT.TIMEVALUE, \ + MSV.DATAVALUE, \ + MSV.PARAMETERID PARAMETER \ + FROM MEDIAN.INSTANTANEOUSPOINT, \ + MEDIAN.VEHICLE V, \ + MEDIAN.CRUISE C, \ + (SELECT TRACKID,CRUISEID FROM MEDIAN.TRACK) T, \ + MEDIAN.SURVEYINFO S, \ + MEDIAN.MEASUREMENT M, \ + MEDIAN.MEASUREDSCALARVALUE MSV \ + WHERE V.VEHICLEID = C.VEHICLEID AND \ + C.CRUISEID = T.CRUISEID AND \ + T.TRACKID = S.TRACKID AND \ + S.SURVEYID = MEDIAN.INSTANTANEOUSPOINT.SURVEYID AND \ + MEDIAN.INSTANTANEOUSPOINT.FEATUREID = M.FEATUREID AND \ + M.MEASUREMENTID = MSV.MEASUREMENTID AND \ + MEDIAN.INSTANTANEOUSPOINT.SURVEYID = ? AND \ + M.ZLOCATION IN (?) AND \ + MSV.PARAMETERID in (?) \ + ORDER BY MSV.PARAMETERID, \ + M.ZLOCATION, \ + MEDIAN.INSTANTANEOUSPOINT.TIMEVALUE + +############################################# +############################################# +########### Horizontalprofil MESH ########### +############################################# +############################################# +horizontalprofile_meshpoint_depth = SELECT DISTINCT \ + mp.KPOSITION KEY, \ + 'Layer ' || ml.KPOSITION || ': ' || -ml.UPPERZLOCATION || ' - '|| -ml.LOWERZLOCATION VALUE \ + from MEDIAN.MESHLAYER ml, \ + MEDIAN.MESHPOINT mp \ + where ml.KPOSITION = mp.KPOSITION and \ + ml.MESHID = mp.MESHID and \ + mp.FEATUREID in \ + ( select FEATUREID \ + from MEDIAN.MESHPOINT mp, \ + MEDIAN.MESH m \ + where m.OBJECTID = ? AND \ + mp.MESHID = m.MESHID AND \ + IPOSITION = (select IPOSITION from MEDIAN.MESHPOINT where FEATUREID = ?) and \ + JPOSITION = (select JPOSITION from MEDIAN.MESHPOINT where FEATUREID = ?)) \ + order by mp.KPOSITION + +horizontalprofile_mesh_chart_data = SELECT ST_ASTEXT(SHAPE), \ + msv.DATAVALUE YORDINATE, \ + msv.PARAMETERID GROUP1, \ + MEDIAN.MESHPOINT.KPOSITION GROUP2, \ + msv.TIMEVALUE GROUP3, \ + MEDIAN.MESHPOINT.JPOSITION, \ + MEDIAN.MESHPOINT.IPOSITION, \ + 2 DATAID \ + from MEDIAN.MESHLAYER ml, \ + MEDIAN.MESHPOINT, \ + MEDIAN.MESH m, \ + MEDIAN.MESHSCALARVALUE msv \ + where msv.FEATUREID = MEDIAN.MESHPOINT. FEATUREID AND \ + ml.KPOSITION = MEDIAN.MESHPOINT.KPOSITION and \ + ml.MESHID = MEDIAN.MESHPOINT.MESHID and \ + m.MESHID = MEDIAN.MESHPOINT.MESHID AND \ + m.PARTIDMIN <= msv.PARTID AND \ + m.PARTIDMAX >= msv.PARTID AND \ + msv.PARAMETERID in (?) AND \ + msv.TIMEVALUE in (?) AND \ + m.OBJECTID = ? AND \ + MEDIAN.MESHPOINT.FEATUREID in \ + ( select FEATUREID \ + from MEDIAN.MESHPOINT mp, \ + MEDIAN.MESH m \ + where m.OBJECTID = ? AND \ + mp.MESHID = m.MESHID AND \ + KPOSITION in ( ? ) and \ + ? = (select ? from MEDIAN.MESHPOINT where FEATUREID = ?)) \ + order by msv.TIMEVALUE, \ + MEDIAN.MESHPOINT.KPOSITION, \ + msv.PARAMETERID, \ + MEDIAN.MESHPOINT.JPOSITION, \ + MEDIAN.MESHPOINT.IPOSITION + +horizontalprofile_mesh_odv_data = SELECT SI.NAME CRUISE, \ + m.MESHID || '-' || MEDIAN.MESHPOINT.IPOSITION || '-' || MEDIAN.MESHPOINT.JPOSITION STATION, \ + '*' TYPE, \ + ST_ASTEXT(SHAPE), \ + 0 BOTDEPTH, \ + (((ML.UPPERZLOCATION + ML.LOWERZLOCATION) / 2)*-1) DEPTH, \ + msv.DATAVALUE, \ + msv.PARAMETERID PARAMETER, \ + msv.TIMEVALUE, \ + MEDIAN.MESHPOINT.JPOSITION, \ + MEDIAN.MESHPOINT.IPOSITION \ + from MEDIAN.MESHLAYER ml, \ + MEDIAN.MESHPOINT, \ + MEDIAN.MESH m, \ + MEDIAN.MESHSCALARVALUE msv, \ + MEDIAN.SOURCEINFO SI \ + where msv.FEATUREID = MEDIAN.MESHPOINT. FEATUREID AND \ + ml.KPOSITION = MEDIAN.MESHPOINT.KPOSITION and \ + ml.MESHID = MEDIAN.MESHPOINT.MESHID and \ + m.MESHID = MEDIAN.MESHPOINT.MESHID AND \ + m.SOURCEID = SI.SOURCEID AND \ + m.PARTIDMIN <= msv.PARTID AND \ + m.PARTIDMAX >= msv.PARTID AND \ + msv.PARAMETERID in (?) AND \ + msv.TIMEVALUE in (?) AND \ + m.OBJECTID = ? AND \ + MEDIAN.MESHPOINT.FEATUREID in \ + ( select FEATUREID \ + from MEDIAN.MESHPOINT mp, \ + MEDIAN.MESH m \ + where m.OBJECTID = ? AND \ + mp.MESHID = m.MESHID AND \ + KPOSITION in ( ? ) and \ + ? = (select ? from MEDIAN.MESHPOINT where FEATUREID = ?)) \ + order by msv.TIMEVALUE, \ + MEDIAN.MESHPOINT.KPOSITION, \ + msv.PARAMETERID, \ + MEDIAN.MESHPOINT.JPOSITION, \ + MEDIAN.MESHPOINT.IPOSITION + +############################################# +############################################# +########### Horizontalprofil MESH ########### +########### Schnittprofil ########### +############################################# +############################################# +horizontalprofile_meshpoint_depth = SELECT DISTINCT \ + mp.KPOSITION KEY, \ + 'Layer ' || ml.KPOSITION || ': ' || -ml.UPPERZLOCATION || ' - '|| -ml.LOWERZLOCATION VALUE \ + from MEDIAN.MESHLAYER ml, \ + MEDIAN.MESHPOINT mp \ + where ml.KPOSITION = mp.KPOSITION and \ + ml.MESHID = mp.MESHID and \ + mp.FEATUREID in \ + ( select FEATUREID \ + from MEDIAN.MESHPOINT mp, \ + MEDIAN.MESH m \ + where m.OBJECTID = ? AND \ + mp.MESHID = m.MESHID )\ + order by mp.KPOSITION + +horizontalprofile_meshpoint_cross_ij=SELECT MEDIAN.MESHFACE.JPOSITION, \ + MEDIAN.MESHFACE.IPOSITION \ + FROM MEDIAN.MESHFACE, \ + MEDIAN.MESH M \ + WHERE MEDIAN.MESHFACE.KPOSITION = 1 AND \ + M.MESHID = MEDIAN.MESHFACE.MESHID AND \ + M.OBJECTID = ? AND \ + INTERSECTS(SHAPE, "?") +horizontalprofile_mesh_cross_chart_data = SELECT ST_ASTEXT(SHAPE), \ + msv.DATAVALUE YORDINATE, \ + msv.PARAMETERID GROUP1, \ + MEDIAN.MESHPOINT.KPOSITION GROUP2, \ + msv.TIMEVALUE GROUP3, \ + MEDIAN.MESHPOINT.JPOSITION, \ + MEDIAN.MESHPOINT.IPOSITION, \ + 2 DATAID \ + from MEDIAN.MESHLAYER ml, \ + MEDIAN.MESHPOINT, \ + MEDIAN.MESH m, \ + MEDIAN.MESHSCALARVALUE msv \ + where msv.FEATUREID = MEDIAN.MESHPOINT.FEATUREID AND \ + ml.KPOSITION = MEDIAN.MESHPOINT.KPOSITION and \ + ml.MESHID = MEDIAN.MESHPOINT.MESHID and \ + m.MESHID = MEDIAN.MESHPOINT.MESHID AND \ + m.PARTIDMIN <= msv.PARTID AND \ + m.PARTIDMAX >= msv.PARTID AND \ + msv.PARAMETERID in (?) AND \ + msv.TIMEVALUE in (?) AND \ + m.OBJECTID = ? AND \ + ml.KPOSITION in (?) AND \ + MEDIAN.MESHPOINT.FEATUREID in \ + ( \ + SELECT distinct FEATUREID \ + FROM MEDIAN.MESHPOINT \ + WHERE ? \ + ) \ + order by msv.TIMEVALUE, \ + MEDIAN.MESHPOINT.KPOSITION, \ + msv.PARAMETERID, \ + MEDIAN.MESHPOINT.JPOSITION, \ + MEDIAN.MESHPOINT.IPOSITION +############################################# +############################################# +############# Profilschnitt MESH ############ +############################################# +############################################# +verticalcrosssection_mesh_year = select distinct \ + to_char(msv.TIMEVALUE,'YYYY') KEY, \ + to_char(msv.TIMEVALUE,'YYYY') VALUE \ + from MEDIAN.MESHSCALARVALUE msv, \ + MEDIAN.MESH m \ + where m.OBJECTID = ? AND \ + msv.PARTID >= m.PARTIDMIN AND \ + msv.PARTID <= m.PARTIDMAX AND \ + msv.PARAMETERID = ? \ + order by to_char(msv.TIMEVALUE,'YYYY') +verticalcrosssection_mesh_date = select distinct \ + msv.TIMEVALUE KEY, \ + msv.TIMEVALUE VALUE \ + from MEDIAN.MESHSCALARVALUE msv, \ + MEDIAN.MESH m \ + where m.OBJECTID = ? AND \ + msv.PARTID >= m.PARTIDMIN AND \ + msv.PARTID <= m.PARTIDMAX AND \ + msv.PARAMETERID = ? AND \ + to_char(msv.TIMEVALUE,'YYYY') in (?) \ + order by msv.TIMEVALUE +verticalcrosssection_mesh_chart_data = SELECT ST_ASTEXT(SHAPE), \ + ((ml.UPPERZLOCATION + ml.LOWERZLOCATION) / 2) Z, \ + msv.DATAVALUE YORDINATE, \ + msv.PARAMETERID GROUP1, \ + msv.TIMEVALUE GROUP2, \ + MEDIAN.MESHPOINT.JPOSITION, \ + MEDIAN.MESHPOINT.IPOSITION, \ + MEDIAN.MESHPOINT.KPOSITION \ + from MEDIAN.MESHLAYER ml, \ + MEDIAN.MESHPOINT, \ + MEDIAN.MESH m, \ + MEDIAN.MESHSCALARVALUE msv \ + where msv.FEATUREID = MEDIAN.MESHPOINT. FEATUREID AND \ + ml.KPOSITION = MEDIAN.MESHPOINT.KPOSITION and \ + ml.MESHID = MEDIAN.MESHPOINT.MESHID and \ + m.MESHID = MEDIAN.MESHPOINT.MESHID AND \ + m.PARTIDMIN <= msv.PARTID AND \ + m.PARTIDMAX >= msv.PARTID AND \ + msv.PARAMETERID = ? AND \ + msv.TIMEVALUE = ? AND \ + m.OBJECTID = ? AND \ + MEDIAN.MESHPOINT.FEATUREID in \ + ( \ + SELECT distinct FEATUREID \ + FROM MEDIAN.MESHPOINT \ + WHERE ? \ + ) \ + order by msv.TIMEVALUE, \ + msv.PARAMETERID, \ + MEDIAN.MESHPOINT.JPOSITION, \ + MEDIAN.MESHPOINT.IPOSITION, \ + MEDIAN.MESHPOINT.KPOSITION + +verticalcrosssection_mesh_odv_data = SELECT SI.NAME CRUISE, \ + M.MESHID || '-' || MEDIAN.MESHPOINT.IPOSITION || '-' || MEDIAN.MESHPOINT.JPOSITION STATION, \ + '*' TYPE, \ + ST_ASTEXT(SHAPE), \ + 0 BOTDEPTH, \ + (((ML.UPPERZLOCATION + ML.LOWERZLOCATION) / 2)*-1) DEPTH, \ + MSV.TIMEVALUE, \ + MSV.DATAVALUE, \ + MSV.PARAMETERID PARAMETER, \ + MEDIAN.MESHPOINT.JPOSITION, \ + MEDIAN.MESHPOINT.IPOSITION, \ + MEDIAN.MESHPOINT.KPOSITION, \ + 2 DATAID \ + from MEDIAN.MESHLAYER ml, \ + MEDIAN.MESHPOINT, \ + MEDIAN.MESH m, \ + MEDIAN.SOURCEINFO SI, \ + MEDIAN.MESHSCALARVALUE msv \ + where msv.FEATUREID = MEDIAN.MESHPOINT. FEATUREID AND \ + ml.KPOSITION = MEDIAN.MESHPOINT.KPOSITION and \ + ml.MESHID = MEDIAN.MESHPOINT.MESHID and \ + m.MESHID = MEDIAN.MESHPOINT.MESHID AND \ + m.PARTIDMIN <= msv.PARTID AND \ + m.PARTIDMAX >= msv.PARTID AND \ + M.SOURCEID = SI.SOURCEID AND \ + msv.PARAMETERID = ? AND \ + msv.TIMEVALUE = ? AND \ + m.OBJECTID = ? AND \ + MEDIAN.MESHPOINT.FEATUREID in \ + ( select FEATUREID \ + from MEDIAN.MESHPOINT mp, \ + MEDIAN.MESH m \ + where m.OBJECTID = ? AND \ + mp.MESHID = m.MESHID AND \ + ? = (select ? from MEDIAN.MESHPOINT where FEATUREID = ?)) \ + order by msv.TIMEVALUE, \ + msv.PARAMETERID, \ + MEDIAN.MESHPOINT.JPOSITION, \ + MEDIAN.MESHPOINT.IPOSITION, \ + MEDIAN.MESHPOINT.KPOSITION + +############################################# +############################################# +########## Horizontalschnitt MESH ########### +############################################# +############################################# +horizontalcrosssection_meshpoint_depth = SELECT DISTINCT MP.KPOSITION KEY, \ + 'Layer ' || ML.KPOSITION || ': ' || -ML.UPPERZLOCATION || ' - '|| -ML.LOWERZLOCATION VALUE \ + from MEDIAN.MESHLAYER ML, \ + MEDIAN.MESHPOINT MP, \ + MEDIAN.MESH M \ + WHERE ML.KPOSITION = MP.KPOSITION AND \ + ML.MESHID = MP.MESHID AND \ + M.OBJECTID = ? AND \ + MP.MESHID = M.MESHID \ + ORDER BY MP.KPOSITION + +horizontalcrosssection_mesh_year = select distinct \ + to_char(msv.TIMEVALUE,'YYYY') KEY, \ + to_char(msv.TIMEVALUE,'YYYY') VALUE \ + from MEDIAN.MESHSCALARVALUE msv, \ + MEDIAN.MESH m \ + where m.OBJECTID = ? AND \ + msv.PARTID >= m.PARTIDMIN AND \ + msv.PARTID <= m.PARTIDMAX AND \ + msv.PARAMETERID = ? \ + order by to_char(msv.TIMEVALUE,'YYYY') +horizontalcrosssection_mesh_date = select distinct \ + msv.TIMEVALUE KEY, \ + msv.TIMEVALUE VALUE \ + from MEDIAN.MESHSCALARVALUE msv, \ + MEDIAN.MESH m \ + where m.OBJECTID = ? AND \ + msv.PARTID >= m.PARTIDMIN AND \ + msv.PARTID <= m.PARTIDMAX AND \ + msv.PARAMETERID = ? AND \ + to_char(msv.TIMEVALUE,'YYYY') in (?) \ + order by msv.TIMEVALUE + +horizontalcrosssection_mesh_data = SELECT ST_ASTEXT(SHAPE), \ + MSV.DATAVALUE YORDINATE, \ + MEDIAN.MESHPOINT.JPOSITION, \ + MEDIAN.MESHPOINT.IPOSITION, \ + MEDIAN.MESHPOINT.KPOSITION, \ + MSV.PARAMETERID, \ + MSV.TIMEVALUE, \ + 2 DATAID \ + from MEDIAN.MESHLAYER ML, \ + MEDIAN.MESHPOINT, \ + MEDIAN.MESH M, \ + MEDIAN.MESHSCALARVALUE MSV \ + where MSV.FEATUREID = MEDIAN.MESHPOINT.FEATUREID AND \ + ML.KPOSITION = MEDIAN.MESHPOINT.KPOSITION and \ + ML.MESHID = MEDIAN.MESHPOINT.MESHID and \ + M.MESHID = MEDIAN.MESHPOINT.MESHID AND \ + M.PARTIDMIN <= MSV.PARTID AND \ + M.PARTIDMAX >= MSV.PARTID AND \ + MSV.PARAMETERID = ? AND \ + MSV.TIMEVALUE = ? AND \ + M.OBJECTID = ? AND \ + MEDIAN.MESHPOINT.KPOSITION = ? \ + order by MEDIAN.MESHPOINT.JPOSITION, \ + MEDIAN.MESHPOINT.IPOSITION +horizontalcrosssection_mesh_odv_data = SELECT SI.NAME CRUISE, \ + M.MESHID || '-' || MEDIAN.MESHPOINT.IPOSITION || '-' || MEDIAN.MESHPOINT.JPOSITION STATION, \ + '*' TYPE, \ + ST_ASTEXT(SHAPE), \ + 0 BOTDEPTH, \ + (((ML.UPPERZLOCATION + ML.LOWERZLOCATION) / 2)*-1) DEPTH, \ + MSV.TIMEVALUE, \ + MSV.DATAVALUE, \ + MSV.PARAMETERID PARAMETER, \ + MEDIAN.MESHPOINT.JPOSITION, \ + MEDIAN.MESHPOINT.IPOSITION, \ + MEDIAN.MESHPOINT.KPOSITION \ + from MEDIAN.MESHLAYER ML, \ + MEDIAN.MESHPOINT, \ + MEDIAN.MESH M, \ + MEDIAN.SOURCEINFO SI, \ + MEDIAN.MESHSCALARVALUE MSV \ + where MSV.FEATUREID = MEDIAN.MESHPOINT.FEATUREID AND \ + ML.KPOSITION = MEDIAN.MESHPOINT.KPOSITION and \ + ML.MESHID = MEDIAN.MESHPOINT.MESHID and \ + M.MESHID = MEDIAN.MESHPOINT.MESHID AND \ + M.PARTIDMIN <= MSV.PARTID AND \ + M.PARTIDMAX >= MSV.PARTID AND \ + M.SOURCEID = SI.SOURCEID AND \ + MSV.PARAMETERID = ? AND \ + MSV.TIMEVALUE = ? AND \ + M.OBJECTID = ? AND \ + MEDIAN.MESHPOINT.KPOSITION = ? \ + order by MEDIAN.MESHPOINT.JPOSITION, \ + MEDIAN.MESHPOINT.IPOSITION + +area_filter = SELECT DISTINCT \ + FEATUREID KEY ,\ + DESCRIPTION VALUE \ + FROM MEDIAN.FEATUREAREA \ + WHERE (FEATURETYPE = 7 OR FEATURETYPE = 8) AND \ + FEATUREID > 0 \ + ORDER BY FEATUREID + +subarea_filter = SELECT \ + FEATURECODE KEY, \ + NAME VALUE \ + FROM MEDIAN.FEATUREAREA \ + WHERE (FEATURETYPE = 7 OR FEATURETYPE = 8) AND \ + FEATUREID = ? \ + ORDER BY NAME + +rasterQuery = SELECT ST_ASTEXT(RASTER) \ + FROM MEDIAN.TOPO_WORLD_2MIN \ + WHERE INTERSECTS(RASTER, "?") + +mapviewer_interface_fis_region = SELECT ID_FIS \ + FROM MEDIAN.FEATUREAREA, \ + MEDIAN.FIS_HAS_REGION FHR \ + WHERE FHR.FEATUREID = MEDIAN.FEATUREAREA.FEATUREID AND \ + FHR.FEATURETYPE = MEDIAN.FEATUREAREA.FEATURETYPE AND \ + FHR.FEATURECODE = MEDIAN.FEATUREAREA.FEATURECODE AND \ + INTERSECTS(SHAPE,"?") + +mapviewer_interface_mapservices_has_fis = SELECT DISTINCT ID_FIS, \ + ID_MAPSERVICE \ + FROM MEDIAN.FIS_HAS_MAPSERVICE \ + WHERE ID_MAPSERVICE IN (?) + +mapviewer_interface_mapservices_has_parameter = SELECT DISTINCT ID_PARAMETER \ + FROM MEDIAN.MAPSERVICE_HAS_PARAMETER \ + WHERE ID_MAPSERVICE = ? + +mapviewer_interface_mapservices_has_parameter_using_layer = SELECT DISTINCT ID_PARAMETER \ + FROM MEDIAN.LAYER_HAS_PARAMETER \ + WHERE ID_MAPSERVICE = ? AND \ + ID_LAYER IN (?) + +############################################# +############################################# +######### Layer Contis und Nauthis ########## +############################################# +############################################# + +layer = SELECT ROW_ID KEY, \ + TITLE || '-' || LAYER_NAME VALUE \ + FROM MEDIAN.LAYER_HAS_SUBTYPES \ + WHERE ID_FEATURECLASS LIKE ? \ + ORDER BY LAYER_NAME + +layer_request_data = SELECT ID_FEATURECLASS, \ + QUERY_STRING, \ + TITLE, \ + LAYER_NAME \ + FROM MEDIAN.LAYER_HAS_SUBTYPES \ + WHERE ROW_ID = ? + +layer_data = SELECT ST_ASTEXT(SHAPE) \ + FROM ? \ + WHERE ? + +layer_data_with_geom = SELECT ST_ASTEXT(SHAPE) \ + FROM ? \ + WHERE ? AND \ + INTERSECTS(SHAPE,"?") + +geometry_for_subareafilter=SELECT st_astext(SHAPE) \ + FROM MEDIAN.FEATUREAREA \ + WHERE (FEATURETYPE = 7 OR FEATURETYPE = 8) AND \ + FEATURECODE = ? diff -r f99d8f92a640 -r 755dd2fa4a0a gnv-artifacts/doc/schema/externalinterface_schema.sql --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv-artifacts/doc/schema/externalinterface_schema.sql Fri Sep 28 12:13:53 2012 +0200 @@ -0,0 +1,72 @@ +/* + * Lookup-Tabelle für das FIS anhand eines Gebietes. + * Diese Tabelle ist in der ArcSDE als Layer zu integrieren. + * Die Inhalte der Spalte id_fis müssen mit den vergebenen IDs + * in der Konfiguration des Artefaktservers übereinstimmen. + * + * Abbildung als Layer in der ArcSDE + * Das hier bereitgestellte SQL ist lediglich als Anhalt zu betrachten. + */ +create table fis_has_region ( + id_fis varchar2(30 char) not null, /* TODO maximale Länge bestimmen und ggf. anpassen.*/ + description varchar2(90 char), + geometry ??? not null +); + +ALTER TABLE fis_has_region ADD PRIMARY KEY (id_fis); + +/* + * Lookup-Tabelle für das FIS anhand eines Mapservices. + * Die Inhalte der Spalte id_fis müssen mit den vergebenen IDs + * in der Konfiguration des Artefaktservers übereinstimmen. + * Die Inhalte der Spalte id_mapservice müssen mit den vergebenen + * IDs der Services im Mapviewer übereinstimmen. + */ +create table fis_has_mapservice( + id_fis varchar2(30 char) not null, /* TODO maximale Länge bestimmen und ggf. anpassen.*/ + id_mapservice varchar2(100 char) not null /* TODO maximale Länge bestimmen und ggf. anpassen.*/ +); + +ALTER TABLE fis_has_mapservice ADD PRIMARY KEY (id_fis,id_mapservice); + +/** + * Lookuptabelle zwischen einer LayerID und dem dazugehörigen + * Mapservice und den im Layer dargestellten Parameter. + * Fremdschlüsselbeziehung zu der Tabelle fis_has_mapservice. + * Primärschlüssel: id_mapservice, id_layer, id_parameter + * id_parameter referenziert zusätzlich die Tabelle MEDIAN.PARAMETER. + * + * Auf eine explizite Abbildung von GroupLayern kann verzichtet werden, + * da sie lediglich einen "ordnenden" Charakter haben. + * vgl. S 52 Pflichtenheft. + * + * Über id_group wird abgebildet ob ein Layer zu einer Gruppe von + * Layern gehört. + */ +create table layer_has_parameter( + id_mapservice varchar2(100 char) not null, /* TODO maximale Länge bestimmen und ggf. anpassen.*/ + id_layer NUMBER(10) not null, /* TODO maximale Länge bestimmen und ggf. anpassen.*/ + layer_name varchar2(30 char) not null, /* TODO maximale Länge bestimmen und ggf. anpassen.*/ + id_group varchar2(30 char ), /* TODO maximale Länge bestimmen und ggf. anpassen.*/ + id_parameter NUMBER(10) not null /* Referenz zur Tabelle MEDIAN.PARAMETER */ +); + +ALTER TABLE layer_has_parameter ADD + PRIMARY KEY (id_mapservice,id_layer,id_parameter); + +/** + * Lookuptabelle ob ein Mapservice genau einen Parameter darstellt. + * Wenn in dieser Tabelle nichts vorhanden ist muss unter zurhilfenahme + * der Layer-ID in der Tabelle layer_has_parameter gesucht werden. + * Die Inhalte der Spalte id_mapservice müssen mit den vergebenen + * IDs der Services im Mapviewer übereinstimmen. + * id_parameter referenziert zusätzlich die Tabelle MEDIAN.PARAMETER. + */ +create table mapservice_has_parameter( + id_mapservice varchar2(100 char) not null, /* TODO maximale Länge bestimmen und ggf. anpassen.*/ + id_parameter NUMBER(10) not null /* Referenz zur Tabelle MEDIAN.PARAMETER */ +); + + +ALTER TABLE mapservice_has_parameter ADD + PRIMARY KEY (id_mapservice,id_parameter); \ No newline at end of file diff -r f99d8f92a640 -r 755dd2fa4a0a gnv-artifacts/doc/schema/externalinterface_testdata.sql --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv-artifacts/doc/schema/externalinterface_testdata.sql Fri Sep 28 12:13:53 2012 +0200 @@ -0,0 +1,10 @@ +INSERT INTO fis_has_mapservice (id_fis,id_mapservice) VALUES ('modeldata','BSH_IMS_Prediction_Model_Salinity'); +INSERT INTO fis_has_mapservice (id_fis,id_mapservice) VALUES ('marnet','BSH_IMS_Marine_Environment_Monitoring_Network'); + +INSERT INTO mapservice_has_parameter(id_mapservice,id_parameter) VALUES ('BSH_IMS_Prediction_Model_Salinity',2); + +INSERT INTO layer_has_parameter(id_mapservice,id_layer,layer_name,id_group,id_parameter) VALUES ('BSH_IMS_Marine_Environment_Monitoring_Network', 1, 'Sealevel', null, ?); +INSERT INTO layer_has_parameter(id_mapservice,id_layer,layer_name,id_group,id_parameter) VALUES ('BSH_IMS_Marine_Environment_Monitoring_Network', 2, 'Temperature', null, 1); +INSERT INTO layer_has_parameter(id_mapservice,id_layer,layer_name,id_group,id_parameter) VALUES ('BSH_IMS_Marine_Environment_Monitoring_Network', 3, 'Salinity', null, 2); +INSERT INTO layer_has_parameter(id_mapservice,id_layer,layer_name,id_group,id_parameter) VALUES ('BSH_IMS_Marine_Environment_Monitoring_Network', 4, 'OxygenSaturation', null, 31); +INSERT INTO layer_has_parameter(id_mapservice,id_layer,layer_name,id_group,id_parameter) VALUES ('BSH_IMS_Marine_Environment_Monitoring_Network', 5, 'Current', null, ?); \ No newline at end of file diff -r f99d8f92a640 -r 755dd2fa4a0a gnv-artifacts/pom.xml --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv-artifacts/pom.xml Fri Sep 28 12:13:53 2012 +0200 @@ -0,0 +1,160 @@ + + + 4.0.0 + de.intevation.bsh.artifacts + gnv-artifacts + jar + 1.0-SNAPSHOT + gnv-artifacts + http://maven.apache.org + + UTF-8 + + + + + org.apache.maven.plugins + maven-eclipse-plugin + 2.5.1 + + + org.apache.maven.plugins + maven-compiler-plugin + 2.0.2 + + 1.5 + 1.5 + + + + + + + de.intevation.bsh.artifact-database + artifact-database + 1.0-SNAPSHOT + + + de.intevation.bsh.geo-backend + geo-backend + 1.0-SNAPSHOT + + + junit + junit + 3.8.1 + test + + + com.esri.sde + jsde_sdk + 9.3 + test + + + com.esri.sde + jpe_sdk + 9.3 + test + + + com.esri.sde + jpe_sdkres + 9.3 + test + + + com.ibm + icu4j + 3.2 + test + + + log4j + log4j + 1.2.14 + + + jfree + jfreechart + 1.0.13 + + + org.apache.xmlgraphics + batik-dom + 1.7 + + + org.apache.xmlgraphics + batik-svggen + 1.7 + + + org.apache.velocity + velocity + 1.6.1 + + + com.lowagie + itext + 2.1.7 + + + net.sf.opencsv + opencsv + 2.0 + + + org.apache.commons + commons-math + 2.0 + + + net.sf.ehcache + ehcache + 1.6.2 + + + commons-validator + commons-validator + 1.3.1 + + + oro + oro + 2.0.8 + + + org.geotools + gt-shapefile + 2.5.8 + + + org.geotools + gt-epsg-wkt + 2.5.8 + + + com.vividsolutions + jts + 1.9 + + + trove + trove + 2.1.1 + + + + + gt2.repo + GeoTools2 Repository including JTS + http://download.osgeo.org/webdav/geotools + + + repository.jboss.org + JBoss Repository + http://repository.jboss.com/maven2 + + + diff -r f99d8f92a640 -r 755dd2fa4a0a gnv-artifacts/src/main/java/de/intevation/gnv/artifacts/APP.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv-artifacts/src/main/java/de/intevation/gnv/artifacts/APP.java Fri Sep 28 12:13:53 2012 +0200 @@ -0,0 +1,21 @@ +/** + * + */ +package de.intevation.gnv.artifacts; + +import de.intevation.artifactdatabase.App; + +/** + * @author Tim Englich + * + */ +public class APP { + + /** + * @param args + */ + public static void main(String[] args) { + App.main(args); + } + +} diff -r f99d8f92a640 -r 755dd2fa4a0a gnv-artifacts/src/main/java/de/intevation/gnv/artifacts/GNVArtifactBase.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv-artifacts/src/main/java/de/intevation/gnv/artifacts/GNVArtifactBase.java Fri Sep 28 12:13:53 2012 +0200 @@ -0,0 +1,837 @@ +/** + * + */ +package de.intevation.gnv.artifacts; + +import de.intevation.artifactdatabase.Config; +import de.intevation.artifactdatabase.ProxyArtifact; +import de.intevation.artifactdatabase.XMLUtils; + +import de.intevation.artifacts.Artifact; +import de.intevation.artifacts.ArtifactDatabase; +import de.intevation.artifacts.ArtifactFactory; +import de.intevation.artifacts.ArtifactNamespaceContext; +import de.intevation.artifacts.CallContext; +import de.intevation.artifacts.CallMeta; + +import de.intevation.gnv.artifacts.context.GNVArtifactContext; + +import de.intevation.gnv.artifacts.fis.product.Product; + +import de.intevation.gnv.artifacts.ressource.RessourceFactory; + +import de.intevation.gnv.state.DefaultInputData; +import de.intevation.gnv.state.ExportMode; +import de.intevation.gnv.state.InputData; +import de.intevation.gnv.state.InputValue; +import de.intevation.gnv.state.OutputMode; +import de.intevation.gnv.state.OutputState; +import de.intevation.gnv.state.State; +import de.intevation.gnv.state.StateFactory; + +import de.intevation.gnv.state.exception.StateException; + +import de.intevation.gnv.transition.Transition; +import de.intevation.gnv.transition.TransitionFactory; + +import de.intevation.gnv.utils.ArtifactXMLUtilities; + +import java.io.IOException; +import java.io.OutputStream; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.HashMap; +import java.util.Iterator; +import java.util.List; +import java.util.Map; + +import javax.xml.xpath.XPathConstants; + +import org.apache.log4j.Logger; + +import org.w3c.dom.Document; +import org.w3c.dom.Element; +import org.w3c.dom.Node; +import org.w3c.dom.NodeList; + +/** + * @author Tim Englich (tim.englich@intevation.de) + * @author Ingo Weinzierl (ingo.weinzierl@intevation.de) + * @author Sascha L. Teichmann (sascha.teichmann@intevation.de) + */ +public abstract class GNVArtifactBase extends GNVDefaultArtifact + implements PreSettingArtifact { + + /** + * the logger, used to log exceptions and additonaly information + */ + private static Logger log = Logger.getLogger(GNVArtifactBase.class); + /** + * The UID of this Class + */ + private static final long serialVersionUID = -8907096744400741458L; + + /** + * The Identifier for the Replacement of the Artifactname + */ + public static final String XPATH_IDENTIFIER_REPLACE = "IDENTIFIER"; + + /** + * The XPATH to the XML-Fragment that should be used for the Configuration + */ + public static final String XPATH_ARTIFACT_CONFIGURATION = "/artifact-database/artifacts/artifact[@name='" + + XPATH_IDENTIFIER_REPLACE + + "']"; + + public static final String XPATH_STATIC_NODE = "/art:result/art:ui/art:static"; + + public static final String XPATH_INPUT_DATA = "/art:action/art:data/art:input"; + + public static final String XPATH_INCLUDE_UI = "/art:action/art:include-ui"; + + public static final String XPATH_TARGET_NAME = "/art:action/art:target/@name"; + + public static final String XPATH_OUTPUT_NAME = "/art:action/art:out/@name"; + + public static final String XPATH_OUTPUT_PARAMS = "/art:action/art:out/art:params/art:input"; + + public static final String INITIAL_STATE = "product"; + + /** + * The current State + */ + protected State current = null; + + /** + * The States that can be used + */ + protected Map states = null; + + /** + * The Transitions which can switch between the different States. + */ + protected Collection transitions = null; + + /** + * The current product + */ + protected Product product; + + /** + * The Name of the Artifact + */ + protected String name = null; + + /** + * The Presettings of InputData which can be used to + * travel through the States in different Ways or + * manipulate the InputData + */ + private Map preSettings = null; + + /** + * Constructor + */ + public GNVArtifactBase() { + super(); + } + + + @Override + public Document advance(Document target, CallContext context) { + log.debug("GNVArtifactBase.advance()"); + + Document result = XMLUtils.newDocument(); + String targetState = XMLUtils.xpathString( + target, XPATH_TARGET_NAME, ArtifactNamespaceContext.INSTANCE + ); + + // no current state... + if (current == null) { + log.warn("No current state. Advance not possible."); + + result = createReport( + result, + "exceptionreport", + "exception", + "No State activated." + ); + + return result; + } + + State next = null; + + try { + + // step forward + if (isStateCurrentlyReachable(targetState)) { + + next = states.get(targetState); + + // 2. Transfer Results + next.putInputData(current.getInputData(), identifier); + next.setParent(current); + next.setPreSettings(this.preSettings); + + if (current != null) { + current.endOfLife(context.globalContext()); + } + + // 3. Switch to next State + current = next; + + // 4. Initialize next Step + current.initialize(identifier, context); + + result = createReport( + result, "result", "success", "Advance success" + ); + } + + // step backward + else if((next = getPreviousState(current, targetState)) != null) { + + if (current != null) { + current.endOfLife(context.globalContext()); + } + + current = next; + + // 2. Transfer Results + current.reset(identifier); + + result = createReport( + result, "result", "success", "Advance success" + ); + } + + // goto initial step + else if(targetState.equals(INITIAL_STATE)) { + + String fis = product.getArtifactFactory(); + ArtifactDatabase db = context.getDatabase(); + GNVProductArtifactFactory fac = (GNVProductArtifactFactory) + db.getInternalArtifactFactory(fis); + + Artifact select = fac.createArtifact(identifier, context, null); + context.putContextValue(ProxyArtifact.REPLACE_PROXY, select); + + result = createReport( + result, "result", "success", "Advance success" + ); + } + + // advance not possible + else { + log.warn("advance not possible for target: " + targetState); + result = createReport( + result, + "exceptionreport", + "exception", + "Statetransition not supported" + ); + } + } + catch (StateException se) { + log.error(se, se); + result = createReport( + result, + "exceptionreport", + "exception", + se.getLocalizedMessage() + ); + } + + return result; + } + + + protected Document createReport( + Document document, + String nodeName, + String state, + String msg + ) { + XMLUtils.ElementCreator creator = new XMLUtils.ElementCreator( + document, + ArtifactNamespaceContext.NAMESPACE_URI, + ArtifactNamespaceContext.NAMESPACE_PREFIX + ); + + Element reportNode = creator.create(nodeName); + Element stateNode = creator.create(state); + + stateNode.setTextContent(msg); + reportNode.appendChild(stateNode); + document.appendChild(reportNode); + + return document; + + } + + + protected State getPreviousState(State current, String name) { + if (current == null) { + return null; + } + + if (current.getID().equals(name)) { + return current; + } + else { + return getPreviousState(current.getParent(), name); + } + } + + + private boolean isStateCurrentlyReachable(String stateid){ + Iterator it = this.transitions.iterator(); + String from = this.current.getID(); + while (it.hasNext()){ + Transition transition = it.next(); + if (transition.getFrom().equals(from)){ + if (transition.getTo().equals(stateid) && transition.isValid(this.current)){ + return true; + } + } + } + return false; + } + + public Document initialize (CallContext context) { + Document result = XMLUtils.newDocument(); + try { + this.current.initialize(super.identifier, context); + result = new ArtifactXMLUtilities() + .createSuccessReport("Initialize success", + XMLUtils.newDocument()); + } catch (StateException e) { + log.error(e,e); + result = new ArtifactXMLUtilities().createExceptionReport(e + .getLocalizedMessage(), XMLUtils.newDocument()); + } + return result; + } + + protected String readStateName(Document document) { + String returnValue = XMLUtils.xpathString( + document, XPATH_TARGET_NAME, ArtifactNamespaceContext.INSTANCE); + return returnValue; + } + + protected Node getConfigurationFragment(Document document) { + log.debug("GNVArtifactBase.getConfigurationFragment"); + String xpathQuery = XPATH_ARTIFACT_CONFIGURATION.replaceAll( + XPATH_IDENTIFIER_REPLACE, this.name); + + Element configurationNode = (Element)Config.getNodeXPath(document, xpathQuery); + + String link = configurationNode.getAttribute("xlink:href"); + if (link != null ){ + String absolutFileName = Config.replaceConfigDir(link); + configurationNode = (Element)new ArtifactXMLUtilities().readConfiguration(absolutFileName); + } + + return configurationNode; + } + + /** + * @see de.intevation.artifactdatabase.DefaultArtifact#feed(org.w3c.dom.Document, + * de.intevation.artifacts.CallContext) + */ + @Override + public Document feed(Document target, CallContext context) { + log.debug("GNVArtifactBase.feed"); + Document result = XMLUtils.newDocument(); + try { + if (this.current != null) { + Collection inputData = this.parseInputData( + target, + XPATH_INPUT_DATA); + + if (!inputData.isEmpty()){ + current.feed(inputData, super.identifier); + result = new ArtifactXMLUtilities().createSuccessReport( + "Feed success", XMLUtils.newDocument()); + }else{ + String msg = "No Inputdata given. Please select at least one Entry."; + log.warn(msg); + result = new ArtifactXMLUtilities().createExceptionReport(msg, + XMLUtils.newDocument()); + } + } else { + String msg = "No State instantiated"; + log.warn(msg); + result = new ArtifactXMLUtilities().createExceptionReport(msg, + XMLUtils.newDocument()); + } + } catch (StateException e) { + log.error(e, e); + result = new ArtifactXMLUtilities().createExceptionReport(e + .getLocalizedMessage(), XMLUtils.newDocument()); + } + return result; + } + + + /** + * @see de.intevation.artifactdatabase.DefaultArtifact#describe(org.w3c.dom.Document, de.intevation.artifacts.CallContext) + */ + @Override + public Document describe(Document data, CallContext context) { + log.debug("GNVArtifactBase.describe"); + + Document document = createDescibeOutput( + context, + identifier, + getIncludeUIFromDocument(data) + ); + + return document; + } + + /** + * @see de.intevation.artifactdatabase.DefaultArtifact#setup(java.lang.String, de.intevation.artifacts.ArtifactFactory, java.lang.Object, org.w3c.dom.Document) + */ + @Override + public void setup(String identifier, ArtifactFactory factory, + Object context,Document data) { + log.debug("GNVArtifactBase.setup"); + super.setup(identifier, factory, context, data); + + Object localContext = context; + if (context instanceof CallContext) { + localContext = ((CallContext) context).globalContext(); + + } + + if (localContext instanceof GNVArtifactContext) { + GNVArtifactContext gnvContext = (GNVArtifactContext) localContext; + Document doc = gnvContext.getConfig(); + Node artifactNode = this.getConfigurationFragment(doc); + + NodeList stateList = Config.getNodeSetXPath(artifactNode, + "states/state"); + this.states = new HashMap(stateList + .getLength()); + for (int i = 0; i < stateList.getLength(); i++) { + State tmpState = StateFactory.getInstance() + .createState(stateList.item(i)); + if (tmpState != null) { + log.debug("Initiate new state: " + tmpState.getID()); + this.states.put(tmpState.getID(), tmpState); + if (this.current == null) { + this.current = tmpState; + } + } + } + + NodeList transitionList = Config.getNodeSetXPath(artifactNode, + "states/transition"); + this.transitions = new ArrayList(transitionList.getLength()); + for (int i = 0; i < transitionList.getLength(); i++) { + Transition tmpTransition = TransitionFactory.getInstance() + .createTransition(transitionList.item(i)); + if (tmpTransition != null) { + this.transitions.add(tmpTransition); + } + } + + } + } + + + protected Document createDescibeOutput( + CallContext context, + String uuid, + boolean incudeUI + ) { + log.debug("GNVArtifactBase.createDescibeOutput"); + Document document = XMLUtils.newDocument(); + + XMLUtils.ElementCreator creator = new XMLUtils.ElementCreator( + document, + ArtifactNamespaceContext.NAMESPACE_URI, + ArtifactNamespaceContext.NAMESPACE_PREFIX + ); + Element rootNode = this.createRootNode(creator, document); + this.createHeader(creator, rootNode, document, "describe"); + this.createOutputs(creator, rootNode, document); + this.createCurrentState(creator, rootNode, document); + this.createReachableStates(creator, rootNode, document); + this.createModel(creator, rootNode, document); + if (incudeUI){ + this.createUserInterface(creator, rootNode, document, context, uuid); + } + + return document; + } + + protected boolean getIncludeUIFromDocument(Document document){ + String value = XMLUtils.xpathString( + document, XPATH_INCLUDE_UI, ArtifactNamespaceContext.INSTANCE); + + boolean includeUI = false; + if (value != null){ + includeUI = Boolean.parseBoolean(value); + } + return includeUI; + } + + protected Element createRootNode( + XMLUtils.ElementCreator creator, + Document document + ) { + Element rootNode = creator.create("result"); + document.appendChild(rootNode); + return rootNode; + } + + protected void createHeader( + XMLUtils.ElementCreator creator, + Element parent, + Document document, + String documentType + ) { + Element typeNode = creator.create("type"); + creator.addAttr(typeNode, "name", documentType); + parent.appendChild(typeNode); + + Element uuidNode = creator.create("uuid"); + creator.addAttr(uuidNode, "value", super.identifier); + parent.appendChild(uuidNode); + + Element hashNode = creator.create("hash"); + creator.addAttr(hashNode, "value", this.hash()); + parent.appendChild(hashNode); + } + + protected Element createSelectBox( + XMLUtils.ElementCreator artCreator, + XMLUtils.ElementCreator creator, + Document document, + CallContext context + ) { + RessourceFactory resource = RessourceFactory.getInstance(); + CallMeta callMeta = (CallMeta) context.getMeta(); + String productName = product.getName(); + + Element selectNode = creator.create("select1"); + creator.addAttr(selectNode, "ref", "product"); + artCreator.addAttr(selectNode, "state", INITIAL_STATE, true); + + + Element labelNode = creator.create("label"); + labelNode.setTextContent( + resource.getRessource(callMeta.getLanguages(), "product", "product") + ); + + Element choicesNode = creator.create("choices"); + + Element itemNode = creator.create("item"); + creator.addAttr(itemNode, "selected", "true"); + + Element choiceLabel = creator.create("label"); + choiceLabel.setTextContent(resource.getRessource( + callMeta.getLanguages(), + productName, + productName + )); + + Element choiceValue = creator.create("value"); + choiceValue.setTextContent(productName); + + itemNode.appendChild(choiceLabel); + itemNode.appendChild(choiceValue); + choicesNode.appendChild(itemNode); + + selectNode.appendChild(labelNode); + selectNode.appendChild(choicesNode); + + return selectNode; + } + + + protected void createReachableStates( + XMLUtils.ElementCreator creator, + Element parent, + Document document + ) { + Element stateNode = creator.create("reachable-states"); + if (this.current != null) { + + // add future states + Iterator transitions = this.transitions.iterator(); + while (transitions.hasNext()) { + Transition tmpTransition = transitions.next(); + if (tmpTransition.getFrom().equals(current.getID()) && + tmpTransition.isValid(this.current)){ + Element currentNode = creator.create("state"); + creator.addAttr(currentNode, "name", tmpTransition.getTo()); + creator.addAttr( + currentNode, + "description", + this.states.get(tmpTransition.getTo()).getDescription()); + stateNode.appendChild(currentNode); + } + } + + + // add old states + appendOldReachableStates(creator, stateNode, current); + } + parent.appendChild(stateNode); + } + + + protected void appendOldReachableStates( + XMLUtils.ElementCreator creator, + Element parent, + State state + ) { + if (state == null) + return; + + while (state != null) { + Element currentNode = creator.create("state"); + creator.addAttr(currentNode, "name", state.getID()); + creator.addAttr(currentNode, "description", state.getDescription()); + parent.appendChild(currentNode); + + state = state.getParent(); + } + } + + + protected void createCurrentState( + XMLUtils.ElementCreator creator, + Element parent, + Document document + ) { + Element stateNode = creator.create("state"); + creator.addAttr(stateNode, "name", this.current.getID()); + creator.addAttr(stateNode, "description", this.current.getDescription()); + parent.appendChild(stateNode); + } + + protected void createModel( + XMLUtils.ElementCreator creator, + Element parent, + Document document + ) { + Element modelNode = creator.create("model"); + if (this.current != null) { + Collection inputValues = this.current + .getRequiredInputValues(); + if (inputValues != null) { + Iterator it = inputValues.iterator(); + while (it.hasNext()) { + InputValue inputValue = it.next(); + Element inputNode = creator.create("input"); + creator.addAttr(inputNode, "name", inputValue.getName()); + creator.addAttr(inputNode, "type", inputValue.getType()); + modelNode.appendChild(inputNode); + } + } + } + parent.appendChild(modelNode); + } + + protected void createUserInterface( + XMLUtils.ElementCreator creator, + Element parent, + Document document, + CallContext context, + String uuid + ) { + XMLUtils.ElementCreator xCreator = new XMLUtils.ElementCreator( + document, + XMLUtils.XFORM_URL, + XMLUtils.XFORM_PREFIX + ); + + Element uiNode = creator.create("ui"); + Element staticNode = creator.create("static"); + Element dynamic = creator.create("dynamic"); + + uiNode.appendChild(staticNode); + uiNode.appendChild(dynamic); + + parent.appendChild(uiNode); + + // append fis to dynamic part + appendFis(document, staticNode, context, product.getArtifactFactory()); + + if (this.current != null) { + Element staticUI = createSelectBox( + creator, xCreator, document, context + ); + staticNode.appendChild(staticUI); + + this.current.describe( + document, uiNode, context, uuid + ); + } + } + + + protected void createOutputs( + XMLUtils.ElementCreator creator, + Element parent, + Document document + ) { + log.debug("GNVArtifactBase.createOutputs"); + Element outputsNode = creator.create("outputs"); + if (this.current instanceof OutputState) { + Collection outputModes = ((OutputState) this.current) + .getOutputModes(); + if (outputModes != null) { + Iterator it = outputModes.iterator(); + while (it.hasNext()) { + OutputMode outputMode = it.next(); + log.debug("Write Outputnode for " + outputMode.toString()); + Element outputModeNode = creator.create("output"); + creator.addAttr( + outputModeNode, "name", outputMode.getName()); + creator.addAttr( + outputModeNode, "description", outputMode.getDescription()); + creator.addAttr( + outputModeNode, "mime-type", outputMode.getMimeType()); + outputsNode.appendChild(outputModeNode); + + Collection inputParameters = outputMode + .getInputParameters(); + if (inputParameters != null) { + Element inputParametersNode = creator.create("parameter"); + outputModeNode.appendChild(inputParametersNode); + Iterator it2 = inputParameters.iterator(); + while (it2.hasNext()) { + InputValue inputValue = it2.next(); + Element inputParameterNode = + creator.create("parameter"); + creator.addAttr( + inputParameterNode, "name", inputValue.getName()); + creator.addAttr( + inputParameterNode, "type", inputValue.getType()); + creator.addAttr( + inputParameterNode, "value", inputValue.getDefaultValue()); + inputParametersNode.appendChild(inputParameterNode); + } + } + + // append export modes + List exportModes = outputMode.getExportModes(); + if (exportModes != null) { + Element exports = creator.create("exports"); + outputModeNode.appendChild(exports); + + for (ExportMode exp: exportModes) { + Element export = creator.create("export"); + creator.addAttr( + export, "name", exp.getName()); + creator.addAttr( + export, "description", exp.getDescription()); + creator.addAttr( + export, "mime-type", exp.getMimeType()); + + exports.appendChild(export); + } + } + } + } else { + log.warn("No Outputmodes given."); + } + } + parent.appendChild(outputsNode); + } + + protected Collection parseInputData(Document document, + String xPath) { + HashMap returnValue = null; + + NodeList inputElemets = (NodeList) XMLUtils.xpath(document, xPath, + XPathConstants.NODESET, ArtifactNamespaceContext.INSTANCE); + if (inputElemets != null) { + returnValue = new HashMap(); + + for (int i = 0; i < inputElemets.getLength(); i++) { + Element inputDataNode = (Element)inputElemets.item(i); + String name = inputDataNode.getAttribute("name"); + String value = inputDataNode.getAttribute("value"); + + if (returnValue.containsKey(name)) { + InputData inputData = returnValue.get(name); + inputData.concartValue(value); + log.debug(inputData.toString()); + returnValue.put(name, inputData); + } else { + InputData inputData = new DefaultInputData(name, value); + + returnValue.put(name, inputData); + } + } + } + return returnValue.values(); + } + + /** + * @see de.intevation.artifactdatabase.DefaultArtifact#out(org.w3c.dom.Document, + * java.io.OutputStream, de.intevation.artifacts.CallContext) + */ + @Override + public void out(Document format, OutputStream outputStream, + CallContext context) throws IOException { + log.debug("TGNVArtifactBase.out"); + try { + + if (current != null && current instanceof OutputState) { + ((OutputState) current) + .out(format, this.parseInputData( + format, XPATH_OUTPUT_PARAMS), + outputStream, super.identifier, context); + } + } catch (StateException e) { + log.error(e, e); + throw new IOException(e.getMessage()); + } + } + + protected static String readOutputType(Document document) { + String value = XMLUtils.xpathString( + document, XPATH_OUTPUT_NAME, ArtifactNamespaceContext.INSTANCE); + return value; + } + + + public void setProduct(Product product) { + this.product = product; + } + + public void endOfLife(Object globalContext) { + super.endOfLife(globalContext); + + if (current != null) { + current.endOfLife(globalContext); + } + } + + /** + * @see de.intevation.gnv.artifacts.PreSettingArtifact#getPreSettings() + */ + public Map getPreSettings() { + return this.preSettings; + } + + /** + * @see de.intevation.gnv.artifacts.PreSettingArtifact#setPreSettings(java.util.Map) + */ + public void setPreSettings(Map preSettings) { + this.preSettings = preSettings; + if (this.current != null){ + this.current.setPreSettings(preSettings); + } + } +} +// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8: diff -r f99d8f92a640 -r 755dd2fa4a0a gnv-artifacts/src/main/java/de/intevation/gnv/artifacts/GNVArtifactFactory.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv-artifacts/src/main/java/de/intevation/gnv/artifacts/GNVArtifactFactory.java Fri Sep 28 12:13:53 2012 +0200 @@ -0,0 +1,28 @@ +package de.intevation.gnv.artifacts; + +import org.w3c.dom.Document; +import org.w3c.dom.Node; + +import org.apache.log4j.Logger; + +import de.intevation.artifactdatabase.DefaultArtifactFactory; + + +/** + * @author Ingo Weinzierl + */ +public class GNVArtifactFactory extends DefaultArtifactFactory { + + public static final String XPATH_PRODUCT_FACTORY = "artifact-factory"; + + private static Logger logger = Logger.getLogger(GNVArtifactFactory.class); + + public GNVArtifactFactory() { + } + + @Override + public void setup(Document document, Node factoryNode) { + super.setup(document, factoryNode); + } +} +// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8: diff -r f99d8f92a640 -r 755dd2fa4a0a gnv-artifacts/src/main/java/de/intevation/gnv/artifacts/GNVDefaultArtifact.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv-artifacts/src/main/java/de/intevation/gnv/artifacts/GNVDefaultArtifact.java Fri Sep 28 12:13:53 2012 +0200 @@ -0,0 +1,83 @@ +package de.intevation.gnv.artifacts; + +import de.intevation.artifactdatabase.DefaultArtifact; +import de.intevation.artifactdatabase.XMLUtils; + +import de.intevation.artifacts.ArtifactNamespaceContext; +import de.intevation.artifacts.CallContext; +import de.intevation.artifacts.CallMeta; + +import de.intevation.gnv.artifacts.ressource.RessourceFactory; + +import org.apache.log4j.Logger; + +import org.w3c.dom.Document; +import org.w3c.dom.Element; + +/** + * @author Ingo Weinzierl + */ +public class GNVDefaultArtifact extends DefaultArtifact { + + private static Logger logger = Logger.getLogger(GNVDefaultArtifact.class); + + + public GNVDefaultArtifact() { + super(); + } + + + protected void appendFis( + Document document, + Element staticNode, + CallContext context, + String fisName + ) { + RessourceFactory resource = RessourceFactory.getInstance(); + CallMeta callMeta = (CallMeta) context.getMeta(); + + XMLUtils.ElementCreator creator = new XMLUtils.ElementCreator( + document, + XMLUtils.XFORM_URL, + XMLUtils.XFORM_PREFIX + ); + + XMLUtils.ElementCreator artCreator = new XMLUtils.ElementCreator( + document, + ArtifactNamespaceContext.NAMESPACE_URI, + ArtifactNamespaceContext.NAMESPACE_PREFIX + ); + + Element selectNode = creator.create("select1"); + artCreator.addAttr(selectNode, "fis", "true", true); + + Element labelNode = creator.create("label"); + labelNode.setTextContent( + resource.getRessource(callMeta.getLanguages(), "fis", "fis") + ); + + Element choicesNode = creator.create("choices"); + + Element itemNode = creator.create("item"); + creator.addAttr(itemNode, "selected", "true"); + + Element choiceLabel = creator.create("label"); + choiceLabel.setTextContent(resource.getRessource( + callMeta.getLanguages(), + fisName, + fisName + )); + + Element choiceValue = creator.create("value"); + choiceValue.setTextContent(fisName); + + itemNode.appendChild(choiceLabel); + itemNode.appendChild(choiceValue); + choicesNode.appendChild(itemNode); + + selectNode.appendChild(labelNode); + selectNode.appendChild(choicesNode); + + staticNode.appendChild(selectNode); + } +} diff -r f99d8f92a640 -r 755dd2fa4a0a gnv-artifacts/src/main/java/de/intevation/gnv/artifacts/GNVProductArtifactFactory.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv-artifacts/src/main/java/de/intevation/gnv/artifacts/GNVProductArtifactFactory.java Fri Sep 28 12:13:53 2012 +0200 @@ -0,0 +1,170 @@ +package de.intevation.gnv.artifacts; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.HashMap; +import java.util.Map; + +import javax.xml.xpath.XPathConstants; + +import org.apache.log4j.Logger; +import org.w3c.dom.Document; +import org.w3c.dom.Node; +import org.w3c.dom.NodeList; + +import de.intevation.artifactdatabase.DefaultArtifactFactory; +import de.intevation.artifactdatabase.ProxyArtifact; +import de.intevation.artifactdatabase.XMLUtils; +import de.intevation.artifacts.Artifact; +import de.intevation.artifacts.ArtifactFactory; +import de.intevation.gnv.artifacts.fis.SelectProductArtifact; +import de.intevation.gnv.artifacts.fis.product.DefaultProduct; +import de.intevation.gnv.state.DefaultInputData; + +/** + * @author Ingo Weinzierl + */ +public class GNVProductArtifactFactory extends DefaultArtifactFactory { + + public static final String XPATH_REPLACE_NAME = "IDENTIFIER"; + + public static final String XPATH_PRODUCT_ARTIFACT = + "artifact-database/artifacts/artifact[@name='"+XPATH_REPLACE_NAME+"']"; + + public static final String XPATH_PRODUCT = "products/product"; + + public static final String XPATH_PRODUCT_NAME = "@name"; + + public static final String XPATH_PRODUCT_FACTORY = "artifact-factory"; + + public static final String XPATH_PRODUCT_PARAMETER = "parameters/parameter"; + + private Logger logger = Logger.getLogger(GNVProductArtifactFactory.class); + + private Map productFactories; + private Map products; + + + public GNVProductArtifactFactory() { + } + + @Override + public Artifact createArtifact(String identifier, Object context, Document data) { + + // create a SelectProductArtifact for initial product selection + Artifact artifact = super.createArtifact(identifier, context, data); + + if (artifact instanceof ProxyArtifact) { + + SelectProductArtifact select = new SelectProductArtifact(); + select.setProducts(products); + select.setup(identifier, this, context, data); + + ((ProxyArtifact) artifact).setProxied(select); + } + + return artifact; + } + + @Override + public void setup(Document document, Node factoryNode) { + super.setup(document, factoryNode); + + String xpath = XPATH_PRODUCT_ARTIFACT.replace(XPATH_REPLACE_NAME, name); + Node artifact = (Node) XMLUtils.xpath( + document, xpath, XPathConstants.NODE); + + NodeList productNodes = (NodeList) XMLUtils.xpath( + artifact, XPATH_PRODUCT, XPathConstants.NODESET); + + if (productNodes == null) { + logger.warn("No products found for fis: " + name); + return; + } + + int productLength = productNodes.getLength(); + + if (productLength != 0) { + productFactories = new HashMap(productLength); + products = new HashMap(productLength); + + parseProductFactories(document, productNodes); + } + } + + + public ArtifactFactory getArtifactFactoryByName(String name) { + return (ArtifactFactory) productFactories.get(name); + } + + + protected void parseProductFactories(Document document, NodeList products) { + int items = products.getLength(); + + for(int i = 0; i < items; i++) { + + try { + Node product = products.item(i); + + String name = (String) XMLUtils.xpath( + product, XPATH_PRODUCT_NAME, XPathConstants.STRING); + + Node factoryNode = (Node) XMLUtils.xpath( + product, XPATH_PRODUCT_FACTORY, XPathConstants.NODE); + + String factoryClass = factoryNode.getTextContent(); + + if (factoryClass == null || factoryClass.equals("")) { + logger.warn("No artifact factory class found for " + name); + continue; + } + + Class cls = Class.forName(factoryClass); + ArtifactFactory factory = (ArtifactFactory) cls.newInstance(); + factory.setup(document, factoryNode); + + productFactories.put(name, factory); + initializeProducts(product); + } + catch (ClassNotFoundException cnfe) { + logger.warn(cnfe, cnfe); + } + catch (InstantiationException ie) { + logger.warn(ie, ie); + } + catch (IllegalAccessException iae) { + logger.warn(iae, iae); + } + } + } + + + protected void initializeProducts(Node productNode) { + String productName = (String) XMLUtils.xpath( + productNode, "@name", XPathConstants.STRING); + + NodeList parameterNodes = (NodeList) XMLUtils.xpath( + productNode, XPATH_PRODUCT_PARAMETER, XPathConstants.NODESET + ); + + if (parameterNodes != null) { + int items = parameterNodes.getLength(); + Collection inputParameter = new ArrayList(items); + + for (int j = 0; j < items; j++) { + Node parameterNode = (Node) parameterNodes.item(j); + String name = (String) XMLUtils.xpath( + parameterNode, "@name", XPathConstants.STRING); + String value = (String) XMLUtils.xpath( + parameterNode, "@value", XPathConstants.STRING); + + inputParameter.add(new DefaultInputData(name, value)); + } + + products.put( + productName, + new DefaultProduct(productName, inputParameter, this.name) + ); + } + } +} diff -r f99d8f92a640 -r 755dd2fa4a0a gnv-artifacts/src/main/java/de/intevation/gnv/artifacts/PreSettingArtifact.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv-artifacts/src/main/java/de/intevation/gnv/artifacts/PreSettingArtifact.java Fri Sep 28 12:13:53 2012 +0200 @@ -0,0 +1,20 @@ +/** + * + */ +package de.intevation.gnv.artifacts; + +import java.util.Map; + +import de.intevation.gnv.state.InputData; + +/** + * @author Tim Englich + * + */ +public interface PreSettingArtifact { + + + Map getPreSettings(); + + void setPreSettings(Map preSettings); +} diff -r f99d8f92a640 -r 755dd2fa4a0a gnv-artifacts/src/main/java/de/intevation/gnv/artifacts/cache/CacheFactory.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv-artifacts/src/main/java/de/intevation/gnv/artifacts/cache/CacheFactory.java Fri Sep 28 12:13:53 2012 +0200 @@ -0,0 +1,86 @@ +/** + * + */ +package de.intevation.gnv.artifacts.cache; + +import net.sf.ehcache.Cache; +import net.sf.ehcache.CacheManager; + +import org.apache.log4j.Logger; + +/** + * @author Tim Englich + * + */ +public class CacheFactory { + + /** + * the logger, used to log exceptions and additonaly information + */ + private static Logger log = Logger.getLogger(CacheFactory.class); + + private final static String CACHENAME = "artifactdata"; + + /** + * The singleton Instance of this Factory. + */ + private static CacheFactory instance = null; + + /** + * + */ + private CacheManager cacheManager = null; + + /** + * Basic-Constructor of this Class + */ + private CacheFactory() { + super(); + } + + /** + * This Method provides an singleton Instance of this Class. + * + * @return an singleton Instance of this Class + */ + public static CacheFactory getInstance() { + if (instance == null) { + instance = new CacheFactory(); + } + return instance; + } + + /** + * Getting the ConnectionPool + * + * @return the ConnectionPool + */ + public Cache getCache() { + return this.cacheManager.getCache(CACHENAME); + } + + /** + * Initializes the ConnectionPool. Should only be called once on system + * startup + * + * @param properties + * the Properties for the Individual Configuration of the + * ConnectionPool + */ + public void initializeCache(String configurationFileName) { + if (cacheManager == null) { + cacheManager = new CacheManager(configurationFileName); + cacheManager.addCache(CACHENAME); + } + } + + /** + * Checks if the ConnectionPool has already been initialized. + * + * @return true if the ConnectionPool is initialized. + */ + public boolean isInitialized() { + return this.cacheManager != null; + } + +} diff -r f99d8f92a640 -r 755dd2fa4a0a gnv-artifacts/src/main/java/de/intevation/gnv/artifacts/context/GNVArtifactContext.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv-artifacts/src/main/java/de/intevation/gnv/artifacts/context/GNVArtifactContext.java Fri Sep 28 12:13:53 2012 +0200 @@ -0,0 +1,105 @@ +/** + * + */ +package de.intevation.gnv.artifacts.context; + +import org.apache.log4j.Logger; + +import org.w3c.dom.Document; + +import java.awt.Color; +import java.awt.Dimension; +import java.awt.Paint; + +import java.io.File; + +import de.intevation.artifactdatabase.DefaultArtifactContext; + +/** + * @author Tim Englich (tim.englich@intevation.de) + * @author Sascha L. Teichmann (sascha.teichmann@intevation.de) + */ +public class GNVArtifactContext +extends DefaultArtifactContext +{ + /** + * the logger, used to log exceptions and additonaly information + */ + private static Logger log = Logger.getLogger(GNVArtifactContext.class); + + public static final String CHART_TEMPLATE_KEY = + "gnv.chart.template"; + + public static final String HORIZONTAL_CROSS_SECTION_PROFILE_SAMPLES_KEY = + "gnv.horizontal.cross.section.profile.samples"; + + public static final String HORIZONTAL_CROSS_SECTION_SAMPLES_KEY = + "gnv.horizontal.cross.section.samples"; + + public static final String HORIZONTAL_CROSS_SECTION_EXTRAPOLATION_ROUNDS_KEY = + "gnv.horizontal.cross.section.extrapolation.rounds"; + + public static final String + HORIZONTAL_CROSS_SECTION_RESULT_SHAPEFILE_PATH_KEY = + "gnv.horizontal.cross.section.result.shapefile"; + + public static final File + DEFAULT_HORIZONTAL_CROSS_SECTION_PROFILE_SHAPEFILE_PATH = + new File(System.getProperty("java.io.tmpdir")); + + public static final Integer + DEFAULT_HORIZONTAL_CROSS_SECTION_PROFILE_SAMPLES = Integer.valueOf(250); + + public static final Integer + DEFAULT_HORIZONTAL_CROSS_SECTION_SAMPLES = Integer.valueOf(1024); + + public static final Integer + DEFAULT_HORIZONTAL_CROSS_SECTION_EXTRAPOLATION_ROUNDS = Integer.valueOf(0); + + public static final String HORIZONTAL_CROSS_SECTION_GROUND_INTERPOLATION_KEY = + "gnv.horizontal.cross.section.ground.interpolation"; + + public static final String DEFAULT_HORIZONTAL_CROSS_SECTION_GROUND_INTERPOLATION = + "bilinear"; + + public static final String PALETTES_KEY = + "gnv.color.palettes"; + + public static final String VERTICAL_CROSS_SECTION_SAMPLES_KEY = + "gnv.vertical.cross.section.samples"; + + public static final Dimension DEFAULT_VERTICAL_CROSS_SECTION_SAMPLES = + new Dimension(1024, 768); + + public static final String VERTICAL_CROSS_SECTION_FILTER_FACTORIES_KEY = + "gnv.vertical.cross.section.filter.factories"; + + public static final String VERTICAL_CROSS_SECTION_GROUND_INTERPOLATION_KEY = + "gnv.vertical.cross.section.ground.interpolation"; + + public static final String DEFAULT_VERTICAL_CROSS_SECTION_GROUND_INTERPOLATION = + "bilinear"; + + public static final String VERTICAL_CROSS_SECTION_GROUND_FILL_KEY = + "gnv.vertical.cross.section.ground.fill"; + + public static final String MAPSERVER_SERVER_PATH_KEY = + "mapserver.server.path"; + + public static final String MAPSERVER_MAP_PATH_KEY = + "mapserver.map.path"; + + public static final Paint DEFAULT_VERTICAL_CROSS_SECTION_GROUND_FILL = + new Color(0x7c8683); + + public GNVArtifactContext() { + super(); + log.debug("GNVArtifactContext.Constructor"); + } + + public GNVArtifactContext(Document config) { + super(config); + log.debug("GNVArtifactContext.Constructor(config)"); + } + +} diff -r f99d8f92a640 -r 755dd2fa4a0a gnv-artifacts/src/main/java/de/intevation/gnv/artifacts/context/GNVArtifactContextFactory.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv-artifacts/src/main/java/de/intevation/gnv/artifacts/context/GNVArtifactContextFactory.java Fri Sep 28 12:13:53 2012 +0200 @@ -0,0 +1,658 @@ +package de.intevation.gnv.artifacts.context; + +import java.awt.Color; +import java.awt.Paint; + +import java.io.FileInputStream; +import java.io.FileNotFoundException; +import java.io.IOException; +import java.io.InputStream; +import java.io.File; + +import java.util.Properties; +import java.util.HashMap; +import java.util.ArrayList; +import java.util.Collections; + +import java.awt.Dimension; + +import org.apache.log4j.Logger; + +import org.w3c.dom.Document; +import org.w3c.dom.Element; +import org.w3c.dom.NodeList; + +import de.intevation.gnv.geobackend.base.connectionpool.ConnectionPoolFactory; + +import de.intevation.gnv.geobackend.base.query.container.QueryContainerFactory; +import de.intevation.gnv.geobackend.base.query.container.exception.QueryContainerException; + +import de.intevation.gnv.chart.XMLChartTheme; + +import de.intevation.gnv.artifacts.cache.CacheFactory; + +import de.intevation.gnv.raster.Palette; +import de.intevation.gnv.raster.Filter; +import de.intevation.gnv.raster.PaletteManager; + +import de.intevation.artifacts.ArtifactContextFactory; + +import de.intevation.artifactdatabase.Config; +import de.intevation.artifactdatabase.XMLUtils; + +/** + * @author Tim Englich (tim.englich@intevation.de) + * @author Ingo Weinzierl (iweinzierl@intevation.de) + * @author Sascha L. Teichmann (sascha.teichmann@intevation.de) + */ +public class GNVArtifactContextFactory implements ArtifactContextFactory { + /** + * the logger, used to log exceptions and additonaly information + */ + private static Logger log = Logger.getLogger(GNVArtifactContext.class); + + public static final String XPATH_GEOBACKEND_CONFIGURATION = + "artifact-database/geo-backend/backend-configuration"; + + public static final String XPATH_GEOBACKEND_QUERYCONFIGURATION = + "artifact-database/geo-backend/query-configuration"; + + private final static String CACHECONFIGNODEPATH = + "/artifact-database/ehcache/configuration"; + + private final static String CHARTCONFIGNODEPATH = + "/artifact-database/gnv/charttemplate/configuration"; + + public final static String PALETTES_PATH = + "/artifact-database/gnv/palettes"; + + public final static String PALETTE_ITEMS = + "palette"; + + public final static String HORIZONTAL_CROSS_SECTION_PROFILE_SAMPLES = + "/artifact-database/gnv/horizontal-cross-section-profile/samples/@number"; + + public final static String HORIZONTAL_CROSS_SECTION_GROUND_INTERPOLATION = + "/artifact-database/gnv/horizontal-cross-section/ground/@interpolation"; + + public final static String HORIZONTAL_CROSS_SECTION_SAMPLES = + "/artifact-database/gnv/horizontal-cross-section/samples/@number"; + + public final static String HORIZONTAL_CROSS_SECTION_EXTRAPOLATION_ROUNDS = + "/artifact-database/gnv/horizontal-cross-section/extrapolation/@rounds"; + + public final static String HORIZONTAL_CROSS_SECTION_RESULT_SHAPEFILE_PATH = + "/artifact-database/gnv/shapefile-directory/@path"; + + public final static String VERTICAL_CROSS_SECTION_SAMPLES = + "/artifact-database/gnv/vertical-cross-section/samples"; + + public final static String VERTICAL_CROSS_SECTION_FILTERS = + "/artifact-database/gnv/vertical-cross-section/filters/filter"; + + public final static String VERTICAL_CROSS_SECTION_GROUND_INTERPOLATION = + "/artifact-database/gnv/vertical-cross-section/ground/@interpolation"; + + public final static String VERTICAL_CROSS_SECTION_GROUND_FILL_COLOR = + "/artifact-database/gnv/vertical-cross-section/ground/@fill-color"; + + public final static String XPATH_MAPSERVER_PATH = + "/artifact-database/mapserver/server/@path"; + + public final static String XPATH_MAP_PATH = + "/artifact-database/mapserver/map/@path"; + + /** + * Constructor + */ + public GNVArtifactContextFactory() { + super(); + log.debug("GNVArtifactContextFactory.Constructor"); + } + + /** + * @see de.intevation.artifacts.ArtifactContextFactory#createArtifactContext(org.w3c.dom.Document) + */ + public Object createArtifactContext(Document config) { + GNVArtifactContext returnValue = null; + try { + log.debug("GNVArtifactContextFactory.createArtifactContext"); + log.info("Initialisation of the Geo-BackendConnectionPool"); + String backendConfigurationFile = Config.getStringXPath(config, + XPATH_GEOBACKEND_CONFIGURATION); + backendConfigurationFile = Config.replaceConfigDir( + backendConfigurationFile); + + Properties properties = getProperties(backendConfigurationFile); + ConnectionPoolFactory cpf = ConnectionPoolFactory.getInstance(); + cpf.initializeConnectionPool(properties); + + log.info("Initialisation of the QueryContainer"); + String queryConfigurationFile = Config.getStringXPath(config, + XPATH_GEOBACKEND_QUERYCONFIGURATION); + queryConfigurationFile = Config.replaceConfigDir( + queryConfigurationFile); + + Properties queryProperties = getProperties(queryConfigurationFile); + QueryContainerFactory qcf = QueryContainerFactory.getInstance(); + qcf.initializeQueryContainer(queryProperties); + + configureCache(config); + + returnValue = new GNVArtifactContext(config); + + configurePalettes(config, returnValue); + + configureChartTemplate(config, returnValue); + + configureHorizontalCrossSectionProfile(config, returnValue); + + configureHorizontalCrossSection(config,returnValue); + + configureVerticalCrossSection(config, returnValue); + + configureMapserver(config, returnValue); + + } catch (FileNotFoundException e) { + log.error(e, e); + } catch (IOException e) { + log.error(e, e); + } catch (QueryContainerException e) { + log.error(e, e); + } + return returnValue; + } + + protected void configureVerticalCrossSection( + Document config, + GNVArtifactContext context + ) { + log.info("configuration of vertical cross section"); + configureVerticalCrossSectionSamples(config, context); + configureVerticalCrossSectionFilters(config, context); + configureVerticalCrossSectionGroundInterpolation(config, context); + configureVerticalCrossSectionGroundFillColor(config, context); + } + + + protected void configureCache(Document config) { + String cacheConfigurationFile = Config.getStringXPath( + config, CACHECONFIGNODEPATH); + + if (cacheConfigurationFile != null + && !cacheConfigurationFile.equals("")) + { + log.info("Initialisation of the Cache"); + cacheConfigurationFile = Config.replaceConfigDir( + cacheConfigurationFile); + + CacheFactory cf = CacheFactory.getInstance(); + cf.initializeCache(cacheConfigurationFile); + } + } + + protected void configureVerticalCrossSectionGroundFillColor( + Document config, + GNVArtifactContext context + ) { + log.info("configuration of vertical cross section ground fill color"); + + String fillColor = Config.getStringXPath( + config, + VERTICAL_CROSS_SECTION_GROUND_FILL_COLOR); + + Paint fill = + GNVArtifactContext.DEFAULT_VERTICAL_CROSS_SECTION_GROUND_FILL; + + if (fillColor != null + && (fillColor = fillColor.trim()).length() != 0) { + try { + Color color = Color.decode(fillColor); + log.info("ground fill color: #" + + Integer.toHexString(color.getRGB())); + fill = color; + } + catch (NumberFormatException nfe) { + log.error("'" + fillColor + "' is not a valid color"); + } + } + + context.put( + GNVArtifactContext + .VERTICAL_CROSS_SECTION_GROUND_FILL_KEY, + fill); + } + + protected void configureVerticalCrossSectionGroundInterpolation( + Document config, + GNVArtifactContext context + ) { + log.info("configuration of vertical cross section ground interpolation"); + String interpolation = Config.getStringXPath( + config, + VERTICAL_CROSS_SECTION_GROUND_INTERPOLATION); + + if (interpolation == null + || (interpolation = interpolation.trim()).length() == 0) { + interpolation = GNVArtifactContext + .DEFAULT_VERTICAL_CROSS_SECTION_GROUND_INTERPOLATION; + } + + log.info("ground interpolation: " + interpolation); + + context.put( + GNVArtifactContext + .VERTICAL_CROSS_SECTION_GROUND_INTERPOLATION_KEY, + interpolation); + } + + protected void configureVerticalCrossSectionFilters( + Document config, + GNVArtifactContext context + ) { + log.info("configuration of vertical cross section filters"); + + NodeList filters = Config.getNodeSetXPath( + VERTICAL_CROSS_SECTION_FILTERS); + + ArrayList filterFactories = + new ArrayList(); + + if (filters == null) { + log.warn("no filters found"); + } + else { + for (int i = 0, N = filters.getLength(); i < N; ++i) { + Element filterElement = (Element)filters.item(i); + String factoryName = filterElement.getAttribute("factory"); + if ((factoryName = factoryName.trim()).length() > 0) { + try { + Class clazz = Class.forName(factoryName); + Filter.Factory filterFactory = + (Filter.Factory)clazz.newInstance(); + filterFactories.add(filterFactory); + } + catch (ClassNotFoundException cnfe) { + log.error("filter class not found", cnfe); + } + catch (InstantiationException ie) { + log.error("cannot instantiate filter factory", ie); + } + catch (IllegalAccessException iae) { + log.error("cannot access filter factory", iae); + } + catch (ClassCastException cce) { + log.error("not a filter factory class", cce); + } + } + else { + log.error("No factory name given"); + } + } + } + + log.info("number of filters: " + filterFactories.size()); + + context.put( + GNVArtifactContext.VERTICAL_CROSS_SECTION_FILTER_FACTORIES_KEY, + Collections.unmodifiableList(filterFactories)); + } + + protected void configureVerticalCrossSectionSamples( + Document config, + GNVArtifactContext context + ) { + log.info("configuration of vertical cross section samples"); + + Element samples = (Element)Config.getNodeXPath( + VERTICAL_CROSS_SECTION_SAMPLES); + + Dimension sampleSize = new Dimension( + GNVArtifactContext.DEFAULT_VERTICAL_CROSS_SECTION_SAMPLES); + + if (samples == null) { + log.warn("no samples found"); + } + else { + String widthString = samples.getAttribute("width"); + if ((widthString = widthString.trim()).length() > 0) { + try { + sampleSize.width = Math.max(1, Integer.parseInt(widthString)); + } + catch (NumberFormatException nfe) { + log.error("invalid value for width: '" + widthString + "'"); + } + } + String heightString = samples.getAttribute("height"); + if ((heightString = heightString.trim()).length() > 0) { + try { + sampleSize.height = Math.max(1, Integer.parseInt(heightString)); + } + catch (NumberFormatException nfe) { + log.error("invalid value for height: '" + heightString + "'"); + } + } + } + log.info("samples (width x height): " + + sampleSize.width + " x " + sampleSize.height); + + context.put( + GNVArtifactContext.VERTICAL_CROSS_SECTION_SAMPLES_KEY, + sampleSize); + + } + + protected void configureHorizontalCrossSectionProfile( + Document config, + GNVArtifactContext context + ) + { + log.info("configuration of horizontal cross section profile"); + + String numSamples = Config.getStringXPath( + config, + HORIZONTAL_CROSS_SECTION_PROFILE_SAMPLES); + + Integer samples = + GNVArtifactContext.DEFAULT_HORIZONTAL_CROSS_SECTION_PROFILE_SAMPLES; + + if (numSamples == null) { + log.warn("No number of samples found."); + } + else { + try { + samples = Integer.valueOf(numSamples); + } + catch (NumberFormatException nfe) { + log.warn("Invalid integer for number of samples"); + } + } + + log.info("# horizontal cross section profile samples: " + samples); + + context.put( + GNVArtifactContext.HORIZONTAL_CROSS_SECTION_PROFILE_SAMPLES_KEY, + samples); + } + + protected void configureHorizontalCrossSection( + Document config, + GNVArtifactContext context + ) { + log.info("configuration of horizontal cross section"); + + configureHorizontalCrossSectionSamples(config, context); + configureHorizontalCrossSectionExtrapolation(config, context); + configureHorizontalCrossSectionResultShapeFilePath(config, context); + configureHorizontalCrossSectionGroundInterpolation(config, context); + } + + protected void configureHorizontalCrossSectionExtrapolation( + Document config, + GNVArtifactContext context + ) + { + log.info( + "configuration of horizontal cross section extrapolation"); + + String extrapolationRoundsValue = Config.getStringXPath( + config, + HORIZONTAL_CROSS_SECTION_EXTRAPOLATION_ROUNDS); + + Integer extrapolationRounds = + GNVArtifactContext.DEFAULT_HORIZONTAL_CROSS_SECTION_EXTRAPOLATION_ROUNDS; + + if (extrapolationRoundsValue != null + && (extrapolationRoundsValue = extrapolationRoundsValue.trim()).length() > 0 + ) { + try { + extrapolationRounds = + Integer.valueOf(extrapolationRoundsValue); + } + catch (NumberFormatException nfe) { + log.error( + "'" + extrapolationRoundsValue + "' is not a valid integer"); + } + } + + log.info("extrapolation rounds: " + extrapolationRounds); + + context.put( + GNVArtifactContext + .HORIZONTAL_CROSS_SECTION_EXTRAPOLATION_ROUNDS_KEY, + extrapolationRounds); + } + + protected void configureHorizontalCrossSectionGroundInterpolation( + Document config, + GNVArtifactContext context + ) + { + log.info( + "configuration of horizontal cross section ground interpolation"); + + String interpolation = Config.getStringXPath( + config, + HORIZONTAL_CROSS_SECTION_GROUND_INTERPOLATION); + + if (interpolation == null + || (interpolation = interpolation.trim()).length() == 0) { + interpolation = GNVArtifactContext + .DEFAULT_HORIZONTAL_CROSS_SECTION_GROUND_INTERPOLATION; + } + + log.info("ground interpolation: " + interpolation); + + context.put( + GNVArtifactContext + .HORIZONTAL_CROSS_SECTION_GROUND_INTERPOLATION_KEY, + interpolation); + } + + protected void configureHorizontalCrossSectionResultShapeFilePath( + Document config, + GNVArtifactContext context + ) + { + log.info( + "configuration of horizontal cross section result shape file path"); + + File dir = + GNVArtifactContext. + DEFAULT_HORIZONTAL_CROSS_SECTION_PROFILE_SHAPEFILE_PATH; + + String path = Config.getStringXPath( + config, + HORIZONTAL_CROSS_SECTION_RESULT_SHAPEFILE_PATH); + + if (path != null && (path = path.trim()).length() > 0) { + dir = new File(Config.replaceConfigDir(path)); + } + else { + log.warn("No 'result-shapefile-directory' given"); + } + + log.info("writing shape files to '" + + dir.getAbsolutePath() + "'"); + + context.put( + GNVArtifactContext + .HORIZONTAL_CROSS_SECTION_RESULT_SHAPEFILE_PATH_KEY, + dir); + } + + protected void configureHorizontalCrossSectionSamples( + Document config, + GNVArtifactContext context + ) + { + log.info("configuration of horizontal cross section samples"); + String numSamples = Config.getStringXPath( + config, + HORIZONTAL_CROSS_SECTION_SAMPLES); + + Integer samples = + GNVArtifactContext.DEFAULT_HORIZONTAL_CROSS_SECTION_SAMPLES; + + if (numSamples == null) { + log.warn("No number of samples found."); + } + else { + try { + samples = Integer.valueOf(numSamples); + } + catch (NumberFormatException nfe) { + log.warn("Invalid integer for number of samples"); + } + } + + log.info("# horizontal cross section profile samples: " + samples); + + context.put( + GNVArtifactContext.HORIZONTAL_CROSS_SECTION_SAMPLES_KEY, + samples); + } + + + protected void configureChartTemplate( + Document config, + GNVArtifactContext context + ) { + log.info("Initialisation of chart template"); + String chartConfigFile = Config.getStringXPath( + config, CHARTCONFIGNODEPATH + ); + + XMLChartTheme theme = new XMLChartTheme("XMLChartTheme"); + + if (chartConfigFile == null) { + log.warn("no configuration file for chart template found"); + } + else { + chartConfigFile = Config.replaceConfigDir(chartConfigFile); + log.debug("Parse xml configuration of " + chartConfigFile); + + Document tmpl = XMLUtils.parseDocument(new File(chartConfigFile)); + if (tmpl != null) { + theme.applyXMLConfiguration(tmpl); + } + else { + log.error( + "Cannot load chart template from '" + + chartConfigFile + "'"); + } + } + + context.put(GNVArtifactContext.CHART_TEMPLATE_KEY, theme); + } + + protected void configurePalettes( + Document config, + GNVArtifactContext context + ) { + log.info("configure palettes"); + + HashMap palettes = new HashMap(); + + Element node = (Element)Config.getNodeXPath(config, PALETTES_PATH); + + if (node == null) { + log.error("No palettes found"); + } + else { + NodeList pals = node.getElementsByTagName(PALETTE_ITEMS); + for (int i = 0, N = pals==null?0:pals.getLength(); i < N; ++i) { + Element pal = (Element)pals.item(i); + String name = pal.getAttribute("name"); + String description = pal.getAttribute("description"); + String filename = pal.getAttribute("file"); + String parameterIds = pal.getAttribute("parameter-ids"); + + if (name == null || (name = name.trim()).length() == 0) { + log.error("Palette has no 'name' attribute."); + } + else if (filename == null + || (filename = filename.trim()).length() == 0) { + log.error("Palette '" + name + "' has no 'file' attribute."); + } + else if (parameterIds == null + || (parameterIds = parameterIds.trim()).length() == 0) { + log.error("no parameter ids given for '" + name + "'"); + } + else { + ArrayList ids = new ArrayList(); + for (String idString: parameterIds.split("[\t ,]+")) { + try { + ids.add(Integer.valueOf(idString)); + } + catch (NumberFormatException nfe) { + log.error( + "parameter id '" + idString + "' is integer"); + } + } + filename = Config.replaceConfigDir(filename); + Document document = XMLUtils.parseDocument( + new File(filename)); + if (document == null) { + log.error("Cannot load palette file '" + + filename + "'"); + } + else { + PaletteManager manager = new PaletteManager( + name, + description, + new Palette(document)); + for (Integer id: ids) { + palettes.put(id, manager); + } + } + } + } // for all palettes + } + + context.put(GNVArtifactContext.PALETTES_KEY, palettes); + } + + + protected void configureMapserver( + Document config, + GNVArtifactContext context + ) { + log.info("read configuration of mapserver."); + + String serverPath = (String) Config.getStringXPath( + config, XPATH_MAPSERVER_PATH); + + String mapPath = (String) Config.getStringXPath( + config, XPATH_MAP_PATH); + + if (serverPath != null && mapPath != null) { + context.put(GNVArtifactContext.MAPSERVER_SERVER_PATH_KEY,serverPath); + context.put(GNVArtifactContext.MAPSERVER_MAP_PATH_KEY, mapPath); + } + } + + /** + * @param filePath + * @return + * @throws FileNotFoundException + * @throws IOException + */ + private Properties getProperties(String filePath) + throws FileNotFoundException, IOException + { + InputStream inputStream = null; + try { + inputStream = new FileInputStream(filePath); + Properties properties = new Properties(); + properties.load(inputStream); + return properties; + } + finally { + if (inputStream != null) { + try { inputStream.close(); } + catch (IOException ioe) {} + } + } + } +} diff -r f99d8f92a640 -r 755dd2fa4a0a gnv-artifacts/src/main/java/de/intevation/gnv/artifacts/fis/SelectProductArtifact.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv-artifacts/src/main/java/de/intevation/gnv/artifacts/fis/SelectProductArtifact.java Fri Sep 28 12:13:53 2012 +0200 @@ -0,0 +1,418 @@ +package de.intevation.gnv.artifacts.fis; + +import java.io.IOException; +import java.io.OutputStream; +import java.util.Collection; +import java.util.HashMap; +import java.util.Iterator; +import java.util.Map; + +import javax.xml.xpath.XPathConstants; + +import org.apache.log4j.Logger; +import org.w3c.dom.Document; +import org.w3c.dom.Element; +import org.w3c.dom.Node; +import org.w3c.dom.NodeList; + +import de.intevation.artifactdatabase.ProxyArtifact; +import de.intevation.artifactdatabase.XMLUtils; +import de.intevation.artifacts.Artifact; +import de.intevation.artifacts.ArtifactFactory; +import de.intevation.artifacts.ArtifactNamespaceContext; +import de.intevation.artifacts.CallContext; +import de.intevation.artifacts.CallMeta; +import de.intevation.gnv.artifacts.GNVArtifactBase; +import de.intevation.gnv.artifacts.GNVDefaultArtifact; +import de.intevation.gnv.artifacts.GNVProductArtifactFactory; +import de.intevation.gnv.artifacts.PreSettingArtifact; +import de.intevation.gnv.artifacts.fis.product.Product; +import de.intevation.gnv.artifacts.ressource.RessourceFactory; +import de.intevation.gnv.state.DefaultInputData; +import de.intevation.gnv.state.InputData; + + +/** + * @author Ingo Weinzierl + */ +public class SelectProductArtifact extends GNVDefaultArtifact { + + /** + * THE UID of this Class. + */ + private static final long serialVersionUID = -7952357683127758677L; + + public static final String XPATH_UUID = "art:action/art:uuid/@value"; + + public static final String XPATH_HASH = "art:action/art:hash/@value"; + + public static final String XPATH_INPUT_DATA_VALUE = + "art:action/art:data/art:input[@name='product']/@value"; + + public static final String XPATH_SETUP_PARAMETER_NODES = + "/art:action/art:factory/art:parameter"; + + public static final String XFORM_URL = "http://www.w3.org/2002/xforms"; + public static final String XFORM_PREFIX = "xform"; + + private static Logger log = Logger.getLogger(SelectProductArtifact.class); + + private Map products; + private Product current; + private Artifact artifact; + private String name; + + private Map preSettings = null; + + public SelectProductArtifact() { + super(); + } + + + @Override + public void setup( + String identifier, + ArtifactFactory factory, + Object context, + Document data) { + log.debug("SelectProductArtifact.setup()"); + super.setup(identifier, factory, context,data); + this.name = factory.getName(); + + // Read the Parameters that should be used for the setup from the + // Data-XML.Document. + NodeList parameterNodes = (NodeList) XMLUtils.xpath(data, + XPATH_SETUP_PARAMETER_NODES, + XPathConstants.NODESET, + ArtifactNamespaceContext.INSTANCE); + if (parameterNodes != null && parameterNodes.getLength() > 0){ + this.preSettings = new HashMap(); + for (int i = 0; i < parameterNodes.getLength(); i++){ + Element parameterNode = (Element)parameterNodes.item(i); + String name = parameterNode.getAttribute("name"); + String value = parameterNode.getAttribute("value"); + log.debug("Name: "+name); + log.debug("Value: "+value); + InputData inputData = this.preSettings.get(name); + if (inputData == null){ + inputData = new DefaultInputData(name, value); + this.preSettings.put(name, inputData); + }else{ + inputData.concartValue(value); + } + } + } + + } + + + public void setProducts(Map products) { + this.products = products; + } + + + @Override + public Document feed(Document target, CallContext context) { + log.debug("SelectProductArtifact.feed()"); + + if (artifact == null) { + Document document = XMLUtils.newDocument(); + String productName = XMLUtils.xpathString( + target, + XPATH_INPUT_DATA_VALUE, + ArtifactNamespaceContext.INSTANCE + ); + + current = (Product) products.get(productName); + + String reportNode = null; + String resultNode = null; + String msg = null; + + if (current != null) { + reportNode = "result"; + resultNode = "success"; + msg = "Feed was successfully. New Artifact created."; + } + else { + reportNode = "exceptionreport"; + resultNode = "exception"; + msg = "Product does not exist."; + } + + XMLUtils.ElementCreator creator = new XMLUtils.ElementCreator( + document, + ArtifactNamespaceContext.NAMESPACE_URI, + ArtifactNamespaceContext.NAMESPACE_PREFIX + ); + + Element report = creator.create(reportNode); + Element success = creator.create(resultNode); + success.setTextContent(msg); + report.appendChild(success); + document.appendChild(report); + + return document; + } + else { + return artifact.feed(target, context); + } + } + + + @Override + public Document advance(Document target, CallContext context) { + log.debug("SelectProductArtifact.advance()"); + + if (artifact != null) { + Document result = artifact.advance(target, context); + context.putContextValue(ProxyArtifact.REPLACE_PROXY, artifact); + return result; + } + + Document result = XMLUtils.newDocument(); + if (current == null) { + // artifact needs to be feeded first + String msg = "Artifact is not configured properly. Call 'feed' fist."; + log.error(msg); + + XMLUtils.ElementCreator creator = new XMLUtils.ElementCreator( + result, + ArtifactNamespaceContext.NAMESPACE_URI, + ArtifactNamespaceContext.NAMESPACE_PREFIX + ); + + Element report = creator.create("exceptionreport"); + Element exception = creator.create("exception"); + exception.setTextContent(msg); + report.appendChild(exception); + result.appendChild(report); + + return result; + } + + String uuid = XMLUtils.xpathString( + target, XPATH_UUID, ArtifactNamespaceContext.INSTANCE + ); + + String hash = XMLUtils.xpathString( + target, XPATH_HASH, ArtifactNamespaceContext.INSTANCE + ); + + // fetch ArtifactFactory from context and create a new Artifact + ArtifactFactory factory = context.getDatabase() + .getInternalArtifactFactory(this.name); + factory = ((GNVProductArtifactFactory)factory) + .getArtifactFactoryByName(current.getName()); + artifact = factory.createArtifact(uuid, context, null); + + + if (this.preSettings != null && artifact instanceof PreSettingArtifact){ + ((PreSettingArtifact)artifact).setPreSettings(this.preSettings); + } + + artifact.feed(feedDocument(uuid, hash), context); + + result = ((GNVArtifactBase) artifact).initialize(context); + if (artifact instanceof GNVArtifactBase) { + ((GNVArtifactBase) artifact).setProduct(current); + } + context.putContextValue(ProxyArtifact.REPLACE_PROXY, artifact); + return result; + } + + + @Override + public Document describe(Document data, CallContext context) { + log.debug("SelectProductArtifact.describe()"); + + // create root node + Document document = XMLUtils.newDocument(); + XMLUtils.ElementCreator creator = new XMLUtils.ElementCreator( + document, + ArtifactNamespaceContext.NAMESPACE_URI, + ArtifactNamespaceContext.NAMESPACE_PREFIX + ); + + Element rootNode = creator.create("result"); + Element typeNode = creator.create("type"); + creator.addAttr(typeNode, "name", "describe"); + rootNode.appendChild(typeNode); + + Element uuidNode = creator.create("uuid"); + creator.addAttr(uuidNode, "value", super.identifier); + rootNode.appendChild(uuidNode); + + Element hashNode = creator.create("hash"); + creator.addAttr(hashNode, "value", hash()); + rootNode.appendChild(hashNode); + + // create output node + Element out = creator.create("outputs"); + rootNode.appendChild(out); + + // create current state + Element state = creator.create("state"); + creator.addAttr(state, "name", "choose-product"); + creator.addAttr(state, "description", "Auswahl des Produktes."); + rootNode.appendChild(state); + + // create reachable states + Element rStates = creator.create("reachable-states"); + appendProducts(document, rStates, context); + rootNode.appendChild(rStates); + + // create model + Element model = creator.create("model"); + Element input = creator.create("input"); + creator.addAttr(input, "name", "product"); + creator.addAttr(input, "type", "String"); + model.appendChild(input); + rootNode.appendChild(model); + + // create ui + Element ui = creator.create("ui"); + Element staticNode = creator.create("static"); + Element dynamic = creator.create("dynamic"); + + appendFis(document, staticNode, context, this.name); + appendSelectProducts(document, dynamic, context.getMeta()); + ui.appendChild(staticNode); + ui.appendChild(dynamic); + rootNode.appendChild(ui); + + document.appendChild(rootNode); + + return document; + } + + + @Override + public void out(Document document, OutputStream out, CallContext context) + throws IOException + { + log.debug("SelectProductArtifact.out()"); + if (artifact != null) { + artifact.out(document, out, context); + } + } + + + protected void appendProducts( + Document document, + Node parent, + Object context + ) { + Iterator iter = products.values().iterator(); + + XMLUtils.ElementCreator creator = new XMLUtils.ElementCreator( + document, + ArtifactNamespaceContext.NAMESPACE_URI, + ArtifactNamespaceContext.NAMESPACE_PREFIX + ); + + while(iter.hasNext()) { + Product prod = (Product) iter.next(); + String name = prod.getName(); + + Element current = creator.create("state"); + creator.addAttr(current, "name", name); + creator.addAttr(current, "description", name); + parent.appendChild(current); + } + } + + + protected void appendSelectProducts( + Document document, + Node node, + CallMeta callMeta + ) { + RessourceFactory ressource = RessourceFactory.getInstance(); + + XMLUtils.ElementCreator creator = new XMLUtils.ElementCreator( + document, + XFORM_URL, + XFORM_PREFIX + ); + + String selectboxName = "product"; + Element selectNode = creator.create("select1"); + creator.addAttr(selectNode, "ref", selectboxName); + + Element lableNode = creator.create("label"); + lableNode.setTextContent(ressource.getRessource(callMeta.getLanguages(), + selectboxName, + selectboxName + ) + ); + + Element choiceNode = creator.create("choices"); + selectNode.appendChild(lableNode); + selectNode.appendChild(choiceNode); + + Iterator it = products.values().iterator(); + while (it.hasNext()) { + Product p = (Product) it.next(); + Element itemNode = creator.create("item"); + Element choiceLableNode = creator.create("label"); + choiceLableNode.setTextContent(ressource.getRessource( + callMeta.getLanguages(), + p.getName(), + p.getName() + )); + itemNode.appendChild(choiceLableNode); + + Element choiceValueNode = creator.create("value"); + choiceValueNode.setTextContent(p.getName()); + itemNode.appendChild(choiceValueNode); + choiceNode.appendChild(itemNode); + } + + node.appendChild(selectNode); + } + + + protected Document feedDocument(String uuid, String hash) { + Document document = XMLUtils.newDocument(); + + XMLUtils.ElementCreator creator = new XMLUtils.ElementCreator( + document, + ArtifactNamespaceContext.NAMESPACE_URI, + ArtifactNamespaceContext.NAMESPACE_PREFIX + ); + Element rootNode = creator.create("action"); + + Element typeNode = creator.create("type"); + creator.addAttr(typeNode, "name", "feed"); + rootNode.appendChild(typeNode); + + Element uuidNode = creator.create("uuid"); + creator.addAttr(uuidNode, "value", uuid); + rootNode.appendChild(uuidNode); + + Element hashNode = creator.create("hash"); + creator.addAttr(hashNode, "value", hash); + rootNode.appendChild(hashNode); + + Element dataNode = creator.create("data"); + rootNode.appendChild(dataNode); + + Collection parameter = this.current.getParameter(); + if (parameter != null) { + Iterator parameterIt = parameter.iterator(); + + while (parameterIt.hasNext()) { + InputData inputData = parameterIt.next(); + + Element inputNode = creator.create("input"); + creator.addAttr(inputNode, "name", inputData.getName()); + creator.addAttr(inputNode, "value", inputData.getValue()); + dataNode.appendChild(inputNode); + } + } + document.appendChild(rootNode); + return document; + } +} +// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8: diff -r f99d8f92a640 -r 755dd2fa4a0a gnv-artifacts/src/main/java/de/intevation/gnv/artifacts/fis/product/DefaultProduct.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv-artifacts/src/main/java/de/intevation/gnv/artifacts/fis/product/DefaultProduct.java Fri Sep 28 12:13:53 2012 +0200 @@ -0,0 +1,66 @@ +/** + * + */ +package de.intevation.gnv.artifacts.fis.product; + +import de.intevation.gnv.state.InputData; + +import java.util.Collection; + +/** + * @author Tim Englich + * + */ +public class DefaultProduct implements Product { + + /** + * The UID of this Class + */ + private static final long serialVersionUID = 6473812725442092770L; + + private String name = null; + + private Collection parameter = null; + + private String artifactFactory = null; + + /** + * Constructor + * + * @param name + * @param parameter + * @param artifactFactory + */ + public DefaultProduct( + String name, + Collection parameter, + String artifactFactory + ) { + super(); + this.name = name; + this.parameter = parameter; + this.artifactFactory = artifactFactory; + } + + /** + * @see de.intevation.gnv.artifacts.fis.product.Product#getName() + */ + public String getName() { + return this.name; + } + + /** + * @see de.intevation.gnv.artifacts.fis.product.Product#getParameter() + */ + public Collection getParameter() { + return this.parameter; + } + + /** + * @see de.intevation.gnv.artifacts.fis.product.Product#getArtifactFactory() + */ + public String getArtifactFactory() { + return this.artifactFactory; + } + +} diff -r f99d8f92a640 -r 755dd2fa4a0a gnv-artifacts/src/main/java/de/intevation/gnv/artifacts/fis/product/Product.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv-artifacts/src/main/java/de/intevation/gnv/artifacts/fis/product/Product.java Fri Sep 28 12:13:53 2012 +0200 @@ -0,0 +1,23 @@ +/** + * + */ +package de.intevation.gnv.artifacts.fis.product; + +import de.intevation.gnv.state.InputData; + +import java.io.Serializable; + +import java.util.Collection; + +/** + * @author Tim Englich + * + */ +public interface Product extends Serializable { + + public String getName(); + + public Collection getParameter(); + + public String getArtifactFactory(); +} diff -r f99d8f92a640 -r 755dd2fa4a0a gnv-artifacts/src/main/java/de/intevation/gnv/artifacts/ressource/RessourceFactory.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv-artifacts/src/main/java/de/intevation/gnv/artifacts/ressource/RessourceFactory.java Fri Sep 28 12:13:53 2012 +0200 @@ -0,0 +1,171 @@ +/** + * + */ +package de.intevation.gnv.artifacts.ressource; + +import java.io.BufferedReader; +import java.io.File; +import java.io.FileNotFoundException; +import java.io.InputStream; +import java.io.InputStreamReader; +import java.io.IOException; +import java.util.ArrayList; +import java.util.Locale; +import java.util.List; +import java.util.MissingResourceException; +import java.util.ResourceBundle; + +import org.apache.log4j.Logger; + +import de.intevation.artifacts.PreferredLocale; + +/** + * @author Tim Englich + * + */ +public class RessourceFactory { + + /** + * the logger, used to log exceptions and additonaly information + */ + private static Logger log = Logger.getLogger(RessourceFactory.class); + + /** + * The singleton Instance of this Factory. + */ + private static RessourceFactory instance = null; + + private static String RESSOURCE_BASE_ID = "artifact.ressource.dir"; + + private static String ressourceName = "artifactMessages"; + private static String DEFAULT_DIR = "lang"; + private static String LANG_CONFIG_FILE = "lang.conf"; + + private String ressourceDir = null; + + private Locale[] locales = null; + + /** + * Basic-Constructor of this Class + */ + private RessourceFactory() { + super(); + ressourceDir = System.getProperty(RESSOURCE_BASE_ID, DEFAULT_DIR); + } + + /** + * This Method provides an singleton Instance of this Class. + * + * @return an singleton Instance of this Class + */ + public static synchronized RessourceFactory getInstance() { + if (instance == null) { + instance = new RessourceFactory(); + } + return instance; + } + + + /** + * This method reads locales, configured in LANG_CONFIG_FILE, from + * filesystem and returns them as array. + * + * @return Array of locales supported by the the server. + */ + public Locale[] getLocales() { + + if (locales != null) + return locales; + + log.debug("Supported locales have not been read - read now."); + try { + String config = "/" + ressourceDir + "/" + LANG_CONFIG_FILE; + InputStream in = RessourceFactory.class.getResourceAsStream(config); + + BufferedReader reader = new BufferedReader( + new InputStreamReader(in) + ); + + String line = null; + String country = null; + String language = null; + int idx = -1; + + List tmpLocales = new ArrayList(); + + while((line = reader.readLine()) != null) { + // validate if defined locale has a valid length + if (line.length() != 2 && line.length() != 5) { + log.warn("Illegal locale definition found."); + continue; + } + + idx = line.indexOf("_"); + if (idx > 0) { + // found locale containing language and country code + language = line.substring(0, idx); + country = line.substring(idx+1); + tmpLocales.add(new Locale(language, country)); + } + else { + // found locale containing languagey code only + tmpLocales.add(new Locale(line)); + } + } + + locales = (Locale[]) tmpLocales.toArray( + new Locale[tmpLocales.size()] + ); + + return locales; + } + catch (FileNotFoundException fnfe) { + log.warn("File not found: " + LANG_CONFIG_FILE, fnfe); + } + catch (IOException ioe) { + log.warn(ioe.getLocalizedMessage(), ioe); + } + + return null; + } + + + /** + * Deliveres the translated Value for an Key to an given Language + * + * @param locale + * The choosen locale + * @param key + * the key + * @param defaultValue + * the Value that should be returned. + * @return the translated Value + */ + public String getRessource(PreferredLocale[] preferredLocales, String key, + String defaultValue) { + if (key == null || preferredLocales.length == 0) { + return defaultValue; + } + + return getRessource(preferredLocales[0].getLocale(), key, defaultValue); + } + + + public String getRessource(Locale locale, String key, String defaultVal) { + if (key == null || locale == null) + return defaultVal; + + try { + ResourceBundle rb = ResourceBundle.getBundle( + ressourceDir + "/" + ressourceName, + locale + ); + + return rb.getString(key); + } + catch (MissingResourceException mre) { + log.warn("No resource bundle: " + locale.toString(), mre); + return defaultVal; + } + } +} diff -r f99d8f92a640 -r 755dd2fa4a0a gnv-artifacts/src/main/java/de/intevation/gnv/artifacts/services/MetaDataService.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv-artifacts/src/main/java/de/intevation/gnv/artifacts/services/MetaDataService.java Fri Sep 28 12:13:53 2012 +0200 @@ -0,0 +1,450 @@ +/** + * + */ +package de.intevation.gnv.artifacts.services; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.Iterator; + +import javax.xml.xpath.XPathConstants; + +import org.apache.log4j.Logger; +import org.w3c.dom.Document; +import org.w3c.dom.Element; +import org.w3c.dom.Node; +import org.w3c.dom.NodeList; + +import com.vividsolutions.jts.geom.Geometry; +import com.vividsolutions.jts.io.ParseException; +import com.vividsolutions.jts.io.WKTReader; + +import de.intevation.artifactdatabase.DefaultService; +import de.intevation.artifactdatabase.XMLUtils; +import de.intevation.artifacts.ArtifactNamespaceContext; +import de.intevation.artifacts.CallMeta; +import de.intevation.artifacts.ServiceFactory; +import de.intevation.gnv.artifacts.services.requestobjects.DefaultFIS; +import de.intevation.gnv.artifacts.services.requestobjects.DefaultLayer; +import de.intevation.gnv.artifacts.services.requestobjects.DefaultMapService; +import de.intevation.gnv.artifacts.services.requestobjects.DefaultParameter; +import de.intevation.gnv.artifacts.services.requestobjects.FIS; +import de.intevation.gnv.artifacts.services.requestobjects.Layer; +import de.intevation.gnv.artifacts.services.requestobjects.MapService; +import de.intevation.gnv.artifacts.services.requestobjects.Parameter; +import de.intevation.gnv.geobackend.base.Result; +import de.intevation.gnv.geobackend.base.query.QueryExecutor; +import de.intevation.gnv.geobackend.base.query.QueryExecutorFactory; +import de.intevation.gnv.geobackend.base.query.exception.QueryException; +import de.intevation.gnv.utils.ArtifactXMLUtilities; + +/** + * @author Tim Englich + * + */ +public class MetaDataService extends DefaultService { + + /** + * the logger, used to log exceptions and additionally information + */ + private static Logger log = Logger.getLogger(MetaDataService.class); + + + private final static String FIS_REGION_QUERY_ID = + "mapviewer_interface_fis_region"; + private final static String MAPSERVICES_HAS_FIS_QUERY_ID = + "mapviewer_interface_mapservices_has_fis"; + private final static String MAPSERVICES_HAS_PARAMETER_QUERY_ID = + "mapviewer_interface_mapservices_has_parameter"; + + private final static String MAPSERVICES_HAS_PARAMETER_USING_LAYER_QUERY_ID = + "mapviewer_interface_mapservices_has_parameter_using_layer"; + + private static String ATTRIBUTE_ID = "id"; + private static String ATTRIBUTE_NAME = "name"; + private static String ATTRIBUTE_TYPE = "type"; + private static String ATTRIBUTE_URL = "url"; + private static String ATTRIBUTE_GROUPLAYER = "isgrouplayer"; + private static String ATTRIBUTE_PARENTID = "parentid"; + private static String ATTRIBUTE_SRS = "srs"; + + + private static String XPATH_LOACTION_NODE = "art:GetMetaData/art:location"; + private static String XPATH_MAPSERVICES_NODESET = "art:GetMetaData/" + + "art:mapservices/" + + "art:mapservice"; + private static String XPATH_LAYER_NODESET = "art:layer"; + + /** + * The UID of this Class. + */ + private static final long serialVersionUID = -8446483887497236372L; + + /** + * Constructor + */ + public MetaDataService() { + super(); + } + + /** + * @see de.intevation.artifactdatabase.DefaultService#process(org.w3c.dom.Document, java.lang.Object, de.intevation.artifacts.CallMeta) + */ + @Override + public Document process(Document data, Object globalContext, + CallMeta callMeta) { + log.debug("MetaDataService.process"); + Document document = null; + try { + Geometry g = this.parseGeometry(data); + Collection mapServices = this.parseMapServices(data); + Collection resultFIS = this.unionFIS(this.getFIS(g), + this.getFIS(mapServices)); + document = XMLUtils.newDocument(); + this.writeFIS2Document(document, resultFIS); + log.debug(new ArtifactXMLUtilities().writeDocument2String(document)); + } catch (MetaDataServiceException e) { + log.error(e,e); + document = new ArtifactXMLUtilities() + .createExceptionReport(e.getMessage(), document); + } + return document; + } + + private Geometry parseGeometry(Document data) + throws MetaDataServiceException{ + log.debug("MetaDataService.parseGeometry"); + + Element locationNode = (Element) XMLUtils.xpath( + data, + XPATH_LOACTION_NODE, + XPathConstants.NODE, + ArtifactNamespaceContext.INSTANCE + ); + Geometry returnValue = null; + if (locationNode != null) { + String srs = locationNode.getAttribute(ATTRIBUTE_SRS); + // TODO: use SRS to transform the Geometry to target-System. + String geometryValue = locationNode.getTextContent(); + if (geometryValue != null){ + try { + returnValue = new WKTReader().read(geometryValue); + } catch (ParseException e) { + log.error(e,e); + throw new MetaDataServiceException("The given Geometry" + + "String is not a " + + "valid WKT."); + } + } + } + return returnValue; + } + + private Collection parseMapServices(Document data){ + log.debug("MetaDataService.parseMapServices"); + + NodeList mapServices = (NodeList) XMLUtils.xpath(data, + XPATH_MAPSERVICES_NODESET, + XPathConstants.NODESET, + ArtifactNamespaceContext.INSTANCE); + Collection returnValue = null; + if (mapServices != null){ + returnValue = new ArrayList(mapServices.getLength()); + for (int i = 0; i < mapServices.getLength(); i++){ + Element mapServiceNode = (Element)mapServices.item(i); + String id = mapServiceNode.getAttribute(ATTRIBUTE_ID); + String type = mapServiceNode.getAttribute(ATTRIBUTE_TYPE); + String url = mapServiceNode.getAttribute(ATTRIBUTE_URL); + Collection layer = null; + + NodeList layerNodes = (NodeList) XMLUtils.xpath(mapServiceNode, + XPATH_LAYER_NODESET, + XPathConstants.NODESET, + ArtifactNamespaceContext.INSTANCE); + if (layerNodes != null){ + layer = new ArrayList(layerNodes.getLength()); + for (int j = 0; j < layerNodes.getLength(); j++){ + Element layerNode = (Element)layerNodes.item(j); + String layerId = layerNode.getAttribute(ATTRIBUTE_ID); + String layerName = layerNode.getAttribute(ATTRIBUTE_NAME); + boolean isGroupLayer = + Boolean.parseBoolean(layerNode + .getAttribute( + ATTRIBUTE_GROUPLAYER)); + String parentId = layerNode + .getAttribute(ATTRIBUTE_PARENTID); + + layer.add(new DefaultLayer(layerId, + layerName, + isGroupLayer, + parentId)); + } + } + MapService mapService = new DefaultMapService(id, layer, + type, url); + returnValue.add(mapService); + + } + } + return returnValue; + } + + private Collection unionFIS(Collection fromGeometry, + Collection fromMapservices){ + log.debug("MetaDataService.unionFIS"); + Collection returnValue = null; + if (fromGeometry == null || fromGeometry.isEmpty()){ + returnValue = fromMapservices; + }else if (fromMapservices == null || fromMapservices.isEmpty()){ + returnValue = fromGeometry; + }else{ + + returnValue = new ArrayList(); + Iterator it = fromMapservices.iterator(); + while (it.hasNext()){ + FIS fis = it.next(); + if (fromGeometry.contains(fis)){ + returnValue.add(fis); + } + } + } + return returnValue; + } + + /** + * Puts the retrieved FIS into the given XML-Document. + * @param document the Document where the FIS should be put in. + * @param fis the retrieved FIS which should be written into + * the XML-Document. + */ + private void writeFIS2Document(Document document, Collection fis){ + + if (fis != null){ + Iterator it = fis.iterator(); + XMLUtils.ElementCreator creator = new XMLUtils.ElementCreator( + document, + ArtifactNamespaceContext.NAMESPACE_URI, + ArtifactNamespaceContext.NAMESPACE_PREFIX + ); + Node rootNode = creator.create("result"); + document.appendChild(rootNode); + + Node factoriesNode = creator.create("factories"); + rootNode.appendChild(factoriesNode); + while (it.hasNext()){ + FIS tmpFIS = it.next(); + Element fisNode = creator.create("factory"); + fisNode.setAttribute("art:name",tmpFIS.getID()); + + Collection parameter = tmpFIS.getParameter(); + + if(parameter != null){ + Iterator pit = parameter.iterator(); + while (pit.hasNext()){ + Parameter p = pit.next(); + Element parameterNode = creator.create("parameter"); + parameterNode.setAttribute(ATTRIBUTE_ID, p.getID()); + parameterNode.setAttribute(ATTRIBUTE_NAME, p.getName()); + fisNode.appendChild(parameterNode); + } + } + factoriesNode.appendChild(fisNode); + } + } + } + + /** + * Returns all FIS which Areas is intersected by this given Geometry + * @param g the Geometry which should be used to determine the FIS. + * @return all FIS which Areas is intersected by this given Geometry + */ + protected Collection getFIS(Geometry g) + throws MetaDataServiceException{ + log.debug("MetaDataService.getFIS ==> Geometry"); + Collection resultValue = null; + if (g != null){ + try { + QueryExecutor queryExecutor = QueryExecutorFactory + .getInstance() + .getQueryExecutor(); + Collection result = queryExecutor.executeQuery(FIS_REGION_QUERY_ID, + new String[]{g.toString()}); + + if (result != null){ + resultValue = new ArrayList(result.size()); + Iterator it = result.iterator(); + while (it.hasNext()){ + Result value = it.next(); + String fis_id = value.getString(0).trim(); + resultValue.add(new DefaultFIS(fis_id)); + } + } + } catch (QueryException e) { + log.error(e,e); + throw new MetaDataServiceException("Cannot Query FIS from DB."); + } + } + return resultValue; + } + + /** + * Returns all FIS which were represented by the given Mapservices + * @param mapServices the Mapservices which should determine the FIS. + * @return all FIS which where represented my the given Mapservices. + */ + protected Collection getFIS(Collection mapServices) + throws MetaDataServiceException{ + log.debug("MetaDataService.getFIS ==> MapServices"); + Collection resultValue = null; + if (mapServices != null && !mapServices.isEmpty()){ + try { + + String mapServiceNames = ""; + Iterator mit = mapServices.iterator(); + while(mit.hasNext()){ + if (mapServiceNames.length() > 0){ + mapServiceNames += " , "; + } + mapServiceNames += "'"+mit.next().getID()+"'"; + } + + QueryExecutor queryExecutor = QueryExecutorFactory + .getInstance() + .getQueryExecutor(); + Collection result = queryExecutor.executeQuery( + MAPSERVICES_HAS_FIS_QUERY_ID, + new String[]{mapServiceNames}); + if (result != null){ + resultValue = new ArrayList(result.size()); + Iterator it = result.iterator(); + while (it.hasNext()){ + Result value = it.next(); + String fisId = value.getString(0).trim(); + String mapServiceID = value.getString(1).trim(); + + // FIRST LOOK IF ONE MAPSERVICE REPRESENTS ONLY ONE PARAM + Collection result2 = queryExecutor.executeQuery( + MAPSERVICES_HAS_PARAMETER_QUERY_ID, + new String[]{"'"+mapServiceID+"'"}); + Collection parameter = null; + if (result2 != null && result2.size() == 1){ + Iterator it2 = result2.iterator(); + parameter = new ArrayList(1); + while (it2.hasNext()){ + Result parameterValue = it2.next(); + String parameterID = parameterValue.getString(0) + .trim(); + parameter.add(new DefaultParameter(parameterID, + parameterID)); + } + }else{ + // IF FALSE LOOK IF THE GIVEN LAYERs TO AN MAPSERVICE + // REPRESENTS DIFFERENT PARAMS + MapService service = this.getMapService(mapServices, + mapServiceID); + Collection layer = service.getLayer(); + if (layer != null && !layer.isEmpty()){ + String layerQueryString = + this.createLayerQueryString(layer); + Collection parameterResult = + queryExecutor.executeQuery( + MAPSERVICES_HAS_PARAMETER_USING_LAYER_QUERY_ID, + new String[]{"'"+mapServiceID+"'", + layerQueryString}); + if (parameterResult != null && + !parameterResult.isEmpty()){ + Iterator it2 = parameterResult.iterator(); + parameter = new ArrayList(parameterResult.size()); + while (it2.hasNext()){ + Result parameterValue = it2.next(); + String parameterID = parameterValue.getString(0) + .trim(); + parameter.add(new DefaultParameter(parameterID, + parameterID)); + } + } + } + + } + + FIS fis = this.getFIS(resultValue, fisId); + if (fis != null){ + if (parameter != null){ + fis.addParameter(parameter); + } + }else{ + resultValue.add(new DefaultFIS(fisId, parameter)); + } + } + } + } catch (QueryException e) { + log.error(e,e); + throw new MetaDataServiceException("Cannot Query FIS from DB."); + } + + } + return resultValue; + } + + + private FIS getFIS (Collection fis, String fisId){ + + Iterator it = fis.iterator(); + while(it.hasNext()){ + FIS tmpFIS = it.next(); + if (tmpFIS.getID().equals(fisId)){ + return tmpFIS; + } + } + return null; + } + + private MapService getMapService(Collection mapServices, + String mapServiceID){ + log.debug("MetaDataService.getMapService"); + Iterator it = mapServices.iterator(); + while (it.hasNext()){ + MapService service = it.next(); + if (service.getID().equals(mapServiceID)){ + return service; + } + } + return null; + } + + private String createLayerQueryString(Collection layer){ + log.debug("MetaDataService.createLayerQueryString"); + StringBuffer sb = new StringBuffer();; + Iterator it = layer.iterator(); + synchronized (sb) { + while (it.hasNext()){ + Layer l = it.next(); + if (!l.isGroupLayer()){ + sb.append(l.getID()); + if (it.hasNext()){ + sb.append(" , "); + } + } + + } + } + String returnValue = sb.toString(); + if (returnValue.endsWith(" , ")){ + returnValue = returnValue.substring(0,returnValue + .lastIndexOf(",")) + .trim(); + } + return returnValue; + } + + /** + * @see de.intevation.artifactdatabase.DefaultService#setup(de.intevation.artifacts.ServiceFactory, java.lang.Object) + */ + @Override + public void setup(ServiceFactory factory, Object globalContext) { + log.debug("MetaDataService.setup"); + super.setup(factory, globalContext); + // TODO: Perhaps it is necessary to init the QueryIds here. + } + +} diff -r f99d8f92a640 -r 755dd2fa4a0a gnv-artifacts/src/main/java/de/intevation/gnv/artifacts/services/MetaDataServiceException.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv-artifacts/src/main/java/de/intevation/gnv/artifacts/services/MetaDataServiceException.java Fri Sep 28 12:13:53 2012 +0200 @@ -0,0 +1,48 @@ +/** + * + */ +package de.intevation.gnv.artifacts.services; +/** + * @author Tim Englich + * + */ +public class MetaDataServiceException extends Exception { + + /** + * The UID of this Class + */ + private static final long serialVersionUID = -7489185270678994565L; + + /** + * Constructor + */ + public MetaDataServiceException() { + super(); + } + + /** + * Constructor + * @param arg0 + */ + public MetaDataServiceException(String arg0) { + super(arg0); + } + + /** + * Constructor + * @param arg0 + */ + public MetaDataServiceException(Throwable arg0) { + super(arg0); + } + + /** + * Constructor + * @param arg0 + * @param arg1 + */ + public MetaDataServiceException(String arg0, Throwable arg1) { + super(arg0, arg1); + } + +} diff -r f99d8f92a640 -r 755dd2fa4a0a gnv-artifacts/src/main/java/de/intevation/gnv/artifacts/services/requestobjects/DefaultFIS.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv-artifacts/src/main/java/de/intevation/gnv/artifacts/services/requestobjects/DefaultFIS.java Fri Sep 28 12:13:53 2012 +0200 @@ -0,0 +1,75 @@ +/** + * + */ +package de.intevation.gnv.artifacts.services.requestobjects; + +import java.util.Collection; +import java.util.Iterator; + +/** + * @author Tim Englich + * + */ +public class DefaultFIS implements FIS { + + + private String id = null; + + private Collection parameter = null; + + public DefaultFIS(String id){ + super(); + this.id = id; + } + /** + * Constructor + * @param id + * @param parameter + */ + public DefaultFIS(String id, Collection parameter) { + this(id); + this.parameter = parameter; + } + + /** + * @see de.intevation.gnv.artifacts.services.requestobjects.FIS#getID() + */ + public String getID() { + return this.id; + } + + /** + * @see de.intevation.gnv.artifacts.services.requestobjects.FIS#getParameter() + */ + public Collection getParameter() { + return this.parameter; + } + + @Override + public boolean equals(Object arg0) { + boolean returnValue = false; + if (arg0 instanceof FIS){ + returnValue = this.id.equals(((FIS)arg0).getID()); + } + return returnValue; + } + /** + * @see de.intevation.gnv.artifacts.services.requestobjects.FIS#addParameter(java.util.Collection) + */ + public void addParameter(Collection parameter) { + if (this.parameter != null){ + Iterator it = parameter.iterator(); + while (it.hasNext()){ + Parameter tmpParameter = it.next(); + if (!this.parameter.contains(tmpParameter)){ + this.parameter.add(tmpParameter); + } + } + }else{ + this.parameter = parameter; + } + } + + + +} diff -r f99d8f92a640 -r 755dd2fa4a0a gnv-artifacts/src/main/java/de/intevation/gnv/artifacts/services/requestobjects/DefaultLayer.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv-artifacts/src/main/java/de/intevation/gnv/artifacts/services/requestobjects/DefaultLayer.java Fri Sep 28 12:13:53 2012 +0200 @@ -0,0 +1,67 @@ +/** + * + */ +package de.intevation.gnv.artifacts.services.requestobjects; +/** + * @author Tim Englich + * + */ +public class DefaultLayer implements Layer { + + + private String id = null; + + private String name = null; + + private boolean groupLayer = false; + + private String parentId = null; + /** + * Constructor + */ + public DefaultLayer(String id,String name, + boolean groupLayer,String parentId) { + this.id = id; + this.name = name; + this.groupLayer = groupLayer; + this.parentId = parentId; + } + + + + /** + * @see de.intevation.gnv.artifactdatabase.objects.map.Layer#getID() + */ + public String getID() { + return this.id; + } + + /** + * @see de.intevation.gnv.artifactdatabase.objects.map.Layer#getName() + */ + public String getName() { + return this.name; + } + + /** + * @see de.intevation.gnv.artifactdatabase.objects.map.Layer#isGroupLayer() + */ + public boolean isGroupLayer() { + return this.groupLayer; + } + + /** + * @see de.intevation.gnv.artifactdatabase.objects.map.Layer#parentID() + */ + public String parentID() { + return this.parentId; + } + + @Override + public String toString() { + return "ID: "+ this.id + " Name: "+this.name+ + " IsGroupLayer: "+this.groupLayer+ + " ParentID: "+this.parentId; + } + +} diff -r f99d8f92a640 -r 755dd2fa4a0a gnv-artifacts/src/main/java/de/intevation/gnv/artifacts/services/requestobjects/DefaultMapService.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv-artifacts/src/main/java/de/intevation/gnv/artifacts/services/requestobjects/DefaultMapService.java Fri Sep 28 12:13:53 2012 +0200 @@ -0,0 +1,63 @@ +/** + * + */ +package de.intevation.gnv.artifacts.services.requestobjects; + +import java.util.Collection; + +/** + * @author Tim Englich + * + */ +public class DefaultMapService implements MapService { + + private String id = null; + + + + private Collection layer = null; + + private String type = null; + + private String url = null; + /** + * Constructor + */ + public DefaultMapService(String id, Collection layer, + String type, String url) { + super(); + this.id = id; + this.layer = layer; + this.type = type; + this.url = url; + } + + /** + * @see de.intevation.gnv.artifactdatabase.objects.map.MapService#getID() + */ + public String getID() { + return this.id; + } + + /** + * @see de.intevation.gnv.artifactdatabase.objects.map.MapService#getLayer() + */ + public Collection getLayer() { + return this.layer; + } + + /** + * @see de.intevation.gnv.artifactdatabase.objects.map.MapService#getType() + */ + public String getType() { + return this.type; + } + + /** + * @see de.intevation.gnv.artifactdatabase.objects.map.MapService#getURL() + */ + public String getURL() { + return this.url; + } + +} diff -r f99d8f92a640 -r 755dd2fa4a0a gnv-artifacts/src/main/java/de/intevation/gnv/artifacts/services/requestobjects/DefaultParameter.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv-artifacts/src/main/java/de/intevation/gnv/artifacts/services/requestobjects/DefaultParameter.java Fri Sep 28 12:13:53 2012 +0200 @@ -0,0 +1,41 @@ +/** + * + */ +package de.intevation.gnv.artifacts.services.requestobjects; +/** + * @author Tim Englich + * + */ +public class DefaultParameter implements Parameter { + + + private String id = null; + + private String name = null; + + /** + * Constructor + * @param id + * @param name + */ + public DefaultParameter(String id, String name) { + super(); + this.id = id; + this.name = name; + } + + /** + * @see de.intevation.gnv.artifacts.services.requestobjects.Parameter#getID() + */ + public String getID() { + return this.id; + } + + /** + * @see de.intevation.gnv.artifacts.services.requestobjects.Parameter#getName() + */ + public String getName() { + return this.name; + } + +} diff -r f99d8f92a640 -r 755dd2fa4a0a gnv-artifacts/src/main/java/de/intevation/gnv/artifacts/services/requestobjects/FIS.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv-artifacts/src/main/java/de/intevation/gnv/artifacts/services/requestobjects/FIS.java Fri Sep 28 12:13:53 2012 +0200 @@ -0,0 +1,18 @@ +/** + * + */ +package de.intevation.gnv.artifacts.services.requestobjects; + +import java.util.Collection; + +/** + * @author Tim Englich + * + */ +public interface FIS { + + String getID(); + Collection getParameter(); + void addParameter(Collection parameter); + +} diff -r f99d8f92a640 -r 755dd2fa4a0a gnv-artifacts/src/main/java/de/intevation/gnv/artifacts/services/requestobjects/Layer.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv-artifacts/src/main/java/de/intevation/gnv/artifacts/services/requestobjects/Layer.java Fri Sep 28 12:13:53 2012 +0200 @@ -0,0 +1,16 @@ +/** + * + */ +package de.intevation.gnv.artifacts.services.requestobjects; +/** + * @author Tim Englich + * + */ +public interface Layer { + + String getName(); + String getID(); + boolean isGroupLayer(); + String parentID(); + +} diff -r f99d8f92a640 -r 755dd2fa4a0a gnv-artifacts/src/main/java/de/intevation/gnv/artifacts/services/requestobjects/MapService.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv-artifacts/src/main/java/de/intevation/gnv/artifacts/services/requestobjects/MapService.java Fri Sep 28 12:13:53 2012 +0200 @@ -0,0 +1,23 @@ +/** + * + */ +package de.intevation.gnv.artifacts.services.requestobjects; + +import java.util.Collection; + +/** + * @author Tim Englich + * + */ +public interface MapService { + + + String getID(); + + String getURL(); + + String getType(); + + Collection getLayer(); + +} diff -r f99d8f92a640 -r 755dd2fa4a0a gnv-artifacts/src/main/java/de/intevation/gnv/artifacts/services/requestobjects/Parameter.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv-artifacts/src/main/java/de/intevation/gnv/artifacts/services/requestobjects/Parameter.java Fri Sep 28 12:13:53 2012 +0200 @@ -0,0 +1,14 @@ +/** + * + */ +package de.intevation.gnv.artifacts.services.requestobjects; +/** + * @author Tim Englich + * + */ +public interface Parameter { + + String getName(); + String getID (); + +} diff -r f99d8f92a640 -r 755dd2fa4a0a gnv-artifacts/src/main/java/de/intevation/gnv/chart/AbstractChart.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv-artifacts/src/main/java/de/intevation/gnv/chart/AbstractChart.java Fri Sep 28 12:13:53 2012 +0200 @@ -0,0 +1,31 @@ +package de.intevation.gnv.chart; + +import java.util.Collection; +import java.util.Locale; + +import org.jfree.chart.JFreeChart; +import org.jfree.chart.ChartTheme; + +/** + * @author Ingo Weinzierl (ingo.weinzierl@intevation.de) + */ +public abstract class AbstractChart +implements Chart +{ + protected JFreeChart chart; + protected boolean linesVisible; + protected boolean shapesVisible; + + protected Locale locale; + + protected ChartLabels labels; + protected ChartTheme theme; + protected Collection parameters; + protected Collection measurements; + protected Collection resultSet; + protected Collection dates; + protected Collection timeGaps; + + public abstract JFreeChart generateChart(); +} +// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf-8 : diff -r f99d8f92a640 -r 755dd2fa4a0a gnv-artifacts/src/main/java/de/intevation/gnv/chart/AbstractHistogram.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv-artifacts/src/main/java/de/intevation/gnv/chart/AbstractHistogram.java Fri Sep 28 12:13:53 2012 +0200 @@ -0,0 +1,76 @@ +package de.intevation.gnv.chart; + +import java.util.Locale; + +import org.apache.log4j.Logger; + +import org.jfree.chart.ChartFactory; +import org.jfree.chart.ChartTheme; +import org.jfree.chart.JFreeChart; + +import org.jfree.chart.plot.PlotOrientation; +import org.jfree.chart.plot.XYPlot; + +import org.jfree.chart.renderer.xy.XYBarRenderer; + +/** + * @author Ingo Weinzierl (ingo.weinzierl@intevation.de) + */ +public abstract class AbstractHistogram +implements Chart +{ + private Logger logger = Logger.getLogger(AbstractHistogram.class); + + protected JFreeChart chart; + protected ChartLabels labels; + protected ChartTheme theme; + protected Object[] data; + + protected Locale locale; + + + public AbstractHistogram( + ChartLabels labels, Object[] data, ChartTheme theme + ) { + this.labels = labels; + this.data = data; + this.theme = theme; + } + + + public JFreeChart generateChart() { + + if (chart != null) + return chart; + + chart = ChartFactory.createHistogram( + labels.getTitle(), + labels.getDomainAxisLabel(), + labels.getRangeAxisLabel(), + null, + PlotOrientation.VERTICAL, + true, + false, + false); + + applyDatasets(); + + theme.apply(chart); + adjustPlot(); + + return chart; + } + + + protected void adjustPlot() { + XYPlot plot = (XYPlot) chart.getPlot(); + XYBarRenderer renderer = (XYBarRenderer) plot.getRenderer(); + + renderer.setShadowVisible(false); + renderer.setSeriesVisibleInLegend(0, false); + } + + + protected abstract void applyDatasets(); +} +// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf-8 : diff -r f99d8f92a640 -r 755dd2fa4a0a gnv-artifacts/src/main/java/de/intevation/gnv/chart/AbstractXYLineChart.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv-artifacts/src/main/java/de/intevation/gnv/chart/AbstractXYLineChart.java Fri Sep 28 12:13:53 2012 +0200 @@ -0,0 +1,275 @@ +package de.intevation.gnv.chart; + +import java.awt.Color; +import java.awt.geom.Ellipse2D; +import java.text.NumberFormat; +import java.util.Collection; +import java.util.Iterator; +import java.util.Locale; +import java.util.Map; + +import org.apache.log4j.Logger; + +import org.jfree.chart.JFreeChart; +import org.jfree.chart.ChartFactory; +import org.jfree.chart.axis.Axis; +import org.jfree.chart.axis.NumberAxis; +import org.jfree.chart.axis.NumberTickUnit; +import org.jfree.chart.axis.AxisLocation; +import org.jfree.chart.plot.PlotOrientation; +import org.jfree.chart.plot.XYPlot; +import org.jfree.chart.renderer.xy.XYLineAndShapeRenderer; +import org.jfree.chart.title.TextTitle; +import org.jfree.data.xy.XYDataset; +import org.jfree.data.Range; +import org.jfree.data.general.Series; + +import de.intevation.gnv.geobackend.base.Result; +import de.intevation.gnv.state.describedata.KeyValueDescibeData; + + +/** + * @author Ingo Weinzierl + */ +public abstract class AbstractXYLineChart +extends AbstractChart +{ + public static final double LOWER_MARGIN = 0.05D; + public static final double UPPER_MARGIN = 0.05D; + + private static Logger log = Logger.getLogger(AbstractXYLineChart.class); + + protected static Color[] COLOR = { + Color.black, Color.red, Color.green, Color.blue, Color.yellow, + Color.gray, Color.orange, Color.pink, Color.cyan + }; + + protected static int nextColor = 0; + + protected PlotOrientation PLOT_ORIENTATION = PlotOrientation.VERTICAL; + + /** Map to store datasets for each parameter */ + protected Map datasets; + + /** Map to store max ranges of each parameter (axis.setAutoRange(true) + * doesn't seem to work */ + protected Map ranges; + + protected abstract void initData(); + protected abstract void addValue(Result row, Series series); + protected abstract void addSeries(Series series, String label, int idx); + protected abstract void localizeDomainAxis(Axis axis, Locale locale); + protected abstract String createSeriesName( + String breakPoint1, + String breakPoint2, + String breakPoint3 + ); + + + public JFreeChart generateChart() { + log.debug("generate XYLineChart"); + nextColor = 0; + + if (chart != null) + return chart; + + initChart(); + + chart.addSubtitle(new TextTitle(labels.getSubtitle())); + + theme.apply(chart); + initData(); + + adjustPlot((XYPlot)chart.getPlot()); + + return chart; + } + + + protected void initChart() { + chart = ChartFactory.createXYLineChart( + labels.getTitle(), + labels.getDomainAxisLabel(), + null, + null, + PLOT_ORIENTATION, + true, + false, + false + ); + } + + + protected void prepareAxis(String seriesKey, int idx) { + log.debug("prepare axis of xychart"); + + XYPlot plot = chart.getXYPlot(); + Axis xAxis = plot.getDomainAxis(); + NumberAxis yAxis = new NumberAxis(seriesKey); + + localizeDomainAxis(xAxis, locale); + localizeRangeAxis(yAxis, locale); + + // litte workarround to adjust the max range of axes. + // NumberAxis.setAutoRange(true) doesn't seem to work properly. + Range yRange = (Range) ranges.get(seriesKey); + yAxis.setRange(Range.expand(yRange, LOWER_MARGIN, UPPER_MARGIN)); + log.debug("Max Range of dataset is: " + yRange.toString()); + + if (seriesKey.contains("richtung")) { + yAxis.setTickUnit(new NumberTickUnit(30.0)); + yAxis.setUpperBound(360.0); + yAxis.setLowerBound(0.0); + } + else { + yAxis.setFixedDimension(10.0); + yAxis.setAutoRangeIncludesZero(false); + } + + plot.setRangeAxis(idx, yAxis); + yAxis.configure(); + + if (idx % 2 != 0) + plot.setRangeAxisLocation(idx, AxisLocation.BOTTOM_OR_RIGHT); + else + plot.setRangeAxisLocation(idx, AxisLocation.BOTTOM_OR_LEFT); + + plot.mapDatasetToRangeAxis(idx, idx); + } + + + protected void adjustRenderer( + int idx, + int seriesCount, + boolean renderLines, + boolean renderShapes + ) { + log.debug("Adjust render of series"); + XYLineAndShapeRenderer renderer = null; + XYPlot plot = chart.getXYPlot(); + + try { + renderer = (XYLineAndShapeRenderer)((XYLineAndShapeRenderer) + (plot.getRenderer())).clone(); + } + catch (CloneNotSupportedException cnse) { + log.warn("Error while cloning renderer.", cnse); + renderer = new XYLineAndShapeRenderer(renderLines, renderShapes); + renderer.setBaseShape(new Ellipse2D.Double(-2,-2,4,4)); + } + + for (int i = 0; i < seriesCount; i++) { + renderer.setSeriesShape(i, renderer.getSeriesShape(0)); + renderer.setSeriesPaint(i, COLOR[nextColor%COLOR.length]); + renderer.setSeriesShapesVisible(i, renderShapes); + renderer.setSeriesLinesVisible(i, renderLines); + nextColor++; + } + plot.setRenderer(idx, renderer); + } + + + protected void adjustPlot(XYPlot plot) { + if (plot.getRangeAxisCount() > 1) + plot.setRangeGridlinesVisible(false); + } + + + protected void localizeRangeAxis(Axis axis, Locale locale) { + if (locale == null) + return; + + log.debug( + "Set language of axis [" + axis.getLabel() + "] " + + "to " + locale.toString() + ); + + NumberFormat format = NumberFormat.getInstance(locale); + ((NumberAxis) axis).setNumberFormatOverride(format); + } + + + public Range getMaxRangeOfDataset(XYDataset dataset) { + int seriesCount = dataset.getSeriesCount(); + double upper = Double.NEGATIVE_INFINITY; + double lower = Double.POSITIVE_INFINITY; + + for (int i = 0; i < seriesCount; i++) { + int itemCount = dataset.getItemCount(i); + + for (int j = 0; j < itemCount; j++) { + Number num = dataset.getY(i, j); + + if (num != null) { + double y = num.doubleValue(); + lower = y < lower ? y : lower; + upper = y > upper ? y : upper; + } + } + } + + return new Range(lower, upper); + } + + + public Range getMaxRangeOfDatasetWithMargin( + XYDataset dataset, + double percent + ) { + Range range = getMaxRangeOfDataset(dataset); + double length = range.getLength(); + double upper = range.getUpperBound() + length /100 * percent; + double lower = range.getLowerBound() - length /100 * percent; + + return new Range(lower, upper); + } + + + protected String findParameter(String label) { + Iterator iter = parameters.iterator(); + + while (iter.hasNext()) { + KeyValueDescibeData data = (KeyValueDescibeData) iter.next(); + String key = data.getValue(); + + if (label.indexOf(key) > -1) + return key; + } + + return label; + } + + + protected String findValueTitle(Collection values, String id) { + log.debug("find description of dataset"); + + if (values != null){ + Iterator it = values.iterator(); + while (it.hasNext()) { + KeyValueDescibeData data = (KeyValueDescibeData) it.next(); + + if (id.equals(data.getKey())) + return data.getValue(); + } + } + return ""; + } + + + protected void storeMaxRange(Map ranges, double value, String parameter) { + Range range = null; + + range = ranges.containsKey(parameter) + ? (Range) ranges.get(parameter) + : new Range(value, value); + + double lower = range.getLowerBound(); + double upper = range.getUpperBound(); + + lower = value < lower ? value : lower; + upper = value > upper ? value : upper; + + ranges.put(parameter, new Range(lower, upper)); + } +} +// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf-8 : diff -r f99d8f92a640 -r 755dd2fa4a0a gnv-artifacts/src/main/java/de/intevation/gnv/chart/Chart.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv-artifacts/src/main/java/de/intevation/gnv/chart/Chart.java Fri Sep 28 12:13:53 2012 +0200 @@ -0,0 +1,15 @@ +package de.intevation.gnv.chart; + +import org.jfree.chart.JFreeChart; + +import java.io.Serializable; + + +/** + * @author Ingo Weinzierl + */ +public interface Chart +extends Serializable +{ + public JFreeChart generateChart(); +} diff -r f99d8f92a640 -r 755dd2fa4a0a gnv-artifacts/src/main/java/de/intevation/gnv/chart/ChartLabels.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv-artifacts/src/main/java/de/intevation/gnv/chart/ChartLabels.java Fri Sep 28 12:13:53 2012 +0200 @@ -0,0 +1,113 @@ +/* Copyright (C) 2007 con terra GmbH (http://www.conterra.de) + * All rights reserved + * + * $Id: ChartLabels.java,v 1.1 2007/12/10 13:57:13 drewnak Exp $ + * + * created by: drewnak + * created at : 10.12.2007 + * created at : 11:48:39 + * + * modified by: $Author: drewnak $ + * modified at: $Date: 2007/12/10 13:57:13 $ + */ +package de.intevation.gnv.chart; + +/** + * @author drewnak + * @author Tim Englich Changes and codecleanup + * @author Ingo Weinzierl + */ +public class ChartLabels { + /** + * + */ + private String title; + + /** + * + */ + private String subtitle; + + /** + * + */ + private String domainAxisLabel; + + /** + * + */ + private String rangeAxisLabel; + + /** + * + */ + private String parameterName; + + + /** + * Constructor + * + * @param title + * @param domainAxisLabel + */ + public ChartLabels(String title, String subtitle, String domainAxisLabel) { + this(title, subtitle, domainAxisLabel, null); + } + + public ChartLabels( + String title, + String subtitle, + String domainAxisLabel, + String rangeAxisLabel + ) { + this(title, subtitle, domainAxisLabel, rangeAxisLabel, null); + } + + + public ChartLabels( + String title, + String subtitle, + String domainAxisLabel, + String rangeAxisLabel, + String parameterName + ) { + this.title = title; + this.subtitle = subtitle; + this.domainAxisLabel = domainAxisLabel; + this.rangeAxisLabel = rangeAxisLabel; + this.parameterName = parameterName; + } + + /** + * @return the title + */ + public String getTitle() { + return this.title; + } + + + /** + * @return the subtitle + */ + public String getSubtitle() { + return subtitle; + } + + /** + * @return the timeAxisLabel + */ + public String getDomainAxisLabel() { + return this.domainAxisLabel; + } + + + public String getRangeAxisLabel() { + return this.rangeAxisLabel; + } + + + public String getParameterName() { + return this.parameterName; + } +} +// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf-8 : diff -r f99d8f92a640 -r 755dd2fa4a0a gnv-artifacts/src/main/java/de/intevation/gnv/chart/ChartStyle.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv-artifacts/src/main/java/de/intevation/gnv/chart/ChartStyle.java Fri Sep 28 12:13:53 2012 +0200 @@ -0,0 +1,170 @@ +/* Copyright (C) 2007 con terra GmbH (http://www.conterra.de) + * All rights reserved + * + * $Id: ChartStyle.java,v 1.2 2007/12/21 12:31:15 blume Exp $ + * + * created by: drewnak + * created at : 10.12.2007 + * created at : 13:07:44 + * + * modified by: $Author: blume $ + * modified at: $Date: 2007/12/21 12:31:15 $ + */ +package de.intevation.gnv.chart; + +import java.awt.Color; +import java.awt.Dimension; + +/** + * @author drewnak + */ +public class ChartStyle { + + private Color mCanvasColor; + private Color mPlotBackgroundColor; + private Color mDomainGridlineColor; + private Color mRangeGridlineColor; + private boolean mDomainCrosshairVisible; + private boolean mRangeCrosshairVisible; + private Insets mAxisOffset; + private boolean mOverrideDefaultChartWidth = false; + private Dimension mChartSize; + + private boolean mUseUpperDataLevel = false; + private boolean mUseLowerDataLevel = false; + private int mUpperLevel; + private int mLowerLevel; + + /** + * @param pCanvasColor + * @param pPlotBackgroundColor + * @param pDomainGridlineColor + * @param pRangeGridlineColor + * @param pDomainCrosshairVisible + * @param pRangeCrosshairVisible + * @param pAxisOffset + */ + public ChartStyle(Color pCanvasColor, Color pPlotBackgroundColor, + Color pDomainGridlineColor, Color pRangeGridlineColor, + boolean pDomainCrosshairVisible, + boolean pRangeCrosshairVisible, Insets pAxisOffset, + Dimension pChartSize) { + super(); + mCanvasColor = pCanvasColor; + mPlotBackgroundColor = pPlotBackgroundColor; + mDomainGridlineColor = pDomainGridlineColor; + mRangeGridlineColor = pRangeGridlineColor; + mDomainCrosshairVisible = pDomainCrosshairVisible; + mRangeCrosshairVisible = pRangeCrosshairVisible; + mAxisOffset = pAxisOffset; + mChartSize = pChartSize; + } + + public Color getCanvasColor() { + return mCanvasColor; + } + + public void setCanvasColor(Color pCanvasColor) { + mCanvasColor = pCanvasColor; + } + + public Color getDomainGridlineColor() { + return mDomainGridlineColor; + } + + public void setDomainGridlineColor(Color pDomainGridlineColor) { + mDomainGridlineColor = pDomainGridlineColor; + } + + public Color getRangeGridlineColor() { + return mRangeGridlineColor; + } + + public void setRangeGridlineColor(Color pRangeGridlineColor) { + mRangeGridlineColor = pRangeGridlineColor; + } + + public boolean isDomainCrosshairVisible() { + return mDomainCrosshairVisible; + } + + public void setDomainCrosshairVisible(boolean pDomainCrosshairVisible) { + mDomainCrosshairVisible = pDomainCrosshairVisible; + } + + public boolean isRangeCrosshairVisible() { + return mRangeCrosshairVisible; + } + + public void setRangeCrosshairVisible(boolean pRangeCrosshairVisible) { + mRangeCrosshairVisible = pRangeCrosshairVisible; + } + + public Insets getAxisOffset() { + return mAxisOffset; + } + + public void setAxisOffset(Insets pAxisOffset) { + mAxisOffset = pAxisOffset; + } + + public Color getPlotBackgroundColor() { + return mPlotBackgroundColor; + } + + public void setPlotBackgroundColor(Color pPlotBackgroundColor) { + mPlotBackgroundColor = pPlotBackgroundColor; + } + + public Dimension getChartSize() { + return mChartSize; + } + + public void setChartSize(Dimension pChartSize) { + mChartSize = pChartSize; + } + + public boolean isOverrideDefaultChartWidth() { + return mOverrideDefaultChartWidth; + } + + public void setOverrideDefaultChartWidth(boolean pOverrideDefaultChartWidth) { + mOverrideDefaultChartWidth = pOverrideDefaultChartWidth; + } + + public void setNewChartWidth(int pNewChartWidth) { + mChartSize.setSize(pNewChartWidth, mChartSize.getHeight()); + } + + public boolean isUseUpperDataLevel() { + return mUseUpperDataLevel; + } + + public void setUseUpperDataLevel(boolean pUseUpperDataLevel) { + mUseUpperDataLevel = pUseUpperDataLevel; + } + + public boolean isUseLowerDataLevel() { + return mUseLowerDataLevel; + } + + public void setUseLowerDataLevel(boolean pUseLowerDataLevel) { + mUseLowerDataLevel = pUseLowerDataLevel; + } + + public int getUpperLevel() { + return mUpperLevel; + } + + public void setUpperLevel(int pUpperLevel) { + mUpperLevel = pUpperLevel; + } + + public int getLowerLevel() { + return mLowerLevel; + } + + public void setLowerLevel(int pLowerLevel) { + mLowerLevel = pLowerLevel; + } +} diff -r f99d8f92a640 -r 755dd2fa4a0a gnv-artifacts/src/main/java/de/intevation/gnv/chart/DefaultHistogram.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv-artifacts/src/main/java/de/intevation/gnv/chart/DefaultHistogram.java Fri Sep 28 12:13:53 2012 +0200 @@ -0,0 +1,168 @@ +package de.intevation.gnv.chart; + +import java.text.NumberFormat; +import java.text.ParseException; +import java.util.Locale; +import java.util.Map; + +import org.apache.log4j.Logger; + +import org.jfree.chart.ChartTheme; + +import org.jfree.chart.plot.XYPlot; + +import org.jfree.data.statistics.HistogramDataset; + +/** + * @author Ingo Weinzierl (ingo.weinzierl@intevation.de) + */ +public class DefaultHistogram +extends AbstractHistogram +{ + // TODO take a better default value + public static final int DEFAULT_BINS = 15; + public static final int MAXIMAL_BINS = 20; + public static final String REQUEST_KEY_BIN_COUNT = "bincount"; + public static final String REQUEST_KEY_BIN_WIDTH = "binwidth"; + public static final String REQUEST_KEY_CHART_WIDTH = "width"; + public static final String REQUEST_KEY_LOCALE = "locale"; + public static final String REQUEST_KEY_BIN_CHOICE = "bintype"; + + private static Logger logger = Logger.getLogger(DefaultHistogram.class); + + protected Map requestParameter; + + + public DefaultHistogram( + ChartLabels labels, Object[] data, ChartTheme theme, Map requestParameter + ) { + super(labels, data, theme); + this.requestParameter = requestParameter; + } + + + protected void applyDatasets() { + XYPlot plot = (XYPlot) chart.getPlot(); + + // prepare data and create add them to histogram dataset + String name = (String) data[0]; + double[] values = toDouble((Double[]) data[1]); + int bins = getBinCount(values); + + HistogramDataset dataset = new HistogramDataset(); + dataset.addSeries(name, values, bins); + + plot.setDataset(0, dataset); + } + + + protected double[] getMinMax(double[] values) { + double[] minmax = new double[2]; + minmax[0] = Double.MAX_VALUE; + minmax[1] = Double.MIN_VALUE; + + int length = values.length; + for (int i = 0; i < length; i++) { + minmax[0] = values[i] < minmax[0] ? values[i] : minmax[0]; + minmax[1] = values[i] > minmax[1] ? values[i] : minmax[1]; + } + + return minmax; + } + + + protected double[] toDouble(Double[] array) { + int length = array.length; + double[] values = new double[length]; + + for(int i = 0; i < length; i++) { + values[i] = array[i].doubleValue(); + } + + return values; + } + + + protected int getBinCount(double[] values) { + String param = (String) requestParameter.get(REQUEST_KEY_BIN_CHOICE); + + if (param != null && param.equalsIgnoreCase(REQUEST_KEY_BIN_WIDTH)) { + return getBinCountByWidth(values); + } + else { + return getBinCountByNumber(); + } + } + + + protected int getBinCountByNumber() { + int bins = -1; + String param = (String) requestParameter.get(REQUEST_KEY_BIN_COUNT); + + try { + bins = Integer.parseInt(param); + bins = bins <= 0 ? DEFAULT_BINS : bins; + bins = bins > MAXIMAL_BINS ? MAXIMAL_BINS : bins; + + return bins; + } + catch (NumberFormatException nfe) { + logger.warn("Invalid number of bins for histogram chart: " + param); + logger.warn("Return default bins: " + DEFAULT_BINS); + + return DEFAULT_BINS; + } + } + + + protected int getBinCountByWidth(double[] values) { + int bins = -1; + String param = (String) requestParameter.get(REQUEST_KEY_BIN_WIDTH); + Locale locale = (Locale) requestParameter.get(REQUEST_KEY_LOCALE); + NumberFormat format = NumberFormat.getInstance(locale); + + try { + double[] minmax = getMinMax(values); + double totalWidth = minmax[1] - minmax[0]; + Number number = format.parse(param); + double binWidth = -1d; + + if (number instanceof Double) { + binWidth = ((Double) number).doubleValue(); + } + else if (number instanceof Long) { + binWidth = ((Long) number).doubleValue(); + } + else if (number instanceof Integer) { + binWidth = ((Integer) number).doubleValue(); + } + else { + logger.warn("Invalid bin width for histogram chart: " + param); + logger.warn("Return default bins: " + DEFAULT_BINS); + + return DEFAULT_BINS; + } + + double tmpBins = totalWidth / binWidth; + + bins = (int) Math.round(tmpBins); + bins = bins <= 0 ? DEFAULT_BINS : bins; + bins = bins > MAXIMAL_BINS ? MAXIMAL_BINS : bins; + + return bins; + } + catch (ParseException pe) { + logger.warn("Invalid bin width for histogram chart: " + param); + logger.warn("Return default bins: " + DEFAULT_BINS); + + return DEFAULT_BINS; + } + catch (NumberFormatException nfe) { + logger.warn("Invalid bin width for histogram chart: " + param); + logger.warn("Return default bins: " + DEFAULT_BINS); + + return DEFAULT_BINS; + } + } +} +// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf-8 : diff -r f99d8f92a640 -r 755dd2fa4a0a gnv-artifacts/src/main/java/de/intevation/gnv/chart/HorizontalCrossProfileChart.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv-artifacts/src/main/java/de/intevation/gnv/chart/HorizontalCrossProfileChart.java Fri Sep 28 12:13:53 2012 +0200 @@ -0,0 +1,59 @@ +package de.intevation.gnv.chart; + +import java.util.Collection; +import java.util.Locale; + +import de.intevation.gnv.chart.ChartLabels; +import de.intevation.gnv.geobackend.base.Result; + +import org.apache.log4j.Logger; + +import org.jfree.chart.ChartTheme; +import org.jfree.data.general.Series; + +/** + * @author Ingo Weinzierl + */ +public class HorizontalCrossProfileChart +extends HorizontalProfileChart +{ + private static Logger log = Logger.getLogger(HorizontalCrossProfileChart.class); + + public HorizontalCrossProfileChart( + ChartLabels labels, + ChartTheme theme, + Collection parameters, + Collection measurements, + Collection dates, + Collection result, + Collection timeGaps, + Locale locale, + boolean linesVisible, + boolean shapesVisible + ) { + super( + labels, + theme, + parameters, + measurements, + dates, + result, + timeGaps, + locale, + linesVisible, + shapesVisible + ); + } + + + @Override + protected void gapDetection( + Result[] results, + Series series, + int startPos, + int endPos + ) { + // nothing to do here, gap detection is done in interpolation + } +} +// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf-8 : diff -r f99d8f92a640 -r 755dd2fa4a0a gnv-artifacts/src/main/java/de/intevation/gnv/chart/HorizontalProfileChart.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv-artifacts/src/main/java/de/intevation/gnv/chart/HorizontalProfileChart.java Fri Sep 28 12:13:53 2012 +0200 @@ -0,0 +1,323 @@ +package de.intevation.gnv.chart; + +import java.util.Collection; +import java.util.Locale; +import java.util.Map; + +import com.vividsolutions.jts.geom.Point; +import com.vividsolutions.jts.io.WKTReader; +import com.vividsolutions.jts.io.ParseException; + +import org.apache.log4j.Logger; + +import org.jfree.chart.ChartTheme; +import org.jfree.chart.plot.PlotOrientation; +import org.jfree.data.general.Series; +import org.jfree.data.xy.XYSeries; + +import de.intevation.gnv.geobackend.base.Result; +import de.intevation.gnv.utils.DistanceCalculator; + + +/** + * @author Ingo Weinzierl + */ +public class HorizontalProfileChart +extends VerticalProfileChart +{ + private static Logger log = Logger.getLogger(HorizontalProfileChart.class); + + private static WKTReader wktReader = new WKTReader(); + private Point firstPoint; + + public HorizontalProfileChart( + ChartLabels labels, + ChartTheme theme, + Collection parameters, + Collection measurements, + Collection dates, + Collection result, + Collection timeGaps, + Locale locale, + boolean linesVisible, + boolean shapesVisible + ) { + super( + labels, + theme, + parameters, + measurements, + dates, + result, + timeGaps, + locale, + linesVisible, + shapesVisible + ); + this.PLOT_ORIENTATION = PlotOrientation.VERTICAL; + } + + + @Override + protected Object getValue(Result row) { + try { + return (Point) wktReader.read(row.getString("SHAPE")); + } + catch(ParseException pe) { + log.warn("No data found while parsing."); + return null; + } + } + + + protected void gapDetection( + Result[] results, + Series series, + int startPos, + int endPos + ) { + log.debug("Start gap detection."); + try { + Point startValue = getPoint(results[startPos]); + Point endValue = getPoint(results[endPos-1]); + if (results[0].getInteger("DATAID") == 2) + addGapsOnGrid(results, series, startPos, endPos); + else + addGaps( + results, + series, + startValue, + endValue, + startPos, + endPos + ); + } + catch (ParseException pe) { + log.warn( + "Error while parsing points for gap detection. " + + "No gaps for current series will be detected." + ); + } + + log.debug("Gap detection finished."); + } + + + protected void addValue(Result row, Series series) { + double distance = 0; + + try { + Point point = (Point) wktReader.read(row.getString("SHAPE")); + if (firstPoint != null) { + distance = DistanceCalculator.calculateDistance( + firstPoint, point + ); + } + else { + firstPoint = point; + } + + ((XYSeries) series).add( + distance, + row.getDouble("YORDINATE") + ); + } + catch(ParseException pe) { + log.warn("No data found while parsing."); + } + } + + + protected void addSeries(Series series, String label, int idx) { + super.addSeries(series, label, idx); + + // reset firstPoint for next series + firstPoint = null; + } + + + @Override + protected void prepareRangeAxis(String seriesKey, int idx) { + return; + // do nothing here + } + + + @Override + protected void storeMaxValue(Map values, Object value, String parameter) { + return; + // do nothing here + } + + + protected String createSeriesName( + String breakPoint1, + String breakPoint2, + String breakPoint3 + ) { + log.debug("create seriesname of horizontalprofile chart"); + return super.createSeriesName( + breakPoint1, + breakPoint2, + breakPoint3) + + " " + + findValueTitle(dates, breakPoint3); + } + + + protected void addGapsOnGrid( + Result[] results, + Series series, + int startPos, + int endPos + ) { + String axis = getDependendAxisName( + results[startPos], + results[startPos+1] + ); + + int last = 0; + int current = 0; + Point lastPoint = null; + Point currentPoint = null; + + try { + firstPoint = getPoint(results[0]); + } + catch (ParseException pe) { + log.error("Unable to parse start point for gap detection."); + return; + } + + for (int i = startPos+1; i < endPos; i++) { + try { + last = results[i-1].getInteger(axis); + lastPoint = getPoint(results[i-1]); + current = results[i].getInteger(axis); + currentPoint = getPoint(results[i]); + double distance = DistanceCalculator.calculateDistance( + firstPoint, + currentPoint); + double distanceOld = DistanceCalculator.calculateDistance( + firstPoint, + lastPoint); + + boolean detected = gridDetection(last, current); + + if (log.isDebugEnabled()) { + log.debug("Last point: " + lastPoint.toString()); + log.debug("Current point: " + currentPoint.toString()); + log.debug("Current distance from start: " + distance); + } + + if (detected) { + log.info( + "Gap detected on grid between " + distanceOld + + " and " + distance); + + ((XYSeries) series).add(distance-1d, null); + ((XYSeries) series).add(distanceOld+1d, null); + } + } + catch (ParseException pe) { + log.warn("Error while parsing point for gap detection.", pe); + } + } + } + + + protected void addGaps( + Result[] results, + Series series, + Point startValue, + Point endValue, + int startPos, + int endPos + ) { + double range = 0; + Point last = null; + Point now = null; + + for (int i = startPos+1; i < endPos; i++) { + boolean detected = false; + + try { + last = (Point) getPoint(results[i-1]); + now = (Point) getPoint(results[i]); + + // gap detection for more than GAP_MAX_VALUES values + if (results.length > GAP_MAX_VALUES) + detected = simpleDetection(startValue, endValue, last, now); + // gap detection for less than GAP_MAX_VALUES values + else + detected = specialDetection( + startValue, + endValue, + last, + now, + results.length + ); + + // gap detected, insert null value to break line + if (detected) { + log.info("Gap after " + range); + double x = range + 0.0001; + + ((XYSeries)series).add(x, null); + } + + range += DistanceCalculator.calculateDistance(last,now); + } + catch (ParseException pe) { + log.warn("Error while parsing point."); + } + + } + } + + + protected boolean simpleDetection( + Point start, + Point end, + Point last, + Point current + ) { + double delta = DistanceCalculator.calculateDistance(start, end); + double deltaSmall = DistanceCalculator.calculateDistance(last,current); + + return (deltaSmall > (delta / 100 * PERCENTAGE)); + } + + + protected boolean specialDetection( + Point start, + Point end, + Point last, + Point current, + int count + ) { + double delta = Math.abs( + DistanceCalculator.calculateDistance(end, start) + ); + double smallDelta = Math.abs( + DistanceCalculator.calculateDistance(current, last) + ); + + return (smallDelta > (3.0 / (count - 1) * delta)); + } + + @Override + protected String getDependendAxisName(Result first, Result second) { + if (first.getInteger("IPOSITION") == second.getInteger("IPOSITION")) + return "JPOSITION"; + + return "IPOSITION"; + } + + private Point getPoint(Result result) + throws ParseException + { + return (Point) wktReader.read(result.getString("SHAPE")); + } +} +// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf-8 : diff -r f99d8f92a640 -r 755dd2fa4a0a gnv-artifacts/src/main/java/de/intevation/gnv/chart/Insets.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv-artifacts/src/main/java/de/intevation/gnv/chart/Insets.java Fri Sep 28 12:13:53 2012 +0200 @@ -0,0 +1,34 @@ +/* Copyright (C) 2007 con terra GmbH (http://www.conterra.de) + * All rights reserved + * + * $Id: Insets.java,v 1.1 2007/12/10 13:57:13 drewnak Exp $ + * + * created by: drewnak + * created at : 10.12.2007 + * created at : 13:31:12 + * + * modified by: $Author: drewnak $ + * modified at: $Date: 2007/12/10 13:57:13 $ + */ +package de.intevation.gnv.chart; + +public class Insets { + public double mUpper; + public double mLower; + public double mLeft; + public double mRight; + + /** + * @param pUpper + * @param pLower + * @param pLeft + * @param pRight + */ + public Insets(double pUpper, double pLeft, double pLower, double pRight) { + super(); + mUpper = pUpper; + mLower = pLower; + mLeft = pLeft; + mRight = pRight; + } +} \ No newline at end of file diff -r f99d8f92a640 -r 755dd2fa4a0a gnv-artifacts/src/main/java/de/intevation/gnv/chart/TimeSeriesChart.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv-artifacts/src/main/java/de/intevation/gnv/chart/TimeSeriesChart.java Fri Sep 28 12:13:53 2012 +0200 @@ -0,0 +1,510 @@ +package de.intevation.gnv.chart; + +import de.intevation.gnv.artifacts.ressource.RessourceFactory; + +import de.intevation.gnv.geobackend.base.Result; + +import de.intevation.gnv.state.describedata.KeyValueDescibeData; + +import de.intevation.gnv.timeseries.gap.TimeGap; + +import java.text.DateFormat; +import java.text.SimpleDateFormat; + +import java.util.Collection; +import java.util.Date; +import java.util.HashMap; +import java.util.Iterator; +import java.util.Locale; +import java.util.TimeZone; + +import org.apache.log4j.Logger; + +import org.jfree.chart.ChartFactory; +import org.jfree.chart.ChartTheme; + +import org.jfree.chart.axis.Axis; +import org.jfree.chart.axis.DateAxis; +import org.jfree.chart.axis.DateTickUnit; +import org.jfree.chart.axis.DateTickUnitType; +import org.jfree.chart.axis.TickUnits; +import org.jfree.chart.axis.TickUnitSource; +import org.jfree.chart.axis.ValueAxis; + +import org.jfree.chart.plot.PlotOrientation; +import org.jfree.chart.plot.XYPlot; + +import org.jfree.data.general.Series; + +import org.jfree.data.time.Minute; +import org.jfree.data.time.TimeSeries; +import org.jfree.data.time.TimeSeriesCollection; + +/** + * @author Ingo Weinzierl (ingo.weinzierl@intevation.de) + */ +public class TimeSeriesChart +extends AbstractXYLineChart +{ + + private static final String DATE_FORMAT = "chart.timeseries.date.format"; + + public static final String DEFAULT_DATE_FORMAT = "dd-MMM-yyyy"; + + public static final long NO_TIME_GAP = Long.MAX_VALUE - 1000; + public static final int GAP_SIZE = 5; // in percent + + private static Logger log = Logger.getLogger(TimeSeriesChart.class); + + + public TimeSeriesChart( + ChartLabels labels, + ChartTheme theme, + Collection parameters, + Collection measurements, + Collection dates, + Collection result, + Collection timeGaps, + Locale locale, + boolean linesVisible, + boolean shapesVisible + ) { + this.labels = labels; + this.theme = theme; + this.parameters = parameters; + this.measurements = measurements; + this.dates = dates; + this.resultSet = result; + this.timeGaps = timeGaps; + this.locale = locale; + this.PLOT_ORIENTATION = PlotOrientation.VERTICAL; + this.linesVisible = linesVisible; + this.shapesVisible = shapesVisible; + this.datasets = new HashMap(); + this.ranges = new HashMap(); + } + + + protected void initChart() { + chart = ChartFactory.createTimeSeriesChart( + labels.getTitle(), + labels.getDomainAxisLabel(), + null, + null, + true, + false, + false + ); + + XYPlot plot = (XYPlot) chart.getPlot(); + plot.setDomainAxis(0, new DateAxis( + labels.getDomainAxisLabel(), TimeZone.getDefault(), locale)); + } + + + protected void initData() { + log.debug("init data for timeseries chart"); + + String breakPoint1 = null; + String breakPoint2 = null; + String breakPoint3 = null; + + Iterator iter = resultSet.iterator(); + Result row = null; + String seriesName = null; + String parameter = null; + TimeSeries series = null; + + int idx = 0; + int startPos = 0; + int endPos = 0; + Date startDate = null; + Date endDate = null; + + Result[] results = + (Result[]) resultSet.toArray(new Result[resultSet.size()]); + + while (iter.hasNext()) { + row = (Result) iter.next(); + + // add current data to plot and prepare for next one + if (!row.getString("GROUP1").equals(breakPoint1) || + !row.getString("GROUP2").equals(breakPoint2) || + !row.getString("GROUP3").equals(breakPoint3) + ) { + log.debug("prepare data/plot for next dataset"); + + if(series != null) { + // add gaps before adding series to chart + startDate = results[startPos].getDate("XORDINATE"); + endDate = results[endPos-1].getDate("XORDINATE"); + addGaps(results,series,startDate,endDate,startPos,endPos); + addSeries(series, parameter, idx); + + startPos = endPos + 1; + } + + // prepare variables for next plot + breakPoint1 = row.getString("GROUP1"); + breakPoint2 = row.getString("GROUP2"); + breakPoint3 = row.getString("GROUP3"); + + seriesName = createSeriesName( + breakPoint1, + breakPoint2, + breakPoint3 + ); + parameter = findParameter(seriesName); + + log.debug("next dataset is '" + seriesName + "'"); + series = new TimeSeries(seriesName, Minute.class); + } + + addValue(row, series); + storeMaxRange(ranges, row.getDouble("YORDINATE"), parameter); + endPos++; + } + + if (startPos < results.length && endPos-1 < results.length) { + // add the last dataset if existing to plot and prepare its axis + startDate = results[startPos].getDate("XORDINATE"); + endDate = results[endPos-1].getDate("XORDINATE"); + addGaps(results, series, startDate, endDate, startPos, endPos); + addSeries(series, parameter, idx); + } + + addDatasets(); + } + + + protected void addValue(Result row, Series series) { + ((TimeSeries) series).addOrUpdate( + new Minute(row.getDate("XORDINATE")), + row.getDouble("YORDINATE") + ); + } + + + protected void addSeries(Series series, String parameter, int idx) { + log.debug("add series (" + parameter + ")to timeseries chart"); + + if (series == null) { + log.warn("no data to add"); + return; + } + + TimeSeriesCollection tsc = null; + + if (datasets.containsKey(parameter)) + tsc = (TimeSeriesCollection) datasets.get(parameter); + else + tsc = new TimeSeriesCollection(); + + tsc.addSeries((TimeSeries) series); + datasets.put(parameter, tsc); + } + + + protected void addDatasets() { + Iterator iter = parameters.iterator(); + XYPlot plot = chart.getXYPlot(); + int idx = 0; + + TimeSeriesCollection tsc = null; + KeyValueDescibeData data = null; + String key = null; + while (iter.hasNext()) { + data = (KeyValueDescibeData) iter.next(); + key = data.getValue(); + + if (datasets.containsKey(key)) { + tsc = (TimeSeriesCollection)datasets.get(key); + plot.setDataset(idx, tsc ); + log.debug("Added " + key + " parameter to plot."); + prepareAxis(key, idx); + adjustRenderer( + idx++, + tsc.getSeriesCount(), + linesVisible, + shapesVisible + ); + } + } + } + + + protected void localizeDomainAxis(Axis axis, Locale locale) { + ((ValueAxis)axis).setStandardTickUnits(createStandardDateTickUnits( + TimeZone.getDefault(), + locale)); + } + + + public static TickUnitSource createStandardDateTickUnits( + TimeZone zone, + Locale locale) + { + /* + * This method have been copied from JFreeChart's DateAxis class. + * DateFormat objects are hard coded in DateAxis and cannot be adjusted. + */ + if (zone == null) { + throw new IllegalArgumentException("Null 'zone' argument."); + } + if (locale == null) { + throw new IllegalArgumentException("Null 'locale' argument."); + } + TickUnits units = new TickUnits(); + + // date formatters + DateFormat f1 = new SimpleDateFormat("HH:mm:ss.SSS", locale); + DateFormat f2 = new SimpleDateFormat("HH:mm:ss", locale); + DateFormat f3 = new SimpleDateFormat("HH:mm", locale); + DateFormat f4 = new SimpleDateFormat("d-MMM, HH:mm", locale); + DateFormat f5 = new SimpleDateFormat("d-MMM yyyy", locale); + DateFormat f6 = new SimpleDateFormat("MMM-yyyy", locale); + DateFormat f7 = new SimpleDateFormat("yyyy", locale); + + f1.setTimeZone(zone); + f2.setTimeZone(zone); + f3.setTimeZone(zone); + f4.setTimeZone(zone); + f5.setTimeZone(zone); + f6.setTimeZone(zone); + f7.setTimeZone(zone); + + // milliseconds + units.add(new DateTickUnit(DateTickUnitType.MILLISECOND, 1, f1)); + units.add(new DateTickUnit(DateTickUnitType.MILLISECOND, 5, + DateTickUnitType.MILLISECOND, 1, f1)); + units.add(new DateTickUnit(DateTickUnitType.MILLISECOND, 10, + DateTickUnitType.MILLISECOND, 1, f1)); + units.add(new DateTickUnit(DateTickUnitType.MILLISECOND, 25, + DateTickUnitType.MILLISECOND, 5, f1)); + units.add(new DateTickUnit(DateTickUnitType.MILLISECOND, 50, + DateTickUnitType.MILLISECOND, 10, f1)); + units.add(new DateTickUnit(DateTickUnitType.MILLISECOND, 100, + DateTickUnitType.MILLISECOND, 10, f1)); + units.add(new DateTickUnit(DateTickUnitType.MILLISECOND, 250, + DateTickUnitType.MILLISECOND, 10, f1)); + units.add(new DateTickUnit(DateTickUnitType.MILLISECOND, 500, + DateTickUnitType.MILLISECOND, 50, f1)); + + // seconds + units.add(new DateTickUnit(DateTickUnitType.SECOND, 1, + DateTickUnitType.MILLISECOND, 50, f2)); + units.add(new DateTickUnit(DateTickUnitType.SECOND, 5, + DateTickUnitType.SECOND, 1, f2)); + units.add(new DateTickUnit(DateTickUnitType.SECOND, 10, + DateTickUnitType.SECOND, 1, f2)); + units.add(new DateTickUnit(DateTickUnitType.SECOND, 30, + DateTickUnitType.SECOND, 5, f2)); + + // minutes + units.add(new DateTickUnit(DateTickUnitType.MINUTE, 1, + DateTickUnitType.SECOND, 5, f3)); + units.add(new DateTickUnit(DateTickUnitType.MINUTE, 2, + DateTickUnitType.SECOND, 10, f3)); + units.add(new DateTickUnit(DateTickUnitType.MINUTE, 5, + DateTickUnitType.MINUTE, 1, f3)); + units.add(new DateTickUnit(DateTickUnitType.MINUTE, 10, + DateTickUnitType.MINUTE, 1, f3)); + units.add(new DateTickUnit(DateTickUnitType.MINUTE, 15, + DateTickUnitType.MINUTE, 5, f3)); + units.add(new DateTickUnit(DateTickUnitType.MINUTE, 20, + DateTickUnitType.MINUTE, 5, f3)); + units.add(new DateTickUnit(DateTickUnitType.MINUTE, 30, + DateTickUnitType.MINUTE, 5, f3)); + + // hours + units.add(new DateTickUnit(DateTickUnitType.HOUR, 1, + DateTickUnitType.MINUTE, 5, f3)); + units.add(new DateTickUnit(DateTickUnitType.HOUR, 2, + DateTickUnitType.MINUTE, 10, f3)); + units.add(new DateTickUnit(DateTickUnitType.HOUR, 4, + DateTickUnitType.MINUTE, 30, f3)); + units.add(new DateTickUnit(DateTickUnitType.HOUR, 6, + DateTickUnitType.HOUR, 1, f3)); + units.add(new DateTickUnit(DateTickUnitType.HOUR, 12, + DateTickUnitType.HOUR, 1, f4)); + + // days + units.add(new DateTickUnit(DateTickUnitType.DAY, 1, + DateTickUnitType.HOUR, 1, f5)); + units.add(new DateTickUnit(DateTickUnitType.DAY, 2, + DateTickUnitType.HOUR, 1, f5)); + units.add(new DateTickUnit(DateTickUnitType.DAY, 7, + DateTickUnitType.DAY, 1, f5)); + units.add(new DateTickUnit(DateTickUnitType.DAY, 15, + DateTickUnitType.DAY, 1, f5)); + + // months + units.add(new DateTickUnit(DateTickUnitType.MONTH, 1, + DateTickUnitType.DAY, 1, f6)); + units.add(new DateTickUnit(DateTickUnitType.MONTH, 2, + DateTickUnitType.DAY, 1, f6)); + units.add(new DateTickUnit(DateTickUnitType.MONTH, 3, + DateTickUnitType.MONTH, 1, f6)); + units.add(new DateTickUnit(DateTickUnitType.MONTH, 4, + DateTickUnitType.MONTH, 1, f6)); + units.add(new DateTickUnit(DateTickUnitType.MONTH, 6, + DateTickUnitType.MONTH, 1, f6)); + + // years + units.add(new DateTickUnit(DateTickUnitType.YEAR, 1, + DateTickUnitType.MONTH, 1, f7)); + units.add(new DateTickUnit(DateTickUnitType.YEAR, 2, + DateTickUnitType.MONTH, 3, f7)); + units.add(new DateTickUnit(DateTickUnitType.YEAR, 5, + DateTickUnitType.YEAR, 1, f7)); + units.add(new DateTickUnit(DateTickUnitType.YEAR, 10, + DateTickUnitType.YEAR, 1, f7)); + units.add(new DateTickUnit(DateTickUnitType.YEAR, 25, + DateTickUnitType.YEAR, 5, f7)); + units.add(new DateTickUnit(DateTickUnitType.YEAR, 50, + DateTickUnitType.YEAR, 10, f7)); + units.add(new DateTickUnit(DateTickUnitType.YEAR, 100, + DateTickUnitType.YEAR, 20, f7)); + + return units; + } + + + protected String getMessage(Locale locale, String key, String def) { + return RessourceFactory.getInstance().getRessource(locale, key, def); + } + + + protected String createSeriesName( + String breakPoint1, + String breakPoint2, + String breakPoint3 + ) { + log.debug("create seriesname of timeseries chart"); + return findValueTitle(parameters, breakPoint1) + + " " + + findValueTitle(measurements, breakPoint2) + + "m"; + } + + + protected void addGaps( + Result[] results, + Series series, + Date startDate, + Date endDate, + int startPos, + int endPos + ) { + int gapID = results[startPos].getInteger("GAPID"); + long maxDiff = calculateGapSize( + startDate, endDate, startPos, endPos, gapID + ); + + if (log.isDebugEnabled()) { + log.debug("*****************************************************"); + log.debug("Values of gap detection."); + log.debug("Start date: " + startDate.toString()); + log.debug("End date: " + endDate.toString()); + long diff = endDate.getTime() - startDate.getTime(); + log.debug("Time difference (in ms): " + diff); + log.debug("Time difference (in h): " + (diff/(1000*60*60))); + log.debug("Configured gap size (in %): " + GAP_SIZE); + log.debug("Calculated gap size (in ms): " + maxDiff); + log.debug("Calculated gap size (in h): " + (maxDiff/(1000*60*60))); + log.debug("*****************************************************"); + } + + Date last = startDate; + for (int i = startPos+1; i < endPos; i++) { + Result res = results[i]; + Date now = res.getDate("XORDINATE"); + + if ((now.getTime() - last.getTime()) > maxDiff) { + // add gap, add 1 minute to last date and add null value + log.info( + "Gap between " + + last.toString() + " and " + now.toString() + ); + last.setTime(last.getTime() + 60000); + ((TimeSeries) series).addOrUpdate(new Minute(last), null); + } + + last = now; + } + } + + + protected long calculateGapSize( + Date start, + Date end, + int startPos, + int endPos, + int gapID + ){ + long maxGap = (end.getTime() - start.getTime()) / 100 * GAP_SIZE; + long interval = getTimeGapValue(start, end, startPos, endPos, gapID); + + if (maxGap < interval) + maxGap = interval + 10; + + return maxGap; + } + + + protected long getTimeGapValue( + Date dStart, + Date dEnd, + int pStart, + int pEnd, + int gapID + ){ + long gap = 0; + + if (gapID < 0 || gapID >= 99) { + + if (gapID == -1) { + // no gaps in meshes + gap = NO_TIME_GAP; + } + else if (pEnd-pStart < 60) { + gap = (3/(pEnd-pStart)) * (dEnd.getTime() - dStart.getTime()); + } + } + else{ + Iterator it = timeGaps.iterator(); + + while (it.hasNext()) { + TimeGap tempTimeGap = (TimeGap) it.next(); + + if (tempTimeGap.getKey() == gapID){ + String unit = tempTimeGap.getUnit(); + int gapValue = tempTimeGap.getValue(); + + if (unit.equals(TimeGap.TIME_UNIT_MINUTE)) { + gap = gapValue * TimeGap.MINUTE_IN_MILLIS; + } + else if (unit.equals(TimeGap.TIME_UNIT_HOUR)) { + gap = gapValue * TimeGap.HOUR_IN_MILLIS; + } + else if (unit.equals(TimeGap.TIME_UNIT_DAY)) { + gap = gapValue * TimeGap.DAY_IN_MILLIS; + } + else if (unit.equals(TimeGap.TIME_UNIT_WEEK)) { + gap = gapValue * TimeGap.WEEK_IN_MILLIS; + } + else if (unit.equals(TimeGap.TIME_UNIT_MONTH)) { + gap = gapValue * (TimeGap.DAY_IN_MILLIS *30); + } + else if (unit.equals(TimeGap.TIME_UNIT_YEAR)) { + gap = gapValue * (TimeGap.DAY_IN_MILLIS *365); + } + break; + } + } + } + + return gap; + } +} +// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf-8 : diff -r f99d8f92a640 -r 755dd2fa4a0a gnv-artifacts/src/main/java/de/intevation/gnv/chart/VerticalCrossSectionChart.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv-artifacts/src/main/java/de/intevation/gnv/chart/VerticalCrossSectionChart.java Fri Sep 28 12:13:53 2012 +0200 @@ -0,0 +1,223 @@ +package de.intevation.gnv.chart; + +import de.intevation.gnv.jfreechart.PolygonDataset; +import de.intevation.gnv.jfreechart.PolygonPlot; +import de.intevation.gnv.jfreechart.PolygonRenderer; +import de.intevation.gnv.jfreechart.PolygonSeries; + +import de.intevation.gnv.math.AttributedXYColumns; + +import de.intevation.gnv.raster.Palette; + +import java.awt.Color; +import java.awt.Paint; + +import java.text.NumberFormat; + +import java.util.HashSet; +import java.util.Locale; +import java.util.Map; + +import org.jfree.chart.JFreeChart; + +import org.jfree.chart.axis.NumberAxis; +import org.jfree.chart.axis.SymbolAxis; +import org.jfree.chart.axis.ValueAxis; + +import org.jfree.chart.plot.PlotOrientation; + +import org.jfree.chart.renderer.LookupPaintScale; + +import org.jfree.chart.title.PaintScaleLegend; +import org.jfree.chart.title.TextTitle; + +import org.jfree.ui.RectangleEdge; +import org.jfree.ui.RectangleInsets; + +/** + * @author Ingo Weinzierl (ingo.weinzierl@intevation.de) + * @author Sascha L. Teichmann (sascha.teichmann@intevation.de) + */ +public class VerticalCrossSectionChart +implements Chart +{ + public static final class PalettePaintLookup + implements PolygonRenderer.PaintLookup + { + private Palette palette; + private Map special; + + public PalettePaintLookup(Palette palette) { + this(palette, null); + } + + public PalettePaintLookup( + Palette palette, + Map special + ) { + this.palette = palette; + this.special = special; + } + + public Paint getPaint(int index) { + if (special != null) { + Paint paint = special.get(index); + if (paint != null) { + return paint; + } + } + return index < 0 + ? Color.black + : palette.getColor(index); + } + } // class PalettePaintLookup + + public static class LocalizedLabelGenerator + extends PolygonRenderer.DefaultLabelGenerator + { + protected NumberFormat format; + + public LocalizedLabelGenerator() { + } + + public LocalizedLabelGenerator(NumberFormat format) { + this.format = format; + } + + protected String toString(Object label) { + return label instanceof Number + ? format.format(((Number)label).doubleValue()) + : super.toString(label); + } + } // class LocalizedLabelGenerator + + protected JFreeChart chart; + + protected AttributedXYColumns columns; + protected Map special; + protected Palette palette; + protected Locale locale; + protected ChartLabels labels; + + public VerticalCrossSectionChart() { + } + + public VerticalCrossSectionChart( + AttributedXYColumns columns, + Palette palette, + Locale locale, + ChartLabels labels + ) { + this(columns, palette, null, locale, labels); + } + + public VerticalCrossSectionChart( + AttributedXYColumns columns, + Palette palette, + Map special, + Locale locale, + ChartLabels labels + ) { + this.columns = columns; + this.palette = palette; + this.special = special; + this.locale = locale; + this.labels = labels; + } + + protected JFreeChart createChart() { + + boolean legendB = false; + boolean tooltips = false; + boolean urls = false; + + PlotOrientation po = PlotOrientation.HORIZONTAL; + PolygonDataset data = columns.getPolygonDataset(); + + HashSet usedColors = new HashSet(); + + for (int i = data.getSeriesCount()-1; i >= 0; --i) { + PolygonSeries ps = data.getSeries(i); + Integer fill = (Integer)ps.getAttribute("fill"); + if (fill != null + && (special != null && !special.containsKey(fill))) { + usedColors.add(fill); + } + } + + NumberFormat format = NumberFormat.getInstance(locale); + format.setMinimumFractionDigits(0); + format.setMaximumFractionDigits(2); + + PolygonRenderer renderer = new PolygonRenderer( + new PalettePaintLookup(palette, special), + new LocalizedLabelGenerator(format)); + + ValueAxis domainAxis = new NumberAxis(this.labels.getDomainAxisLabel()); + ValueAxis rangeAxis = new NumberAxis(this.labels.getRangeAxisLabel()); + + PolygonPlot plot = new PolygonPlot( + data, + renderer, + domainAxis, + rangeAxis, + null); + + plot.setOutlinePaint(Color.WHITE); + + String [] labels = new String[usedColors.size()]; + + int colors = palette.getSize(); + LookupPaintScale lookupPaint = + new LookupPaintScale(-0.5d, labels.length-0.5d, Color.white); + + Color color = null; + + for (int i = 0, j = labels.length-1; i < colors && j >= 0; i++) { + if (usedColors.contains(i)) { + Palette.Entry entry = palette.getEntryByIndex(i); + color = entry.getColor(); + labels[j] = entry.getDescription(); + lookupPaint.add(j-0.5d, color); + --j; + } + } + + JFreeChart chart = new JFreeChart( + this.labels.getTitle(), + JFreeChart.DEFAULT_TITLE_FONT, + plot, + legendB); + + chart.removeLegend(); + chart.addSubtitle(new TextTitle(this.labels.getSubtitle())); + + SymbolAxis scale = new SymbolAxis(this.labels.getParameterName(), labels); + scale.setRange(-1.5d, labels.length+0.5d); + scale.setGridBandsVisible(false); + scale.setPlot(plot); + + PaintScaleLegend legend = new PaintScaleLegend( + lookupPaint, scale); + legend.setMargin(new RectangleInsets(3d, 10d, 3d, 10d)); + legend.setPosition(RectangleEdge.LEFT); + legend.setAxisOffset(5d); + + chart.addSubtitle(legend); + + return chart; + } + + public JFreeChart generateChart() { + if (chart == null) { + chart = createChart(); + } + + return chart; + } + + public void setBackgroundPaint(Paint paint) { + chart.setBackgroundPaint(paint); + } +} +// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf-8 : diff -r f99d8f92a640 -r 755dd2fa4a0a gnv-artifacts/src/main/java/de/intevation/gnv/chart/VerticalProfileChart.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv-artifacts/src/main/java/de/intevation/gnv/chart/VerticalProfileChart.java Fri Sep 28 12:13:53 2012 +0200 @@ -0,0 +1,394 @@ +package de.intevation.gnv.chart; + +import java.util.Collection; +import java.util.HashMap; +import java.util.Map; +import java.util.Iterator; +import java.util.Locale; + +import org.apache.log4j.Logger; + +import org.jfree.chart.ChartTheme; +import org.jfree.chart.axis.Axis; +import org.jfree.chart.axis.NumberAxis; +import org.jfree.chart.plot.XYPlot; +import org.jfree.chart.plot.PlotOrientation; +import org.jfree.data.Range; +import org.jfree.data.general.Series; +import org.jfree.data.xy.XYSeries; +import org.jfree.data.xy.XYSeriesCollection; + +import de.intevation.gnv.geobackend.base.Result; +import de.intevation.gnv.state.describedata.KeyValueDescibeData; + + +/** + * @author Ingo Weinzierl + */ +public class VerticalProfileChart +extends AbstractXYLineChart +{ + public static final String DEFAULT_AXIS = "KPOSITION"; + + private static Logger log = Logger.getLogger(VerticalProfileChart.class); + + protected final double PERCENTAGE = 5.0; + protected final double GAP_MAX_LEVEL = Math.sqrt(2.0); + protected final int GAP_MAX_VALUES = 60; + + /** Map to store max ranges of each parameter (axis.setAutoRange(true) + * doesn't seem to work properly. */ + protected Map values; + + + public VerticalProfileChart( + ChartLabels labels, + ChartTheme theme, + Collection parameters, + Collection measurements, + Collection dates, + Collection result, + Collection timeGaps, + Locale locale, + boolean linesVisible, + boolean shapesVisible + ) { + this.labels = labels; + this.theme = theme; + this.parameters = parameters; + this.measurements = measurements; + this.dates = dates; + this.resultSet = result; + this.timeGaps = timeGaps; + this.locale = locale; + this.PLOT_ORIENTATION = PlotOrientation.HORIZONTAL; + this.linesVisible = linesVisible; + this.shapesVisible = shapesVisible; + this.datasets = new HashMap(); + this.ranges = new HashMap(); + this.values = new HashMap(); + } + + + protected void initData() { + log.debug("init data for VerticalProfileChart"); + + String breakPoint1 = null; + String breakPoint2 = null; + String breakPoint3 = null; + + Iterator iter = resultSet.iterator(); + Result row = null; + String seriesName = null; + String parameter = null; + XYSeries series = null; + + int idx = 0; + int startPos = 0; + int endPos = 0; + double startValue = 0; + double endValue = 0; + + Result[] results = + (Result[]) resultSet.toArray(new Result[resultSet.size()]); + + while (iter.hasNext()) { + row = (Result) iter.next(); + + // add current data to plot and prepare for next one + if (!row.getString("GROUP1").equals(breakPoint1) || + !row.getString("GROUP2").equals(breakPoint2) || + !row.getString("GROUP3").equals(breakPoint3) + ) { + log.debug("prepare data/plot for next dataset"); + + if(series != null) { + gapDetection(results, series, startPos, endPos); + addSeries(series, parameter, idx); + + startPos = endPos +1; + } + + // prepare variables for next plot + breakPoint1 = row.getString("GROUP1"); + breakPoint2 = row.getString("GROUP2"); + breakPoint3 = row.getString("GROUP3"); + + seriesName = createSeriesName( + breakPoint1, + breakPoint2, + breakPoint3 + ); + parameter = findParameter(seriesName); + + log.debug("next dataset is '" + seriesName + "'"); + series = new XYSeries(seriesName); + } + + addValue(row, series); + Object x = getValue(row); + Double y = row.getDouble("YORDINATE"); + if (x != null && y != null) { + storeMaxRange(ranges, y, parameter); + storeMaxValue(values, x, parameter); + } + endPos++; + } + + if (results.length == 0) + return; + + gapDetection(results, series, startPos, endPos); + addSeries(series, parameter, idx); + + addDatasets(); + } + + + protected Object getValue(Result row) { + return row.getDouble("XORDINATE"); + } + + + protected void gapDetection( + Result[] results, + Series series, + int startPos, + int endPos + ) { + double startValue = results[startPos].getDouble("XORDINATE"); + double endValue = results[endPos-1].getDouble("XORDINATE"); + if (results[0].getInteger("DATAID") == 2) + addGapsOnGrid(results, series, startPos, endPos); + else + addGaps(results, series, startValue, endValue, startPos, endPos); + } + + + protected void prepareRangeAxis(String seriesKey, int idx) { + XYPlot plot = chart.getXYPlot(); + NumberAxis xAxis = (NumberAxis) plot.getDomainAxis(); + + Range xRange = (Range) values.get(seriesKey); + xAxis.setRange(Range.expand(xRange, LOWER_MARGIN, UPPER_MARGIN)); + log.debug("Max X-Range of dataset is: " + xRange.toString()); + } + + + protected void addValue(Result row, Series series) { + ((XYSeries) series).add( + row.getDouble("XORDINATE"), + row.getDouble("YORDINATE") + ); + } + + + protected void addSeries(Series series, String parameter, int idx) { + log.debug("add series (" + parameter + ")to chart"); + + if (series == null) { + log.warn("no data to add"); + return; + } + + XYSeriesCollection xysc = null; + + if (datasets.containsKey(parameter)) + xysc = (XYSeriesCollection) datasets.get(parameter); + else + xysc = new XYSeriesCollection(); + + xysc.addSeries((XYSeries) series); + datasets.put(parameter, xysc); + } + + + protected void addDatasets() { + Iterator iter = parameters.iterator(); + XYPlot plot = chart.getXYPlot(); + int idx = 0; + + XYSeriesCollection xysc = null; + KeyValueDescibeData data = null; + String key = null; + while (iter.hasNext()) { + data = (KeyValueDescibeData) iter.next(); + key = data.getValue(); + + if (datasets.containsKey(key)) { + xysc = (XYSeriesCollection)datasets.get(key); + plot.setDataset(idx, xysc ); + log.debug("Added " + key + " parameter to plot."); + prepareAxis(key, idx); + prepareRangeAxis(key, idx); + adjustRenderer( + idx++, + xysc.getSeriesCount(), + linesVisible, + shapesVisible + ); + } + } + } + + + protected void storeMaxValue(Map values, Object val, String parameter) { + double value = ((Double) val).doubleValue(); + Range range = null; + + range = values.containsKey(parameter) + ? (Range) values.get(parameter) + : new Range(value, value); + + double lower = range.getLowerBound(); + double upper = range.getUpperBound(); + + lower = value < lower ? value : lower; + upper = value > upper ? value : upper; + + values.put(parameter, new Range(lower, upper)); + } + + + protected void localizeDomainAxis(Axis axis, Locale locale) { + // call localizeRangeAxis from superclass which formats NumberAxis + super.localizeRangeAxis(axis, locale); + } + + + protected String createSeriesName( + String breakPoint1, + String breakPoint2, + String breakPoint3 + ) { + log.debug("create seriesname of verticalprofile chart"); + return findValueTitle(parameters, breakPoint1) + + " " + + findValueTitle(measurements, breakPoint2) + + "m"; + } + + + protected void addGapsOnGrid( + Result[] results, + Series series, + int startPos, + int endPos + ) { + String axis = null; + + if (results.length > (startPos+1)) { + axis = getDependendAxisName( + results[startPos], + results[startPos+1] + ); + } + else { + axis = DEFAULT_AXIS; + } + + double range = 0; + int last = 0; + int current = 0; + + for (int i = startPos+1; i < endPos; i++) { + last = results[i-1].getInteger(axis); + current = results[i].getInteger(axis); + + boolean detected = gridDetection(last, current); + + if (detected) { + double xOld = results[i-1].getDouble("XORDINATE"); + double xNow = results[i].getDouble("XORDINATE"); + log.debug("Gap detected on grid between "+ xOld +" and "+ xNow); + ((XYSeries) series).add(xOld+0.0001, null); + } + } + } + + + protected void addGaps( + Result[] results, + Series series, + double startValue, + double endValue, + int startPos, + int endPos + ) { + + double last = 0; + double current = 0; + int num = results.length; + + for (int i = startPos+1; i < endPos; i++) { + boolean detected = false; + + last = results[i-1].getDouble("YORDINATE"); + current = results[i].getDouble("YORDINATE"); + + // gap detection for more than GAP_MAX_VALUES values + if (num > GAP_MAX_VALUES) + detected = simpleDetection(startValue, endValue, last, current); + // gap detection for less than GAP_MAX_VALUES values + else + detected = specialDetection( + startValue, + endValue, + last, + current, + num + ); + + if (detected) { + log.info("Gap between " + last + " and " + current); + ((XYSeries) series).add((last+current)/2, null); + } + } + } + + + protected boolean simpleDetection( + double start, + double end, + double last, + double current + ) { + double delta = Math.abs(end - start); + double smallDelta = Math.abs(current - last); + + return (smallDelta > delta / 100 * PERCENTAGE); + } + + + protected boolean specialDetection( + double start, + double end, + double last, + double current, + int count + ) { + double delta = Math.abs(end - start); + double smallDelta = Math.abs(current - last); + + return (smallDelta > (3.0 / (count - 1) * delta)); + } + + + protected boolean gridDetection(double last, double current) { + if (log.isDebugEnabled()) { + log.debug("######################################################"); + log.debug("Parameters for gap detection"); + log.debug("Defined gap size for grids: " + GAP_MAX_LEVEL); + log.debug("1st value to compare: " + last); + log.debug("2nd value to compare: " + current); + log.debug("Difference: " + Math.abs(current - last)); + } + return (Math.abs(current - last) > GAP_MAX_LEVEL); + } + + + protected String getDependendAxisName(Result first, Result second) { + return "KPOSITION"; + } +} +// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf-8 : diff -r f99d8f92a640 -r 755dd2fa4a0a gnv-artifacts/src/main/java/de/intevation/gnv/chart/XMLChartTheme.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv-artifacts/src/main/java/de/intevation/gnv/chart/XMLChartTheme.java Fri Sep 28 12:13:53 2012 +0200 @@ -0,0 +1,338 @@ +package de.intevation.gnv.chart; + +import java.awt.Font; +import java.awt.Color; +import java.awt.Paint; +import java.awt.geom.Ellipse2D; +import java.lang.NumberFormatException; + +import org.apache.log4j.Logger; + +import org.jfree.chart.StandardChartTheme; +import org.jfree.chart.plot.XYPlot; +import org.jfree.chart.renderer.xy.AbstractXYItemRenderer; +import org.jfree.chart.renderer.xy.XYBarRenderer; +import org.jfree.chart.renderer.xy.XYLineAndShapeRenderer; +import org.jfree.ui.RectangleInsets; +import org.jfree.util.UnitType; + + +import org.w3c.dom.Document; + +import de.intevation.artifactdatabase.Config; + +/** + * @author Ingo Weinzierl + */ +public class XMLChartTheme +extends StandardChartTheme +{ + private static final Color DEFAULT_COLOR = Color.BLACK; + + private Logger log = Logger.getLogger(XMLChartTheme.class); + + protected boolean domainCrosshairVisible; + protected boolean rangeCrosshairVisible; + protected boolean renderLines; + protected boolean renderShapes; + + protected int pointWidth; + protected int pointHeight; + + protected Paint histogramBasePaint; + + + public XMLChartTheme(String name) { + super(name); + } + + + public void setDomainCrosshairVisible(boolean visible) { + this.domainCrosshairVisible = visible; + } + + + public boolean getDomainCrosshairVisible() { + return domainCrosshairVisible; + } + + + public boolean getRangeCrosshairVisible() { + return rangeCrosshairVisible; + } + + + public void setRangeCrosshairVisible(boolean visible) { + this.rangeCrosshairVisible = visible; + } + + + public void setHistogramBasePaint(Color c) { + this.histogramBasePaint = c; + } + + + public Paint getHistogramBasePaint() { + return histogramBasePaint; + } + + + public void applyXMLConfiguration(Document document) { + log.debug("create XMLChartTheme"); + + init(document); + } + + + private void init(Document document) { + log.debug("init XMLChartTheme parameters"); + + initChartParameters(document); + initTitleParameters(document); + initSubtitleParameters(document); + initPlotParameters(document); + initAxisParameters(document); + initLegendParameters(document); + initRenderer(document); + initHistogramColor(document); + } + + + private void initTitleParameters(Document document) { + log.debug("init title parameters."); + + int size = getInt(document, "theme/title/font/size/@value"); + String type = getString(document, "theme/title/font/type/@value"); + boolean bold = getBool(document, "theme/title/font/bold/@value"); + + setExtraLargeFont(createFont(type, size, bold)); + + String color = getString(document, "theme/title/font/color/@value"); + Color c = decodeColor(color); + if (c != null) + setTitlePaint(c); + } + + + private void initSubtitleParameters(Document document) { + log.debug("init title parameters."); + + int size = getInt(document, "theme/subtitle/font/size/@value"); + String type = getString(document, "theme/subtitle/font/type/@value"); + boolean bold = getBool(document, "theme/subtitle/font/bold/@value"); + + setLargeFont(createFont(type, size, bold)); + + String col = getString(document, "theme/subtitle/font/color/@value"); + setSubtitlePaint(Color.decode(col)); + } + + + private void initChartParameters(Document document) { + log.debug("init chart parameters."); + + String bg = getString(document, "theme/chart/background/color/@value"); + Color c = decodeColor(bg); + if (c != null) + setChartBackgroundPaint(c); + } + + + private void initPlotParameters(Document document) { + log.debug("init plot parameters."); + + String tmp = null; + tmp = getString(document, "theme/plot/background/color/@value"); + Color c = decodeColor(tmp); + if (c != null) + setPlotBackgroundPaint(c); + + tmp = getString(document, "theme/plot/outline/color/@value"); + c = decodeColor(tmp); + if (c != null) + setPlotOutlinePaint(c); + + tmp = getString(document, "theme/plot/domaingridline/color/@value"); + c = decodeColor(tmp); + if (c != null) + setDomainGridlinePaint(c); + + tmp = getString(document, "theme/plot/rangegridline/color/@value"); + c = decodeColor(tmp); + if (c != null) + setRangeGridlinePaint(c); + + boolean rangeCrosshairVisible = getBool( + document, "theme/plot/rangecrosshair/visible/@value"); + setRangeCrosshairVisible(rangeCrosshairVisible); + + boolean domainCrosshairVisible = getBool( + document, "theme/plot/domaincrosshair/visible/@value"); + setDomainCrosshairVisible(domainCrosshairVisible); + + int top = getInt(document, "theme/plot/offset/top/@value"); + int bottom = getInt(document, "theme/plot/offset/bottom/@value"); + int left = getInt(document, "theme/plot/offset/left/@value"); + int right = getInt(document, "theme/plot/offset/right/@value"); + setAxisOffset(new RectangleInsets( + UnitType.RELATIVE, + top, left, bottom, right) + ); + } + + + private void initAxisParameters(Document document) { + log.debug("init axis parameters."); + + String tmp = null; + tmp = getString(document, "theme/axis/label/color/@value"); + Color c = decodeColor(tmp); + if (c != null) + setAxisLabelPaint(c); + + tmp = getString(document, "theme/axis/ticklabel/color/@value"); + c = decodeColor(tmp); + if (c != null) + setTickLabelPaint(c); + } + + + private void initLegendParameters(Document document) { + log.debug("init legend parameters."); + + String tmp = null; + tmp = getString(document, "theme/legend/font/color/@value"); + Color c = decodeColor(tmp); + if (c != null) + setLegendItemPaint(c); + + tmp = getString(document, "theme/legend/background/color/@value"); + c = decodeColor(tmp); + if (c != null) + setLegendBackgroundPaint(c); + } + + + private void initRenderer(Document document) { + log.debug("init renderer parameters."); + + pointWidth = getInt(document, "theme/plot/itemrenderer/width/@value"); + log.debug("Read point width of " + pointWidth); + pointHeight = getInt(document, "theme/plot/itemrenderer/height/@value"); + log.debug("Read point height of " + pointHeight); + renderLines = getBool( + document, "theme/plot/itemrenderer/renderLines/@value" + ); + renderShapes = getBool( + document, "theme/plot/itemrenderer/renderPoints/@value" + ); + } + + + private void initHistogramColor(Document document) { + log.debug("init histogram color"); + String tmp = getString(document, "theme/histogram/bar/color/@value"); + Color c = decodeColor(tmp); + + if (c != null) + setHistogramBasePaint(c); + } + + + private static String getString(Document document, String xpath) { + return Config.getStringXPath(document, xpath); + } + + + private static int getInt(Document document, String xpath) { + String tmp = getString(document, xpath); + + if (tmp != null) + return Integer.parseInt(tmp); + else + return 0; + } + + + private static boolean getBool(Document document, String xpath) { + String tmp = getString(document, xpath); + + if (tmp != null) + return Boolean.parseBoolean(tmp); + else + return false; + } + + + protected Color decodeColor(String color) { + try { + if (color == null) + return null; + + return Color.decode(color); + } + catch (NumberFormatException nfe) { + log.warn("Error while parsing color: " + color, nfe); + } + + return null; + } + + + protected Font createFont(String type, int size, boolean bold) { + Font font = null; + if (bold) + font = new Font(type, Font.BOLD, size); + else + font = new Font(type, Font.PLAIN, size); + + return font; + } + + + protected void applyToXYPlot(XYPlot plot) { + log.debug("apply theme parameter to XYPlot"); + + super.applyToXYPlot(plot); + plot.setDomainCrosshairVisible(this.domainCrosshairVisible); + plot.setRangeCrosshairVisible(this.rangeCrosshairVisible); + + AbstractXYItemRenderer renderer = (AbstractXYItemRenderer) + plot.getRenderer(); + + if (renderer instanceof XYLineAndShapeRenderer) + applyToXYLineAndShapeRenderer(plot); + + if (renderer instanceof XYBarRenderer) + applyToXYBarRenderer(plot); + } + + + protected void applyToXYLineAndShapeRenderer(XYPlot plot) { + if (plot == null) + return; + + XYLineAndShapeRenderer renderer = + (XYLineAndShapeRenderer) plot.getRenderer(); + + Ellipse2D.Double point = new Ellipse2D.Double( + -(pointWidth/2), -(pointHeight/2), pointWidth, pointHeight + ); + + renderer.setSeriesShape(0, point); + renderer.setSeriesShapesVisible(0, renderShapes); + renderer.setSeriesLinesVisible(0, renderLines); + + plot.setRenderer(renderer); + } + + + protected void applyToXYBarRenderer(XYPlot plot) { + if (plot == null) + return; + + XYBarRenderer renderer = (XYBarRenderer) plot.getRenderer(); + + renderer.setSeriesPaint(0, histogramBasePaint); + } +} diff -r f99d8f92a640 -r 755dd2fa4a0a gnv-artifacts/src/main/java/de/intevation/gnv/chart/exception/TechnicalChartException.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv-artifacts/src/main/java/de/intevation/gnv/chart/exception/TechnicalChartException.java Fri Sep 28 12:13:53 2012 +0200 @@ -0,0 +1,51 @@ +/** + * + */ +package de.intevation.gnv.chart.exception; + +/** + * @author Tim Englich + * + */ +public class TechnicalChartException extends Exception { + + /** + * The UID of this Class + */ + private static final long serialVersionUID = -5325863742368006109L; + + /** + * Constructor + */ + public TechnicalChartException() { + } + + /** + * Constructor + * + * @param message + */ + public TechnicalChartException(String message) { + super(message); + } + + /** + * Constructor + * + * @param cause + */ + public TechnicalChartException(Throwable cause) { + super(cause); + } + + /** + * Constructor + * + * @param message + * @param cause + */ + public TechnicalChartException(String message, Throwable cause) { + super(message, cause); + } + +} diff -r f99d8f92a640 -r 755dd2fa4a0a gnv-artifacts/src/main/java/de/intevation/gnv/exports/ChartExportHelper.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv-artifacts/src/main/java/de/intevation/gnv/exports/ChartExportHelper.java Fri Sep 28 12:13:53 2012 +0200 @@ -0,0 +1,296 @@ +package de.intevation.gnv.exports; + +import com.lowagie.text.Document; +import com.lowagie.text.DocumentException; +import com.lowagie.text.PageSize; +import com.lowagie.text.Rectangle; + +import com.lowagie.text.pdf.PdfContentByte; +import com.lowagie.text.pdf.PdfTemplate; +import com.lowagie.text.pdf.PdfWriter; + +import de.intevation.artifactdatabase.XMLUtils; + +import de.intevation.gnv.chart.Chart; + +import java.awt.Graphics2D; +import java.awt.Transparency; + +import java.awt.geom.Rectangle2D.Double; + +import java.awt.geom.Rectangle2D; + +import java.awt.image.BufferedImage; + +import java.io.IOException; +import java.io.OutputStream; +import java.io.OutputStreamWriter; +import java.io.UnsupportedEncodingException; + +import javax.imageio.ImageIO; + +import org.apache.batik.svggen.SVGGraphics2D; +import org.apache.batik.svggen.SVGGraphics2DIOException; + +import org.apache.log4j.Logger; + +import org.jfree.chart.JFreeChart; + +/** + * @author Ingo Weinzierl + */ +public class ChartExportHelper { + + private static final String DEFAULT_PAGE_SIZE = "A4"; + private static final String DEFAULT_ENCODING = "UTF-8"; + + private static Logger log = Logger.getLogger(ChartExportHelper.class); + + public static void exportImage( + OutputStream out, + JFreeChart chart, + String format, + int width, + int height + ) + throws IOException + { + log.info("export chart as png"); + + ImageIO.write( + chart.createBufferedImage( + width, height, Transparency.BITMASK, null + ), + format, + out + ); + } + + + public static void exportHistograms( + OutputStream out, + Chart[] histograms, + String format, + int width, + int height) + throws IOException + { + log.info("export histograms"); + + int size = histograms.length; + BufferedImage image = new BufferedImage( + width, height*size, BufferedImage.TYPE_INT_RGB); + Graphics2D g = image.createGraphics(); + + for (int i = 0; i < size; i++) { + JFreeChart chart = histograms[i].generateChart(); + chart.draw(g, new Rectangle2D.Double(0.0D, i*height, width, height)); + } + g.finalize(); + + ImageIO.write(image, format, out); + } + + + public static void exportHistogramsAsSVG( + OutputStream out, + Chart[] histograms, + String encoding, + int width, + int height + ) { + log.info("export histograms as svg"); + + if (encoding == null) + encoding = DEFAULT_ENCODING; + + org.w3c.dom.Document document = XMLUtils.newDocument(); + SVGGraphics2D graphics = new SVGGraphics2D(document); + + int size = histograms.length; + for (int i = 0; i < size; i++) { + JFreeChart chart = histograms[i].generateChart(); + chart.draw(graphics, new Rectangle2D.Double( + 0.0D, i*height,width,height)); + } + graphics.finalize(); + + try { + graphics.stream(new OutputStreamWriter(out, encoding)); + } + catch (SVGGraphics2DIOException svge) { + log.error("Error while writing svg export to output stream.", svge); + } + catch (UnsupportedEncodingException uee) { + log.error("Unsupported encoding: " + encoding, uee); + } + } + + + public static void exportSVG( + OutputStream out, + JFreeChart chart, + String encoding, + int width, + int height + ) { + log.info("export chart as svg"); + + if (encoding == null) + encoding = DEFAULT_ENCODING; + + org.w3c.dom.Document document = XMLUtils.newDocument(); + SVGGraphics2D graphics = new SVGGraphics2D(document); + + chart.draw(graphics, new Rectangle2D.Double(0.0D, 0.0D,width,height)); + + try { + graphics.stream(new OutputStreamWriter(out, encoding)); + } + catch (SVGGraphics2DIOException svge) { + log.error("Error while writing svg export to output stream.", svge); + } + catch (UnsupportedEncodingException uee) { + log.error("Unsupported encoding: " + encoding, uee); + } + } + + + public static void exportPDF( + OutputStream out, + JFreeChart chart, + String pageFormat, + boolean landscape, + float marginLeft, + float marginRight, + float marginTop, + float marginBottom + ) { + log.info("export chart as pdf."); + + if (pageFormat == null) + pageFormat = DEFAULT_PAGE_SIZE; + + Rectangle page = PageSize.getRectangle(pageFormat); + int pageWidth = (int) (page.getRight(marginRight) - page.getLeft(marginLeft)); + int pageHeight = (int) (page.getTop(marginTop) - page.getBottom(marginBottom)); + + Document document = null; + if (landscape) { + document = new Document(page.rotate()); + log.debug("Create landscape pdf."); + } + else + document = new Document(page); + + try { + PdfWriter writer = PdfWriter.getInstance(document, out); + + document.addSubject(chart.getTitle().getText()); + document.addCreationDate(); + document.open(); + + PdfContentByte content = writer.getDirectContent(); + + int width = 0; + int height = 0; + if (landscape) { + width = pageHeight; + height = pageWidth; + } + else { + width = pageWidth; + height = pageHeight; + } + + PdfTemplate template = content.createTemplate(width, height); + Graphics2D graphics = template.createGraphics(width, height); + Rectangle2D area = new Rectangle2D.Double(0.0D, 0.0D,width,height); + + chart.draw(graphics, area); + graphics.dispose(); + content.addTemplate(template, marginLeft, marginBottom); + } + catch (DocumentException de) { + log.error("Error while exporting chart to pdf.", de); + } + finally { + document.close(); + } + } + + + public static void exportHistogramsAsPDF( + OutputStream out, + Chart[] histograms, + String pageFormat, + boolean landscape, + float marginLeft, + float marginRight, + float marginTop, + float marginBottom + ) { + log.info("export histogram as pdf."); + + if (pageFormat == null) + pageFormat = DEFAULT_PAGE_SIZE; + + Rectangle page = PageSize.getRectangle(pageFormat); + int pageWidth = + (int) (page.getRight(marginRight) - page.getLeft(marginLeft)); + int pageHeight = + (int) (page.getTop(marginTop) - page.getBottom(marginBottom)); + + Document document = null; + if (landscape) { + document = new Document(page.rotate()); + log.debug("Create landscape pdf."); + } + else + document = new Document(page); + + try { + PdfWriter writer = PdfWriter.getInstance(document, out); + + document.addCreationDate(); + document.open(); + + PdfContentByte content = writer.getDirectContent(); + + int width = 0; + int height = 0; + if (landscape) { + width = pageHeight; + height = pageWidth; + } + else { + width = pageWidth; + height = pageHeight; + } + + int size = histograms.length; + for (int i = 0; i < size; i++) { + if (i > 0) { + document.newPage(); + } + + JFreeChart chart = histograms[i].generateChart(); + PdfTemplate template = content.createTemplate(width, height); + Graphics2D graphics = template.createGraphics(width, height); + Rectangle2D area = new Rectangle2D.Double( + 0.0D, 0.0D,width,height); + + chart.draw(graphics, area); + graphics.dispose(); + content.addTemplate(template, marginLeft, marginBottom); + } + } + catch (DocumentException de) { + log.error("Error while exporting chart to pdf.", de); + } + finally { + document.close(); + } + } +} +// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf-8 : diff -r f99d8f92a640 -r 755dd2fa4a0a gnv-artifacts/src/main/java/de/intevation/gnv/exports/DefaultDataCollector.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv-artifacts/src/main/java/de/intevation/gnv/exports/DefaultDataCollector.java Fri Sep 28 12:13:53 2012 +0200 @@ -0,0 +1,48 @@ +package de.intevation.gnv.exports; + +import java.util.List; +import java.util.ArrayList; + +import org.apache.log4j.Logger; + +import de.intevation.gnv.geobackend.base.Result; +import de.intevation.gnv.geobackend.base.ResultDescriptor; +import de.intevation.gnv.state.exception.StateException; + + +/** + * @author Ingo Weinzierl (ingo.weinzierl@intevation.de) + */ +public class DefaultDataCollector +implements Export.DataCollector +{ + private Logger log = Logger.getLogger(DefaultDataCollector.class); + + protected ResultDescriptor rd; + protected String [] names; + + + public DefaultDataCollector(String[] names) { + this.names = names; + } + + public void init(Result res) { + rd = res.getResultDescriptor(); + } + + public String[] getData(Result result) + throws StateException { + + if (rd == null) + init(result); + + List entries = new ArrayList(); + + int[] indices = rd.getColumnIndices(names); + for (int i = 0; i < names.length; ++i) { + entries.add(result.getString(indices[i])); + } + + return (String[]) entries.toArray((new String[entries.size()])); + } +} diff -r f99d8f92a640 -r 755dd2fa4a0a gnv-artifacts/src/main/java/de/intevation/gnv/exports/DefaultExport.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv-artifacts/src/main/java/de/intevation/gnv/exports/DefaultExport.java Fri Sep 28 12:13:53 2012 +0200 @@ -0,0 +1,83 @@ +package de.intevation.gnv.exports; + +import org.apache.log4j.Logger; + +import au.com.bytecode.opencsv.CSVWriter; + +import java.util.Iterator; +import java.util.Collection; + +import java.io.UnsupportedEncodingException; +import java.io.IOException; +import java.io.OutputStreamWriter; +import java.io.OutputStream; + +import de.intevation.gnv.geobackend.base.Result; + +import de.intevation.gnv.state.exception.StateException; + +/** + * @author Sascha L. Teichmann (sascha.teichmann@intevation.de) + * @author Ingo Weinzierl (ingo.weinzierl@intevation.de) + */ +public class DefaultExport +implements Export +{ + private static Logger log = Logger.getLogger(DefaultExport.class); + + private Export.DataCollector collector; + + public DefaultExport(Export.DataCollector collector) { + this.collector = collector; + } + + protected void writeData( + Profile profile, + Collection result, + CSVWriter writer + ) + throws StateException { + log.debug("create content for export."); + Iterator it = result.iterator(); + + String[] header = profile.getHeader(); + if (header != null) + writer.writeNext(header); + + while (it.hasNext()) { + Result res = it.next(); + + writer.writeNext(collector.getData(res)); + } + } + + public void create( + Profile profile, + OutputStream outputStream, + Collection result + ) + throws + IOException, + UnsupportedEncodingException, + StateException + { + if (result == null) { + String msg = "No data given for generation of " + + profile.getType() + " file."; + log.error(msg); + throw new StateException(msg); + } + + CSVWriter writer = new CSVWriter( + new OutputStreamWriter( + outputStream, + profile.getEncoding()), + profile.getSeparator(), + profile.getQuoteCharacter(), + profile.getEscapeCharacter()); + + writeData(profile, result, writer); + + writer.close(); + } +} diff -r f99d8f92a640 -r 755dd2fa4a0a gnv-artifacts/src/main/java/de/intevation/gnv/exports/DefaultProfile.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv-artifacts/src/main/java/de/intevation/gnv/exports/DefaultProfile.java Fri Sep 28 12:13:53 2012 +0200 @@ -0,0 +1,66 @@ +package de.intevation.gnv.exports; + + +/** + * @author Sascha L. Teichmann (sascha.teichmann@intevation.de) + * @author Ingo Weinzierl (ingo.weinzierl@intevation.de) + */ +public class DefaultProfile +implements Export.Profile +{ + protected Export.DataCollector collector; + protected String [] header; + protected String [] names; + protected char separator; + protected char escapeCharacter; + protected char quoteCharacter; + protected String type; + protected String encoding; + + public DefaultProfile() { + } + + public DefaultProfile( + String [] header, + char separator, + char escapeCharacter, + char quoteCharacter, + String type, + String encoding + ) { + this.header = header; + this.separator = separator; + this.escapeCharacter = escapeCharacter; + this.quoteCharacter = quoteCharacter; + this.type = type; + this.encoding = encoding; + } + + public String toString(int index, String value) { + return value; + } + + public char getSeparator() { + return separator; + } + + public char getEscapeCharacter() { + return escapeCharacter; + } + + public char getQuoteCharacter() { + return quoteCharacter; + } + + public String getType() { + return type; + } + + public String getEncoding() { + return encoding; + } + + public String[] getHeader() { + return header; + } +} diff -r f99d8f92a640 -r 755dd2fa4a0a gnv-artifacts/src/main/java/de/intevation/gnv/exports/Export.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv-artifacts/src/main/java/de/intevation/gnv/exports/Export.java Fri Sep 28 12:13:53 2012 +0200 @@ -0,0 +1,40 @@ +package de.intevation.gnv.exports; + +import java.util.Collection; + +import java.io.OutputStream; +import java.io.IOException; +import java.io.UnsupportedEncodingException; + +import de.intevation.gnv.geobackend.base.Result; +import de.intevation.gnv.state.exception.StateException; + +/** + * @author Sascha L. Teichmann (sascha.teichmann@intevation.de) + * @author Ingo Weinzierl (ingo.weinzierl@intevation.de) + */ +public interface Export { + + public interface Profile { + String toString(int column, String value); + char getSeparator(); + char getEscapeCharacter(); + char getQuoteCharacter(); + String getType(); + String getEncoding(); + String [] getHeader(); + } + + public interface DataCollector { + String[] getData(Result result) + throws StateException; + } + + public void create( + Profile profile, + OutputStream outputStream, + Collection result + ) + throws IOException, UnsupportedEncodingException, StateException; + +} diff -r f99d8f92a640 -r 755dd2fa4a0a gnv-artifacts/src/main/java/de/intevation/gnv/exports/ShapeDataCollector.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv-artifacts/src/main/java/de/intevation/gnv/exports/ShapeDataCollector.java Fri Sep 28 12:13:53 2012 +0200 @@ -0,0 +1,57 @@ +package de.intevation.gnv.exports; + +import org.apache.log4j.Logger; + +import com.vividsolutions.jts.io.WKTReader; +import com.vividsolutions.jts.io.ParseException; +import com.vividsolutions.jts.geom.Point; + +import de.intevation.gnv.geobackend.base.Result; +import de.intevation.gnv.state.exception.StateException; + + +/** + * @author Ingo Weinzierl (ingo.weinzierl@intevation.de) + */ +public class ShapeDataCollector +extends DefaultDataCollector +{ + private Logger log = Logger.getLogger(ShapeDataCollector.class); + + protected WKTReader wktReader = new WKTReader(); + + public ShapeDataCollector(String[] names) { + super(names); + } + + public String[] getData(Result result) + throws StateException { + + if (rd == null) + init(result); + + try { + String [] entries = new String[names.length+1]; + int j = 0; + for (int i = 0; i < names.length; i++) { + + if (names[i].equals("SHAPE")) { + Point p = (Point)wktReader.read(result.getString("SHAPE")); + + entries[j++] = ""+p.getX(); + entries[j++] = ""+p.getY(); + } + else { + entries[j++] = result.getString(names[i]); + } + } + + return entries; + } + catch (ParseException pe) { + log.error(pe, pe); + throw new StateException( + "Error occured while parsing a Point from WKT."); + } + } +} diff -r f99d8f92a640 -r 755dd2fa4a0a gnv-artifacts/src/main/java/de/intevation/gnv/exports/SimpleOdvDataCollector.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv-artifacts/src/main/java/de/intevation/gnv/exports/SimpleOdvDataCollector.java Fri Sep 28 12:13:53 2012 +0200 @@ -0,0 +1,74 @@ +package de.intevation.gnv.exports; + +import java.util.Date; +import java.text.DateFormat; +import java.text.SimpleDateFormat; + +import org.apache.log4j.Logger; + +import com.vividsolutions.jts.io.ParseException; +import com.vividsolutions.jts.geom.Point; + +import de.intevation.gnv.geobackend.base.Result; +import de.intevation.gnv.state.exception.StateException; + +/** + * @author Ingo Weinzierl (ingo.weinzierl@intevation.de) + */ +public class SimpleOdvDataCollector +extends ShapeDataCollector +{ + private static Logger log = Logger.getLogger(SimpleOdvDataCollector.class); + + public static final String SRC_FORMAT = "yyyy.MM.dd HH:mm:ss"; + public static final String DEST_FORMAT = "yyyy-MM-dd HH:mm"; + + public static DateFormat srcFormat = new SimpleDateFormat(SRC_FORMAT); + public static DateFormat destFormat = new SimpleDateFormat(DEST_FORMAT); + + public SimpleOdvDataCollector(String[] names) { + super(names); + } + + public String[] getData(Result result) + throws StateException + { + if (rd == null) + init(result); + + try { + String [] entries = new String[names.length+1]; + int j = 0; + for (int i = 0; i < names.length; i++) { + + if (names[i].equals("SHAPE")) { + Point p = (Point)wktReader.read(result.getString("SHAPE")); + + entries[j++] = ""+p.getX(); + entries[j++] = ""+p.getY(); + } + // Change the datetime format from yyyy.MM.dd HH:mm:ss to + // yyyy-MM-dd HH:mm + else if (names[i].equals("TIMEVALUE")) { + Date source = srcFormat.parse(result.getString(names[i])); + entries[j++] = destFormat.format(source); + } + else { + entries[j++] = result.getString(names[i]); + } + } + + return entries; + } + catch (ParseException pe) { + log.error(pe, pe); + throw new StateException( + "Error occured while parsing source data."); + } + catch (java.text.ParseException pe) { + log.error(pe, pe); + throw new StateException( + "Error occured while parsing source data."); + } + } +} diff -r f99d8f92a640 -r 755dd2fa4a0a gnv-artifacts/src/main/java/de/intevation/gnv/histogram/HistogramHelper.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv-artifacts/src/main/java/de/intevation/gnv/histogram/HistogramHelper.java Fri Sep 28 12:13:53 2012 +0200 @@ -0,0 +1,214 @@ +package de.intevation.gnv.histogram; + +import de.intevation.gnv.geobackend.base.Result; +import de.intevation.gnv.geobackend.base.ResultDescriptor; + +import de.intevation.gnv.state.describedata.KeyValueDescibeData; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.Iterator; +import java.util.List; + +import org.apache.log4j.Logger; + + +/** + * @author Ingo Weinzierl (ingo.weinzierl@intevation.de) + */ +public class HistogramHelper { + + private static Logger logger = Logger.getLogger(HistogramHelper.class); + + + private HistogramHelper() { + } + + +/* + public static Object[][] prepareHistogramData( + Collection input, + Collection parameters, + Collection measurements, + Collection dates + ) { + List values = new ArrayList(); + + ResultDescriptor rd; + int b1Idx, b2Idx, b3Idx, yIdx; + + Iterator it = parameters.iterator(); + KeyValueDescibeData param = (KeyValueDescibeData) it.hasNext(); + int parameter = param.getValue(); + + Iterator iter = input.iterator(); + while (iter.hasNext()) { + Result row = (Result) iter.next(); + + if (rd == null) { + rd = row.getResultDescriptor(); + b1Idx = rd.getColumnIndex("GROUP1"); + b2Idx = rd.getColumnIndex("GROUP2"); + b3Idx = rd.getColumnIndex("GROUP3"); + } + + if (row.getInteger(b1Idx) == parameter + && row.getInteger(b2Idx) == measurement) + { + + } + } + + return null; + } + */ + + public static Object[][] prepareHistogramData( + Collection input, + Collection parameters, + Collection measurements, + Collection dates + ) { + List names = new ArrayList(); + List data = new ArrayList(); + + if (logger.isDebugEnabled()) { + logger.debug("############ prepare histogram data ##########"); + logger.debug("Input data size: " + input.size()); + } + + if (input == null) { + return new Object[0][0]; + } + + String break1, break2, break3; + int b1Idx = -1; + int b2Idx = -1; + int b3Idx = -1; + int yIdx = -1; + try { + Iterator iter = input.iterator(); + + if (iter.hasNext()) { + Result row = (Result) iter.next(); + Result previousRow = row; + + if (b1Idx == -1) { + ResultDescriptor rd = row.getResultDescriptor(); + b1Idx = rd.getColumnIndex("GROUP1"); + b2Idx = rd.getColumnIndex("GROUP2"); + b3Idx = rd.getColumnIndex("GROUP3"); + yIdx = rd.getColumnIndex("YORDINATE"); + + if (b1Idx == -1 || b2Idx == -1 || b3Idx == -1 || yIdx == -1) { + return new Object[0][0]; + } + } + break1 = row.getString(b1Idx); + break2 = row.getString(b2Idx); + break3 = row.getString(b3Idx); + + List values = new ArrayList(); + while (iter.hasNext()) { + + // found new series + if (!break1.equals(row.getString(b1Idx)) + || !break2.equals(row.getString(b2Idx)) + || !break3.equals(row.getString(b3Idx)) + ) { + + // get parameter name + String name = generateName( + break1, break2, break3, + parameters, measurements, dates + ); + + // add values and parameter name + data.add((Double[]) values.toArray(new Double[values.size()])); + names.add(name); + + if (logger.isDebugEnabled()) { + logger.debug(" --- series name: " + name); + logger.debug(" --- series items: " + values.size()); + } + + values.clear(); + + Double yValue = row.getDouble(yIdx); + if (yValue != null) + values.add(yValue); + + // set new conditions to find new series + break1 = row.getString(b1Idx); + break2 = row.getString(b2Idx); + break3 = row.getString(b3Idx); + + previousRow = row; + row = (Result) iter.next(); + } else { + + Double value = row.getDouble(yIdx); + if (value != null) + values.add(value); + + row = (Result) iter.next(); + } + } + + Double yValue = row.getDouble(yIdx); + if (yValue != null) + values.add(yValue); + + String name = generateName( + break1, break2, break3, parameters, measurements, dates); + + if (logger.isDebugEnabled()) { + logger.debug(" --- series name: " + name); + logger.debug(" --- series items: " + values.size()); + } + + data.add((Double[]) values.toArray(new Double[values.size()])); + names.add(name); + } + } + catch (Exception e) { + logger.error(e.getMessage(), e); + } + + int series = data.size(); + logger.debug(" === Found total: " + series); + Object[][] obj = new Object[series][2]; + for (int i = 0; i < series; i++) { + obj[i][0] = names.get(i); + obj[i][1] = (Double[]) data.get(i); + } + + return obj; + } + + + protected static String generateName( + String break1, String break2, String break3, + Collection parameters, Collection measurements, Collection dates) + { + return findValueTitle(parameters,break1) + " " + + findValueTitle(measurements,break2) + "m"; + } + + + protected static String findValueTitle(Collection values, String id) { + if (values != null) { + Iterator it = values.iterator(); + + while (it.hasNext()) { + KeyValueDescibeData data = (KeyValueDescibeData) it.next(); + + if (id.equals(data.getKey())) { + return data.getValue(); + } + } + } + return ""; + } +} +// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf-8 : diff -r f99d8f92a640 -r 755dd2fa4a0a gnv-artifacts/src/main/java/de/intevation/gnv/jfreechart/CompactXYItems.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv-artifacts/src/main/java/de/intevation/gnv/jfreechart/CompactXYItems.java Fri Sep 28 12:13:53 2012 +0200 @@ -0,0 +1,128 @@ +package de.intevation.gnv.jfreechart; + +import java.io.Serializable; + +/** + * @author Sascha Teichmann + * @author Ingo Weinzierl + */ +public class CompactXYItems +implements Serializable +{ + protected double [] data; + + public CompactXYItems(double [] data) { + this.data = data; + } + + public double getX(int index) { + return data[index << 1]; + } + + public double getY(int index) { + return data[(index << 1)+1]; + } + + public void get(int index, double [] xy) { + xy[0] = data[index = (index << 1) + 1]; + xy[1] = data[index + 1]; + } + + public double [] getData() { + return data; + } + + public void setData(double [] data) { + this.data = data; + } + + public int size() { + return data.length >> 1; + } + + public double [] calculateBoundingBox(double [] bbox) { + for (int i = 0; i < data.length;) { + double x = data[i++]; + double y = data[i++]; + if (x < bbox[0]) bbox[0] = x; + if (y < bbox[1]) bbox[1] = y; + if (x > bbox[2]) bbox[2] = x; + if (y > bbox[3]) bbox[3] = y; + } + return bbox; + } + + public String toString() { + StringBuilder sb = new StringBuilder(); + for (int i = 0; i < data.length;) { + if (i > 0) sb.append("; "); + sb.append('('); + sb.append(data[i++]); + sb.append(", "); + sb.append(data[i++]); + sb.append(')'); + } + return sb.toString(); + } + + + public double getMinX() { + double lower = Double.POSITIVE_INFINITY; + + for (int i = 0; i < data.length; i += 2) { + double x = data[i]; + + if (!Double.isNaN(x)) { + lower = Math.min(lower, x); + } + } + + return lower; + } + + + public double getMaxX() { + double upper = Double.NEGATIVE_INFINITY; + + for (int i = 0; i < data.length; i += 2) { + double x = data[i]; + + if (!Double.isNaN(x)) { + upper = Math.max(upper, x); + } + } + + return upper; + } + + + public double getMinY() { + double lower = Double.POSITIVE_INFINITY; + + for (int i = 1; i < data.length; i += 2) { + double y = data[i]; + + if (!Double.isNaN(y)) { + lower = Math.min(lower, y); + } + } + + return lower; + } + + + public double getMaxY() { + double upper = Double.NEGATIVE_INFINITY; + + for (int i = 1; i < data.length; i += 2) { + double y = data[i]; + + if (!Double.isNaN(y)) { + upper = Math.max(upper, y); + } + } + + return upper; + } +} +// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf-8 : diff -r f99d8f92a640 -r 755dd2fa4a0a gnv-artifacts/src/main/java/de/intevation/gnv/jfreechart/LevelOrderIndices.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv-artifacts/src/main/java/de/intevation/gnv/jfreechart/LevelOrderIndices.java Fri Sep 28 12:13:53 2012 +0200 @@ -0,0 +1,58 @@ +package de.intevation.gnv.jfreechart; + +import java.util.LinkedList; + +/** + * @author Sascha L. Teichmann (sascha.teichmann@intevation.de) + */ +public class LevelOrderIndices +{ + public interface Visitor { + Object visit(int index); + } + + protected int from; + protected int to; + + public LevelOrderIndices() { + } + + public LevelOrderIndices(int to) { + this(0, to); + } + + public LevelOrderIndices(int from, int to) { + this.from = Math.min(from, to); + this.to = Math.max(from, to); + } + + public Object visit(Visitor visitor) { + LinkedList queue = new LinkedList(); + + queue.add(new int [] { from, to }); + + while (!queue.isEmpty()) { + int [] pair = queue.remove(); + + int mid = (pair[0] + pair[1]) >> 1; + + Object result = visitor.visit(mid); + + if (result != null) { + return result; + } + + if (mid-1 >= pair[0]) { + queue.add(new int [] { pair[0], mid-1 }); + } + + if (mid+1 <= pair[1]) { + pair[0] = mid+1; + queue.add(pair); + } + } + + return null; + } +} +// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf-8 : diff -r f99d8f92a640 -r 755dd2fa4a0a gnv-artifacts/src/main/java/de/intevation/gnv/jfreechart/PolygonDataset.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv-artifacts/src/main/java/de/intevation/gnv/jfreechart/PolygonDataset.java Fri Sep 28 12:13:53 2012 +0200 @@ -0,0 +1,110 @@ +package de.intevation.gnv.jfreechart; + +import java.util.List; +import java.util.Collection; +import java.util.ArrayList; + +import org.jfree.data.Range; +import org.jfree.data.general.AbstractSeriesDataset; + +/** + * @author Ingo Weinzierl + */ +public class PolygonDataset +extends AbstractSeriesDataset +{ + /** PolygonSeries included in this Dataset */ + private List data; + + + public PolygonDataset() { + data = new ArrayList(); + } + + public PolygonDataset(Collection series) { + data = new ArrayList(series); + } + + public PolygonDataset(PolygonSeries series) { + this(); + + if (series != null) { + data.add(series); + } + } + + + public void addSeries(PolygonSeries series) { + if (series == null) + throw new IllegalArgumentException("Null 'series' argument."); + + data.add(series); + } + + public void addAllSeries(Collection series) { + data.addAll(series); + } + + public Range getDomainBounds() { + double lower = Double.POSITIVE_INFINITY; + double upper = Double.NEGATIVE_INFINITY; + int seriesCount = getSeriesCount(); + + for (int s = 0; s < seriesCount; s++) { + PolygonSeries series = getSeries(s); + + Range domainRange = series.getDomainBounds(); + double minX = domainRange.getLowerBound(); + if (!Double.isNaN(minX)) { + lower = Math.min(lower, minX); + } + + double maxX = domainRange.getUpperBound(); + if (!Double.isNaN(maxX)) { + upper = Math.max(upper, maxX); + } + } + + return new Range(lower, upper); + } + + + public Range getRangeBounds() { + double lower = Double.POSITIVE_INFINITY; + double upper = Double.NEGATIVE_INFINITY; + int seriesCount = getSeriesCount(); + + for (int i = 0; i < seriesCount; i++) { + PolygonSeries series = getSeries(i); + + Range range = series.getRangeBounds(); + double minX = range.getLowerBound(); + if (!Double.isNaN(minX)) { + lower = Math.min(lower, minX); + } + + double maxX = range.getUpperBound(); + if (!Double.isNaN(maxX)) { + upper = Math.max(upper, maxX); + } + } + + return new Range(lower, upper); + } + + + public int getSeriesCount() { + return data.size(); + } + + + public Comparable getSeriesKey(int series) { + return ((PolygonSeries)data.get(series)).getKey(); + } + + + public PolygonSeries getSeries(int idx) { + return (PolygonSeries)data.get(idx); + } +} +// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf-8 : diff -r f99d8f92a640 -r 755dd2fa4a0a gnv-artifacts/src/main/java/de/intevation/gnv/jfreechart/PolygonPlot.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv-artifacts/src/main/java/de/intevation/gnv/jfreechart/PolygonPlot.java Fri Sep 28 12:13:53 2012 +0200 @@ -0,0 +1,440 @@ +package de.intevation.gnv.jfreechart; + +import java.awt.AlphaComposite; +import java.awt.Composite; +import java.awt.Graphics2D; +import java.awt.Shape; + +import java.awt.geom.Point2D; +import java.awt.geom.Rectangle2D; + +import java.util.HashMap; +import java.util.Iterator; +import java.util.Map; + +import org.jfree.chart.axis.Axis; +import org.jfree.chart.axis.AxisCollection; +import org.jfree.chart.axis.AxisLocation; +import org.jfree.chart.axis.AxisSpace; +import org.jfree.chart.axis.AxisState; +import org.jfree.chart.axis.ValueAxis; + +import org.jfree.chart.plot.Plot; +import org.jfree.chart.plot.PlotRenderingInfo; +import org.jfree.chart.plot.PlotState; +import org.jfree.chart.plot.PlotOrientation; + +import org.jfree.data.Range; + +import org.jfree.ui.RectangleEdge; +import org.jfree.ui.RectangleInsets; + +import org.jfree.util.ObjectList; + +/** + * @author Ingo Weinzierl + */ +// TODO implement cloneable +public class PolygonPlot +extends Plot +{ + public static final String PLOT_TYPE = "PolygonPlot"; + + public static final PlotOrientation DEFAULT_PLOT_ORIENTATION = + PlotOrientation.VERTICAL; + + private PolygonDataset dataset; + private transient PolygonRenderer renderer; + + private PlotOrientation orientation; + + private RectangleInsets axisOffset; + + private ObjectList domainAxisLocation; + private ObjectList rangeAxisLocation; + private ObjectList domainAxes; + private ObjectList rangeAxes; + + + public PolygonPlot(PolygonDataset dataset, PolygonRenderer renderer) { + this(dataset, renderer, null, null, PlotOrientation.HORIZONTAL); + } + + + public PolygonPlot( + PolygonDataset dataset, + PolygonRenderer renderer, + PlotOrientation orientation + ) { + this(dataset, renderer, null, null, orientation); + } + + + public PolygonPlot( + PolygonDataset dataset, + PolygonRenderer renderer, + ValueAxis domainAxis, + ValueAxis rangeAxis, + PlotOrientation orientation + ) { + super(); + + this.dataset = dataset; + this.renderer = renderer; + this.domainAxes = new ObjectList(); + this.rangeAxes = new ObjectList(); + this.domainAxisLocation = new ObjectList(); + this.rangeAxisLocation = new ObjectList(); + this.axisOffset = RectangleInsets.ZERO_INSETS; + + if (orientation != null) + this.orientation = orientation; + else + this.orientation = DEFAULT_PLOT_ORIENTATION; + + if (domainAxis != null) { + this.domainAxes.set(0, domainAxis); + domainAxis.setPlot(this); + } + domainAxisLocation.set(0, AxisLocation.BOTTOM_OR_LEFT); + + if (rangeAxis != null) { + this.rangeAxes.set(0, rangeAxis); + rangeAxis.setPlot(this); + } + rangeAxisLocation.set(0, AxisLocation.BOTTOM_OR_LEFT); + + configureDomainAxis(); + configureRangeAxis(); + } + + + public void configureDomainAxis() { + // we just have 1 dataset + Range domainAxisRange = getDataset().getDomainBounds(); + + for (int i = 0; i < domainAxes.size(); i++) { + ValueAxis axis = (ValueAxis) domainAxes.get(i); + + if (axis != null) { + axis.configure(); + axis.setRange(domainAxisRange); + } + } + } + + public ValueAxis getDomainAxis() { + return getDomainAxis(0); + } + + public ValueAxis getDomainAxis(int index) { + return index < domainAxes.size() + ? (ValueAxis)domainAxes.get(index) + : null; + } + + public ValueAxis getRangeAxis() { + return getRangeAxis(0); + } + + public ValueAxis getRangeAxis(int index) { + return index < rangeAxes.size() + ? (ValueAxis)rangeAxes.get(index) + : null; + } + + public void configureRangeAxis() { + // we just have 1 dataset + Range rangeAxisRange = getDataset().getRangeBounds(); + + for (int i = 0; i < rangeAxes.size(); i++) { + ValueAxis axis = (ValueAxis) rangeAxes.get(i); + + if (axis != null) { + axis.configure(); + axis.setRange(rangeAxisRange); + } + } + } + + + public PolygonDataset getDataset(){ + return this.dataset; + } + + + public String getPlotType() { + return PLOT_TYPE; + } + + + public void setDataset(PolygonDataset dataset) { + this.dataset = dataset; + } + + + public void draw( + Graphics2D g2, + Rectangle2D area, + Point2D anchor, + PlotState parentState, + PlotRenderingInfo info + ) { + Graphics2D savedG2 = g2; + Rectangle2D savedDataArea = area; + + if (info != null) { + info.setPlotArea(area); + info.setDataArea(area); + } + + AxisSpace space = calculateAxisSpace(g2, area); + Rectangle2D dataArea = space.shrink(area, null); + + // draw background and outline + drawBackground(g2, area); + drawOutline(g2, area); + + Shape savedClip = g2.getClip(); + g2.clip(area); + + Composite originalComposite = g2.getComposite(); + g2.setComposite(AlphaComposite.getInstance( + AlphaComposite.SRC_OVER, + getForegroundAlpha() + )); + + // draw axis + drawAxes(g2, area, dataArea, info); + + if (!isEmptyOrNull(dataset)) { + // draw data + drawPolygons(savedG2, dataArea, info); + drawLabels(savedG2, dataArea, info); + } + + g2.setClip(savedClip); + g2.setComposite(originalComposite); + } + + + private void drawAxes( + Graphics2D g2, + Rectangle2D plotArea, + Rectangle2D dataArea, + PlotRenderingInfo plotState + ) { + AxisCollection axisCollection = new AxisCollection(); + + for (int i = 0; i < domainAxes.size(); i++) { + ValueAxis axis = (ValueAxis) domainAxes.get(i); + if (axis != null) + axisCollection.add(axis, getDomainAxisEdge(i)); + } + + for (int i = 0; i < rangeAxes.size(); i++) { + ValueAxis axis = (ValueAxis) rangeAxes.get(i); + if (axis != null) + axisCollection.add(axis, getRangeAxisEdge(i)); + } + + Map axisStateMap = new HashMap(); + + // draw the top axes + double cursor = dataArea.getMinY() - this.axisOffset.calculateTopOutset( + dataArea.getHeight()); + Iterator iterator = axisCollection.getAxesAtTop().iterator(); + while (iterator.hasNext()) { + ValueAxis axis = (ValueAxis) iterator.next(); + AxisState info = axis.draw(g2, cursor, plotArea, dataArea, + RectangleEdge.TOP, plotState); + cursor = info.getCursor(); + axisStateMap.put(axis, info); + } + + // draw the bottom axes + cursor = dataArea.getMaxY() + + this.axisOffset.calculateBottomOutset(dataArea.getHeight()); + iterator = axisCollection.getAxesAtBottom().iterator(); + while (iterator.hasNext()) { + ValueAxis axis = (ValueAxis) iterator.next(); + AxisState info = axis.draw(g2, cursor, plotArea, dataArea, + RectangleEdge.BOTTOM, plotState); + cursor = info.getCursor(); + axisStateMap.put(axis, info); + } + + // draw the left axes + cursor = dataArea.getMinX() + - this.axisOffset.calculateLeftOutset(dataArea.getWidth()); + iterator = axisCollection.getAxesAtLeft().iterator(); + while (iterator.hasNext()) { + ValueAxis axis = (ValueAxis) iterator.next(); + AxisState info = axis.draw(g2, cursor, plotArea, dataArea, + RectangleEdge.LEFT, plotState); + cursor = info.getCursor(); + axisStateMap.put(axis, info); + } + + // draw the right axes + cursor = dataArea.getMaxX() + + this.axisOffset.calculateRightOutset(dataArea.getWidth()); + iterator = axisCollection.getAxesAtRight().iterator(); + while (iterator.hasNext()) { + ValueAxis axis = (ValueAxis) iterator.next(); + AxisState info = axis.draw(g2, cursor, plotArea, dataArea, + RectangleEdge.RIGHT, plotState); + cursor = info.getCursor(); + axisStateMap.put(axis, info); + } + } + + + private void drawLabels( + Graphics2D g2, + Rectangle2D area, + PlotRenderingInfo info + ) { + renderer.drawLabels(g2, this, area, dataset); + } + + private void drawPolygons( + Graphics2D g2, + Rectangle2D area, + PlotRenderingInfo info + ) { + renderer.drawPolygons(g2, this, area, dataset); + } + + + private AxisSpace calculateAxisSpace(Graphics2D g2, Rectangle2D plotArea) { + AxisSpace space = new AxisSpace(); + space = calculateRangeAxisSpace(g2, plotArea, space); + Rectangle2D tmpPlotArea = space.shrink(plotArea, null); + space = calculateDomainAxisSpace(g2, plotArea, space); + + return space; + } + + + private AxisSpace calculateDomainAxisSpace( + Graphics2D g2, + Rectangle2D plotArea, + AxisSpace space + ) { + if (space == null) + space = new AxisSpace(); + + for (int i = 0; i < domainAxes.size(); i++) { + Axis axis = (Axis) domainAxes.get(i); + + if (axis != null) { + RectangleEdge edge = getDomainAxisEdge(i); + space = axis.reserveSpace(g2, this, plotArea, edge, space); + } + } + + return space; + } + + + private AxisSpace calculateRangeAxisSpace( + Graphics2D g2, + Rectangle2D plotArea, + AxisSpace space + ) { + if (space == null) + space = new AxisSpace(); + + for (int i = 0; i < rangeAxes.size(); i++) { + Axis axis = (Axis) rangeAxes.get(i); + + if (axis != null) { + RectangleEdge edge = getRangeAxisEdge(i); + space = axis.reserveSpace(g2, this, plotArea, edge, space); + } + } + + return space; + } + + public RectangleEdge getDomainAxisEdge() { + return Plot.resolveDomainAxisLocation( + getDomainAxisLocation(), orientation + ); + } + + + public RectangleEdge getDomainAxisEdge(int idx) { + AxisLocation location = getDomainAxisLocation(idx); + RectangleEdge result = Plot.resolveDomainAxisLocation( + location, orientation + ); + + if (result == null) + result = RectangleEdge.opposite(getDomainAxisEdge()); + + return result; + } + + + public RectangleEdge getRangeAxisEdge() { + return Plot.resolveRangeAxisLocation( + getRangeAxisLocation(), orientation + ); + } + + + public RectangleEdge getRangeAxisEdge(int idx) { + AxisLocation location = getRangeAxisLocation(idx); + RectangleEdge result = Plot.resolveRangeAxisLocation( + location, + orientation + ); + + if (result == null) + result = RectangleEdge.opposite(getRangeAxisEdge()); + + return result; + } + + + public AxisLocation getDomainAxisLocation() { + return (AxisLocation) domainAxisLocation.get(0); + } + + + public AxisLocation getDomainAxisLocation(int idx) { + if (idx < domainAxisLocation.size()) + return (AxisLocation) domainAxisLocation.get(idx); + + return null; + } + + + public AxisLocation getRangeAxisLocation() { + return (AxisLocation) rangeAxisLocation.get(0); + } + + + public AxisLocation getRangeAxisLocation(int idx) { + if (idx < rangeAxisLocation.size()) + return (AxisLocation) rangeAxisLocation.get(idx); + + return null; + } + + + private boolean isEmptyOrNull(PolygonDataset dataset) { + if (dataset != null) { + int seriesCount = dataset.getSeriesCount(); + for (int s = 0; s < seriesCount; s++) { + PolygonSeries series = dataset.getSeries(s); + if (series.getItemCount() > 0) { + return false; + } + } + } + return true; + } +} diff -r f99d8f92a640 -r 755dd2fa4a0a gnv-artifacts/src/main/java/de/intevation/gnv/jfreechart/PolygonRenderer.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv-artifacts/src/main/java/de/intevation/gnv/jfreechart/PolygonRenderer.java Fri Sep 28 12:13:53 2012 +0200 @@ -0,0 +1,242 @@ +package de.intevation.gnv.jfreechart; + +import java.util.ArrayList; + +import java.awt.Color; +import java.awt.Graphics2D; +import java.awt.Paint; +import java.awt.Shape; +import java.awt.BasicStroke; +import java.awt.FontMetrics; +import java.awt.Font; + +import java.awt.geom.GeneralPath; +import java.awt.geom.Rectangle2D; +import java.awt.geom.Rectangle2D.Double; + +import org.jfree.data.Range; + +import org.jfree.chart.axis.ValueAxis; + +import org.jfree.ui.RectangleEdge; + +import org.apache.log4j.Logger; + +import org.jfree.text.TextUtilities; + + +/** + * @author Ingo Weinzierl (ingo.weinzierl@intevation.de) + * @author Sascha L. Teichmann (sascha.teichmann@intevation.de) + */ +public class PolygonRenderer +{ + private static Logger log = Logger.getLogger( + PolygonRenderer.class); + + public interface PaintLookup { + + Paint getPaint(int index); + + } // interface PaintLookup + + public static class DefaultLabelGenerator + implements PolygonSeriesLabelGenerator + { + public DefaultLabelGenerator() { + } + + public String generateLabel(PolygonSeries series) { + Object label = series.getAttribute("label"); + return label != null + ? toString(label) + : null; + } + + protected String toString(Object label) { + return label.toString(); + } + } // class DefaultLabelGenerator + + public static final PolygonSeriesLabelGenerator + DEFAULT_LABEL_GENERATOR_INSTANCE = new DefaultLabelGenerator(); + + protected PaintLookup lookup; + protected PolygonSeriesLabelGenerator labelGenerator; + + public PolygonRenderer(PaintLookup lookup) { + this(lookup, null); + } + + public PolygonRenderer( + PaintLookup lookup, + PolygonSeriesLabelGenerator labelGenerator + ) { + this.lookup = lookup; + this.labelGenerator = labelGenerator; + } + + public void drawPolygons( + Graphics2D graphics, + PolygonPlot plot, + Rectangle2D area, + PolygonDataset dataset + ) { + int seriesCount = dataset.getSeriesCount(); + for (int i = 0; i < seriesCount; i++) { + PolygonSeries series = dataset.getSeries(i); + Integer colorIdx = (Integer)series.getAttribute("fill"); + + if (colorIdx != null) { + Paint paint = lookup.getPaint(colorIdx.intValue()); + graphics.setPaint(paint != null ? paint : Color.black); + graphics.fill(constructShape(plot, area, series, true)); + } + else { + Number lineWidth = (Number)series.getAttribute("line.width"); + BasicStroke stroke = new BasicStroke( + lineWidth != null ? lineWidth.floatValue() : 1f); + graphics.setStroke(stroke); + graphics.setPaint(Color.black); + graphics.draw(constructShape(plot, area, series, false)); + } + } + } + + public void drawLabels( + final Graphics2D graphics, + final PolygonPlot plot, + final Rectangle2D area, + PolygonDataset dataset + ) { + if (labelGenerator == null) { + return; + } + + final ArrayList bboxes = new ArrayList(); + + Font font = graphics.getFont(); + font = font.deriveFont(Font.PLAIN, Math.max(8, font.getSize()-3)); + graphics.setFont(font); + FontMetrics metrics = graphics.getFontMetrics(font); + + for (int i = dataset.getSeriesCount()-1; i >= 0; --i) { + PolygonSeries series = dataset.getSeries(i); + + String label = labelGenerator.generateLabel(series); + if (label == null) { + continue; + } + + final Rectangle2D box = TextUtilities.getTextBounds( + label, graphics, metrics); + + for (int j = series.getItemCount()-1; j >= 0; --j) { + final CompactXYItems ring = series.getItem(j); + LevelOrderIndices loi = new LevelOrderIndices(ring.size()-1); + Rectangle2D r = (Rectangle2D)loi.visit( + new LevelOrderIndices.Visitor() + { + ValueAxis da = plot.getDomainAxis(); + ValueAxis ra = plot.getRangeAxis(); + RectangleEdge de = plot.getDomainAxisEdge(); + RectangleEdge re = plot.getRangeAxisEdge(); + Rectangle2D.Double r = new Rectangle2D.Double( + 0d, 0d, box.getWidth(), box.getHeight()); + + public Object visit(int index) { + r.x = da.valueToJava2D(ring.getX(index), area, de) + - 0.5*box.getWidth(); + r.y = ra.valueToJava2D(ring.getY(index), area, re) + + 0.5*box.getHeight(); + + for (Rectangle2D b: bboxes) { + if (b.intersects(r)) { + return null; + } + } + return r; + } + }); + + if (r != null) { + bboxes.add(r); + graphics.drawString( + label, (float)r.getX(), (float)r.getY()); + } + } // for all items in series + } // for all series + } + + protected Shape constructShape( + PolygonPlot plot, + Rectangle2D area, + PolygonSeries series, + boolean close + ) { + ValueAxis da = plot.getDomainAxis(); + ValueAxis ra = plot.getRangeAxis(); + RectangleEdge de = plot.getDomainAxisEdge(); + RectangleEdge re = plot.getRangeAxisEdge(); + + CompactXYItems [] rings = series.getRings(); + GeneralPath path = new GeneralPath(); + + for (int i = 0; i < rings.length; ++i) { + + CompactXYItems ring = rings[i]; + + double [] data = ring.getData(); + + if (data.length >= 2) { + path.moveTo( + (float)da.valueToJava2D(data[0], area, de), + (float)ra.valueToJava2D(data[1], area, re)); + } + for (int j = 2; j < data.length;) { + path.lineTo( + (float)da.valueToJava2D(data[j++], area, de), + (float)ra.valueToJava2D(data[j++], area, re)); + } + if (close) { + path.closePath(); + } + } + return path; + } + + public Rectangle2D getBoundingBox(PolygonDataset dataset) { + Rectangle2D bbox = null; + + for (int i = 0, N = dataset.getSeriesCount(); i < N; i++) { + Range domain = dataset.getSeries(i).getDomainBounds(); + Range range = dataset.getSeries(i).getRangeBounds(); + + double x = domain.getLowerBound(); + double y = range.getLowerBound(); + double w = Math.abs(domain.getUpperBound() - x); + double h = Math.abs(range.getUpperBound() - y); + + if (bbox == null) { + bbox = new Rectangle2D.Double(x, y, w, h); + } + else { + bbox.add(new Rectangle2D.Double(x, y, w, h)); + } + } + + return bbox; + } + + public Rectangle2D getBounds(PolygonSeries series) { + + Range domain = series.getDomainBounds(); + Range range = series.getRangeBounds(); + + return new Rectangle2D.Double( + domain.getLowerBound(), range.getLowerBound(), + domain.getUpperBound(), range.getUpperBound() + ); + } +} +// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf-8 : diff -r f99d8f92a640 -r 755dd2fa4a0a gnv-artifacts/src/main/java/de/intevation/gnv/jfreechart/PolygonSeries.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv-artifacts/src/main/java/de/intevation/gnv/jfreechart/PolygonSeries.java Fri Sep 28 12:13:53 2012 +0200 @@ -0,0 +1,172 @@ +package de.intevation.gnv.jfreechart; + +import java.util.Map; +import java.util.HashMap; + +import org.jfree.data.Range; +import org.jfree.data.general.Series; + +/** + * @author Sascha Teichmann + * @author Ingo Weinzierl + */ +public class PolygonSeries +extends Series +{ + protected CompactXYItems [] rings; + protected Map attributes; + + private static long uniqueKey; + + protected synchronized static Long createUniqueKey() { + return new Long(uniqueKey++); + } + + public PolygonSeries() { + this(createUniqueKey(), null); + } + + public PolygonSeries(Comparable key, CompactXYItems [] rings) { + this(key, null, rings, new HashMap()); + } + + public PolygonSeries( + Comparable key, + String description, + CompactXYItems[] rings + ) { + this(key, description, rings, new HashMap()); + } + + public PolygonSeries( + Comparable key, + String description, + CompactXYItems [] rings, + Map attributes + ) { + super(key, description); + this.rings = rings; + this.attributes = attributes; + } + + + public void setRings(CompactXYItems [] rings) { + this.rings = rings; + } + + public CompactXYItems [] getRings() { + return rings; + } + + public void addRing(CompactXYItems newRing) { + if (rings == null) { + rings = new CompactXYItems [] { newRing }; + } + else { + CompactXYItems [] nRings = new CompactXYItems[rings.length + 1]; + System.arraycopy(rings, 0, nRings, 0, rings.length); + nRings[rings.length] = newRing; + rings = nRings; + } + } + + public void addRings(CompactXYItems [] newRings) { + if (newRings == null || newRings.length == 0) { + return; + } + if (rings == null || rings.length == 0) { + rings = newRings; + } + else { + CompactXYItems [] both = + new CompactXYItems[rings.length + newRings.length]; + System.arraycopy(rings, 0, both, 0, rings.length); + System.arraycopy(newRings, 0, both, rings.length, newRings.length); + rings = both; + } + } + + public Object getAttribute(Object key) { + return attributes.get(key); + } + + + public Object setAttribute(Object key, Object value) { + return attributes.put(key, value); + } + + + public int getItemCount() { + return rings != null ? rings.length : 0; + } + + + public CompactXYItems getItem(int idx) { + return rings[idx]; + } + + + public Object removeAttribute(Object key) { + return attributes.remove(key); + } + + + public boolean hasAttribute(Object key) { + return attributes.containsKey(key); + } + + + public Range getDomainBounds() { + double upper = Double.NEGATIVE_INFINITY; + double lower = Double.POSITIVE_INFINITY; + int count = getItemCount(); + + for (int i = 0; i < count; i++) { + CompactXYItems items = getItem(i); + double minX = items.getMinX(); + double maxX = items.getMaxX(); + + if (!Double.isNaN(minX)) { + lower = Math.min(lower, minX); + } + + if (!Double.isNaN(maxX)) { + upper = Math.max(upper, maxX); + } + } + + if (lower > upper) { + return null; + } + + return new Range(lower, upper); + } + + + public Range getRangeBounds() { + double upper = Double.NEGATIVE_INFINITY; + double lower = Double.POSITIVE_INFINITY; + int count = getItemCount(); + + for (int i = 0; i < count; i++) { + CompactXYItems items = getItem(i); + double minY = items.getMinY(); + double maxY = items.getMaxY(); + + if (!Double.isNaN(minY)) { + lower = Math.min(lower, minY); + } + + if (!Double.isNaN(maxY)) { + upper = Math.max(upper, maxY); + } + } + + if (lower > upper) { + return null; + } + + return new Range(lower, upper); + } +} +// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf-8 : diff -r f99d8f92a640 -r 755dd2fa4a0a gnv-artifacts/src/main/java/de/intevation/gnv/jfreechart/PolygonSeriesLabelGenerator.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv-artifacts/src/main/java/de/intevation/gnv/jfreechart/PolygonSeriesLabelGenerator.java Fri Sep 28 12:13:53 2012 +0200 @@ -0,0 +1,10 @@ +package de.intevation.gnv.jfreechart; + +/** + * @author Sascha L. Teichmann (sascha.teichmann@intevation.de) + */ +public interface PolygonSeriesLabelGenerator +{ + String generateLabel(PolygonSeries series); +} +// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf-8 : diff -r f99d8f92a640 -r 755dd2fa4a0a gnv-artifacts/src/main/java/de/intevation/gnv/layer/LayerArtifact.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv-artifacts/src/main/java/de/intevation/gnv/layer/LayerArtifact.java Fri Sep 28 12:13:53 2012 +0200 @@ -0,0 +1,50 @@ +/** + * + */ +package de.intevation.gnv.layer; + +import org.apache.log4j.Logger; +import org.w3c.dom.Document; + +import de.intevation.artifacts.ArtifactFactory; +import de.intevation.gnv.artifacts.GNVArtifactBase; + +/** + * @author Tim Englich + * + */ +public class LayerArtifact extends GNVArtifactBase{ + + /** + * the logger, used to log exceptions and additionally information + */ + private static Logger log = Logger.getLogger(LayerArtifact.class); + + /** + * The UID of this Class + */ + private static final long serialVersionUID = 409054207294748753L; + + /** + * Constructor + */ + public LayerArtifact() { + super(); + log.debug("LayerArtifact.Constructor"); + this.name = "layer"; + } + + + /** + * @see de.intevation.gnv.artifacts.GNVArtifactBase#setup(java.lang.String, + * de.intevation.artifacts.ArtifactFactory, java.lang.Object + * org.w3c.dom.Document) + */ + @Override + public void setup(String identifier, ArtifactFactory factory, + Object context, Document data) { + log.debug("LayerArtifact.setup"); + super.setup(identifier, factory, context, data); + } + +} diff -r f99d8f92a640 -r 755dd2fa4a0a gnv-artifacts/src/main/java/de/intevation/gnv/math/AreaInterpolation.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv-artifacts/src/main/java/de/intevation/gnv/math/AreaInterpolation.java Fri Sep 28 12:13:53 2012 +0200 @@ -0,0 +1,162 @@ +package de.intevation.gnv.math; + +import com.vividsolutions.jts.geom.Coordinate; +import com.vividsolutions.jts.geom.Envelope; + +import com.vividsolutions.jts.index.strtree.STRtree; + +import java.awt.Dimension; + +import java.io.Serializable; + +import java.util.Arrays; +import java.util.List; + +import org.apache.log4j.Logger; + +/** + * @author Sascha L. Teichmann (sascha.teichmann@intevation.de) + */ +public class AreaInterpolation +implements Serializable +{ + private static Logger log = Logger.getLogger(AreaInterpolation.class); + + protected double [] raster; + + protected int width; + protected int height; + + public AreaInterpolation() { + } + + public int getWidth() { + return width; + } + + public int getHeight() { + return height; + } + + public double [] getRaster() { + return raster; + } + + public static final double EPS = 1e-6d; + + + public boolean interpolate( + List points, + Envelope boundingBox, + Dimension samples, + XYDepth depth, + int extrapolationRounds + ) { + boolean debug = log.isDebugEnabled(); + + if (points == null || points.isEmpty()) { + log.warn("no points to interpolate"); + return false; + } + + List cells = GridCell.pointsToGridCells( + points, + Interpolation2D.relevantArea( + boundingBox, + points), + extrapolationRounds); + + if (cells.isEmpty()) { + log.warn("no cells to interpolate"); + return false; + } + + int W = samples.width; + int H = samples.height; + + double cellWidth = boundingBox.getWidth() / W; + double cellHeight = boundingBox.getHeight() / H; + + STRtree spatialIndex = new STRtree(); + + for (GridCell cell: cells) { + spatialIndex.insert(cell.getEnvelope(), cell); + } + + if (debug) { + log.debug("width: " + boundingBox.getWidth()); + log.debug("height: " + boundingBox.getHeight()); + log.debug("sample width: " + W); + log.debug("sample height: " + H); + log.debug("cell width: " + cellWidth); + log.debug("cell height: " + cellHeight); + } + + Envelope queryBuffer = new Envelope(); + Coordinate center = new Coordinate(); + GridCell.CellFinder finder = new GridCell.CellFinder(); + + double [] raster = new double[W*H]; + Arrays.fill(raster, Double.NaN); + + double minX = boundingBox.getMinX(); + double minY = boundingBox.getMinY(); + + long startTime = System.currentTimeMillis(); + + int pos = 0; + for (int j = 0; j < H; ++j) { + + double y = j*cellHeight + 0.5d*cellHeight + minY; + double x = 0.5d*cellWidth + minX; + + for (int end = pos + W; pos < end; ++pos, x += cellWidth) { + + queryBuffer.init(x - EPS, x + EPS, y - EPS, y + EPS); + center.x = x; center.y = y; + finder.prepare(center); + spatialIndex.query(queryBuffer, finder); + + GridCell found = finder.found; + + if (found == null || depth.depth(center) > 0d) { + continue; + } + + double z1 = Interpolation2D.interpolate( + found.p1.x, found.p1.z, + found.p2.x, found.p2.z, + center.x); + double z2 = Interpolation2D.interpolate( + found.p3.x, found.p3.z, + found.p4.x, found.p4.z, + center.x); + double y1 = Interpolation2D.interpolate( + found.p1.x, found.p1.y, + found.p2.x, found.p2.y, + center.x); + double y2 = Interpolation2D.interpolate( + found.p3.x, found.p3.y, + found.p4.x, found.p4.y, + center.x); + raster[pos] = Interpolation2D.interpolate( + y1, z1, + y2, z2, + center.y); + } + } + + long stopTime = System.currentTimeMillis(); + + if (debug) { + log.debug("interpolation took: " + (stopTime - startTime)/1000f + " secs"); + } + + this.raster = raster; + this.width = W; + this.height = H; + + return true; + } +} +// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 : diff -r f99d8f92a640 -r 755dd2fa4a0a gnv-artifacts/src/main/java/de/intevation/gnv/math/AttributedPoint2ds.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv-artifacts/src/main/java/de/intevation/gnv/math/AttributedPoint2ds.java Fri Sep 28 12:13:53 2012 +0200 @@ -0,0 +1,80 @@ +package de.intevation.gnv.math; + +import com.vividsolutions.jts.geom.MultiLineString; +import com.vividsolutions.jts.geom.MultiPolygon; + +import de.intevation.gnv.utils.Pair; + +import java.io.Serializable; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * @author Sascha L. Teichmann (sascha.teichmann@intevation.de) + */ +public class AttributedPoint2ds +implements Serializable +{ + protected List points; + protected Map attributes; + protected AreaInterpolation interpolation; + protected List> lineStrings; + protected Map polygons; + + public AttributedPoint2ds() { + } + + public AttributedPoint2ds(List points) { + this.points = points; + } + + public Object getAttribute(Object key) { + return attributes != null + ? attributes.get(key) + : null; + } + + public void setAttribute(Object key, Object value) { + if (attributes == null) { + attributes = new HashMap(); + } + attributes.put(key, value); + } + + public List getPoints() { + return points; + } + + public void setPoints(List points) { + this.points = points; + } + + public void setInterpolation(AreaInterpolation interpolation) { + this.interpolation = interpolation; + } + + public AreaInterpolation getInterpolation() { + return interpolation; + } + + public void setPolygons(Map polygons) { + this.polygons = polygons; + } + + public Map getPolygons() { + return polygons; + } + + public void setLineStrings( + List> lineStrings + ) { + this.lineStrings = lineStrings; + } + + public List> getLineStrings() { + return lineStrings; + } +} +// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 : diff -r f99d8f92a640 -r 755dd2fa4a0a gnv-artifacts/src/main/java/de/intevation/gnv/math/AttributedXYColumns.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv-artifacts/src/main/java/de/intevation/gnv/math/AttributedXYColumns.java Fri Sep 28 12:13:53 2012 +0200 @@ -0,0 +1,72 @@ +package de.intevation.gnv.math; + +import java.util.Map; +import java.util.HashMap; +import java.util.List; + +import java.io.Serializable; + +import de.intevation.gnv.jfreechart.PolygonDataset; + +/** + * @author Ingo Weinzierl (ingo.weinzierl@intevation.de) + * @author Sascha L. Teichmann (sascha.teichmann@intevation.de) + */ +public class AttributedXYColumns +implements Serializable +{ + protected List columns; + protected Map attributes; + protected Interpolation3D interpolation; + protected PolygonDataset dataset; + + public AttributedXYColumns() { + } + + public AttributedXYColumns(List columns) { + this(columns, null); + } + + public AttributedXYColumns(List columns, Map attributes) { + this.columns = columns; + this.attributes = attributes; + } + + public Object getAttribute(Object key) { + return attributes != null + ? attributes.get(key) + : null; + } + + public void setAttribute(Object key, Object value) { + if (attributes == null) { + attributes = new HashMap(); + } + attributes.put(key, value); + } + + public List getXYColumns() { + return columns; + } + + public void setXYColumns(List columns) { + this.columns = columns; + } + + public void setInterpolation(Interpolation3D interpolation) { + this.interpolation = interpolation; + } + + public Interpolation3D getInterpolation() { + return interpolation; + } + + public void setPolygonDataset(PolygonDataset dataset) { + this.dataset = dataset; + } + + public PolygonDataset getPolygonDataset() { + return dataset; + } +} +// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8: diff -r f99d8f92a640 -r 755dd2fa4a0a gnv-artifacts/src/main/java/de/intevation/gnv/math/ConstantFunction.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv-artifacts/src/main/java/de/intevation/gnv/math/ConstantFunction.java Fri Sep 28 12:13:53 2012 +0200 @@ -0,0 +1,24 @@ +package de.intevation.gnv.math; + +import org.apache.commons.math.analysis.UnivariateRealFunction; + +/** + * @author Sascha L. Teichmann + */ +public class ConstantFunction +implements UnivariateRealFunction +{ + protected double value; + + public ConstantFunction() { + } + + public ConstantFunction(double value) { + this.value = value; + } + + public double value(double x) { + return value; + } +} +// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8: diff -r f99d8f92a640 -r 755dd2fa4a0a gnv-artifacts/src/main/java/de/intevation/gnv/math/ConstantXYDepth.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv-artifacts/src/main/java/de/intevation/gnv/math/ConstantXYDepth.java Fri Sep 28 12:13:53 2012 +0200 @@ -0,0 +1,24 @@ +package de.intevation.gnv.math; + +import com.vividsolutions.jts.geom.Coordinate; + +/** + * @author Sascha L. Teichmann (sascha.teichmann@intevation.de) + */ +public class ConstantXYDepth +implements XYDepth +{ + protected double depth; + + public ConstantXYDepth() { + } + + public ConstantXYDepth(double depth) { + this.depth = depth; + } + + public double depth(Coordinate coordinate) { + return depth; + } +} +// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8: diff -r f99d8f92a640 -r 755dd2fa4a0a gnv-artifacts/src/main/java/de/intevation/gnv/math/GridCell.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv-artifacts/src/main/java/de/intevation/gnv/math/GridCell.java Fri Sep 28 12:13:53 2012 +0200 @@ -0,0 +1,311 @@ +package de.intevation.gnv.math; + +import com.vividsolutions.jts.algorithm.CGAlgorithms; + +import com.vividsolutions.jts.geom.Coordinate; +import com.vividsolutions.jts.geom.Envelope; +import com.vividsolutions.jts.geom.Geometry; +import com.vividsolutions.jts.geom.GeometryFactory; +import com.vividsolutions.jts.geom.LinearRing; +import com.vividsolutions.jts.geom.Point; +import com.vividsolutions.jts.geom.Polygon; + +import com.vividsolutions.jts.index.ItemVisitor; + +import java.io.Serializable; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; + +import org.apache.log4j.Logger; + +/** + * @author Sascha L. Teichmann (sascha.teichmann@intevation.de) + */ +public class GridCell +implements Serializable +{ + private static Logger log = Logger.getLogger(GridCell.class); + + public static final class CellFinder + implements ItemVisitor + { + public GridCell found; + + protected Point point; + + public CellFinder() { + } + + public void prepare(Coordinate center) { + found = null; + point = GEOMETRY_FACTORY.createPoint(center); + } + + public void visitItem(Object item) { + if (found == null) { + GridCell cell = (GridCell)item; + if (cell.contains(point)) { + found = cell; + } + } + } + } // class CellFinder + + public Point2d p1; + public Point2d p2; + public Point2d p3; + public Point2d p4; + + protected Polygon polygon; + + public static final GeometryFactory GEOMETRY_FACTORY + = new GeometryFactory(); + + public GridCell() { + } + + public GridCell(Point2d p1, Point2d p2, Point2d p3, Point2d p4) { + this.p1 = p1; + this.p2 = p2; + this.p3 = p3; + this.p4 = p4; + createPolygon(); + } + + protected void createPolygon() { + Coordinate [] coords = new Coordinate [] { p1, p2, p3, p4, p1 }; + if (!CGAlgorithms.isCCW(coords)) { + for (int i = 0, j = coords.length-1; i < j; ++i, --j) { + Coordinate c = coords[i]; + coords[i] = coords[j]; + coords[j] = c; + } + } + LinearRing shell = GEOMETRY_FACTORY + .createLinearRing(coords); + + if (!shell.isValid()) { + log.warn("linear ring is not valid"); + } + + polygon = GEOMETRY_FACTORY.createPolygon(shell, null); + } + + public Envelope getEnvelope() { + return polygon.getEnvelopeInternal(); + } + + public boolean contains(Geometry coord) { + return polygon.contains(coord); + } + + public static List pointsToGridCells( + List points + ) { + return pointsToGridCells(points, null); + } + + public static List pointsToGridCells( + List points, + Envelope relevantArea + ) { + return pointsToGridCells(points, relevantArea, 0); + } + + private static final int NEIGHBORS [][] = { + { -1, -1 }, // 0 + { -1, 0 }, // 1 + { -1, +1 }, // 2 + { 0, +1 }, // 3 + { +1, +1 }, // 4 + { +1, 0 }, // 5 + { +1, -1 }, // 6 + { 0, -1 } // 7 + }; + + public static int extrapolate( + HashMap> rows, + int minI, int maxI, + int minJ, int maxJ, + int rounds, + Envelope relevantArea + ) { + Point2d [] neighbors = new Point2d[NEIGHBORS.length]; + Point2d [] positions = new Point2d[NEIGHBORS.length]; + + int total = 0; + + ArrayList> prio = + new ArrayList>(NEIGHBORS.length); + + for (int i = 0; i < NEIGHBORS.length; ++i) { + prio.add(new ArrayList()); + } + + while (rounds-- > 0) { + for (int i = minI; i <= maxI; ++i) { + for (int j = minJ; j <= maxJ; ++j) { + Point2d p = get(rows, i, j); + if (p != null) { + continue; + } + + int count = 0; + + for (int k = 0; k < neighbors.length; ++k) { + neighbors[k] = positions[k] = null; + int dij [] = NEIGHBORS[k]; + Point2d n1 = get(rows, i+ dij[0], j+ dij[1]); + Point2d n2 = get(rows, i+2*dij[0], j+2*dij[1]); + if (n1 != null && n2 != null) { + ++count; + } + } + + if (count > 0) { + prio.get(count-1).add(new IJKey(i, j)); + } + } // for all columns + } // for all rows + + int N = 0; + + for (int l = NEIGHBORS.length-1; l >= 0; --l) { + ArrayList list = prio.get(l); + for (IJKey ij: list) { + int i = ij.i; + int j = ij.j; + for (int k = 0; k < neighbors.length; ++k) { + neighbors[k] = positions[k] = null; + int dij [] = NEIGHBORS[k]; + Point2d n1 = get(rows, i+ dij[0], j+ dij[1]); + Point2d n2 = get(rows, i+2*dij[0], j+2*dij[1]); + if (n1 != null && n2 != null) { + neighbors[k] = n1; + positions[k] = n1.extrapolate(-1d, n2); + } + } + + Point2d avg = Point2d.average(positions); + + if (avg != null && avg.near(positions) + && (relevantArea == null || relevantArea.contains(avg.x, avg.y))) { + avg.i = i; + avg.j = j; + avg.inverseDistanceWeighting(neighbors); + put(rows, avg, i, j); + } + } + N += list.size(); + list.clear(); + } + + if (N == 0) { + break; + } + total += N; + } // for all rounds + + return total; + } + + public static List pointsToGridCells( + List points, + Envelope relevantArea, + int extrapolationRounds + ) { + int minI = Integer.MAX_VALUE; + int maxI = Integer.MIN_VALUE; + int minJ = Integer.MAX_VALUE; + int maxJ = Integer.MIN_VALUE; + + HashMap> rows = + new HashMap>(); + + int culled = 0; + + for (Point2d p: points) { + + if (relevantArea != null && !relevantArea.contains(p.x, p.y)) { + ++culled; + continue; + } + + if (p.i < minI) minI = p.i; + if (p.i > maxI) maxI = p.i; + if (p.j < minJ) minJ = p.j; + if (p.j > maxJ) maxJ = p.j; + + HashMap row = rows.get(p.i); + + if (row == null) { + rows.put(p.i, row = new HashMap()); + } + + row.put(p.j, p); + } + + ArrayList cells = new ArrayList(points.size()); + + int extrapolated = extrapolate( + rows, + minI, maxI, + minJ, maxJ, + extrapolationRounds, + relevantArea); + + for (int i = minI + 1; i <= maxI; ++i) { + HashMap row1 = rows.get(i-1); + HashMap row2 = rows.get(i); + + if (row1 == null || row2 == null) { + continue; + } + + for (int j = minJ + 1; j < maxJ; ++j) { + Point2d p1 = row1.get(j-1); + Point2d p2 = row1.get(j); + Point2d p3 = row2.get(j); + Point2d p4 = row2.get(j-1); + + if (p1 != null && p2 != null && p3 != null && p4 != null) { + cells.add(new GridCell(p1, p2, p3, p4)); + } + } + } // for all rows + + if (log.isDebugEnabled()) { + log.debug("culled points: " + culled); + log.debug("extrapolated points: " + extrapolated); + log.debug("min/max i: " + minI + " / " + maxI); + log.debug("min/max j: " + minJ + " / " + maxJ); + log.debug("cells found: " + cells.size()); + } + + return cells; + } + + private static Point2d get( + HashMap> rows, + int i, int j + ) { + HashMap row = rows.get(i); + return row != null ? row.get(j) : null; + } + + private static void put( + HashMap> rows, + Point2d point, + int i, int j + ) { + Integer I = Integer.valueOf(i); + HashMap row = rows.get(I); + if (row == null) { + rows.put(I, row = new HashMap()); + } + row.put(j, point); + } +} +// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 : diff -r f99d8f92a640 -r 755dd2fa4a0a gnv-artifacts/src/main/java/de/intevation/gnv/math/HeightValue.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv-artifacts/src/main/java/de/intevation/gnv/math/HeightValue.java Fri Sep 28 12:13:53 2012 +0200 @@ -0,0 +1,46 @@ +package de.intevation.gnv.math; + +import java.io.Serializable; + +import java.util.Comparator; + +/** + * @author Ingo Weinzierl + * @author Sascha L. Teichmann + */ +public class HeightValue +implements Serializable +{ + public static final Comparator INV_Z_COMPARATOR = new Comparator() { + public int compare(Object a, Object b) { + HeightValue ha = (HeightValue)a; + HeightValue hb = (HeightValue)b; + if (ha.z > hb.z) return -1; + if (ha.z < hb.z) return +1; + return 0; + } + }; + + public double z; + public double v; + public int k; + + public HeightValue(double z, double v, int k) { + this.z = z; + this.v = v; + this.k = k; + } + + public double getZ() { + return z; + } + + public double getV() { + return v; + } + + public double getK() { + return k; + } +} +// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8: diff -r f99d8f92a640 -r 755dd2fa4a0a gnv-artifacts/src/main/java/de/intevation/gnv/math/IJKey.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv-artifacts/src/main/java/de/intevation/gnv/math/IJKey.java Fri Sep 28 12:13:53 2012 +0200 @@ -0,0 +1,39 @@ +package de.intevation.gnv.math; + +import java.io.Serializable; + +/** + * @author Sascha L. Teichmann + */ +public class IJKey +implements Serializable +{ + public int i; + public int j; + + public IJKey() { + } + + public IJKey(int i, int j) { + this.i = i; + this.j = j; + } + + public void sort() { + if (i > j) { + int t = i; + i = j; + j = t; + } + } + + public int hashCode() { + return (i << 16) | j; + } + + public boolean equals(Object obj) { + IJKey other = (IJKey)obj; + return i == other.i && j == other.j; + } +} +// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8: diff -r f99d8f92a640 -r 755dd2fa4a0a gnv-artifacts/src/main/java/de/intevation/gnv/math/Interpolation2D.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv-artifacts/src/main/java/de/intevation/gnv/math/Interpolation2D.java Fri Sep 28 12:13:53 2012 +0200 @@ -0,0 +1,241 @@ +package de.intevation.gnv.math; + +import com.vividsolutions.jts.geom.Coordinate; +import com.vividsolutions.jts.geom.Envelope; + +import com.vividsolutions.jts.index.strtree.STRtree; + +import java.util.List; + +import org.apache.log4j.Logger; + +/** + * @author Sascha L. Teichmann (sascha.teichmann@intevation.de) + */ +public final class Interpolation2D +{ + private static Logger log = Logger.getLogger(Interpolation2D.class); + + public static final int CULL_POINT_THRESHOLD = Integer.getInteger( + "gnv.interpolation2d.cull.point.threshold", 1000); + + public static final double EPS = 1e-6d; + + public interface Consumer { + void interpolated(Coordinate point, boolean success); + } // interface Consumer + + private Interpolation2D() { + } + + public static final Envelope relevantArea( + List path, + List points + ) { + return relevantArea(path, points, CULL_POINT_THRESHOLD); + } + + public static final Envelope relevantArea( + Envelope pathBBox, + List points + ) { + return relevantArea(pathBBox, points, CULL_POINT_THRESHOLD); + } + + public static final Envelope relevantArea( + Envelope pathBBox, + List points, + int threshold + ) { + return points.size() < threshold + ? null + : relevantArea( + pathBBox, + pointsBoundingBox(points)); + } + + public static final Envelope relevantArea( + List path, + List points, + int threshold + ) { + return points.size() < threshold || path.isEmpty() + ? null + : relevantArea( + pointsBoundingBox(path), + pointsBoundingBox(points)); + } + + public static final Envelope relevantArea( + Envelope pathBBox, + Envelope pointsBBox + ) { + double pathArea = pathBBox.getWidth()*pathBBox.getHeight(); + double pointsArea = pointsBBox.getWidth()*pointsBBox.getHeight(); + + if (pathArea > 0.8d*pointsArea) { return null; } + + double nArea = 1.44d * pathArea; + if (nArea < 0.1d*pointsArea) nArea = 0.1d*pointsArea; + double w = pathBBox.getWidth(); + double h = pathBBox.getHeight(); + double [] d = solveQuadratic(1d, w+h, pathArea - nArea); + + if (d == null) { return null; } + + double extra = pos(d); + + pathBBox.expandBy(extra); + + return pathBBox; + } + + public static final double [] solveQuadratic( + double a, double b, double c + ) { + double d = b*b - 4d*a*c; + if (d < 0d) { return null; } + + d = Math.sqrt(d); + a = 1d/(2d*a); + b = -b; + + return new double [] { a*(b + d), a*(b - d) }; + } + + public static final double pos(double [] x) { + return x[0] >= 0 ? x[0] : x[1]; + } + + + public static Envelope pointsBoundingBox( + List path + ) { + int N = path.size(); + Envelope area = new Envelope(path.get(N-1)); + + for (int i = N-2; i >= 0; --i) { + area.expandToInclude(path.get(i)); + } + + return area; + } + + public static void interpolate( + List path, + List points, + double from, + double to, + int steps, + Metrics metrics, + Consumer consumer + ) { + boolean debug = log.isDebugEnabled(); + + int N = path.size(); + int M = points.size(); + + if (debug) { + log.debug("Size of path: " + N); + log.debug("Size of points: " + M); + } + + if (M < 1 || N < 2) { // nothing to do + return; + } + + List cells = GridCell.pointsToGridCells( + points, relevantArea(path, points)); + + if (cells.isEmpty()) { + log.warn("no cells found"); + return; + } + + // put into spatial index to speed up finding neighbors. + STRtree spatialIndex = new STRtree(); + + for (GridCell cell: cells) { + spatialIndex.insert(cell.getEnvelope(), cell); + } + + LinearToMap linearToMap = new LinearToMap( + path, from, to, metrics); + + double dP = (to - from)/steps; + + Coordinate center = new Coordinate(); + Envelope queryBuffer = new Envelope(); + GridCell.CellFinder finder = new GridCell.CellFinder(); + + int missedInterpolations = 0; + int interpolations = 0; + + for (double p = from; p <= to; p += dP) { + if (!linearToMap.locate(p, center)) { + continue; + } + queryBuffer.init( + center.x - EPS, center.x + EPS, + center.y - EPS, center.y + EPS); + + finder.prepare(center); + spatialIndex.query(queryBuffer, finder); + + GridCell found = finder.found; + + if (found == null) { + consumer.interpolated(center, false); + ++missedInterpolations; + continue; + } + + Point2d n0 = found.p1; + Point2d n1 = found.p2; + Point2d n2 = found.p3; + Point2d n3 = found.p4; + + double z1 = interpolate( + n0.x, n0.z, + n1.x, n1.z, + center.x); + double z2 = interpolate( + n2.x, n2.z, + n3.x, n3.z, + center.x); + double y1 = interpolate( + n0.x, n0.y, + n1.x, n1.y, + center.x); + double y2 = interpolate( + n2.x, n2.y, + n3.x, n3.y, + center.x); + center.z = interpolate( + y1, z1, + y2, z2, + center.y); + consumer.interpolated(center, true); + ++interpolations; + } + + if (debug) { + log.debug("interpolations: " + + interpolations + " / " + missedInterpolations); + } + } + + public static final double interpolate( + double x1, double y1, + double x2, double y2, + double x + ) { + if (x2 == x1) { + return (y1 + y2)*0.5d; + } + double m = (y2-y1)/(x2-x1); + double b = y1 - m*x1; + return m*x + b; + } +} +// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8: diff -r f99d8f92a640 -r 755dd2fa4a0a gnv-artifacts/src/main/java/de/intevation/gnv/math/Interpolation3D.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv-artifacts/src/main/java/de/intevation/gnv/math/Interpolation3D.java Fri Sep 28 12:13:53 2012 +0200 @@ -0,0 +1,241 @@ +package de.intevation.gnv.math; + +import com.vividsolutions.jts.geom.Coordinate; +import com.vividsolutions.jts.geom.Envelope; + +import com.vividsolutions.jts.index.strtree.STRtree; + +import java.awt.Dimension; + +import java.io.Serializable; + +import java.util.Arrays; +import java.util.List; + +import org.apache.log4j.Logger; + +/** + * @author Sascha L. Teichmann (sascha.teichmann@intevation.de) + */ +public class Interpolation3D +implements Serializable +{ + private static Logger log = Logger.getLogger(Interpolation3D.class); + + public static final int DEFAULT_WIDTH = 1024; + public static final int DEFAULT_HEIGHT = 768; + + public static final double EPS = 1e-6d; + + protected int width; + protected int height; + + protected double cellWidth; + protected double cellHeight; + + protected double [] raster; + protected double [] depths; + + public Interpolation3D() { + this(DEFAULT_WIDTH, DEFAULT_HEIGHT); + } + + public Interpolation3D(Dimension size) { + this(size.width, size.height); + } + + public Interpolation3D(int width, int height) { + this.width = width; + this.height = height; + } + + public int getHeight() { + return height; + } + + public int getWidth() { + return width; + } + + public double getCellWidth() { + return cellWidth; + } + + public double getCellHeight() { + return cellHeight; + } + + public double [] getRaster() { + return raster; + } + + public double [] getDepths() { + return depths; + } + + public double getMaxDepth() { + double maxDepth = Double.MAX_VALUE; + for (int i = depths!=null?depths.length-1:0; i >= 0; --i) { + double d = depths[i]; + if (!Double.isNaN(d) && d < maxDepth) { + maxDepth = d; + } + } + return maxDepth; + } + + public boolean interpolate( + List path, + List points, + double from, + double to, + Metrics metrics, + XYDepth xyDepth + ) { + boolean debug = log.isDebugEnabled(); + + int N = path.size(); + int M = points.size(); + + if (debug) { + log.debug("Size of path: " + N); + log.debug("Size of points: " + M); + } + + if (M < 1 || N < 2) { // nothing to do + return false; + } + + List cells = GridCell.pointsToGridCells( + points, Interpolation2D.relevantArea(path, points)); + + if (cells.isEmpty()) { + log.warn("no cells found"); + return false; + } + + // put into spatial index to speed up finding neighbors. + STRtree spatialIndex = new STRtree(); + + for (GridCell cell: cells) { + spatialIndex.insert(cell.getEnvelope(), cell); + } + + LinearToMap linearToMap = new LinearToMap( + path, from, to, metrics); + + double [] depths = new double[width]; + Arrays.fill(depths, Double.NaN); + + double cellWidth = (to - from)/width; + + double maxDepth = Double.MAX_VALUE; + + int i = 0; + Coordinate center = new Coordinate(); + for (double p = cellWidth*0.5; i < depths.length; ++i, p += cellWidth) { + if (linearToMap.locate(p, center)) { + double depth = xyDepth.depth(center); + depths[i] = depth; + if (depth < maxDepth) { + maxDepth = depth; + } + } + } + + if (maxDepth == Double.MAX_VALUE) { + log.warn("no depth found -> no interpolation"); + return false; + } + + double cellHeight = Math.abs(maxDepth)/height; + + if (debug) { + log.debug("max depth found: " + maxDepth); + log.debug("cell size: " + cellWidth + " x " + cellHeight); + } + + double [] raster = new double[width*height]; + Arrays.fill(raster, Double.NaN); + + Envelope queryBuffer = new Envelope(); + GridCell.CellFinder finder = new GridCell.CellFinder(); + + i = 0; + for (double p = cellWidth*0.5; i < depths.length; ++i, p += cellWidth) { + double depth = depths[i]; + if (Double.isNaN(depth) || depth >= 0d) { + continue; + } + linearToMap.locate(p, center); + + queryBuffer.init( + center.x - EPS, center.x + EPS, + center.y - EPS, center.y + EPS); + + finder.prepare(center); + spatialIndex.query(queryBuffer, finder); + + GridCell found = finder.found; + + if (found == null) { + continue; + } + + XYColumn n0 = (XYColumn)found.p1; + XYColumn n1 = (XYColumn)found.p2; + XYColumn n2 = (XYColumn)found.p3; + XYColumn n3 = (XYColumn)found.p4; + + if (n0.prepare(xyDepth) + && n1.prepare(xyDepth) + && n2.prepare(xyDepth) + && n3.prepare(xyDepth) + ) { + double y1 = Interpolation2D.interpolate( + n0.x, n0.y, + n1.x, n1.y, + center.x); + double y2 = Interpolation2D.interpolate( + n2.x, n2.y, + n3.x, n3.y, + center.x); + double z = -cellHeight*0.5; + for (int j = i; + j < raster.length && z >= depth; + z -= cellHeight, j += width) { + + double v0 = n0.value(z); + double v1 = n1.value(z); + double v2 = n2.value(z); + double v3 = n3.value(z); + + double z1 = Interpolation2D.interpolate( + n0.x, v0, + n1.x, v1, + center.x); + double z2 = Interpolation2D.interpolate( + n2.x, v2, + n3.x, v3, + center.x); + double value = Interpolation2D.interpolate( + y1, z1, + y2, z2, + center.y); + raster[j] = value; + } + // XXX: Adjusted depth to create no gap + // between last value and ground. + depths[i] = z+0.5d*cellHeight; + } // down the x/y column + } // all along the track + + this.depths = depths; + this.raster = raster; + this.cellWidth = cellWidth; + this.cellHeight = cellHeight; + + return true; + } +} +// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8: diff -r f99d8f92a640 -r 755dd2fa4a0a gnv-artifacts/src/main/java/de/intevation/gnv/math/Interpolator.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv-artifacts/src/main/java/de/intevation/gnv/math/Interpolator.java Fri Sep 28 12:13:53 2012 +0200 @@ -0,0 +1,12 @@ +package de.intevation.gnv.math; + +import com.vividsolutions.jts.geom.Coordinate; + +/** + * @author Sascha L. Teichmann + */ +public interface Interpolator +{ + void interpolate(double t, Coordinate v); +} +// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8: diff -r f99d8f92a640 -r 755dd2fa4a0a gnv-artifacts/src/main/java/de/intevation/gnv/math/L1Comparator.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv-artifacts/src/main/java/de/intevation/gnv/math/L1Comparator.java Fri Sep 28 12:13:53 2012 +0200 @@ -0,0 +1,37 @@ +package de.intevation.gnv.math; + +import java.util.Comparator; + +import com.vividsolutions.jts.geom.Coordinate; + +/** + * @author Sascha L. Teichmann + */ +public class L1Comparator +implements Comparator +{ + private Coordinate ref; + + public L1Comparator() { + } + + public L1Comparator(Coordinate ref) { + this.ref = ref; + } + + public void setReference(Coordinate ref) { + this.ref = ref; + } + + public int compare(Object a, Object b) { + Coordinate pa = (Coordinate)a; + Coordinate pb = (Coordinate)b; + double da = Point2d.L1(ref, pa); + double db = Point2d.L1(ref, pb); + if (da < db) return -1; + if (da > db) return +1; + return 0; + } +} +// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8: + diff -r f99d8f92a640 -r 755dd2fa4a0a gnv-artifacts/src/main/java/de/intevation/gnv/math/LinearFunction.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv-artifacts/src/main/java/de/intevation/gnv/math/LinearFunction.java Fri Sep 28 12:13:53 2012 +0200 @@ -0,0 +1,57 @@ +package de.intevation.gnv.math; + +import org.apache.commons.math.optimization.fitting.ParametricRealFunction; + +import org.apache.commons.math.FunctionEvaluationException; + +import org.apache.commons.math.analysis.UnivariateRealFunction; + +/** + * @author Sascha L. Teichmann (sascha.teichmann@intevation.de) + */ +public class LinearFunction +implements ParametricRealFunction +{ + public static final LinearFunction INSTANCE = new LinearFunction(); + + public static class Univariate + implements UnivariateRealFunction + { + protected double m; + protected double b; + + public Univariate() { + } + + public Univariate(double x1, double y1, double x2, double y2) { + if (y1 == y2) { + m = 0d; + b = (x1 + x2)*0.5d; + } + else { + m = (x1 - x2)/(y1 - y2); + b = y1 - m*x1; + } + } + + public double value(double x) { + return m*x + b; + } + } // class Univariate + + public LinearFunction() { + } + + public double value(double x, double [] parameters) + throws FunctionEvaluationException + { + return x*parameters[0] + parameters[1]; + } + + public double [] gradient(double x, double [] parameters) + throws FunctionEvaluationException + { + return new double [] { x, 1f }; + } +} +// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 : diff -r f99d8f92a640 -r 755dd2fa4a0a gnv-artifacts/src/main/java/de/intevation/gnv/math/LinearMetrics.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv-artifacts/src/main/java/de/intevation/gnv/math/LinearMetrics.java Fri Sep 28 12:13:53 2012 +0200 @@ -0,0 +1,59 @@ +package de.intevation.gnv.math; + +import com.vividsolutions.jts.geom.Coordinate; + +/** + * @author Sascha L. Teichmann + */ +public final class LinearMetrics +implements Metrics +{ + public static final Metrics INSTANCE = + new LinearMetrics(); + + public static final class LinearInterpolator + implements Interpolator + { + private double mx; + private double bx; + private double my; + private double by; + + public LinearInterpolator(Coordinate p1, Coordinate p2) { + + /* + I) p1.x = 0*m + bx + II) p2.x = 1*m + bx + + bx = p1.x + + p2.x = m + p1.x + + mx = p2.x - p1.x + */ + + bx = p1.x; + mx = p2.x - bx; + + by = p1.y; + my = p2.y - by; + } + + public void interpolate(double t, Coordinate v) { + v.x = t*mx + bx; + v.y = t*my + by; + } + } // class LinearInterpolator + + private LinearMetrics() { + } + + public double distance(Coordinate p1, Coordinate p2) { + return p1.distance(p2); + } + + public Interpolator getInterpolator(Coordinate p1, Coordinate p2) { + return new LinearInterpolator(p1, p2); + } +} +// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8: diff -r f99d8f92a640 -r 755dd2fa4a0a gnv-artifacts/src/main/java/de/intevation/gnv/math/LinearToMap.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv-artifacts/src/main/java/de/intevation/gnv/math/LinearToMap.java Fri Sep 28 12:13:53 2012 +0200 @@ -0,0 +1,184 @@ +package de.intevation.gnv.math; + +import com.vividsolutions.jts.geom.Coordinate; + +import java.util.List; +import java.util.Iterator; +import java.util.NoSuchElementException; + +/** + * @author Sascha L. Teichmann + */ +public class LinearToMap +{ + public static final class Range { + private Range next; + + private double from; + private double to; + private double b; + + private Coordinate p1; + private Coordinate p2; + + private Interpolator interpolator; + + public Range() { + } + + public Range( + double from, + double to, + Interpolator interpolator, + Coordinate p1, + Coordinate p2 + ) { + this.from = from; + this.to = to; + this.interpolator = interpolator; + this.p1 = p1; + this.p2 = p2; + + b = from == to + ? 0d + : 1.0d/(to - from); + } + + public void eval(double x, Coordinate v) { + interpolator.interpolate((x - from)*b, v); + } + + public boolean inside(double x) { + return x >= from && x <= to; + } + + public Coordinate startPoint() { + return p1; + } + + public Coordinate endPoint() { + return p2; + } + } // class Range + + protected Range head; + protected Range last; + + public LinearToMap() { + } + + public LinearToMap( + List path, + double from, + double to, + Metrics metrics + ) { + double diagramLength = Math.abs(to - from); + + double worldLength = length(path, metrics); + + double rangeStart = from; + + Range last = null; + + for (int i = 1, N = path.size(); i < N; ++i) { + Coordinate p1 = path.get(i-1); + Coordinate p2 = path.get(i); + double segmentLength = metrics.distance(p1, p2); + + double relativeLength = segmentLength / worldLength; + + double rangeLength = diagramLength * relativeLength; + + double rangeEnd = rangeStart + rangeLength; + + Range range = new Range( + rangeStart, rangeEnd, + metrics.getInterpolator(p1, p2), + p1, p2); + + if (last == null) { + last = head = range; + } + else { + last.next = range; + last = range; + } + rangeStart = rangeEnd; + } + } + + protected Range locateRange(double diagramX) { + + if (last != null && last.inside(diagramX)) { + return last; + } + + Range current = head; + while (current != null) { + if (current.inside(diagramX)) { + return last = current; + } + current = current.next; + } + + return null; + } + + public boolean locate(double diagramX, Coordinate v) { + Range range = locateRange(diagramX); + if (range == null) { + return false; + } + range.eval(diagramX, v); + return true; + } + + public static double length( + List path, + Metrics metrics + ) { + double sum = 0d; + for (int i = path.size()-1; i >= 1; --i) { + Coordinate p1 = path.get(i); + Coordinate p2 = path.get(i-1); + sum += metrics.distance(p1, p2); + } + return sum; + } + + public int numRanges() { + int count = 0; + Range current = head; + while (current != null) { + ++count; + current = current.next; + } + return count; + } + + public Iterator ranges() { + return new Iterator() { + + Range current = head; + + public boolean hasNext() { + return current != null; + } + + public Object next() { + if (!hasNext()) { + throw new NoSuchElementException(); + } + Range x = current; + current = current.next; + return x; + } + + public void remove() { + throw new UnsupportedOperationException(); + } + }; + } +} +// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8: diff -r f99d8f92a640 -r 755dd2fa4a0a gnv-artifacts/src/main/java/de/intevation/gnv/math/Metrics.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv-artifacts/src/main/java/de/intevation/gnv/math/Metrics.java Fri Sep 28 12:13:53 2012 +0200 @@ -0,0 +1,14 @@ +package de.intevation.gnv.math; + +import com.vividsolutions.jts.geom.Coordinate; + +/** + * @author Sascha L. Teichmann + */ +public interface Metrics +{ + double distance(Coordinate p1, Coordinate p2); + + Interpolator getInterpolator(Coordinate p1, Coordinate p2); +} +// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8: diff -r f99d8f92a640 -r 755dd2fa4a0a gnv-artifacts/src/main/java/de/intevation/gnv/math/Point2d.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv-artifacts/src/main/java/de/intevation/gnv/math/Point2d.java Fri Sep 28 12:13:53 2012 +0200 @@ -0,0 +1,199 @@ +package de.intevation.gnv.math; + +import com.vividsolutions.jts.geom.Coordinate; +import com.vividsolutions.jts.geom.Envelope; + +import java.util.Comparator; + +import org.apache.log4j.Logger; + +/** + * @author Sascha L. Teichmann (sascha.teichmann@intevation.de) + */ +public class Point2d +extends Coordinate +{ + private static Logger log = Logger.getLogger(Point2d.class); + + public static final double EPSILON = 1e-3d; + + public static final Comparator X_COMPARATOR = new Comparator() { + public int compare(Object a, Object b) { + double xa = ((Coordinate)a).x; + double xb = ((Coordinate)b).x; + if (xa < xb) return -1; + if (xa > xb) return +1; + return 0; + } + }; + + public static final Comparator Y_COMPARATOR = new Comparator() { + public int compare(Object a, Object b) { + double ya = ((Coordinate)a).y; + double yb = ((Coordinate)b).y; + if (ya < yb) return -1; + if (ya > yb) return +1; + return 0; + } + }; + + public static class InverseL1Comparator + implements Comparator + { + private Point2d ref; + + public InverseL1Comparator(Point2d ref) { + this.ref = ref; + } + + public int compare(Object a, Object b) { + Point2d pa = (Point2d)a; + Point2d pb = (Point2d)b; + double da = ref.L1(pa); + double db = ref.L1(pb); + if (da < db) return -1; + if (da > db) return +1; + return 0; + } + } // class InverseL1Comparator + + public int i; + public int j; + + public Point2d() { + } + + public Point2d(double x, double y) { + super(x, y); + } + + public Point2d(double x, double y, int i, int j) { + super(x, y); + this.i = i; + this.j = j; + } + + public Point2d(double x, double y, double z, int i, int j) { + super(x, y, z); + this.i = i; + this.j = j; + } + + + public double L1(Point2d other) { + return L1(this, other); + } + + public static double L1(Coordinate a, Coordinate b) { + return Math.abs(a.x - b.x) + Math.abs(a.y - b.y); + } + + public Envelope envelope() { + return envelope(EPSILON); + } + + public Envelope envelope(double epsilon) { + return new Envelope( + x-epsilon, x+epsilon, + y-epsilon, y+epsilon); + } + + public boolean hasIGap(Point2d other) { + return Math.abs(i - other.i) > 1; + } + + public boolean hasJGap(Point2d other) { + return Math.abs(j - other.j) > 1; + } + + public Point2d extrapolate(double t, Point2d other) { + if (other == null) { + return null; + } + Point2d p = newPoint(); + p.x = t*(other.x - x) + x; + p.y = t*(other.y - y) + y; + return p; + } + + public Point2d newPoint() { + return new Point2d(0d, 0d); + } + + public Point2d newPoint(double x, double y) { + return new Point2d(x, y); + } + + public void inverseDistanceWeighting(Point2d [] ps) { + + double sum = 0d; + + double [] d = new double[ps.length]; + + for (int i = 0; i < ps.length; ++i) { + Point2d p = ps[i]; + if (p != null) { + double di = distance(p); + if (di < 1e-5d) { z = p.z; return; } + di = 1d/di; + d[i] = di; + sum += di; + } + } + + if (sum == 0d) { + return; + } + + double v = 0d; + + for (int i = 0; i < ps.length; ++i) { + Point2d p = ps[i]; + if (p != null) { + v += p.z*d[i]; + } + } + z = v/sum; + } + + public static Point2d average(Point2d [] ps) { + + Point2d p = null; + int count = 0; + + for (int i = 0; i < ps.length; ++i) { + Point2d t = ps[i]; + if (t != null) { + ++count; + if (p == null) { + p = t.newPoint(t.x, t.y); + } + else { + p.x += t.x; + p.y += t.y; + } + } + } + + if (p != null) { + double s = 1d/count; + p.x *= s; + p.y *= s; + } + + return p; + } + + public boolean near(Point2d [] ps) { + + for (int i = 0; i < ps.length; ++i) { + Point2d p = ps[i]; + if (p != null && distance(p) > EPSILON) { + return false; + } + } + + return true; + } +} +// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8: diff -r f99d8f92a640 -r 755dd2fa4a0a gnv-artifacts/src/main/java/de/intevation/gnv/math/QueriedXYDepth.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv-artifacts/src/main/java/de/intevation/gnv/math/QueriedXYDepth.java Fri Sep 28 12:13:53 2012 +0200 @@ -0,0 +1,94 @@ +/** + * + */ +package de.intevation.gnv.math; + +import java.util.ArrayList; +import java.util.Collection; + +import java.lang.ref.SoftReference; + +import org.apache.log4j.Logger; + +import com.vividsolutions.jts.geom.Coordinate; + +import de.intevation.gnv.geobackend.base.Result; +import de.intevation.gnv.geobackend.base.query.QueryExecutor; +import de.intevation.gnv.geobackend.base.query.QueryExecutorFactory; +import de.intevation.gnv.geobackend.base.query.exception.QueryException; +import de.intevation.gnv.geobackend.sde.datasources.RasterObject; + +import de.intevation.gnv.utils.WKTUtils; + +/** + * @author Tim Englich (tim.englich@intevation.de) + * @author Sascha L. Teichmann (sascha.teichmann@intevation.de) + */ +public class QueriedXYDepth implements XYDepth { + + /** + * the logger, used to log exceptions and additonaly information + */ + private static Logger log = Logger.getLogger(QueriedXYDepth.class); + + private static final String queryID = "rasterQuery"; + + private QueryExecutor queryExecutor; + + private ArrayList> rasterData; + + private RasterObject last; + + private int interpolation; + + public QueriedXYDepth() { + this(RasterObject.BILINEAR); + } + + public QueriedXYDepth(int interpolation) { + this.interpolation = interpolation; + rasterData = new ArrayList>(); + queryExecutor = QueryExecutorFactory.getInstance().getQueryExecutor(); + } + + /** + * @see de.intevation.gnv.math.XYDepth#depth(com.vividsolutions.jts.geom.Coordinate) + */ + public double depth(Coordinate coordinate) { + double resultValue = Double.NaN; + + RasterObject ro = getRasterObject(coordinate); + + if (ro == null) { + try { + String[] filterValues = new String[] { WKTUtils.toWKT(coordinate) }; + Collection result = queryExecutor.executeQuery(this.queryID,filterValues); + for (Result row: result) { + if ((ro = (RasterObject)row.getObject(0)) != null) { + rasterData.add(new SoftReference(last = ro)); + } + break; + } + } catch (QueryException e) { + log.error(e, e); + } + } + return ro != null + ? ro.getValue(coordinate, interpolation) + : Double.NaN; + } + + private RasterObject getRasterObject(Coordinate coordinate) { + if (last != null && last.contains(coordinate)) { + return last; + } + for (int i = rasterData.size()-1; i >= 0; --i) { + SoftReference ref = rasterData.get(i); + RasterObject ro = ref.get(); + if (ro != null && ro.contains(coordinate)) { + return last = ro; + } + } + return null; + } +} diff -r f99d8f92a640 -r 755dd2fa4a0a gnv-artifacts/src/main/java/de/intevation/gnv/math/XYColumn.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv-artifacts/src/main/java/de/intevation/gnv/math/XYColumn.java Fri Sep 28 12:13:53 2012 +0200 @@ -0,0 +1,127 @@ +package de.intevation.gnv.math; + +import java.util.ArrayList; +import java.util.List; +import java.util.Collections; + +import org.apache.commons.math.analysis.interpolation.SplineInterpolator; +import org.apache.commons.math.analysis.interpolation.UnivariateRealInterpolator; + +import org.apache.commons.math.analysis.UnivariateRealFunction; + +import org.apache.commons.math.MathException; +import org.apache.commons.math.FunctionEvaluationException; + +import org.apache.log4j.Logger; + +/** + * @author Ingo Weinzierl + * @author Sascha L. Teichmann + */ +public class XYColumn +extends Point2d +implements UnivariateRealFunction +{ + private static Logger log = Logger.getLogger(XYColumn.class); + + protected List values; + + protected transient UnivariateRealFunction curve; + + public XYColumn() { + values = new ArrayList(); + } + + public XYColumn(double x, double y, int i, int j) { + super(x, y, i, j); + values = new ArrayList(); + } + + public void add(HeightValue value) { + values.add(value); + } + + public List getValues() { + return values; + } + + public double value(double depth) { + try { + if (curve != null) { + HeightValue h = values.get(0); + // extrapolate beyond boundaries by repeating + if (depth > h.z) return h.v; + h = values.get(values.size()-1); + if (depth < h.z) return h.v; + return curve.value(depth); + } + } + catch (FunctionEvaluationException fee) { + log.error("evaluation failed", fee); + } + + return Double.NaN; + } + + public boolean prepare(XYDepth xyDepth) { + if (curve == null) { + int N = values.size(); + if (N == 0) { + log.error("no points for interpolation"); + return false; + } + + if (N == 1) { + // only one value -> constant function + curve = new ConstantFunction(values.get(0).v); + } + else { // more than on value + double depth = xyDepth.depth(this); + Collections.sort(values, HeightValue.INV_Z_COMPARATOR); + + // if there is no value at 0 repeat first value + HeightValue first = values.get(0); + if (first.z < 0d) { + values.add(0, new HeightValue(0d, first.v, first.k-1)); + ++N; + } + + // if there is no value at depth repeat last value + HeightValue last = values.get(N-1); + if (last.z > depth) { + values.add(new HeightValue(depth, last.v, last.k+1)); + ++N; + } + if (N < 3) { // interpolate linear + first = values.get(0); + last = values.get(N-1); + curve = new LinearFunction.Univariate( + first.z, first.v, + last.z, last.v); + } + else { // higher degree interpolation + double [] z = new double[N]; + double [] v = new double[N]; + for (int i = 0; i < N; ++i) { + HeightValue h = values.get(N-1-i); + z[i] = h.z; + v[i] = h.v; + } + try { + curve = getInterpolator().interpolate(z, v); + } + catch (MathException me) { + log.error("interpolation failed", me); + return false; + } + } + } + } + return true; + } + + protected UnivariateRealInterpolator getInterpolator() { + return new SplineInterpolator(); + } +} +// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8: diff -r f99d8f92a640 -r 755dd2fa4a0a gnv-artifacts/src/main/java/de/intevation/gnv/math/XYDepth.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv-artifacts/src/main/java/de/intevation/gnv/math/XYDepth.java Fri Sep 28 12:13:53 2012 +0200 @@ -0,0 +1,12 @@ +package de.intevation.gnv.math; + +import com.vividsolutions.jts.geom.Coordinate; + +/** + * @author Sascha L. Teichmann + */ +public interface XYDepth +{ + double depth(Coordinate coordinate); +} +// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8: diff -r f99d8f92a640 -r 755dd2fa4a0a gnv-artifacts/src/main/java/de/intevation/gnv/profile/horizontal/HorizontalProfileArtifact.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv-artifacts/src/main/java/de/intevation/gnv/profile/horizontal/HorizontalProfileArtifact.java Fri Sep 28 12:13:53 2012 +0200 @@ -0,0 +1,49 @@ +/** + * + */ +package de.intevation.gnv.profile.horizontal; + +import org.apache.log4j.Logger; +import org.w3c.dom.Document; + +import de.intevation.artifacts.ArtifactFactory; +import de.intevation.gnv.artifacts.GNVArtifactBase; + +/** + * @author Tim Englich + * + */ +public class HorizontalProfileArtifact extends GNVArtifactBase { + + /** + * the logger, used to log exceptions and additonaly information + */ + private static Logger log = Logger + .getLogger(HorizontalProfileArtifact.class); + /** + * + */ + private static final long serialVersionUID = -721831166719594662L; + + /** + * Constructor + */ + public HorizontalProfileArtifact() { + super(); + log.debug("HorizontalProfileArtifact.Constructor"); + this.name = "horizontalProfile"; + } + + + /** + * @see de.intevation.gnv.artifacts.GNVArtifactBase#setup(java.lang.String, + * de.intevation.artifacts.ArtifactFactory, java.lang.Object, + * org.w3c.dom.Document) + */ + @Override + public void setup(String identifier, ArtifactFactory factory, + Object context, Document data) { + log.debug("HorizontalProfileArtifact.setup"); + super.setup(identifier, factory, context, data); + } +} diff -r f99d8f92a640 -r 755dd2fa4a0a gnv-artifacts/src/main/java/de/intevation/gnv/profile/horizontal/HorizontalProfileInstantaneousPointArtifact.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv-artifacts/src/main/java/de/intevation/gnv/profile/horizontal/HorizontalProfileInstantaneousPointArtifact.java Fri Sep 28 12:13:53 2012 +0200 @@ -0,0 +1,33 @@ +/** + * + */ +package de.intevation.gnv.profile.horizontal; + +import org.apache.log4j.Logger; + +/** + * @author Tim Englich + * + */ +public class HorizontalProfileInstantaneousPointArtifact extends + HorizontalProfileArtifact { + /** + * the logger, used to log exceptions and additonaly information + */ + private static Logger log = Logger + .getLogger(HorizontalProfileInstantaneousPointArtifact.class); + + /** + * The UID of this Class. + */ + private static final long serialVersionUID = -6700816287500004553L; + + /** + * Constructor + */ + public HorizontalProfileInstantaneousPointArtifact() { + super(); + log.debug("HorizontalProfileInstantaneousPointArtifact.Constructor"); + super.name = super.name + "InstantaneousPoint"; + } +} diff -r f99d8f92a640 -r 755dd2fa4a0a gnv-artifacts/src/main/java/de/intevation/gnv/profile/horizontal/HorizontalProfileMeshArtifact.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv-artifacts/src/main/java/de/intevation/gnv/profile/horizontal/HorizontalProfileMeshArtifact.java Fri Sep 28 12:13:53 2012 +0200 @@ -0,0 +1,32 @@ +/** + * + */ +package de.intevation.gnv.profile.horizontal; + +import org.apache.log4j.Logger; + +/** + * @author Tim Englich + * + */ +public class HorizontalProfileMeshArtifact extends HorizontalProfileArtifact { + /** + * the logger, used to log exceptions and additonaly information + */ + private static Logger log = Logger + .getLogger(HorizontalProfileMeshArtifact.class); + + /** + * The UID of this class + */ + private static final long serialVersionUID = -8291547966693867205L; + + /** + * Constructor + */ + public HorizontalProfileMeshArtifact() { + super(); + log.debug("VerticalProfileMeshArtifact.Constructor"); + super.name = super.name + "Mesh"; + } +} diff -r f99d8f92a640 -r 755dd2fa4a0a gnv-artifacts/src/main/java/de/intevation/gnv/profile/horizontal/HorizontalProfileMeshCrossArtifact.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv-artifacts/src/main/java/de/intevation/gnv/profile/horizontal/HorizontalProfileMeshCrossArtifact.java Fri Sep 28 12:13:53 2012 +0200 @@ -0,0 +1,34 @@ +/** + * + */ +package de.intevation.gnv.profile.horizontal; + +import org.apache.log4j.Logger; + +/** + * @author Tim Englich + * + */ +public class HorizontalProfileMeshCrossArtifact extends + HorizontalProfileMeshArtifact { + + /** + * The UID of this Class + */ + private static final long serialVersionUID = 3955589051619129854L; + /** + * the logger, used to log exceptions and additonaly information + */ + private static Logger log = Logger + .getLogger(HorizontalProfileMeshCrossArtifact.class); + + /** + * Constructor + */ + public HorizontalProfileMeshCrossArtifact() { + super(); + log.debug("HorizontalProfileMeshCrossArtifact.Constructor"); + super.name = super.name + "Cross"; + } + +} diff -r f99d8f92a640 -r 755dd2fa4a0a gnv-artifacts/src/main/java/de/intevation/gnv/profile/horizontalcrosssection/HorizontalCrossSectionMeshArtifact.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv-artifacts/src/main/java/de/intevation/gnv/profile/horizontalcrosssection/HorizontalCrossSectionMeshArtifact.java Fri Sep 28 12:13:53 2012 +0200 @@ -0,0 +1,49 @@ +/** + * + */ +package de.intevation.gnv.profile.horizontalcrosssection; + +import org.apache.log4j.Logger; +import org.w3c.dom.Document; + +import de.intevation.artifacts.ArtifactFactory; +import de.intevation.gnv.artifacts.GNVArtifactBase; + +/** + * @author Tim Englich + * + */ +public class HorizontalCrossSectionMeshArtifact extends GNVArtifactBase { + /** + * + */ + private static final long serialVersionUID = -2687278172203755640L; + /** + * the logger, used to log exceptions and additonaly information + */ + private static Logger log = Logger + .getLogger(HorizontalCrossSectionMeshArtifact.class); + + + /** + * Constructor + */ + public HorizontalCrossSectionMeshArtifact() { + super(); + log.debug("HorizontalCrossSectionMeshArtifact.Constructor"); + this.name = "horizontalCrossSectionMesh"; + } + + + /** + * @see de.intevation.gnv.artifacts.GNVArtifactBase#setup(java.lang.String, + * de.intevation.artifacts.ArtifactFactory, java.lang.Object, + * org.w3c.dom.Document) + */ + @Override + public void setup(String identifier, ArtifactFactory factory, + Object context, Document data) { + log.debug("HorizontalCrossSectionMeshArtifact.setup"); + super.setup(identifier, factory, context, data); + } +} diff -r f99d8f92a640 -r 755dd2fa4a0a gnv-artifacts/src/main/java/de/intevation/gnv/profile/vertical/VerticalProfileArtifact.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv-artifacts/src/main/java/de/intevation/gnv/profile/vertical/VerticalProfileArtifact.java Fri Sep 28 12:13:53 2012 +0200 @@ -0,0 +1,48 @@ +/** + * + */ +package de.intevation.gnv.profile.vertical; + +import org.apache.log4j.Logger; +import org.w3c.dom.Document; + +import de.intevation.artifacts.ArtifactFactory; +import de.intevation.gnv.artifacts.GNVArtifactBase; + +/** + * @author Tim Englich + * + */ +public class VerticalProfileArtifact extends GNVArtifactBase { + /** + * the logger, used to log exceptions and additonaly information + */ + private static Logger log = Logger.getLogger(VerticalProfileArtifact.class); + + /** + * The UID of this class + */ + private static final long serialVersionUID = -8291547966693867205L; + + /** + * Constructor + */ + public VerticalProfileArtifact() { + super(); + log.debug("VerticalProfileArtifact.Constructor"); + this.name = "verticalProfile"; + } + + + /** + * @see de.intevation.gnv.artifacts.GNVArtifactBase#setup(java.lang.String, + * de.intevation.artifacts.ArtifactFactory, java.lang.Object, + * org.w3c.dom.Document) + */ + @Override + public void setup(String identifier, ArtifactFactory factory, + Object context, Document data) { + log.debug("VerticalProfileArtifact.setup"); + super.setup(identifier, factory, context, data); + } +} diff -r f99d8f92a640 -r 755dd2fa4a0a gnv-artifacts/src/main/java/de/intevation/gnv/profile/vertical/VerticalProfileInstantaneousPointArtifact.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv-artifacts/src/main/java/de/intevation/gnv/profile/vertical/VerticalProfileInstantaneousPointArtifact.java Fri Sep 28 12:13:53 2012 +0200 @@ -0,0 +1,33 @@ +/** + * + */ +package de.intevation.gnv.profile.vertical; + +import org.apache.log4j.Logger; + +/** + * @author Tim Englich + * + */ +public class VerticalProfileInstantaneousPointArtifact extends + VerticalProfileArtifact { + /** + * the logger, used to log exceptions and additonaly information + */ + private static Logger log = Logger + .getLogger(VerticalProfileInstantaneousPointArtifact.class); + + /** + * The UID of this class + */ + private static final long serialVersionUID = -8291547966693867205L; + + /** + * Constructor + */ + public VerticalProfileInstantaneousPointArtifact() { + super(); + log.debug("VerticalProfileInstantaneousPointArtifact.Constructor"); + super.name = super.name + "InstantaneousPoint"; + } +} diff -r f99d8f92a640 -r 755dd2fa4a0a gnv-artifacts/src/main/java/de/intevation/gnv/profile/vertical/VerticalProfileMeshArtifact.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv-artifacts/src/main/java/de/intevation/gnv/profile/vertical/VerticalProfileMeshArtifact.java Fri Sep 28 12:13:53 2012 +0200 @@ -0,0 +1,32 @@ +/** + * + */ +package de.intevation.gnv.profile.vertical; + +import org.apache.log4j.Logger; + +/** + * @author Tim Englich + * + */ +public class VerticalProfileMeshArtifact extends VerticalProfileArtifact { + /** + * the logger, used to log exceptions and additonaly information + */ + private static Logger log = Logger + .getLogger(VerticalProfileMeshArtifact.class); + + /** + * The UID of this class + */ + private static final long serialVersionUID = -8291547966693867205L; + + /** + * Constructor + */ + public VerticalProfileMeshArtifact() { + super(); + log.debug("VerticalProfileMeshArtifact.Constructor"); + super.name = super.name + "Mesh"; + } +} diff -r f99d8f92a640 -r 755dd2fa4a0a gnv-artifacts/src/main/java/de/intevation/gnv/profile/verticalcrosssection/VerticalCrossSectionMeshArtifact.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv-artifacts/src/main/java/de/intevation/gnv/profile/verticalcrosssection/VerticalCrossSectionMeshArtifact.java Fri Sep 28 12:13:53 2012 +0200 @@ -0,0 +1,49 @@ +/** + * + */ +package de.intevation.gnv.profile.verticalcrosssection; + +import org.apache.log4j.Logger; +import org.w3c.dom.Document; + +import de.intevation.artifacts.ArtifactFactory; +import de.intevation.gnv.artifacts.GNVArtifactBase; + +/** + * @author Tim Englich + * + */ +public class VerticalCrossSectionMeshArtifact extends GNVArtifactBase { + /** + * + */ + private static final long serialVersionUID = -2687278172203755640L; + /** + * the logger, used to log exceptions and additonaly information + */ + private static Logger log = Logger + .getLogger(VerticalCrossSectionMeshArtifact.class); + + + /** + * Constructor + */ + public VerticalCrossSectionMeshArtifact() { + super(); + log.debug("VerticalCrossSectionMeshArtifact.Constructor"); + this.name = "verticalCrossSectionMesh"; + } + + + /** + * @see de.intevation.gnv.artifacts.GNVArtifactBase#setup(java.lang.String, + * de.intevation.artifacts.ArtifactFactory, java.lang.Object, + * org.w3c.dom.Document) + */ + @Override + public void setup(String identifier, ArtifactFactory factory, + Object context, Document data) { + log.debug("VerticalCrossSectionMeshArtifact.setup"); + super.setup(identifier, factory, context, data); + } +} diff -r f99d8f92a640 -r 755dd2fa4a0a gnv-artifacts/src/main/java/de/intevation/gnv/raster/AbstractProducer.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv-artifacts/src/main/java/de/intevation/gnv/raster/AbstractProducer.java Fri Sep 28 12:13:53 2012 +0200 @@ -0,0 +1,26 @@ +package de.intevation.gnv.raster; + +import de.intevation.gnv.raster.Vectorizer.RingsHandler; + +public abstract class AbstractProducer +implements RingsHandler +{ + protected double minX; + protected double minY; + protected double maxX; + protected double maxY; + + public AbstractProducer() { + } + + public AbstractProducer( + double minX, double minY, + double maxX, double maxY + ) { + this.minX = minX; + this.minY = minY; + this.maxX = maxX; + this.maxY = maxY; + } +} +// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 : diff -r f99d8f92a640 -r 755dd2fa4a0a gnv-artifacts/src/main/java/de/intevation/gnv/raster/DemuxRingsHandler.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv-artifacts/src/main/java/de/intevation/gnv/raster/DemuxRingsHandler.java Fri Sep 28 12:13:53 2012 +0200 @@ -0,0 +1,40 @@ +package de.intevation.gnv.raster; + +import java.util.ArrayList; +import java.util.List; + +import de.intevation.gnv.raster.Vectorizer.RingsHandler; +import de.intevation.gnv.raster.Vectorizer.Edge; + +/** + * @author Sascha L. Teichmann (sascha.teichmann@intevation.de) + */ +public class DemuxRingsHandler +implements RingsHandler +{ + protected ArrayList handlers; + + public DemuxRingsHandler() { + handlers = new ArrayList(); + } + + public void addHandler(RingsHandler handler) { + handlers.add(handler); + } + + public void handleRings( + List rings, + int value, + int width, + int height + ) { + for (RingsHandler handler: handlers) { + handler.handleRings(rings, value, width, height); + } + } + + public void clear() { + handlers.clear(); + } +} +// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 : diff -r f99d8f92a640 -r 755dd2fa4a0a gnv-artifacts/src/main/java/de/intevation/gnv/raster/ExternalIndexConverter.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv-artifacts/src/main/java/de/intevation/gnv/raster/ExternalIndexConverter.java Fri Sep 28 12:13:53 2012 +0200 @@ -0,0 +1,44 @@ +package de.intevation.gnv.raster; + +import org.apache.log4j.Logger; + +/** + * @author Sascha L. Teichmann (sascha.teichmann@intevation.de) + */ +public class ExternalIndexConverter +implements JTSMultiPolygonProducer.ValueConverter +{ + private static Logger log = Logger.getLogger( + ExternalIndexConverter.class); + + protected Palette palette; + + public ExternalIndexConverter() { + } + + public ExternalIndexConverter(Palette palette) { + this.palette = palette; + } + + public Integer convert(Integer value) { + if (value == null) { + return value; + } + + int v = value.intValue(); + + if (v == -1) { + return value; + } + + Palette.Entry entry = palette.getEntryByIndex(v); + + if (entry == null) { + log.warn("cannot find palette entry for index: " + v); + return value; + } + + return Integer.valueOf(entry.getExternalIndex()); + } +} +// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 : diff -r f99d8f92a640 -r 755dd2fa4a0a gnv-artifacts/src/main/java/de/intevation/gnv/raster/Filter.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv-artifacts/src/main/java/de/intevation/gnv/raster/Filter.java Fri Sep 28 12:13:53 2012 +0200 @@ -0,0 +1,20 @@ +package de.intevation.gnv.raster; + +import org.w3c.dom.Element; + +/** + * @author Sascha L. Teichmann (sascha.teichmann@intevation.de) + */ +public interface Filter +{ + public interface Factory { + + void init(Element element); + + Filter create(); + + } // interface Factory + + Raster filter(Raster raster); +} +// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8: diff -r f99d8f92a640 -r 755dd2fa4a0a gnv-artifacts/src/main/java/de/intevation/gnv/raster/IsoAttributeGenerator.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv-artifacts/src/main/java/de/intevation/gnv/raster/IsoAttributeGenerator.java Fri Sep 28 12:13:53 2012 +0200 @@ -0,0 +1,34 @@ +package de.intevation.gnv.raster; + +/** + * @author Sascha L. Teichmann (sascha.teichmann@intevation.de) + */ +public class IsoAttributeGenerator +implements IsoProducer.AttributeGenerator +{ + protected Palette palette; + + public IsoAttributeGenerator() { + } + + public IsoAttributeGenerator(Palette palette) { + this.palette = palette; + } + + public Object generateAttribute(int neighbor1, int neighbor2) { + Palette.Entry e1 = palette.getEntryByIndex(neighbor1); + Palette.Entry e2 = palette.getEntryByIndex(neighbor2); + + if (e1 == null || e2 == null) { + return null; + } + + double e1t = e1.getFrom(); + double e2f = e2.getTo(); + + return Double.valueOf(e2f >= e1t + ? 0.5d*(e1t+e2f) + : 0.5d*(e2.getTo()+e1.getFrom())); + } +} +// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8: diff -r f99d8f92a640 -r 755dd2fa4a0a gnv-artifacts/src/main/java/de/intevation/gnv/raster/IsoPolygonSeriesProducer.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv-artifacts/src/main/java/de/intevation/gnv/raster/IsoPolygonSeriesProducer.java Fri Sep 28 12:13:53 2012 +0200 @@ -0,0 +1,117 @@ +package de.intevation.gnv.raster; + +import java.util.ArrayList; +import java.util.Collection; + +import org.apache.log4j.Logger; + +import gnu.trove.TIntObjectHashMap; +import gnu.trove.TDoubleArrayList; + +import de.intevation.gnv.raster.Vectorizer.Edge; + +import de.intevation.gnv.math.IJKey; + +import de.intevation.gnv.jfreechart.PolygonSeries; +import de.intevation.gnv.jfreechart.CompactXYItems; + +/** + * @author Sascha L. Teichmann (sascha.teichmann@intevation.de) + */ +public class IsoPolygonSeriesProducer +extends IsoProducer +{ + private static Logger log = Logger.getLogger( + IsoPolygonSeriesProducer.class); + + public static final Float LINE_WIDTH = Float.valueOf(0.1f); + + public IsoPolygonSeriesProducer( + double minX, double minY, + double maxX, double maxY + ) { + super(minX, minY, maxX, maxY); + } + + public Collection getSeries() { + return getSeries(null); + } + + public Collection getSeries( + AttributeGenerator attributeGenerator + ) { + ArrayList series = new ArrayList(); + + double b1 = minX; + double m1 = width != 1 + ? (maxX - minX)/(width-1) + : 0d; + + double b2 = minY; + double m2 = height != 1 + ? (maxY - minY)/(height-1) + : 0d; + + TDoubleArrayList vertices = new TDoubleArrayList(); + + for (IJKey key: joinPairs()) { + PolygonSeries ps = new PolygonSeries(); + + // process complete + ArrayList completeList = complete.get(key); + if (completeList != null) { + for (Edge head: completeList) { + Edge current = head; + do { + vertices.add(m1*(current.a % width) + b1); + vertices.add(m2*(current.a / width) + b2); + } + while ((current = current.next) != head); + // add head again to close shape + vertices.add(m1*(head.a % width) + b1); + vertices.add(m2*(head.a / width) + b2); + ps.addRing(new CompactXYItems(vertices.toNativeArray())); + vertices.reset(); + } + } + + // process open + TIntObjectHashMap map = commonOpen.get(key); + + if (map != null) { + for (Edge head: headList(map)) { + + head = Vectorizer.simplify(head, width); + Edge current = head, last = head; + do { + vertices.add(m1*(current.a % width) + b1); + vertices.add(m2*(current.a / width) + b2); + last = current; + } + while ((current = current.next) != null); + // add b from tail + vertices.add(m1*(last.b % width) + b1); + vertices.add(m2*(last.b / width) + b2); + ps.addRing(new CompactXYItems(vertices.toNativeArray())); + vertices.reset(); + } // for all in common open + } // if map defined for key + + if (ps.getItemCount() > 0) { + series.add(ps); + if (attributeGenerator != null) { + Object attribute = attributeGenerator + .generateAttribute(key.i, key.j); + + if (attribute != null) { + ps.setAttribute("label", attribute); + } + } + ps.setAttribute("line.width", LINE_WIDTH); + } + } // for all pairs + + return series; + } +} +// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8: diff -r f99d8f92a640 -r 755dd2fa4a0a gnv-artifacts/src/main/java/de/intevation/gnv/raster/IsoProducer.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv-artifacts/src/main/java/de/intevation/gnv/raster/IsoProducer.java Fri Sep 28 12:13:53 2012 +0200 @@ -0,0 +1,143 @@ +package de.intevation.gnv.raster; + +import java.util.List; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.HashSet; + +import gnu.trove.TIntObjectHashMap; +import gnu.trove.TIntHashSet; +import gnu.trove.TObjectProcedure; + +import de.intevation.gnv.math.IJKey; + +import de.intevation.gnv.raster.Vectorizer.Edge; + +/** + * @author Sascha L. Teichmann (sascha.teichmann@intevation.de) + */ +public class IsoProducer +extends AbstractProducer +{ + public interface AttributeGenerator { + + Object generateAttribute(int neighbor1, int neighbor2); + + } // interface AttributeGenerator + + protected HashMap open; + protected HashMap commonOpen; + protected HashMap> complete; + + protected int width; + protected int height; + + public IsoProducer( + double minX, double minY, + double maxX, double maxY + ) { + super(minX, minY, maxX, maxY); + + open = new HashMap(); + commonOpen = new HashMap(); + complete = new HashMap>(); + } + + public void handleRings( + List rings, + int value, + int width, + int height + ) { + if (value == -1) { + return; + } + this.width = width; + this.height = height; + + Integer v = Integer.valueOf(value); + + for (Edge head: rings) { + Edge current = head; + do { + Integer neighbor = open.remove(current); + + if (neighbor != null) { + IJKey pair = new IJKey(value, neighbor.intValue()); + pair.sort(); + + TIntObjectHashMap co = commonOpen.get(pair); + + if (co == null) { + commonOpen.put(pair, co = new TIntObjectHashMap()); + } + + Edge edge = new Edge(current); + + Edge otherA = (Edge)co.remove(edge.a); + if (otherA != null) { + otherA.chain(edge, edge.a); + } + + Edge otherB = (Edge)co.remove(edge.b); + if (otherB != null) { + otherB.chain(edge, edge.b); + } + + if (edge.isComplete()) { + ArrayList list = complete.get(pair); + if (list == null) { + complete.put(pair, list = new ArrayList()); + } + list.add(Vectorizer.simplify(edge, width)); + } + else { + if (otherA == null) { + co.put(edge.a, edge); + } + if (otherB == null) { + co.put(edge.b, edge); + } + } + } + else { + Edge edge = new Edge(current.b, current.a); + open.put(edge, v); + } + + current = current.next; + } + while (current != head); + } // for all rings + + } // handleRings + + protected HashSet joinPairs() { + HashSet pairs = new HashSet(); + pairs.addAll(complete .keySet()); + pairs.addAll(commonOpen.keySet()); + return pairs; + } + + protected static ArrayList headList(TIntObjectHashMap map) { + final ArrayList headList = new ArrayList(); + map.forEachValue(new TObjectProcedure() { + TIntHashSet headSet = new TIntHashSet(); + public boolean execute(Object value) { + Edge head = ((Edge)value).head(); + if (headSet.add(head.a)) { + headList.add(head); + } + return true; + } + }); + return headList; + } + + public void clear() { + open.clear(); + complete.clear(); + commonOpen.clear(); + } +} +// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 : diff -r f99d8f92a640 -r 755dd2fa4a0a gnv-artifacts/src/main/java/de/intevation/gnv/raster/JTSMultiLineStringProducer.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv-artifacts/src/main/java/de/intevation/gnv/raster/JTSMultiLineStringProducer.java Fri Sep 28 12:13:53 2012 +0200 @@ -0,0 +1,196 @@ +package de.intevation.gnv.raster; + +import com.vividsolutions.jts.geom.Coordinate; +import com.vividsolutions.jts.geom.Geometry; +import com.vividsolutions.jts.geom.GeometryFactory; +import com.vividsolutions.jts.geom.LineString; +import com.vividsolutions.jts.geom.MultiLineString; +import com.vividsolutions.jts.geom.Polygon; +import com.vividsolutions.jts.geom.TopologyException; + +import de.intevation.gnv.math.IJKey; + +import de.intevation.gnv.raster.Vectorizer.Edge; + +import de.intevation.gnv.utils.Pair; + +import gnu.trove.TIntObjectHashMap; + +import java.util.ArrayList; +import java.util.List; + +import org.apache.log4j.Logger; +/** + * @author Sascha L. Teichmann (sascha.teichmann@intevation.de) + */ +public class JTSMultiLineStringProducer +extends IsoProducer +{ + private static Logger log = Logger.getLogger( + JTSMultiLineStringProducer.class); + + protected GeometryFactory geometryFactory; + + protected Polygon clip; + + public JTSMultiLineStringProducer( + Polygon clip, + double minX, double minY, + double maxX, double maxY + ) { + this( + clip, + // XXX: Geotools crashes if only using a 2d packed data format! + JTSMultiPolygonProducer.createDefaultGeometryFactory(3), + minX, minY, + maxX, maxY); + } + + public JTSMultiLineStringProducer( + Polygon clip, + GeometryFactory geometryFactory, + double minX, double minY, + double maxX, double maxY + ) { + super(minX, minY, maxX, maxY); + this.clip = clip; + this.geometryFactory = geometryFactory; + } + + protected void clipLineString( + LineString lineString, + ArrayList lineStrings + ) { + if (clip == null) { + lineStrings.add(lineString); + return; + } + + if (!lineString.intersects(clip)) { + return; + } + + try { + Geometry result = lineString.intersection(clip); + + if (result instanceof LineString) { + lineStrings.add((LineString)result); + } + else if (result instanceof MultiLineString) { + MultiLineString mls = (MultiLineString)result; + for (int i = 0, N = mls.getNumGeometries(); i < N; ++i) { + Geometry g = mls.getGeometryN(i); + if (g instanceof LineString) { + lineStrings.add((LineString)g); + } + else { + log.warn("cannot handle geometry " + g.getClass()); + } + } + } + else { + log.warn("cannot handle " + result.getClass()); + } + } + catch (TopologyException te) { + log.error(te.getLocalizedMessage(), te); + lineStrings.add(lineString); + } + } + + public List> getMultiLineStrings( + AttributeGenerator attributeGenerator + ) { + ArrayList> multiLineStrings = + new ArrayList>(); + + double b1 = minX; + double m1 = width != 1 + ? (maxX - minX)/(width-1) + : 0d; + + double b2 = minY; + double m2 = height != 1 + ? (maxY - minY)/(height-1) + : 0d; + + ArrayList coordinates = new ArrayList(); + + for (IJKey key: joinPairs()) { + ArrayList lineStrings = new ArrayList(); + + // process complete + ArrayList completeList = complete.get(key); + if (completeList != null) { + for (Edge head: completeList) { + Edge current = head; + do { + coordinates.add(new Coordinate( + m1*(current.a % width) + b1, + m2*(current.a / width) + b2)); + } + while ((current = current.next) != head); + // add head again to close shape + coordinates.add(new Coordinate( + m1*(head.a % width) + b1, + m2*(head.a / width) + b2)); + + clipLineString( + geometryFactory.createLineString( + coordinates.toArray( + new Coordinate[coordinates.size()])), + lineStrings); + + coordinates.clear(); + } + } + + // process open + TIntObjectHashMap map = commonOpen.get(key); + + if (map != null) { + for (Edge head: headList(map)) { + + head = Vectorizer.simplify(head, width); + Edge current = head, last = head; + do { + coordinates.add(new Coordinate( + m1*(current.a % width) + b1, + m2*(current.a / width) + b2)); + last = current; + } + while ((current = current.next) != null); + // add b from tail + coordinates.add(new Coordinate( + m1*(last.b % width) + b1, + m2*(last.b / width) + b2)); + + clipLineString( + geometryFactory.createLineString( + coordinates.toArray( + new Coordinate[coordinates.size()])), + lineStrings); + + coordinates.clear(); + } // for all in common open + } // if map defined for key + + if (!lineStrings.isEmpty()) { + MultiLineString multiLineString = + geometryFactory.createMultiLineString( + lineStrings.toArray( + new LineString[lineStrings.size()])); + lineStrings.clear(); + Object attribute = attributeGenerator != null + ? attributeGenerator.generateAttribute(key.i, key.j) + : key; + multiLineStrings.add(new Pair( + attribute, + multiLineString)); + } + } // for all pairs + + return multiLineStrings; + } +} +// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 : diff -r f99d8f92a640 -r 755dd2fa4a0a gnv-artifacts/src/main/java/de/intevation/gnv/raster/JTSMultiPolygonProducer.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv-artifacts/src/main/java/de/intevation/gnv/raster/JTSMultiPolygonProducer.java Fri Sep 28 12:13:53 2012 +0200 @@ -0,0 +1,225 @@ +package de.intevation.gnv.raster; + +import com.vividsolutions.jts.algorithm.CGAlgorithms; + +import com.vividsolutions.jts.geom.Coordinate; +import com.vividsolutions.jts.geom.Geometry; +import com.vividsolutions.jts.geom.GeometryFactory; +import com.vividsolutions.jts.geom.LinearRing; +import com.vividsolutions.jts.geom.MultiPolygon; +import com.vividsolutions.jts.geom.Polygon; +import com.vividsolutions.jts.geom.PrecisionModel; +import com.vividsolutions.jts.geom.TopologyException; + +import com.vividsolutions.jts.geom.impl.PackedCoordinateSequenceFactory; + +import de.intevation.gnv.raster.Vectorizer.Edge; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.TreeMap; + +import org.apache.log4j.Logger; + +/** + * @author Sascha L. Teichmann (sascha.teichmann@intevation.de) + */ +public class JTSMultiPolygonProducer +extends AbstractProducer +{ + private static Logger log = Logger.getLogger( + JTSMultiPolygonProducer.class); + + public static final int SRID_WGS84 = 4326; + + public interface ValueConverter { + + Integer convert(Integer value); + + } // interface ValueConverter + + protected GeometryFactory geometryFactory; + + protected Polygon clip; + + protected HashMap> valueToPolygons; + + public JTSMultiPolygonProducer() { + } + + public JTSMultiPolygonProducer( + Polygon clip, + double minX, double minY, + double maxX, double maxY + ) { + this( + clip, + createDefaultGeometryFactory(), + minX, minY, + maxX, maxY); + } + + public JTSMultiPolygonProducer( + Polygon clip, + GeometryFactory geometryFactory, + double minX, double minY, + double maxX, double maxY + ) { + super(minX, minY, maxX, maxY); + this.clip = clip; + this.geometryFactory = geometryFactory; + valueToPolygons = new HashMap>(); + } + + public static GeometryFactory createDefaultGeometryFactory() { + return createDefaultGeometryFactory(3); + } + + public static GeometryFactory createDefaultGeometryFactory(int dim) { + return new GeometryFactory( + new PrecisionModel( + PrecisionModel.FLOATING), + SRID_WGS84, + new PackedCoordinateSequenceFactory( + PackedCoordinateSequenceFactory.DOUBLE, + dim)); + } + + public void handleRings( + List rings, + int value, + int width, + int height + ) { + if (value == -1) { + return; + } + + double b1 = minX; + double m1 = width != 1 + ? (maxX - minX)/(width-1) + : 0d; + + double b2 = minY; + double m2 = height != 1 + ? (maxY - minY)/(height-1) + : 0d; + + ArrayList vertices = new ArrayList(); + + LinearRing shell = null; + ArrayList holes = new ArrayList(); + + for (Edge head: rings) { + Edge current = head; + do { + vertices.add(new Coordinate( + m1*(current.a % width) + b1, + m2*(current.a / width) + b2)); + } + while ((current = current.prev) != head); + vertices.add(new Coordinate( + m1*(head.a % width) + b1, + m2*(head.a / width) + b2)); + + Coordinate [] coordinates = + vertices.toArray(new Coordinate[vertices.size()]); + + vertices.clear(); + + LinearRing ring = geometryFactory.createLinearRing( + coordinates); + + if (CGAlgorithms.isCCW(coordinates)) { + shell = ring; + } + else { + holes.add(ring); + } + } + + if (shell == null) { + log.error("polygon has no shell"); + return; + } + + Polygon polygon = geometryFactory.createPolygon( + shell, + holes.toArray(new LinearRing[holes.size()])); + + if (clip == null || clip.intersects(polygon)) { + Integer v = Integer.valueOf(value); + + ArrayList polygons = valueToPolygons.get(v); + + if (polygons == null) { + valueToPolygons.put(v, polygons = new ArrayList()); + } + + polygons.add(polygon); + } + } + + public Map getMultiPolygons() { + return getMultiPolygons(null); + } + + protected MultiPolygon flattenCollection(Geometry result) { + + if (result instanceof MultiPolygon) { + return (MultiPolygon)result; + } + + if (result instanceof Polygon) { + return geometryFactory.createMultiPolygon( + new Polygon[] { (Polygon)result }); + } + + log.warn("cannot handle " + result.getClass()); + + return null; + } + + public Map getMultiPolygons( + ValueConverter valueConverter + ) { + TreeMap multiPolygons = + new TreeMap(); + + for (Map.Entry> entry: + valueToPolygons.entrySet() + ) { + ArrayList polygons = entry.getValue(); + + Integer value = valueConverter != null + ? valueConverter.convert(entry.getKey()) + : entry.getKey(); + + MultiPolygon mp = geometryFactory.createMultiPolygon( + polygons.toArray(new Polygon[polygons.size()])); + + if (clip != null) { + try { + Geometry result = mp.intersection(clip); + + MultiPolygon mp2 = flattenCollection(result); + + if (mp2 != null) { mp = mp2; } + } + catch (TopologyException te) { + log.error(te.getLocalizedMessage(), te); + } + } + multiPolygons.put(value, mp); + } + + return multiPolygons; + } + + public void clear() { + valueToPolygons.clear(); + } +} +// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 : diff -r f99d8f92a640 -r 755dd2fa4a0a gnv-artifacts/src/main/java/de/intevation/gnv/raster/KernelFilter.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv-artifacts/src/main/java/de/intevation/gnv/raster/KernelFilter.java Fri Sep 28 12:13:53 2012 +0200 @@ -0,0 +1,70 @@ +package de.intevation.gnv.raster; + +import org.w3c.dom.Element; + +import org.apache.log4j.Logger; + +/** + * @author Sascha L. Teichmann (sascha.teichmann@intevation.de) + */ +public class KernelFilter +implements Filter +{ + private static Logger log = Logger.getLogger(KernelFilter.class); + + public static class GaussFactory + implements Filter.Factory + { + public static final double DEFAULT_SIGMA = 1.0d; + public static final int DEFAULT_RADIUS = 5; + + protected double sigma; + protected int radius; + + public GaussFactory() { + sigma = DEFAULT_SIGMA; + radius = DEFAULT_RADIUS; + } + + public void init(Element element) { + String s = element.getAttribute("sigma"); + String r = element.getAttribute("radius"); + + if ((s = s.trim()).length() > 0) { + try { + sigma = Math.abs(Double.parseDouble(s)); + } + catch (NumberFormatException nfe) { + log.warn("gauss sigma '" + s + "' not a valid float value."); + } + } + + if ((r = r.trim()).length() > 0) { + try { + radius = Math.min(3, Math.abs(Integer.parseInt(r))); + } + catch (NumberFormatException nfe) { + log.warn("gauss radius '" + r + "' not a valid integer value."); + } + } + } + + public Filter create() { + return new KernelFilter(Raster.Kernel.createGauss(sigma, radius)); + } + } // class GaussFactory + + protected Raster.Kernel kernel; + + public KernelFilter() { + } + + public KernelFilter(Raster.Kernel kernel) { + this.kernel = kernel; + } + + public Raster filter(Raster raster) { + return raster.create(kernel); + } +} +// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8: diff -r f99d8f92a640 -r 755dd2fa4a0a gnv-artifacts/src/main/java/de/intevation/gnv/raster/Palette.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv-artifacts/src/main/java/de/intevation/gnv/raster/Palette.java Fri Sep 28 12:13:53 2012 +0200 @@ -0,0 +1,289 @@ +package de.intevation.gnv.raster; + +import org.w3c.dom.Document; +import org.w3c.dom.Element; +import org.w3c.dom.NodeList; + +import java.util.Arrays; + +import java.awt.Color; + +import org.apache.log4j.Logger; + +import de.intevation.gnv.raster.Raster.ValueToIndex; + +/** + * @author Sascha L. Teichmann (sascha.teichmann@intevation.de) + */ +public class Palette +implements ValueToIndex +{ + private static Logger log = Logger.getLogger(Palette.class); + + public static final class Entry + implements Comparable + { + private Entry left; + private Entry right; + + private int index; + + private int externalIndex; + + private double from; + private double to; + + private String description; + + private Color color; + + public Entry() { + } + + public Entry(Entry other) { + index = other.index; + externalIndex = other.externalIndex; + from = other.from; + to = other.to; + description = other.description; + color = other.color; + } + + public Entry( + int index, + int externalIndex, + double from, + double to, + Color color, + String description + ) { + this.index = index; + this.externalIndex = externalIndex; + this.from = from; + this.to = to; + this.color = color; + this.description = description; + } + + public int compareTo(Object other) { + Entry e = (Entry)other; + if (from < e.from) return -1; + if (from > e.from) return +1; + return 0; + } + + public double getFrom() { + return from; + } + + public double getTo() { + return to; + } + + public Color getColor() { + return color; + } + + public int getExternalIndex() { + return externalIndex; + } + + public Entry locateEntry(double value) { + Entry current = this; + while (current != null) { + boolean b = value >= current.from; + if (b && value <= current.to) { + return current; + } + current = b + ? current.right + : current.left; + } + return null; + } + + public int locate(double value) { + Entry entry = locateEntry(value); + return entry != null + ? entry.index + : -1; + } + + public Entry findByIndex(int index) { + Entry current = this; + while (current != null) { + if (current.index == index) { + break; + } + current = index < current.index + ? current.left + : current.right; + } + return current; + } + + public String getDescription() { + return description; + } + + public boolean isInfinity() { + return from == -Double.MAX_VALUE + || to == Double.MAX_VALUE; + } + } // class Entry + + protected Entry [] entries; + protected Entry lookup; + protected Color [] rgbs; + + private Entry buildLookup(Entry [] entries, int lo, int hi) { + if (lo > hi) { + return null; + } + int mid = (lo + hi)/2; + Entry entry = entries[mid]; + entry.left = buildLookup(entries, lo, mid-1); + entry.right = buildLookup(entries, mid+1, hi); + return entry; + } + + public Palette() { + } + + public Palette(Document document) { + + NodeList rangeNodes = document.getElementsByTagName("range"); + + entries = new Entry[rangeNodes.getLength()]; + rgbs = new Color[entries.length]; + + for (int i = 0; i < entries.length; ++i) { + Element rangeElement = (Element)rangeNodes.item(i); + double from = doubleValue(rangeElement.getAttribute("from")); + double to = doubleValue(rangeElement.getAttribute("to")); + int extIndex = intValue(rangeElement.getAttribute("index"), i); + Color color = color(rangeElement.getAttribute("rgb")); + String desc = rangeElement.getAttribute("description"); + if (from > to) { double t = from; from = to; to = t; } + entries[i] = new Entry(i, extIndex, from, to, color, desc); + rgbs[i] = color; + } + + buildLookup(); + } + + public Palette(Palette original, int N) { + if (N < 2) { + throw new IllegalArgumentException("N < 2"); + } + + Entry [] origEntries = original.entries; + + int newSize = 0; + for (int i = 0; i < origEntries.length; ++i) { + // cannot split infinity intervals + newSize += origEntries[i].isInfinity() ? 1 : N; + } + + entries = new Entry[newSize]; + rgbs = new Color[newSize]; + + for (int i = 0, j = 0; i < origEntries.length; ++i) { + Entry origEntry = origEntries[i]; + if (origEntry.isInfinity()) { + // infinity intervals are just copied + Entry nEntry = new Entry(origEntry); + entries[j] = nEntry; + rgbs[j] = nEntry.color; + nEntry.index = j++; + } + else { + // split interval into N parts + double from = origEntry.from; + double to = origEntry.to; + double delta = (to - from)/N; + for (int k = 0; k < N; ++k) { + Entry nEntry = new Entry(origEntry); + nEntry.from = from; + nEntry.to = from + delta; + from += delta; + entries[j] = nEntry; + rgbs[j] = nEntry.color; + nEntry.index = j++; + } + } // limited interval + } // for all original entries + + buildLookup(); + } + + private static final int intValue(String s, int def) { + if (s == null || (s = s.trim()).length() == 0) { + return def; + } + try { + return Integer.parseInt(s); + } + catch (NumberFormatException nfe) { + log.error(nfe.getLocalizedMessage(), nfe); + } + return def; + } + + private static final double doubleValue(String s) { + if (s == null || (s = s.trim()).length() == 0) { + return 0d; + } + if ((s = s.toLowerCase()).startsWith("-inf")) { + return -Double.MAX_VALUE; // XXX: Not using Double.NEGATIVE_INFINITY! + } + + if (s.startsWith("inf")) { + return Double.MAX_VALUE; // XXX: Not using Double.NEGATIVE_INFINITY! + } + + return Double.parseDouble(s); + } + + private static final Color color(String s) { + if (s == null || (s = s.trim()).length() == 0) { + return null; + } + return Color.decode(s); + } + + + protected void buildLookup() { + Arrays.sort(entries); + lookup = buildLookup(entries, 0, entries.length-1); + } + + public Palette subdivide(int N) { + return new Palette(this, N); + } + + public int getSize() { + return rgbs.length; + } + + public Color getColor(int index) { + return rgbs[index]; + } + + public int indexToRGB(int index) { + return rgbs[index].getRGB(); + } + + public int toIndex(double value) { + return lookup.locate(value); + } + + public Entry getEntry(double value) { + return lookup.locateEntry(value); + } + + public Entry getEntryByIndex(int index) { + return lookup.findByIndex(index); + } +} +// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8: diff -r f99d8f92a640 -r 755dd2fa4a0a gnv-artifacts/src/main/java/de/intevation/gnv/raster/PaletteManager.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv-artifacts/src/main/java/de/intevation/gnv/raster/PaletteManager.java Fri Sep 28 12:13:53 2012 +0200 @@ -0,0 +1,71 @@ +package de.intevation.gnv.raster; + +import java.util.HashMap; + +import java.lang.ref.SoftReference; + +/** + * @author Sascha L. Teichmann (sascha.teichmann@intevation.de) + */ +public class PaletteManager +{ + protected Palette base; + + protected String description; + protected String name; + + protected HashMap> levels; + + public PaletteManager() { + } + + public PaletteManager( + String name, + String description, + Palette base + ) { + this.name = name; + this.description = description; + this.base = base; + levels = new HashMap>(); + } + + public String getDescription() { + return description; + } + + public String getName() { + return name; + } + + public Palette getBase() { + return base; + } + + public Palette getLevel(int n) { + if (n < 2) { + return base; + } + + Integer N = Integer.valueOf(n); + + Palette palette; + + synchronized (levels) { + SoftReference ref = levels.get(N); + + if (ref != null && (palette = ref.get()) != null) { + return palette; + } + + palette = base.subdivide(n); + + ref = new SoftReference(palette); + + levels.put(N, ref); + } + + return palette; + } +} +// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8: diff -r f99d8f92a640 -r 755dd2fa4a0a gnv-artifacts/src/main/java/de/intevation/gnv/raster/PolygonDatasetProducer.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv-artifacts/src/main/java/de/intevation/gnv/raster/PolygonDatasetProducer.java Fri Sep 28 12:13:53 2012 +0200 @@ -0,0 +1,86 @@ +package de.intevation.gnv.raster; + +import java.util.List; +import java.util.HashMap; + +import gnu.trove.TDoubleArrayList; + +import de.intevation.gnv.raster.Vectorizer.Edge; + +import de.intevation.gnv.jfreechart.PolygonSeries; +import de.intevation.gnv.jfreechart.PolygonDataset; +import de.intevation.gnv.jfreechart.CompactXYItems; + +/** + * @author Sascha L. Teichmann (sascha.teichmann@intevation.de) + */ +public class PolygonDatasetProducer +extends AbstractProducer +{ + protected HashMap polygonSeries; + + protected PolygonDatasetProducer() { + } + + public PolygonDatasetProducer( + double minX, double minY, + double maxX, double maxY + + ) { + super(minX, minY, maxX, maxY); + polygonSeries = new HashMap(); + } + + public void handleRings( + List rings, + int value, + int width, + int height + ) { + if (value == -1) { + return; + } + + Integer v = Integer.valueOf(value); + + PolygonSeries ps = polygonSeries.get(v); + + if (ps == null) { + polygonSeries.put(v, ps = new PolygonSeries()); + ps.setAttribute("fill", v); + } + + TDoubleArrayList vertices = new TDoubleArrayList(); + + /* minX = 0*m1 + b1 <=> b1 = minX + * maxX = (width-1)*m1 + b1 + * m1 = (maxX - minX)/(width-1) + */ + + double b1 = minX; + double m1 = width != 1 + ? (maxX - minX)/(width-1) + : 0d; + + double b2 = minY; + double m2 = height != 1 + ? (maxY - minY)/(height-1) + : 0d; + + for (Edge head: rings) { + Edge current = head; + do { + vertices.add(m1*(current.a % width) + b1); + vertices.add(m2*(current.a / width) + b2); + } + while ((current = current.next) != head); + ps.addRing(new CompactXYItems(vertices.toNativeArray())); + vertices.reset(); + } + } + + public PolygonDataset getPolygonDataset() { + return new PolygonDataset(polygonSeries.values()); + } +} +// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8: diff -r f99d8f92a640 -r 755dd2fa4a0a gnv-artifacts/src/main/java/de/intevation/gnv/raster/Raster.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv-artifacts/src/main/java/de/intevation/gnv/raster/Raster.java Fri Sep 28 12:13:53 2012 +0200 @@ -0,0 +1,237 @@ +package de.intevation.gnv.raster; + +/** + * @author Sascha L. Teichmann (sascha.teichmann@intevation.de) + */ +public class Raster +{ + public static class Kernel { + + public static final class Coeff { + public int di; + public int dj; + public double c; + + public Coeff() { + } + + public Coeff(int di, int dj, double c) { + this.di = di; + this.dj = dj; + this.c = c; + } + + public String toString() { + return String.valueOf(c); + } + + } // class Coeff + + protected Coeff [] coeffs; + protected int width; + + public Kernel() { + } + + public Kernel(Coeff [] coeffs, int width) { + this.coeffs = coeffs; + this.width = width; + } + + public static double gauss(double x, double y, double sigma) { + double s2 = sigma*sigma; + return 1.0d/(2.0d*Math.PI*s2)*Math.exp(-(x*x + y*y)/(2.0d*s2)); + } + + public static Kernel createGauss() { + return createGauss(1.0d, 5); + } + + public static Kernel createGauss(double sigma, int width) { + Coeff [] coeffs = new Coeff[width*width]; + double sum = 0d; + for (int j = 0; j < width; ++j) { + int y = -width/2 + j; + for (int i = 0; i < width; ++i) { + int x = -width/2 + i; + double c = gauss(x, y, sigma); + coeffs[j*width + i] = new Coeff(x, y, c); + sum += c; + } + } + sum = 1.0/sum; + for (int i = 0; i < coeffs.length; ++i) { + coeffs[i].c *= sum; + } + return new Kernel(coeffs, width); + } + + public double fold(Access access, int i, int j) { + + double s = 0.0d; + + double unused = 0d; + + for (int k = 0; k < coeffs.length; ++k) { + Coeff coeff = coeffs[k]; + double v = access.get(i + coeff.di, j + coeff.dj); + if (Double.isNaN(v)) { + unused += coeff.c; + } + else { + s += v * coeff.c; + } + } + + return s*(1.0d - unused); + } + + public String toString() { + StringBuilder sb = new StringBuilder(); + + int height = coeffs.length/width; + + for (int j = 0; j < height; ++j) { + if (j > 0) { + sb.append(System.getProperty("line.separator")); + } + for (int i = 0; i < width; ++i) { + if (i > 0) { + sb.append("\t"); + } + sb.append(coeffs[j*width + i]); + } + } + + return sb.toString(); + } + } // class Kernel + + public interface Access { + + double get(int i, int j); + + } // interface Access + + public interface ValueToIndex { + + int toIndex(double value); + + } // interface ValueToIndex; + + public static class IsoClasses + implements ValueToIndex + { + protected double m; + protected double b; + protected int numClasses; + + public IsoClasses(Raster raster, int numClasses) { + + this.numClasses = numClasses; + + double min = Double.MAX_VALUE; + double max = -Double.MAX_VALUE; + + double [] src = raster.raster; + + for (int i = 0; i < src.length; ++i) { + double x = src[i]; + if (!Double.isNaN(x)) { + if (x < min) min = x; + if (x > max) max = x; + } + } + + /* f(min) = 0, f(max) = numClasses - 1 + + I: 0 = m*min + b + II: numClasses - 1 = m*max + b + + II - I: + numClasses - 1 = m*(max - min) + + m = (numClasses - 1)/(max - min) + b = m*min + */ + + if (max == min) { + m = 0; + b = 0; + } + else { + m = (numClasses - 1)/(max - min); + b = m*min; + } + } + + public int toIndex(double value) { + return Double.isNaN(value) + ? -1 + : Math.min(Math.max(0, (int)Math.round(m*value + b)), numClasses-1); + } + } // class IsoClasses + + protected double [] raster; + protected int width; + + public Raster() { + this(new double[0], 0); + } + + public Raster(double [] raster, int width) { + this.raster = raster; + this.width = width; + } + + public int getWidth() { + return width; + } + + public int getHeight() { + return raster.length / width; + } + + public double [] getValues() { + return raster; + } + + public int [] toIndexed(ValueToIndex valueToIndex) { + int [] dst = new int[raster.length]; + for (int i = 0; i < raster.length; ++i) { + dst[i] = valueToIndex.toIndex(raster[i]); + } + return dst; + } + + public Raster create(Kernel kernel) { + double [] dst = new double[raster.length]; + Raster r = new Raster(dst, width); + r.apply(kernel, continueBorder()); + return r; + } + + public void apply(Kernel kernel, Access access) { + int height = getHeight(); + for (int j = 0; j < height; ++j) { + int row = j*width; + for (int i = 0; i < width; ++i) { + raster[row + i] = kernel.fold(access, i, j); + } + } + } + + public Access continueBorder() { + return new Access() { + int height = getHeight()-1; + public double get(int i, int j) { + if (i < 0) i = 0; + else if (i >= width) i = width-1; + if (j < 0) j = 0; + else if (j > height) j = height; + return raster[j*width + i]; + } + }; + } +} +// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8: diff -r f99d8f92a640 -r 755dd2fa4a0a gnv-artifacts/src/main/java/de/intevation/gnv/raster/RasterToPPM.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv-artifacts/src/main/java/de/intevation/gnv/raster/RasterToPPM.java Fri Sep 28 12:13:53 2012 +0200 @@ -0,0 +1,41 @@ +package de.intevation.gnv.raster; + +import java.io.IOException; +import java.io.OutputStream; + +import java.awt.Color; + +/** + * @author Sascha L. Teichmann (sascha.teichmann@intevation.de) + */ +public class RasterToPPM +{ + private RasterToPPM() { + } + + public static void writeToPPM(Raster raster, Palette palette, OutputStream out) + throws IOException + { + int W = raster.getWidth(); + int H = raster.getHeight(); + out.write(("P6\n" + W + " " + H + "\n255\n").getBytes("US-ASCII")); + double [] values = raster.getValues(); + int pos = 0; + byte [] data = new byte[W*3]; + int black = Color.BLACK.getRGB(); + for (int i = 0; i < H; ++i) { + for (int j = 0; j < data.length; ++pos) { + Palette.Entry entry = palette.getEntry(values[pos]); + int rgb = entry == null + ? black + : entry.getColor().getRGB(); + data[j++] = (byte)((rgb >> 16) & 0xff); + data[j++] = (byte)((rgb >> 8) & 0xff); + data[j++] = (byte)( rgb & 0xff); + } + out.write(data); + } + out.flush(); + } +} +// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 : diff -r f99d8f92a640 -r 755dd2fa4a0a gnv-artifacts/src/main/java/de/intevation/gnv/raster/Vectorizer.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv-artifacts/src/main/java/de/intevation/gnv/raster/Vectorizer.java Fri Sep 28 12:13:53 2012 +0200 @@ -0,0 +1,343 @@ +package de.intevation.gnv.raster; + +import java.util.BitSet; +import java.util.List; +import java.util.ArrayList; + +import gnu.trove.TIntStack; +import gnu.trove.TIntObjectHashMap; + +import org.apache.log4j.Logger; + +/** + * @author Sascha L. Teichmann (sascha.teichmann@intevation.de) + */ +public class Vectorizer +{ + private static Logger log = Logger.getLogger(Vectorizer.class); + + public interface RingsHandler { + + void handleRings( + List rings, + int value, + int width, + int height); + + } // interface RingsHandler + + public static final class Edge { + + public Edge prev; + public Edge next; + + public int a; + public int b; + + public Edge() { + } + + public Edge(int a, int b) { + this.a = a; + this.b = b; + } + + public Edge(Edge other) { + a = other.a; + b = other.b; + } + + public void chain(Edge other, int found) { + + if (found == a) { + other.next = this; + prev = other; + return; + } + + if (found == b) { + next = other; + other.prev = this; + return; + } + + throw new IllegalStateException("cannot chain"); + } + + public boolean isComplete() { + Edge current = this; + do { + if (current.prev == null || current.next == null) { + return false; + } + current = current.next; + } + while (current != this); + return true; + } + + public int length() { + int length = 0; + Edge current = this; + do { ++length; } + while ((current = current.next) != null && current != this); + return length; + } + + public Edge head() { + Edge current = this; + while (current.prev != null) { + current = current.prev; + } + return current; + } + + public int hashCode() { + return (a << 16) | b; + } + + public boolean equals(Object other) { + Edge e = (Edge)other; + return a == e.a && b == e.b; + } + } // class Edge + + protected static Edge simplify(Edge edge, int width) { + + Edge e1 = edge, start = edge; + + int length = edge.length(); + + if (length < 2) { + return e1; + } + + Edge e2 = edge.next; + + int count = 0; + + do { + int e1x = e1.a % width; + int e1y = e1.a / width; + int e2x = e1.b % width; + int e2y = e1.b / width; + int e3x = e2.b % width; + int e3y = e2.b / width; + + if ((e1x == e2x && e2x == e3x && e1x == e3x) + || (e1y == e2y && e2y == e3y && e1y == e3y)) { + e1.b = e2.b; + Edge removed = e1.next; + e1.next = e2.next; + if (e1.next != null) { + e1.next.prev = e1; + } + e2 = e1.next; + count = 0; + --length; + if (removed == start) { + start = e1; + } + } + else { + e1 = e1.next; + e2 = e2.next; + ++count; + } + } + while (length > 1 && e2 != null && count < length + 2); + + return start; + } + + protected int [] raster; + protected int width; + protected TIntObjectHashMap openEdges; + protected List rings; + protected boolean simplify; + + public Vectorizer() { + this(true); + } + + public Vectorizer(boolean simplify) { + openEdges = new TIntObjectHashMap(); + rings = new ArrayList(); + this.simplify = simplify; + } + + public Vectorizer(int [] raster, int width) { + this(true, raster, width); + } + + public Vectorizer(boolean simplify, int [] raster, int width) { + this(simplify); + this.raster = raster; + this.width = width; + } + + public static final int tl(int i, int w) { + int x = i % w; + int y = i / w; + return x + (w + 1)*y; + } + + public static final int tr(int i, int w) { + return tl(i, w) + 1; + } + + public static final int bl(int i, int w) { + return tl(i, w) + w + 1; + } + + public static final int br(int i, int w) { + return bl(i, w) + 1; + } + + protected void resetRegion() { + openEdges.clear(); + rings.clear(); + } + + protected void emit(Edge edge) { + + Edge otherA = (Edge)openEdges.remove(edge.a); + if (otherA != null) { + otherA.chain(edge, edge.a); + } + + Edge otherB = (Edge)openEdges.remove(edge.b); + if (otherB != null) { + otherB.chain(edge, edge.b); + } + + if (edge.isComplete()) { + rings.add(simplify ? simplify(edge, width + 1) : edge); + } + else { + if (otherA == null) { + openEdges.put(edge.a, edge); + } + if (otherB == null) { + openEdges.put(edge.b, edge); + } + } + } + + public int process(RingsHandler handler) { + + BitSet visited = new BitSet(raster.length); + + TIntStack stack = new TIntStack(); + + int regions = 0; + + int height = raster.length / width; + + for (int i = 0; i < raster.length; ++i) { + if (visited.get(i)) { + continue; + } + + ++regions; + + int currentValue = raster[i]; + visited.set(i); + + int current = i; + visited.set(current); + + for (;;) { + int tl = tl(current, width); + int tr = tr(current, width); + int bl = bl(current, width); + int br = br(current, width); + + int t = current - width; + + if (t < 0) { + emit(new Edge(tr, tl)); + } + else { + if (raster[t] != currentValue) { + emit(new Edge(tr, tl)); + } + else { + if (!visited.get(t)) { + visited.set(t); + stack.push(t); + } + } + } + + int b = current + width; + + if (b >= raster.length) { + emit(new Edge(bl, br)); + } + else { + if (raster[b] != currentValue) { + emit(new Edge(bl, br)); + } + else { + if (!visited.get(b)) { + visited.set(b); + stack.push(b); + } + } + } + + int x = current % width; + + if (x == 0) { + emit(new Edge(tl, bl)); + } + else { + int l = current - 1; + if (raster[l] != currentValue) { + emit(new Edge(tl, bl)); + } + else { + if (!visited.get(l)) { + visited.set(l); + stack.push(l); + } + } + } + + if (x == width - 1) { + emit(new Edge(br, tr)); + } + else { + int r = current + 1; + if (raster[r] != currentValue) { + emit(new Edge(br, tr)); + } + else { + if (!visited.get(r)) { + visited.set(r); + stack.push(r); + } + } + } + + if (stack.size() == 0) { + break; + } + + current = stack.pop(); + } + + handler.handleRings( + rings, + currentValue, + width + 1, + height + 1); + + resetRegion(); + } + + return regions; + } +} +// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8: diff -r f99d8f92a640 -r 755dd2fa4a0a gnv-artifacts/src/main/java/de/intevation/gnv/state/CoordinateSelectionState.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv-artifacts/src/main/java/de/intevation/gnv/state/CoordinateSelectionState.java Fri Sep 28 12:13:53 2012 +0200 @@ -0,0 +1,174 @@ +/** + * + */ +package de.intevation.gnv.state; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.HashMap; +import java.util.Iterator; +import java.util.List; + +import org.apache.log4j.Logger; +import org.w3c.dom.Element; +import org.w3c.dom.Node; +import org.w3c.dom.NodeList; + +import com.vividsolutions.jts.geom.Point; + +import de.intevation.artifactdatabase.Config; +import de.intevation.gnv.geobackend.base.Result; +import de.intevation.gnv.state.describedata.DefaultKeyValueDescribeData; +import de.intevation.gnv.state.describedata.KeyValueDescibeData; +import de.intevation.gnv.state.describedata.NamedArrayList; +import de.intevation.gnv.state.describedata.NamedCollection; +import de.intevation.gnv.utils.ArtifactXMLUtilities; +import de.intevation.gnv.utils.InputValidator; +import de.intevation.gnv.utils.WKTUtils; +import de.intevation.gnv.utils.exception.ValidationException; + +/** + * @author Tim Englich + * + */ +public class CoordinateSelectionState extends StateBase { + + /** + * the logger, used to log exceptions and additonaly information + */ + private static Logger log = Logger.getLogger(CoordinateSelectionState.class); + + /** + * The UID of this Class + */ + private static final long serialVersionUID = 6318923553625195063L; + + /** + * XPATH Expressions for the setup. + */ + + private final static String MESH_WIDTH_XPATH = "mesh-width"; + private final static String XLINK_XPATH = "xlink:href"; + private final static String MESH_LIST_XPATH = "/mesh-widths/mesh"; + private final static String ID_XPATH = "id"; + private final static String WIDTH_VALUE_XPATH = "width"; + + /** + * Holds all given Widths between two MeshPoints for different Meshes. + */ + private HashMap meshWidths = null; + + /** + * Constructor + */ + public CoordinateSelectionState() { + super(); + } + + @Override + protected List purifyResult(Collection result, String uuid) { + log.debug("CoordinateSelectionState.purifyResult"); + List describeData = new ArrayList(); + + NamedCollection keyValueDescibeData = + extractKVP(result, "FEATUREID", "SHAPE"); + + describeData.add(keyValueDescibeData); + return describeData; + } + + /** + * @see de.intevation.gnv.state.StateBase#prepareInputData4RegionDBQuery(java.lang.String) + */ + @Override + protected String prepareInputData4RegionDBQuery(String value) { + log.debug("CoordinateSelectionState.prepareInputData4RegionDBQuery"); + double distance=0.; + String returnValue = null; + try { + Point center = new InputValidator().getPointValue(value); + String meshId = super.inputData.get("meshid").getValue(); + int segments = 97; + if (meshWidths != null){ + Double distanceValue = this.meshWidths.get(meshId); + if (distanceValue != null){ + log.debug("User "+distanceValue+" as Buffer around given Point"); + distance = distanceValue.doubleValue(); + }else{ + log.warn("No distance is configured for Mesh with id"+ meshId); + } + }else{ + log.warn("No MeshWidth configured. Check if this is correct."); + } + returnValue = center.buffer(distance,segments).toText(); + } catch (NumberFormatException e) { + log.error(e,e); + } catch (ValidationException e) { + log.error(e,e); + } + return returnValue; + + } + + /** + * @see de.intevation.gnv.state.StateBase#extractKVP(java.util.Collection, java.lang.String, java.lang.String) + */ + @Override + protected NamedCollection extractKVP( + Collection result, + String keyid, + String valueid) { + Iterator rit = result.iterator(); + NamedCollection keyValueDescibeData = new NamedArrayList( + this.dataName, result.size()); + keyValueDescibeData.setMultiSelect(this.dataMultiSelect); + String prevKey = null; + while (rit.hasNext()) { + Result resultValue = rit.next(); + String key = resultValue.getString(keyid); + if(prevKey == null || !prevKey.equals(key)){ // TODO: FIXME: We have to do that because the arcsde does not support a distinct Query on Layers + String geomString = this.convert2DisplayCoordinate(resultValue.getString(valueid)); + String value = geomString; + if (resultValue.getResultDescriptor().getColumnIndex("VALUE") > 0){ + value = resultValue.getString("VALUE") + " - "+value; + } + + + keyValueDescibeData.add(new DefaultKeyValueDescribeData(key,value )); + } + prevKey = key; + } + return keyValueDescibeData; + } + + protected static String convert2DisplayCoordinate(String wkt){ + return WKTUtils.toText(wkt); + } + + /** + * @see de.intevation.gnv.state.StateBase#setup(org.w3c.dom.Node) + */ + @Override + public void setup(Node configuration) { + super.setup(configuration); + Element widthElement = (Element)Config.getNodeXPath(configuration, MESH_WIDTH_XPATH); + + if (widthElement != null){ + String fileName = widthElement.getAttribute(XLINK_XPATH); + fileName = Config.replaceConfigDir(fileName); + Node configurationNode = new ArtifactXMLUtilities().readConfiguration(fileName); + NodeList meshNodes = Config.getNodeSetXPath(configurationNode,MESH_LIST_XPATH ); + if (meshNodes != null){ + meshWidths = new HashMap(meshNodes.getLength()); + for (int i = 0; i < meshNodes.getLength(); i++){ + Element meshNode = (Element)meshNodes.item(i); + String id = meshNode.getAttribute(ID_XPATH); + Double value = Double.parseDouble(meshNode.getAttribute(WIDTH_VALUE_XPATH)); + meshWidths.put(id, value); + } + } + }else{ + log.warn("No Mesh Width defined."); + } + } +} diff -r f99d8f92a640 -r 755dd2fa4a0a gnv-artifacts/src/main/java/de/intevation/gnv/state/DefaultExportMode.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv-artifacts/src/main/java/de/intevation/gnv/state/DefaultExportMode.java Fri Sep 28 12:13:53 2012 +0200 @@ -0,0 +1,31 @@ +package de.intevation.gnv.state; + +/** + * @author Ingo Weinzierl (ingo.weinzierl@intevation.de) + */ +public class DefaultExportMode +implements ExportMode +{ + protected String name; + protected String description; + protected String mimeType; + + public DefaultExportMode(String name, String description, String mimeType){ + this.name = name; + this.description = description; + this.mimeType = mimeType; + } + + public String getName() { + return name; + } + + public String getDescription() { + return description; + } + + public String getMimeType() { + return mimeType; + } +} +// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8: diff -r f99d8f92a640 -r 755dd2fa4a0a gnv-artifacts/src/main/java/de/intevation/gnv/state/DefaultInputData.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv-artifacts/src/main/java/de/intevation/gnv/state/DefaultInputData.java Fri Sep 28 12:13:53 2012 +0200 @@ -0,0 +1,127 @@ +package de.intevation.gnv.state; + +import java.util.HashMap; +import java.util.Map; + +import org.apache.log4j.Logger; + +/** + * @author Tim Englich (tim.englich@intevation.de) + * @author Ingo Weinzierl (ingo.weinzierl@intevation.de) + */ +public class DefaultInputData implements InputData { + + /** + * + */ + private static final long serialVersionUID = 4308041648698108066L; + + private static final Logger logger = Logger.getLogger(DefaultInputData.class); + + private final static String VALUE_SEPARATOR = " , "; + + protected String name; + protected String value; + protected Map description; + protected Object object; + + + /** + * Constructor + */ + public DefaultInputData(String name, String value) { + this.name = name; + this.value = value; + } + + public DefaultInputData(String name, Object object) { + this.name = name; + this.object = object; + } + + /** + * @see de.intevation.gnv.state.InputData#getName() + */ + public String getName() { + return this.name; + } + + /** + * @see de.intevation.gnv.state.InputData#getValue() + */ + public String getValue() { + return this.value; + } + + public void setObject(Object object) { + this.object = object; + } + + public Object getObject() { + return object; + } + + public String getDescription(String key) { + if (description == null) + return null; + + return (String) description.get(key); + } + + public String[] getDescription() { + String[] values = splitValue(); + int length = values.length; + + String[] description = new String[length]; + for (int i = 0; i < length; i++) { + description[i] = (String) this.description.get(values[i]); + } + + return description; + } + + public void setDescription(String[] description) { + if (this.description == null) + this.description = new HashMap(); + + String[] values = splitValue(); + + int length = values.length; + int descLength = description.length; + + for (int i = 0; i < length; i++) { + if (i < descLength) { + this.description.put(values[i], description[i]); + } + else { + break; + } + } + } + + /** + * @see java.lang.Object#toString() + */ + @Override + public String toString() { + return this.name + "==> " + this.value; + } + + /** + * @see de.intevation.gnv.state.InputData#concartValue(java.lang.String) + */ + public void concartValue(String value) { + this.value = this.value + VALUE_SEPARATOR + value; + } + + /** + * @see de.intevation.gnv.state.InputData#splitValue() + */ + public String[] splitValue() { + if (this.value != null){ + return this.value.split(VALUE_SEPARATOR); + } + return null; + } + +} diff -r f99d8f92a640 -r 755dd2fa4a0a gnv-artifacts/src/main/java/de/intevation/gnv/state/DefaultInputValue.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv-artifacts/src/main/java/de/intevation/gnv/state/DefaultInputValue.java Fri Sep 28 12:13:53 2012 +0200 @@ -0,0 +1,78 @@ +/** + * + */ +package de.intevation.gnv.state; + +/** + * @author Tim Englich + * + */ +public class DefaultInputValue implements InputValue { + + /** + * The UID of this Class. + */ + private static final long serialVersionUID = -8518824299166180986L; + private String name = null; + private String type = null; + private boolean multiselect = false; + private int usedInQueries = 1; + private String defaultValue = "N/N"; + + public DefaultInputValue(String name, String type, String defaultValue, + boolean multiselect) { + this(name, type, multiselect, 1); + this.defaultValue = defaultValue; + + } + + /** + * Constructor + */ + public DefaultInputValue(String name, String type, boolean multiselect, + int usedInQueries) { + this.name = name; + this.type = type; + this.multiselect = multiselect; + this.usedInQueries = usedInQueries; + } + + /** + * @see de.intevation.gnv.state.InputValue#getName() + */ + public String getName() { + return this.name; + } + + /** + * @see de.intevation.gnv.state.InputValue#getType() + */ + public String getType() { + return this.type; + } + + /** + * @see java.lang.Object#toString() + */ + @Override + public String toString() { + return "InputValue " + this.name + " ==> " + this.type + + "==> multiselect: " + this.multiselect; + } + + /** + * @see de.intevation.gnv.state.InputValue#isMultiselect() + */ + public boolean isMultiselect() { + return this.multiselect; + } + + public int usedInQueries() { + return this.usedInQueries; + } + + public String getDefaultValue() { + return this.defaultValue; + } + +} diff -r f99d8f92a640 -r 755dd2fa4a0a gnv-artifacts/src/main/java/de/intevation/gnv/state/DefaultOutputMode.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv-artifacts/src/main/java/de/intevation/gnv/state/DefaultOutputMode.java Fri Sep 28 12:13:53 2012 +0200 @@ -0,0 +1,86 @@ +package de.intevation.gnv.state; + +import java.util.Collection; +import java.util.List; + +/** + * @author Tim Englich (tim.englich@intevation.de) + * @author Ingo Weinzierl (ingo.weinzierl@intevation.de) + */ +public class DefaultOutputMode implements OutputMode { + + /** + * The UID of this Class. + */ + private static final long serialVersionUID = -6459085460904827056L; + private String name = null; + private String description = null; + private String mimeType = null; + private Collection inputParameters = null; + private List exportModes; + + /** + * Constructor + * + * @param name + * @param description + * @param mimeType + */ + public DefaultOutputMode( + String name, + String description, + String mimeType, + Collection inputParameters, + List exportModes) + { + super(); + this.name = name; + this.description = description; + this.mimeType = mimeType; + this.inputParameters = inputParameters; + this.exportModes = exportModes; + } + + /** + * @see de.intevation.gnv.state.OutputMode#getDescription() + */ + public String getDescription() { + return this.description; + } + + /** + * @see de.intevation.gnv.state.OutputMode#getMimeType() + */ + public String getMimeType() { + return this.mimeType; + } + + /** + * @see de.intevation.gnv.state.OutputMode#getName() + */ + public String getName() { + return this.name; + } + + /** + * @see java.lang.Object#toString() + */ + @Override + public String toString() { + return "Name: " + this.name + " ; Description: " + this.description + + " ; Mime-Type: " + this.mimeType; + } + + /** + * @see de.intevation.gnv.state.OutputMode#getInputParameters() + */ + public Collection getInputParameters() { + return this.inputParameters; + } + + public List getExportModes() { + return exportModes; + } + +} +// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8: diff -r f99d8f92a640 -r 755dd2fa4a0a gnv-artifacts/src/main/java/de/intevation/gnv/state/DefaultState.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv-artifacts/src/main/java/de/intevation/gnv/state/DefaultState.java Fri Sep 28 12:13:53 2012 +0200 @@ -0,0 +1,23 @@ +/** + * + */ +package de.intevation.gnv.state; + +/** + * @author Tim Englich + * + */ +public class DefaultState extends StateBase { + + /** + * The UID of this Class + */ + private static final long serialVersionUID = 8934030362091576766L; + + /** + * Constructor + */ + public DefaultState() { + } + +} diff -r f99d8f92a640 -r 755dd2fa4a0a gnv-artifacts/src/main/java/de/intevation/gnv/state/ExportMode.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv-artifacts/src/main/java/de/intevation/gnv/state/ExportMode.java Fri Sep 28 12:13:53 2012 +0200 @@ -0,0 +1,15 @@ +package de.intevation.gnv.state; + +import java.io.Serializable; + +/** + * @author Ingo Weinzierl (ingo.weinzierl@intevation.de) + */ +public interface ExportMode +extends Serializable +{ + public String getName(); + public String getDescription(); + public String getMimeType(); +} +// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8: diff -r f99d8f92a640 -r 755dd2fa4a0a gnv-artifacts/src/main/java/de/intevation/gnv/state/InputData.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv-artifacts/src/main/java/de/intevation/gnv/state/InputData.java Fri Sep 28 12:13:53 2012 +0200 @@ -0,0 +1,31 @@ +/** + * + */ +package de.intevation.gnv.state; + +import java.io.Serializable; + +/** + * @author Tim Englich + * + */ +public interface InputData extends Serializable { + + public String getName(); + + public String getValue(); + + public void setObject(Object o); + + public Object getObject(); + + public void setDescription(String[] description); + + public String getDescription(String key); + + public String[] getDescription(); + + public void concartValue(String value); + + String[] splitValue(); +} diff -r f99d8f92a640 -r 755dd2fa4a0a gnv-artifacts/src/main/java/de/intevation/gnv/state/InputValue.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv-artifacts/src/main/java/de/intevation/gnv/state/InputValue.java Fri Sep 28 12:13:53 2012 +0200 @@ -0,0 +1,24 @@ +/** + * + */ +package de.intevation.gnv.state; + +import java.io.Serializable; + +/** + * @author Tim Englich + * + */ +public interface InputValue extends Serializable { + + public String getName(); + + public String getType(); + + public String getDefaultValue(); + + public boolean isMultiselect(); + + public int usedInQueries(); + +} diff -r f99d8f92a640 -r 755dd2fa4a0a gnv-artifacts/src/main/java/de/intevation/gnv/state/MeasurementState.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv-artifacts/src/main/java/de/intevation/gnv/state/MeasurementState.java Fri Sep 28 12:13:53 2012 +0200 @@ -0,0 +1,258 @@ +package de.intevation.gnv.state; + +import de.intevation.artifactdatabase.XMLUtils; + +import de.intevation.artifacts.CallMeta; + +import de.intevation.gnv.artifacts.ressource.RessourceFactory; + +import de.intevation.gnv.geobackend.base.Result; +import de.intevation.gnv.geobackend.base.ResultDescriptor; + +import de.intevation.gnv.state.describedata.ExtendedKeyValueData; +import de.intevation.gnv.state.describedata.KeyValueDescibeData; +import de.intevation.gnv.state.describedata.NamedArrayList; +import de.intevation.gnv.state.describedata.NamedCollection; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collection; +import java.util.Iterator; +import java.util.List; + +import org.apache.log4j.Logger; + +import org.w3c.dom.Document; +import org.w3c.dom.Element; +import org.w3c.dom.Node; + +/** + * @author Ingo Weinzierl (ingo.weinzierl@intevation.de) + */ +public class MeasurementState +extends DefaultState +{ + private static Logger logger = Logger.getLogger(MeasurementState.class); + + public static final String SQL_KEY_PARAMETERID = "PARAMETERID"; + + + private class ParameterMatrix { + private final Logger logger = + Logger.getLogger(ParameterMatrix.class); + + private List measurements; + private List mDescriptions; + private List parameters; + private boolean[][] values; + + public ParameterMatrix(Collection data, String[] parameter) { + measurements = new ArrayList(data.size()); + mDescriptions = new ArrayList(data.size()); + parameters = new ArrayList(parameter.length); + + values = new boolean[data.size()][parameter.length]; + for (int i = 0; i < data.size(); i++) { + Arrays.fill(values[i], false); + } + + initParameters(parameter); + initMeasurements(data); + } + + private void initMeasurements(Collection data) { + Iterator iter = data.iterator(); + while (iter.hasNext()) { + ExtendedKeyValueData value = (ExtendedKeyValueData) iter.next(); + String key = value.getKey(); + String val = value.getValue(); + String parameter = value.getParameter(); + + int i = measurements.indexOf(key); + int j = parameters.indexOf(parameter); + int tmp = mDescriptions.indexOf(val); + + if (i < 0) { + measurements.add(key); + i = measurements.indexOf(key); + } + + if (j < 0) { + logger.warn("Not a valid parameter: " + parameter); + } + + if (tmp < 0) { + mDescriptions.add(val); + tmp = mDescriptions.indexOf(val); + } + + if (i >= 0 && i < measurements.size() && j >= 0 + && j < parameters.size()) + { + values[i][j] = true; + } + } + } + + private void initParameters(String[] parameter) { + int count = parameter.length; + for (int i = 0; i < count; i++) { + parameters.add(parameter[i]); + } + } + + public int measurementSize() { + if (measurements != null) + return measurements.size(); + + return 0; + } + + public int parameterSize() { + if (parameters != null) + return parameters.size(); + + return 0; + } + + public String getMeasurement(int idx) { + if (idx >= 0 && idx < measurements.size()) + return (String) measurements.get(idx); + + logger.warn("Index is out of bounds: " + idx); + return ""; + } + + public String getParameter(int idx) { + if (idx >= 0 && idx < parameters.size()) { + return (String) parameters.get(idx); + } + + logger.warn("Index is out of bounds: " + idx); + return ""; + } + + public String getMDescription(int idx) { + if (mDescriptions != null) { + return (String) mDescriptions.get(idx); + } + + return null; + } + + public boolean isValid(int i, int j) { + if (i < 0 || i > measurements.size() + || j < 0 || j > parameters.size()) + { + logger.warn("Index out of bounds: " + i + "|" + j); + return false; + } + + return values[i][j]; + } + } // End of ParameterMatrix + + + public MeasurementState() { + super(); + } + + @Override + protected NamedCollection extractKVP( + Collection result, + String keyid, + String valueid + ) { + NamedCollection kvdd = + new NamedArrayList(dataName, result.size()); + + kvdd.setMultiSelect(true); + + int keyPos = -1; + int valPos = -1; + int parPos = -1; + + for (Result res: result) { + if (keyPos < 0 || valPos < 0 || parPos < 0) { + ResultDescriptor rd = res.getResultDescriptor(); + + keyPos = rd.getColumnIndex(keyid); + valPos = rd.getColumnIndex(valueid); + parPos = rd.getColumnIndex(SQL_KEY_PARAMETERID); + } + + kvdd.add(new ExtendedKeyValueData( + res.getString(keyPos), + res.getString(valPos), + getID(), + res.getString(parPos))); + } + + return kvdd; + } + + + @Override + protected void appendToDynamicNode( + XMLUtils.ElementCreator artCreator, + XMLUtils.ElementCreator creator, + Document document, + Node dynamicNode, + CallMeta callMeta, + Object o + ) { + NamedArrayList all = (NamedArrayList) o; + String name = all.getName(); + RessourceFactory factory = RessourceFactory.getInstance(); + + Element matrixNode = creator.create("group"); + Element matrixLabel = creator.create("label"); + matrixLabel.setTextContent(factory.getRessource( + callMeta.getLanguages(), all.getName(), all.getName())); + creator.addAttr(matrixNode, "mode", "matrix"); + matrixNode.appendChild(matrixLabel); + + InputData inputParam = inputData.get("parameterid"); + ParameterMatrix matrix = new ParameterMatrix(all, inputParam.splitValue()); + + int measurements = matrix.measurementSize(); + int parameters = matrix.parameterSize(); + + for (int i = 0; i < measurements; i++) { + Element select = creator.create("select"); + creator.addAttr(select, "label", matrix.getMDescription(i)); + creator.addAttr(select, "ref", name); + + for (int j = 0; j < parameters; j++) { + Element item = creator.create("item"); + Element label = creator.create("label"); + Element value = creator.create("value"); + + creator.addAttr(item, "ref", name); + creator.addAttr( + item, + "parameter", + inputParam.getDescription(matrix.getParameter(j))); + + if (!matrix.isValid(i, j)) { + creator.addAttr(item, "disabled", "true"); + } + else { + creator.addAttr(item, "disabled", "false"); + } + + label.setTextContent(matrix.getMDescription(i)); + value.setTextContent(matrix.getMeasurement(i)); + + item.appendChild(label); + item.appendChild(value); + select.appendChild(item); + } + + matrixNode.appendChild(select); + } + + dynamicNode.appendChild(matrixNode); + } +} +// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8: diff -r f99d8f92a640 -r 755dd2fa4a0a gnv-artifacts/src/main/java/de/intevation/gnv/state/MinMaxState.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv-artifacts/src/main/java/de/intevation/gnv/state/MinMaxState.java Fri Sep 28 12:13:53 2012 +0200 @@ -0,0 +1,207 @@ +package de.intevation.gnv.state; + +import de.intevation.artifactdatabase.XMLUtils; + +import de.intevation.artifacts.CallMeta; + +import de.intevation.gnv.artifacts.ressource.RessourceFactory; + +import de.intevation.gnv.geobackend.base.Result; + +import de.intevation.gnv.geobackend.util.DateUtils; + +import de.intevation.gnv.state.describedata.DefaultMinMaxDescribeData; +import de.intevation.gnv.state.describedata.DescribeData; +import de.intevation.gnv.state.describedata.MinMaxDescribeData; + +import de.intevation.gnv.state.exception.StateException; + +import de.intevation.gnv.utils.InputValidator; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.Date; +import java.util.GregorianCalendar; +import java.util.Iterator; +import java.util.List; + +import org.apache.log4j.Logger; + +import org.w3c.dom.Document; +import org.w3c.dom.Element; +import org.w3c.dom.Node; + +/** + * @author Tim Englich (tim.englich@intevation.de) + * @author Ingo Weinzierl (ingo.weinzierl@intevation.de) + */ +public class MinMaxState extends StateBase { + + /** + * The UID of this Class + */ + private static final long serialVersionUID = -3525903792105187408L; + /** + * the logger, used to log exceptions and additonaly information + */ + private static Logger log = Logger.getLogger(MinMaxState.class); + + /** + * Constructor + */ + public MinMaxState() { + super(); + } + + /** + * @see de.intevation.gnv.state.StateBase#purifyResult(java.util.Collection, + * java.lang.String) + */ + @Override + protected List purifyResult( + Collection result, String uuid) + { + List describeData = new ArrayList(); + + if (result != null && result.size() == 1) { + Result value = result.iterator().next(); + DescribeData values = new DefaultMinMaxDescribeData( + dataName, + value.getObject("MIN"), + value.getObject("MAX"), + getID()); + describeData.add(values); + } else { + log.warn("Result cannot be handled as MinMax Resultset"); + } + + return describeData; + } + + + /** + * @see de.intevation.gnv.state.StateBase#feed(java.util.Collection, + * java.lang.String) + */ + @Override + public void feed(Collection inputData, String uuid) + throws StateException + { + if (inputData == null) + return; + + InputValidator iv = new InputValidator(); + Iterator iter = inputData.iterator(); + + Object min = null; + Object max = null; + + while (iter.hasNext()) { + InputData tmp = (InputData) iter.next(); + InputValue meta = inputValues.get(tmp.getName()); + String value = tmp.getValue(); + String name = tmp.getName(); + + if (meta == null) { + log.warn("Input data not expected here. Data will be ignored."); + return; + } + + boolean valid = iv.isInputValid(value, meta.getType()); + if (!valid) { + String msg = "Input is not valid for this state."; + log.error(msg); + throw new StateException(msg); + } + + if (name.equals(MINVALUEFIELDNAME)) { + min = value; + } + + if (name.equals(MAXVALUEFIELDNAME)) { + max = value; + } + } + + if (min != null && max != null) { + DescribeData values = new DefaultMinMaxDescribeData( + dataName, min, max, getID()); + + this.inputData.put(dataName, new DefaultInputData(dataName, values)); + } + } + + + @Override + protected void appendToStaticNode( + XMLUtils.ElementCreator artCreator, + XMLUtils.ElementCreator creator, + Document document, + Node staticNode, + CallMeta callMeta + ) { + InputData data = inputData.get(dataName); + + if (data == null) { + return; + } + + MinMaxDescribeData minMax = (MinMaxDescribeData) data.getObject(); + + Object min = minMax.getMinValue(); + Object max = minMax.getMaxValue(); + if (min instanceof GregorianCalendar) { + Date d = ((GregorianCalendar) min).getTime(); + min = DateUtils.getPatternedDateAmer(d); + } + + if (max instanceof GregorianCalendar) { + Date d = ((GregorianCalendar) max).getTime(); + max = DateUtils.getPatternedDateAmer(d); + } + + Element groupNode = creator.create("group"); + artCreator.addAttr(groupNode, "state", minMax.getState(), true); + + creator.addAttr(groupNode, "ref", minMax.getName()); + Element groupNodeLableNode = creator.create("label"); + groupNodeLableNode.setTextContent(RessourceFactory + .getInstance().getRessource( + callMeta.getLanguages(), + minMax.getName(), + minMax.getName())); + groupNode.appendChild(groupNodeLableNode); + + Element inputMinNode = creator.create("input"); + creator.addAttr(inputMinNode, "ref", MINVALUEFIELDNAME); + Element inputMinLableNode = creator.create("label"); + inputMinLableNode.setTextContent(RessourceFactory + .getInstance().getRessource( + callMeta.getLanguages(), MINVALUEFIELDNAME, + MINVALUEFIELDNAME)); + inputMinNode.appendChild(inputMinLableNode); + + Element inputMinValueNode = creator.create("value"); + inputMinValueNode.setTextContent(min.toString()); + inputMinNode.appendChild(inputMinValueNode); + + Element inputMaxNode = creator.create("input"); + creator.addAttr(inputMaxNode, "ref", MAXVALUEFIELDNAME); + Element inputMaxLableNode = creator.create("label"); + inputMaxLableNode.setTextContent(RessourceFactory + .getInstance().getRessource( + callMeta.getLanguages(), MAXVALUEFIELDNAME, + MAXVALUEFIELDNAME)); + inputMaxNode.appendChild(inputMaxLableNode); + + Element inputMaxValueNode = creator.create("value"); + inputMaxValueNode.setTextContent(max.toString()); + inputMaxNode.appendChild(inputMaxValueNode); + + groupNode.appendChild(inputMinNode); + groupNode.appendChild(inputMaxNode); + + staticNode.appendChild(groupNode); + } +} +// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8: diff -r f99d8f92a640 -r 755dd2fa4a0a gnv-artifacts/src/main/java/de/intevation/gnv/state/OutputMode.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv-artifacts/src/main/java/de/intevation/gnv/state/OutputMode.java Fri Sep 28 12:13:53 2012 +0200 @@ -0,0 +1,25 @@ +/** + * + */ +package de.intevation.gnv.state; + +import java.io.Serializable; +import java.util.Collection; +import java.util.List; + +/** + * @author Tim Englich + * + */ +public interface OutputMode extends Serializable { + + public String getName(); + + public String getDescription(); + + public String getMimeType(); + + public Collection getInputParameters(); + + public List getExportModes(); +} diff -r f99d8f92a640 -r 755dd2fa4a0a gnv-artifacts/src/main/java/de/intevation/gnv/state/OutputState.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv-artifacts/src/main/java/de/intevation/gnv/state/OutputState.java Fri Sep 28 12:13:53 2012 +0200 @@ -0,0 +1,46 @@ +/** + * + */ +package de.intevation.gnv.state; + +import de.intevation.artifacts.CallContext; + +import de.intevation.gnv.state.exception.StateException; + +import java.io.OutputStream; + +import java.util.Collection; + +import org.w3c.dom.Document; + +/** + * @author Tim Englich (tim.englich@intevation.de) + * + */ +public interface OutputState +extends State +{ + + /** + * Returns the Rendered Result of an State. + * + * @param outputMode + * The Mode that should be produces (Chart, Map, ...) + * @return The Bytecode of the Result + * @throws StateException + */ + public void out( + Document format, + Collection inputData, + OutputStream outputStream, + String uuid, + CallContext callContext + ) throws StateException; + + /** + * Delivers the provided OutputModes of an State + * + * @return the provided OutputModes of an State + */ + public Collection getOutputModes(); +} diff -r f99d8f92a640 -r 755dd2fa4a0a gnv-artifacts/src/main/java/de/intevation/gnv/state/OutputStateBase.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv-artifacts/src/main/java/de/intevation/gnv/state/OutputStateBase.java Fri Sep 28 12:13:53 2012 +0200 @@ -0,0 +1,431 @@ +/** + * + */ +package de.intevation.gnv.state; + +import java.io.OutputStream; +import java.util.ArrayList; +import java.util.Collection; +import java.util.HashMap; +import java.util.Iterator; +import java.util.List; +import java.util.Locale; + +import javax.xml.xpath.XPathConstants; + +import net.sf.ehcache.Cache; + +import org.apache.log4j.Logger; +import org.w3c.dom.Document; +import org.w3c.dom.Element; +import org.w3c.dom.Node; +import org.w3c.dom.NodeList; + +import de.intevation.artifactdatabase.Config; +import de.intevation.artifactdatabase.XMLUtils; +import de.intevation.artifacts.CallContext; +import de.intevation.artifacts.CallMeta; +import de.intevation.gnv.artifacts.cache.CacheFactory; +import de.intevation.gnv.artifacts.ressource.RessourceFactory; +import de.intevation.gnv.geobackend.base.Result; +import de.intevation.gnv.geobackend.base.query.QueryExecutor; +import de.intevation.gnv.geobackend.base.query.QueryExecutorFactory; +import de.intevation.gnv.geobackend.base.query.exception.QueryException; +import de.intevation.gnv.state.describedata.MinMaxDescribeData; +import de.intevation.gnv.state.exception.StateException; +import de.intevation.gnv.utils.InputValidator; + +/** + * @author Tim Englich + * + */ +public abstract class OutputStateBase +extends StateBase +implements OutputState +{ + public static final String XPATH_OUTPUT_MODE = + "/art:action/art:out/@name"; + + public static final String XPATH_EXPORT_MODE = + "/art:action/art:out/art:export/@name"; + + public static final String XPATH_MIME_TYPE = + "/art:action/art:out/art:mime-type/@value"; + + public static final String XPATH_EXPORTS = + "exportModes/export"; + + /** + * The UID of this Class + */ + private static final long serialVersionUID = -1718732895737303823L; + + /** + * the logger, used to log exceptions and additonaly information + */ + private static Logger log = Logger.getLogger(OutputStateBase.class); + + /** + * The different Outputmodes which are provided by an OutputState + */ + protected Collection outputModes = null; + + protected String queryODVID = null; + + /** + * Constructor + */ + public OutputStateBase() { + super(); + } + + /** + * @see de.intevation.gnv.state.OutputState#getOutputModes() + */ + public Collection getOutputModes() { + log.debug("OutputStateBase.getOutputModes"); + return this.outputModes; + } + + /** + * @see de.intevation.gnv.state.StateBase#setup(org.w3c.dom.Node) + */ + @Override + public void setup(Node configuration) { + log.debug("OutputStateBase.setup"); + super.setup(configuration); + + this.queryODVID = Config.getStringXPath(configuration,"queryID-odv"); + + NodeList outputModeList = Config.getNodeSetXPath(configuration, + "outputsModes/outputsMode"); + if (outputModeList != null) { + log.debug(outputModeList.getLength() + " were found."); + this.outputModes = new ArrayList(outputModeList + .getLength()); + for (int i = 0; i < outputModeList.getLength(); i++) { + Element currentNode = (Element)outputModeList.item(i); + String name = currentNode.getAttribute("name"); + String description =currentNode.getAttribute("description"); + String mimeType = currentNode.getAttribute("mime-type"); + NodeList inputValuesList = Config.getNodeSetXPath(currentNode, + "parameters/inputvalue"); + Collection inputParameters = null; + if (inputValuesList != null) { + inputParameters = new ArrayList(inputValuesList + .getLength()); + for (int j = 0; j < inputValuesList.getLength(); j++) { + Element currentInputValuesNode = (Element)inputValuesList.item(j); + String inputValueName = currentInputValuesNode.getAttribute("name"); + String inputValueType = currentInputValuesNode.getAttribute("type"); + String defaultValue =currentInputValuesNode.getAttribute("value"); + boolean isMultiselect = false; + InputValue inputValue = new DefaultInputValue( + inputValueName, inputValueType, defaultValue, + isMultiselect); + inputParameters.add(inputValue); + } + } + + // parse export modes + List exportList = null; + NodeList exports = (NodeList) XMLUtils.xpath( + currentNode, XPATH_EXPORTS, XPathConstants.NODESET); + + if (exports != null) { + int exportSize = exports.getLength(); + + exportList = new ArrayList(exportSize); + for (int k = 0; k < exportSize; k++) { + Element exp = (Element) exports.item(k); + String expName = exp.getAttribute("name"); + String expDesc = exp.getAttribute("description"); + String expMime = exp.getAttribute("mime-type"); + + exportList.add( + new DefaultExportMode(expName, expDesc, expMime)); + } + } + + OutputMode outputMode = new DefaultOutputMode(name, + description, mimeType, inputParameters, exportList); + log.debug(outputMode.toString()); + this.outputModes.add(outputMode); + + } + } + } + + /** + * @see de.intevation.gnv.state.StateBase#advance() + */ + @Override + public void advance(String uuid, CallContext context) + throws StateException + { + } + + @Override + public void initialize(String uuid, CallContext context) + throws StateException + { + } + + public void out( + Document format, + Collection inputData, + OutputStream outputStream, + String uuid, + CallMeta callMeta + ) + throws StateException + { + } + + /** + * @see de.intevation.gnv.state.OutputState#out(java.lang.String, + * java.util.Collection, java.io.OutputStream) + */ + public void out(String outputMode, Collection inputData, + OutputStream outputStream) throws StateException { + } + + /** + * @return + */ + protected Object getChartResult(String uuid, CallContext callContext) { + log.debug("OutputStateBase.getChartResult"); + CacheFactory factory = CacheFactory.getInstance(); + + if (factory.isInitialized()) { + // we use a cache + log.info("Using cache."); + Cache cache = factory.getCache(); + String key = "chart_" + getHash(); + + net.sf.ehcache.Element value = cache.get(key); + if (value != null) { + log.debug("Found element in cache."); + return value.getObjectValue(); + } + else { + log.debug("Element not in cache, we need to ask the database"); + Object result = getData(queryID); + cache.put(new net.sf.ehcache.Element(key, result)); + + return result; + } + } + else { + // we don't use a cache, so we have to query the database every + // single time + log.info("Not using a cache."); + return getData(queryID); + } + } + + protected Object getChartFromCache(String uuid, CallContext callContext) { + log.debug("Fetch chart [" + uuid + "] from cache"); + CacheFactory cacheFactory = CacheFactory.getInstance(); + if (cacheFactory.isInitialized()) { + String key = "chart_" + getHash(); + net.sf.ehcache.Element object = cacheFactory.getCache().get(key); + + if (object != null) { + return object.getObjectValue(); + } + } + return null; + } + + protected Collection getODVResult(String uuid) { + log.debug("OutputStateBase.getODVResult"); + // TODO add Caching? I think it's not nessessary + Collection returnValue = null; + if (this.queryODVID != null){ + returnValue = this.getData(this.queryODVID); + }else{ + log.warn("No Query for ODV Data is defined."); + } + return returnValue; + } + + /** + * @param returnValue + * @return + */ + protected Collection getData(String queryID) { + log.debug("OutputStateBase.getData"); + Collection returnValue = null; + try { + String[] filterValues = this.generateFilterValuesFromInputData(); + try { + QueryExecutor queryExecutor = QueryExecutorFactory + .getInstance() + .getQueryExecutor(); + returnValue = queryExecutor.executeQuery(queryID,filterValues); + } catch (RuntimeException e) { + log.error(e, e); + } + } catch (QueryException e) { + log.error(e, e); + } + return returnValue; + } + + protected void removeChartResult(String uuid) { + log.debug("OutputStateBase.getChartResult"); + if (CacheFactory.getInstance().isInitialized()) { + String key = "chart_" + getHash(); + log.debug("Hash for Queryelements: " + key); + net.sf.ehcache.Element value = CacheFactory.getInstance().getCache().get(key); + if (value != null) { + CacheFactory.getInstance().getCache().remove(key); + } + } + } + + protected void removeChart(String uuid) { + log.debug("OutputStateBase.removeChart from cache"); + + CacheFactory cacheFactory = CacheFactory.getInstance(); + if (cacheFactory.isInitialized()) { + String key = "chart_" + getHash(); + net.sf.ehcache.Element object = cacheFactory.getCache().get(key); + if (object != null) + cacheFactory.getCache().remove(key); + } + } + + protected void purifyChart(Object chart, String uuid) { + log.debug("Prufify chart [" + uuid + "]"); + CacheFactory cacheFactory = CacheFactory.getInstance(); + if (cacheFactory.isInitialized()) { + String key = "chart_" + getHash(); + cacheFactory.getCache().put(new net.sf.ehcache.Element(key, chart)); + } + } + + + @Override + public void feed(Collection inputData, String uuid) + throws StateException + { + putInputData(inputData, uuid); + } + + /** + * @see de.intevation.gnv.state.StateBase#putInputData(java.util.Collection, java.lang.String) + */ + @Override + public void putInputData(Collection inputData, + String uuid) + throws StateException { + log.debug("OutputStateBase.putInputData"); + this.removeChartResult(uuid); + this.removeChart(uuid); + + if (inputData != null) { + Iterator it = inputData.iterator(); + InputValidator iv = new InputValidator(); + while (it.hasNext()) { + InputData tmpItem = it.next(); + Object tmpObj = tmpItem.getObject(); + InputValue inputValue = this.inputValues.get(tmpItem.getName()); + if (inputValue != null) { + if (this.inputData == null) { + this.inputData = new HashMap( + inputData.size()); + } + + boolean valid = iv.isInputValid(tmpItem.getValue(), + inputValue.getType()); + if (valid) { + if (tmpItem.getName().equals(MINVALUEFIELDNAME)){ + String minValue = tmpItem.getValue(); + String maxValue = getInputValue4ID(inputData, MAXVALUEFIELDNAME); + valid = iv.isInputValid(maxValue,inputValue.getType()); + if (!valid){ + String errMsg = "Wrong input for " + tmpItem.getValue() + + " is not an " + inputValue.getType() + + " Value."; + log.warn(errMsg); + throw new StateException(errMsg); + } + + valid = iv.isInputValid(minValue, + maxValue, + inputValue.getType()); + if (!valid){ + String errMsg = "MaxValue-Input is less than MinValue-Input "; + log.warn(errMsg); + throw new StateException(errMsg); + } + }else if (tmpItem.getName().equals(MAXVALUEFIELDNAME)){ + String minValue = getInputValue4ID(inputData, MINVALUEFIELDNAME); + String maxValue = tmpItem.getValue(); + valid = iv.isInputValid(minValue,inputValue.getType()); + if (!valid){ + String errMsg = "Wrong input for " + tmpItem.getValue() + + " is not an " + inputValue.getType() + + " Value."; + log.warn(errMsg); + throw new StateException(errMsg); + } + + valid = iv.isInputValid(minValue, + maxValue, + inputValue.getType()); + if (!valid){ + String errMsg = "MaxValue-Input is less than MinValue-Input "; + log.warn(errMsg); + throw new StateException(errMsg); + } + } + this.inputData.put(tmpItem.getName(), tmpItem); + } else { + String errMsg = "Wrong input for " + tmpItem.getValue() + + " is not an " + inputValue.getType() + + " Value."; + log.warn(errMsg); + throw new StateException(errMsg); + } + + } + else if (tmpObj != null && tmpObj instanceof MinMaxDescribeData) { + MinMaxDescribeData data = (MinMaxDescribeData) tmpObj; + if (this.inputData == null) { + this.inputData = new HashMap(inputData.size()); + } + this.inputData.put(tmpItem.getName(), tmpItem); + this.inputData.put("minvalue", new DefaultInputData("minvalue", (String) data.getMinValue())); + this.inputData.put("maxvalue", new DefaultInputData("maxvalue", (String) data.getMaxValue())); + } + else { + + String errMsg = "No Inputvalue given for Inputdata " + + tmpItem.getName(); + log.warn(errMsg + "Value will be ignored"); + + } + } + } else { + log.warn("No Inputdata given"); + } + } + + public void out(String outputMode, Collection inputData, + OutputStream outputStream, String uuid, CallMeta callMeta) + throws StateException { + } + + + protected String getMessage(Locale locale, String key, String value) { + return RessourceFactory.getInstance().getRessource( + locale, + key, + value + ); + } +} +// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8: diff -r f99d8f92a640 -r 755dd2fa4a0a gnv-artifacts/src/main/java/de/intevation/gnv/state/PreSettingsTransferState.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv-artifacts/src/main/java/de/intevation/gnv/state/PreSettingsTransferState.java Fri Sep 28 12:13:53 2012 +0200 @@ -0,0 +1,75 @@ +/** + * + */ +package de.intevation.gnv.state; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.Map; + +import org.w3c.dom.Element; +import org.w3c.dom.Node; + +import de.intevation.artifactdatabase.Config; +import de.intevation.artifacts.CallContext; +import de.intevation.gnv.state.exception.StateException; + +/** + * @author Tim Englich + * + */ +public class PreSettingsTransferState extends DefaultState { + + /** + * The UID of this Class + */ + private static final long serialVersionUID = 573381812690806922L; + + private String transferPreSettingsName = null; + + private String transferInputDataname = null; + /** + * Constructor + */ + public PreSettingsTransferState() { + super(); + } + + /** + * @see de.intevation.gnv.state.StateBase#initialize(java.lang.String, de.intevation.artifacts.CallContext) + */ + @Override + public void initialize(String uuid, CallContext context) + throws StateException { + Map preSettings = this.getPreSettings(); + if (preSettings != null){ + InputData ip = preSettings.get(transferPreSettingsName); + if (ip != null){ + Collection localInputdata = new ArrayList(1); + localInputdata.add(new DefaultInputData(transferInputDataname, + ip.getValue())); + this.putInputData(localInputdata, uuid); + } + } + + super.initialize(uuid, context); + } + + /** + * @see de.intevation.gnv.state.StateBase#setup(org.w3c.dom.Node) + */ + @Override + public void setup(Node configuration) { + + Element preSettingsNode = (Element)Config.getNodeXPath(configuration, + "presettings-transfer"); + if (preSettingsNode != null){ + this.transferPreSettingsName = preSettingsNode.getAttribute("presetting"); + this.transferPreSettingsName = preSettingsNode.getAttribute("inputvalue"); + } + super.setup(configuration); + } + + + +} diff -r f99d8f92a640 -r 755dd2fa4a0a gnv-artifacts/src/main/java/de/intevation/gnv/state/SingleInputState.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv-artifacts/src/main/java/de/intevation/gnv/state/SingleInputState.java Fri Sep 28 12:13:53 2012 +0200 @@ -0,0 +1,60 @@ +/** + * + */ +package de.intevation.gnv.state; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; + +import org.apache.log4j.Logger; + +import de.intevation.gnv.geobackend.base.Result; +import de.intevation.gnv.state.describedata.DefaultSingleValueDescribeData; + +/** + * @author Tim Englich + * + */ +public class SingleInputState extends StateBase { + + /** + * the logger, used to log exceptions and additonaly information + */ + private static Logger log = Logger.getLogger(SingleInputState.class); + + /** + * + */ + private static final long serialVersionUID = -6169497306324917318L; + + /** + * Constructor + */ + public SingleInputState() { + } + + /** + * @see de.intevation.gnv.state.StateBase#purifyResult(java.util.Collection, + * java.lang.String) + */ + @Override + protected List purifyResult(Collection result, String uuid) { + log.debug("SingleInputState.purifyResult"); + List describeData = new ArrayList(); + + String value = null; + if (result != null && result.size() == 1) { + Result tmpItem = result.iterator().next(); + value = tmpItem.getObject("MAX").toString(); + } else { + value = ""; + } + + describeData.add(new DefaultSingleValueDescribeData( + this.dataName, value, getID())); + + return describeData; + } + +} diff -r f99d8f92a640 -r 755dd2fa4a0a gnv-artifacts/src/main/java/de/intevation/gnv/state/State.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv-artifacts/src/main/java/de/intevation/gnv/state/State.java Fri Sep 28 12:13:53 2012 +0200 @@ -0,0 +1,65 @@ +/** + * + */ +package de.intevation.gnv.state; + +import java.io.Serializable; +import java.util.Collection; +import java.util.Map; + +import org.w3c.dom.Document; +import org.w3c.dom.Node; + +import de.intevation.artifacts.CallContext; +import de.intevation.gnv.state.exception.StateException; + +/** + * @author Tim Englich (tim.englich@intevation.de) + * @author Ingo Weinzierl (ingo.weinzierl@intevation.de) + * @author Sascha L. Teichmann (sascha.teichmann@intevation.de) + */ +public interface State extends Serializable { + + public void setup(Node configuration); + + public String getID(); + + public String getDescription(); + + public void describe( + Document document, + Node rootNode, + CallContext context, + String uuid + ); + + public void feed(Collection inputData, String uuid) + throws StateException; + + public void setParent(State state); + + public State getParent(); + + public Collection getRequiredInputValues(); + + public Map inputData(); + + public void putInputData(Collection inputData, String uuid) + throws StateException; + + public Collection getInputData() throws StateException; + + public void advance(String uuid, CallContext context) + throws StateException; + + public void initialize(String uuid, CallContext context) + throws StateException; + + public void reset(String uuid); + + public void endOfLife(Object globalContext); + + public void setPreSettings(Map preSettings); + + public Map getPreSettings(); +} diff -r f99d8f92a640 -r 755dd2fa4a0a gnv-artifacts/src/main/java/de/intevation/gnv/state/StateBase.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv-artifacts/src/main/java/de/intevation/gnv/state/StateBase.java Fri Sep 28 12:13:53 2012 +0200 @@ -0,0 +1,1007 @@ +package de.intevation.gnv.state; + +import de.intevation.artifactdatabase.Config; +import de.intevation.artifactdatabase.XMLUtils; + +import de.intevation.artifacts.ArtifactNamespaceContext; +import de.intevation.artifacts.CallContext; +import de.intevation.artifacts.CallMeta; + +import de.intevation.gnv.artifacts.cache.CacheFactory; + +import de.intevation.gnv.artifacts.ressource.RessourceFactory; + +import de.intevation.gnv.geobackend.base.Result; + +import de.intevation.gnv.geobackend.base.query.QueryExecutor; +import de.intevation.gnv.geobackend.base.query.QueryExecutorFactory; + +import de.intevation.gnv.geobackend.base.query.exception.QueryException; + +import de.intevation.gnv.geobackend.util.DateUtils; + +import de.intevation.gnv.state.describedata.DefaultKeyValueDescribeData; +import de.intevation.gnv.state.describedata.KeyValueDescibeData; +import de.intevation.gnv.state.describedata.MinMaxDescribeData; +import de.intevation.gnv.state.describedata.NamedArrayList; +import de.intevation.gnv.state.describedata.NamedCollection; +import de.intevation.gnv.state.describedata.SingleValueDescribeData; + +import de.intevation.gnv.state.exception.StateException; + +import de.intevation.gnv.utils.InputValidator; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collection; +import java.util.Date; +import java.util.GregorianCalendar; +import java.util.HashMap; +import java.util.Iterator; +import java.util.List; +import java.util.Map; + +import javax.xml.xpath.XPathConstants; + +import net.sf.ehcache.Cache; + +import org.apache.log4j.Logger; + +import org.w3c.dom.Document; +import org.w3c.dom.Element; +import org.w3c.dom.Node; +import org.w3c.dom.NodeList; + +/** + * @author Tim Englich (tim.englich@intevation.de) + * @author Ingo Weinzierl (ingo.weinzierl@intevation.de) + * @author Sascha L. Teichmann (sascha.teichmann@intevation.de) + */ +public abstract class StateBase implements State { + + /** + * The UID of this Class + */ + private static final long serialVersionUID = 2411169179001645426L; + + /** + * the logger, used to log exceptions and additonaly information + */ + private static Logger log = Logger.getLogger(StateBase.class); + + protected final static String MINVALUEFIELDNAME = "minvalue"; + protected final static String MAXVALUEFIELDNAME = "maxvalue"; + + private final static String NODATASELECTIONKEY = "n/n"; + + public final static String DESCRIBEDATAKEY = "_DESCRIBEDATA"; + + public final static String XPATH_STATIC_UI = "art:static"; + public final static String XPATH_DYNAMIC_UI = "art:dynamic"; + + /** input value names which should not be rendered from State itself */ + public final static String[] BLACKLIST = {"sourceid", "fisname"}; + + private String id = null; + + protected String hash; + + private String description = null; + + protected String dataName = null; + + protected String preSettingsName = null; + + protected boolean dataMultiSelect = false; + + protected boolean dataNoSelect = false; + + protected String queryID = null; + + protected Collection inputValueNames = null; + + protected Map inputValues = null; + + protected State parent = null; + + protected Map inputData = null; + + protected Map preSettings = null; + + /** + * Constructor + */ + public StateBase() { + super(); + } + + /** + * @see de.intevation.gnv.state.State#getID() + */ + public String getID() { + return this.id; + } + + /** + * @see de.intevation.gnv.state.State#getDescription() + */ + public String getDescription() { + return this.description; + } + + + + /** + * @see de.intevation.gnv.state.State#getRequiredInputValues() + */ + public Collection getRequiredInputValues() { + return this.inputValues.values(); + } + + + public void reset(String uuid) { + inputData.remove(dataName); + } + + + /** + * @see de.intevation.gnv.state.State#setup(org.w3c.dom.Node) + */ + public void setup(Node configuration) { + this.id = ((Element)configuration).getAttribute("id"); + this.description = ((Element)configuration).getAttribute("description"); + + log.info("State-ID = " + this.id); + + NodeList inputValuesNodes = Config.getNodeSetXPath(configuration, + "inputvalues/inputvalue"); + this.inputValues = new HashMap(inputValuesNodes + .getLength()); + this.inputValueNames = new ArrayList(inputValuesNodes + .getLength()); + for (int i = 0; i < inputValuesNodes.getLength(); i++) { + Element inputValueNode = (Element)inputValuesNodes.item(i); + String usedinQueryValue = inputValueNode.getAttribute("usedinquery"); + int usedinQuery = 1; + if (usedinQueryValue != null) { + try { + usedinQuery = Integer.parseInt(usedinQueryValue); + } catch (NumberFormatException e) { + log + .warn("Used in Query Value cannot be transformed into a Number"); + } + } + InputValue inputValue = new DefaultInputValue(inputValueNode.getAttribute("name"), + inputValueNode.getAttribute("type"), + Boolean.parseBoolean(inputValueNode. + getAttribute("multiselect")), usedinQuery); + this.inputValues.put(inputValue.getName(), inputValue); + this.inputValueNames.add(inputValue.getName()); + } + + this.queryID = Config.getStringXPath(configuration, "queryID"); + log.info("QueryID ==> " + this.queryID); + + this.dataName = Config.getStringXPath(configuration, "dataname"); + + String dataMultiSelectValue = Config.getStringXPath(configuration, + "data-multiselect"); + if (dataMultiSelectValue != null) { + this.dataMultiSelect = Boolean.parseBoolean(dataMultiSelectValue); + } + + String dataNoSelectValue =Config.getStringXPath(configuration, + "data-noselect"); + if (dataNoSelectValue != null) { + this. dataNoSelect = Boolean.parseBoolean(dataNoSelectValue); + } + + this.preSettingsName = Config.getStringXPath(configuration, "presettings-name"); + + } + + /** + * @see de.intevation.gnv.state.State#getParent() + */ + public State getParent() { + return this.parent; + } + + /** + * @see de.intevation.gnv.state.State#setParent(de.intevation.gnv.state.State) + */ + public void setParent(State state) { + this.parent = state; + } + + + public void feed(Collection inputData, String uuid) + throws StateException + { + if (inputData != null) { + Iterator it = inputData.iterator(); + InputValidator iv = new InputValidator(); + while (it.hasNext()) { + InputData tmpItem = it.next(); + InputValue inputValue = this.inputValues.get(tmpItem.getName()); + if (inputValue != null) { + if (this.inputData == null) { + this.inputData = new HashMap( + inputData.size()); + } + + boolean valid = iv.isInputValid(tmpItem.getValue(), + inputValue.getType()); + if (valid) { + String[] desc = getDescriptionForInputData(tmpItem, uuid); + tmpItem.setDescription(desc); + this.inputData.put(tmpItem.getName(), tmpItem); + } else { + String errMsg = "Wrong input for " + tmpItem.getValue() + + " is not an " + inputValue.getType() + + " Value."; + log.warn(errMsg); + throw new StateException(errMsg); + } + + } else { + String errMsg = "No Inputvalue given for Inputdata " + + tmpItem.getName(); + log.warn(errMsg + "Value will be ignored"); + + } + } + } else { + log.warn("No Inputdata given"); + } + } + + + private String[] getDescriptionForInputData(InputData data, String uuid) { + // there is only one element in the list, so take the first + Object obj = getDescibeData(uuid).get(0); + List descs = new ArrayList(); + + if (obj instanceof NamedArrayList) { + NamedArrayList list = (NamedArrayList) obj; + List selected = Arrays.asList(data.splitValue()); + int size = list.size(); + + for (int i = 0; i < size; i++) { + KeyValueDescibeData kv = (KeyValueDescibeData) list.get(i); + + // values are concatinated in InputData, so one InputData object can + // contain many input + String key = kv.getKey(); + int idx = selected.indexOf(key); + if (idx >= 0) { + descs.add(kv.getValue()); + + // XXX Workarround: I just wanted to remove the element at + // 'idx' from selected, but for any reason this is not + // possible (throws an exception) (iw) + List tmp = new ArrayList(); + for (int j = 0; j < selected.size(); j++) { + if (j != idx) + tmp.add(selected.get(j)); + } + + selected = tmp; + } + } + } + + return (String[]) descs.toArray(new String[descs.size()]); + } + + + /** + * @see de.intevation.gnv.state.State#putInputData(java.util.Collection) + */ + public void putInputData(Collection inputData, String uuid) + throws StateException { + if (inputData != null) { + Iterator it = inputData.iterator(); + InputValidator iv = new InputValidator(); + while (it.hasNext()) { + InputData tmpItem = it.next(); + InputValue inputValue = this.inputValues.get(tmpItem.getName()); + if (inputValue != null) { + if (this.inputData == null) { + this.inputData = new HashMap( + inputData.size()); + } + + boolean valid = iv.isInputValid(tmpItem.getValue(), + inputValue.getType()); + if (valid) { + if (tmpItem.getName().equals(MINVALUEFIELDNAME)){ + String minValue = tmpItem.getValue(); + String maxValue = this.getInputValue4ID(inputData, MAXVALUEFIELDNAME); + valid = iv.isInputValid(maxValue,inputValue.getType()); + if (!valid){ + String errMsg = "Wrong input for " + tmpItem.getValue() + + " is not an " + inputValue.getType() + + " Value."; + log.warn(errMsg); + throw new StateException(errMsg); + } + + valid = iv.isInputValid(minValue, + maxValue, + inputValue.getType()); + if (!valid){ + String errMsg = "MaxValue-Input is less than MinValue-Input "; + log.warn(errMsg); + throw new StateException(errMsg); + } + }else if (tmpItem.getName().equals(MAXVALUEFIELDNAME)){ + String minValue = this.getInputValue4ID(inputData, MINVALUEFIELDNAME); + String maxValue = tmpItem.getValue(); + valid = iv.isInputValid(minValue,inputValue.getType()); + if (!valid){ + String errMsg = "Wrong input for " + tmpItem.getValue() + + " is not an " + inputValue.getType() + + " Value."; + log.warn(errMsg); + throw new StateException(errMsg); + } + + valid = iv.isInputValid(minValue, + maxValue, + inputValue.getType()); + if (!valid){ + String errMsg = "MaxValue-Input is less than MinValue-Input "; + log.warn(errMsg); + throw new StateException(errMsg); + } + } + this.inputData.put(tmpItem.getName(), tmpItem); + } else { + String errMsg = "Wrong input for " + tmpItem.getValue() + + " is not an " + inputValue.getType() + + " Value."; + log.warn(errMsg); + throw new StateException(errMsg); + } + + } else { + String errMsg = "No Inputvalue given for Inputdata " + + tmpItem.getName(); + log.warn(errMsg + "Value will be ignored"); + + } + } + } else { + log.warn("No Inputdata given"); + } + + setHash(uuid); + } + + + /** + * + * @see de.intevation.gnv.state.State#setPreSettings(java.util.Map) + */ + public void setPreSettings(Map preSettings) { + this.preSettings = preSettings; + } + + + + public Map getPreSettings() { + return this.preSettings; + } + + protected String getInputValue4ID(Collection inputData, String inputName){ + Iterator it = inputData.iterator(); + while (it.hasNext()) { + InputData tmpItem = it.next(); + if (tmpItem.getName().equals(inputName)){ + return tmpItem.getValue(); + } + } + return null; + } + + + /** + * @see de.intevation.gnv.state.State#advance(java.lang.String, + * de.intevation.artifacts.CallMeta) + */ + public void advance(String uuid, CallContext context) + throws StateException + { + } + + public void initialize(String uuid, CallContext context) + throws StateException + { + } + + /** + * @return + */ + protected String[] generateFilterValuesFromInputData() { + List list = new ArrayList(); + Iterator it = this.inputValueNames.iterator(); + while (it.hasNext()) { + String value = it.next(); + InputData data = this.inputData.get(value); + if (data != null + && this.inputValues.containsKey(data.getName())) { + int size = this.inputValues.get(data.getName()) + .usedInQueries(); + String type = this.inputValues.get(data.getName()) + .getType(); + String requestValue = data.getValue(); + if (type.equalsIgnoreCase("string")) { + requestValue = this + .prepareInputData4DBQuery(requestValue); + } else if (type.equalsIgnoreCase("date")) { + requestValue = this + .prepareInputData4DateDBQuery(requestValue); + } else if (type.equalsIgnoreCase("coordinate")){ + requestValue = this + .prepareInputData4RegionDBQuery(requestValue); + } + for (int j = 0; j < size; j++) { + list.add(requestValue); + } + } + } + String[] filterValues = list.toArray(new String[list.size()]); + return filterValues; + } + + protected String prepareInputData4RegionDBQuery(String value){ + return value; + } + + private String prepareInputData4DateDBQuery(String value) { + if (value != null) { + String[] values = value.split(","); + String newValue = ""; + for (int i = 0; i < values.length; i++) { + if (newValue.length() > 0) { + newValue = newValue + " , "; + } + // TODO JUST HACK FIND A BETTER RESOLUTION + newValue = newValue + "to_date('" + values[i].trim() + + "', 'YYYY.MM.DD HH24:MI:SS')"; + } + return newValue; + } + + return value; + } + + private String prepareInputData4DBQuery(String value) { + if (value != null) { + String[] values = value.split(","); + String newValue = ""; + for (int i = 0; i < values.length; i++) { + if (newValue.length() > 0) { + newValue = newValue + " , "; + } + newValue = newValue + "'" + values[i].trim() + "'"; + } + return newValue; + } + + return value; + + } + + /** + * @param result + */ + protected List purifyResult(Collection result, String uuid) { + List describeData = new ArrayList(); + + NamedCollection keyValueDescibeData = + extractKVP(result, "KEY", "VALUE"); + + describeData.add(keyValueDescibeData); + + return describeData; + } + + /** + * @param result + * @return + */ + protected NamedCollection extractKVP(Collection result, + String keyid, + String valueid) { + Iterator rit = result.iterator(); + int dataSize = (this.dataNoSelect ? result.size()+1 : result.size()); + + NamedCollection keyValueDescibeData = new NamedArrayList( + this.dataName, dataSize); + keyValueDescibeData.setMultiSelect(this.dataMultiSelect); + + if (this.dataNoSelect){ + keyValueDescibeData.add(new DefaultKeyValueDescribeData( + NODATASELECTIONKEY, + "No Selection", + getID() + )); + } + + boolean initialized = false; + int keyPos = 0; + int valuePos = 1; + String previousKey = null; + InputData preSettingsData = + (this.preSettings != null && this.preSettingsName != null) + ? this.preSettings.get(this.preSettingsName) + : null; + boolean filterWithPresettings = preSettingsData != null; + + List preSettingValues = null; + if(filterWithPresettings){ + preSettingValues = Arrays.asList(preSettingsData.splitValue()); + } + while (rit.hasNext()) { + Result resultValue = rit.next(); + if (!initialized){ + keyPos = resultValue.getResultDescriptor().getColumnIndex(keyid); + valuePos = resultValue.getResultDescriptor().getColumnIndex(valueid); + if (valuePos < 0){ + valuePos = 1; + } + initialized = true; + } + String tmpKey = resultValue.getString(keyPos); + + // TODO: FIXME: We have to do that because the arcsde does not + // support a distinct Query on Layers. + if (previousKey == null || !tmpKey.equals(previousKey)){ + previousKey = tmpKey; + if (!filterWithPresettings || preSettingValues.contains(tmpKey)){ + keyValueDescibeData.add( + new DefaultKeyValueDescribeData( + tmpKey, + resultValue.getString(valuePos), + getID()) + ); + } + } + } + return keyValueDescibeData; + } + + + public static boolean inBlackList(String key) { + int length = BLACKLIST.length; + for (int i = 0; i < length; i++) { + if (BLACKLIST[i].equals(key)) { + return true; + } + } + + return false; + } + + /** + * @see de.intevation.gnv.state.State#describe(org.w3c.dom.Document, + * org.w3c.dom.Node, de.intevation.artifacts.CallMeta, + * java.lang.String) + */ + public void describe( + Document document, + Node rootNode, + CallContext context, + String uuid) + { + XMLUtils.ElementCreator xCreator = new XMLUtils.ElementCreator( + document, + XMLUtils.XFORM_URL, + XMLUtils.XFORM_PREFIX + ); + + XMLUtils.ElementCreator creator = new XMLUtils.ElementCreator( + document, + ArtifactNamespaceContext.NAMESPACE_URI, + ArtifactNamespaceContext.NAMESPACE_PREFIX + ); + + // append dynamic node + Node dynamic = (Node) XMLUtils.xpath( + rootNode, + XPATH_DYNAMIC_UI, + XPathConstants.NODE, + ArtifactNamespaceContext.INSTANCE + ); + + describeDynamic( + creator, xCreator, document, dynamic, context, uuid); + + // append static nodes + Node staticNode = (Node) XMLUtils.xpath( + rootNode, + XPATH_STATIC_UI, + XPathConstants.NODE, + ArtifactNamespaceContext.INSTANCE + ); + + State parent = getParent(); + if (parent != null && parent instanceof StateBase) { + ((StateBase) parent).describeStatic( + creator,xCreator, document, staticNode, context,uuid); + } + } + + + protected void describeDynamic( + XMLUtils.ElementCreator artCreator, + XMLUtils.ElementCreator creator, + Document document, + Node dynamic, + CallContext context, + String uuid) + { + CallMeta callMeta = context.getMeta(); + + if (dataName == null) + return; + + List descibeData = getDescibeData(uuid); + if (descibeData != null) { + Iterator it = descibeData.iterator(); + + while (it.hasNext()) { + Object o = it.next(); + if ((!it.hasNext() && dataName != null)) { + appendToDynamicNode( + artCreator, creator, document, dynamic, callMeta, o); + } + } + } + } + + + protected void describeStatic( + XMLUtils.ElementCreator artCreator, + XMLUtils.ElementCreator creator, + Document document, + Node staticNode, + CallContext context, + String uuid) + { + State parent = getParent(); + if (parent != null && parent instanceof StateBase) { + ((StateBase) parent).describeStatic( + artCreator, creator, document, staticNode, context, uuid); + } + + CallMeta callMeta = context.getMeta(); + appendToStaticNode(artCreator, creator, document, staticNode, callMeta); + } + + + protected void appendToStaticNode( + XMLUtils.ElementCreator artCreator, + XMLUtils.ElementCreator creator, + Document document, + Node staticNode, + CallMeta callMeta + ) { + InputData data = inputData.get(dataName); + + if (data == null) { + return; + } + + Element selectNode = creator.create("select1"); + creator.addAttr(selectNode, "ref", dataName); + + Element lableNode = creator.create("label"); + lableNode.setTextContent(RessourceFactory.getInstance() + .getRessource(callMeta.getLanguages(), dataName, dataName)); + Element choiceNode = creator.create("choices"); + + artCreator.addAttr( + selectNode, "state", getID(), true + ); + + String[] descriptions = data.getDescription(); + int size = descriptions.length; + + for (int i = 0; i < size; i++) { + Element itemNode = creator.create("item"); + String value = data.getValue(); + String desc = descriptions[i]; + desc = desc == null ? value : desc; + + creator.addAttr(itemNode, "selected", "true"); + + Element choiceLableNode = creator.create("label"); + choiceLableNode.setTextContent(desc); + itemNode.appendChild(choiceLableNode); + + Element choiceValueNode = creator.create("value"); + choiceValueNode.setTextContent(value); + itemNode.appendChild(choiceValueNode); + choiceNode.appendChild(itemNode); + } + + selectNode.appendChild(lableNode); + selectNode.appendChild(choiceNode); + + staticNode.appendChild(selectNode); + } + + + protected void appendToDynamicNode( + XMLUtils.ElementCreator artCreator, + XMLUtils.ElementCreator creator, + Document document, + Node dynamicNode, + CallMeta callMeta, + Object o + ) { + if (o instanceof Collection) { + String name = null; + boolean multiselect = false; + if (o instanceof NamedCollection) { + NamedCollection nc = ((NamedCollection) o); + name = nc.getName(); + multiselect = nc.isMultiSelect(); + } else { + Object[] names = this.inputValueNames.toArray(); + name = names[names.length - 1].toString(); + } + + Element selectNode = creator.create(multiselect?"select":"select1"); + creator.addAttr(selectNode, "ref", name); + + Element lableNode = creator.create("label"); + lableNode.setTextContent(RessourceFactory.getInstance() + .getRessource(callMeta.getLanguages(), name, name)); + Element choiceNode = creator.create("choices"); + + Collection values = (Collection) o; + Iterator resultIt = values.iterator(); + while (resultIt.hasNext()) { + KeyValueDescibeData result = resultIt.next(); + Element itemNode = creator.create("item"); + + if (result.isSelected()) { + itemNode.setAttribute("selected", "true"); + } + + Element choiceLableNode = creator.create("label"); + choiceLableNode.setTextContent(result.getValue()); + itemNode.appendChild(choiceLableNode); + + Element choicValueNode = creator.create("value"); + choicValueNode.setTextContent("" + result.getKey()); + itemNode.appendChild(choicValueNode); + choiceNode.appendChild(itemNode); + } + selectNode.appendChild(lableNode); + selectNode.appendChild(choiceNode); + + dynamicNode.appendChild(selectNode); + } + else if (o instanceof MinMaxDescribeData) { + appendMinMaxDescribeData( + artCreator, + creator, + document, + dynamicNode, + callMeta, + o); + } + else if (o instanceof SingleValueDescribeData) { + appendSingleValueDescribeData( + artCreator, + creator, + document, + dynamicNode, + callMeta, + o); + } + } + + + protected void appendMinMaxDescribeData( + XMLUtils.ElementCreator artCreator, + XMLUtils.ElementCreator creator, + Document document, + Node node, + CallMeta callMeta, + Object o + ) { + MinMaxDescribeData minMaxDescibeData = (MinMaxDescribeData) o; + Object min = minMaxDescibeData.getMinValue(); + Object max = minMaxDescibeData.getMaxValue(); + if (min instanceof GregorianCalendar) { + Date d = ((GregorianCalendar) min).getTime(); + min = DateUtils.getPatternedDateAmer(d); + } + + if (max instanceof GregorianCalendar) { + Date d = ((GregorianCalendar) max).getTime(); + max = DateUtils.getPatternedDateAmer(d); + } + + Element groupNode = creator.create("group"); + artCreator.addAttr(groupNode, "state", minMaxDescibeData.getState(), true); + + creator.addAttr(groupNode, "ref", minMaxDescibeData.getName()); + Element groupNodeLableNode = creator.create("label"); + groupNodeLableNode.setTextContent(RessourceFactory + .getInstance().getRessource( + callMeta.getLanguages(), + minMaxDescibeData.getName(), + minMaxDescibeData.getName())); + groupNode.appendChild(groupNodeLableNode); + + Element inputMinNode = creator.create("input"); + creator.addAttr(inputMinNode, "ref", MINVALUEFIELDNAME); + Element inputMinLableNode = creator.create("label"); + inputMinLableNode.setTextContent(RessourceFactory + .getInstance().getRessource( + callMeta.getLanguages(), MINVALUEFIELDNAME, + MINVALUEFIELDNAME)); + inputMinNode.appendChild(inputMinLableNode); + + Element inputMinValueNode = creator.create("value"); + inputMinValueNode.setTextContent(min.toString()); + inputMinNode.appendChild(inputMinValueNode); + + Element inputMaxNode = creator.create("input"); + creator.addAttr(inputMaxNode, "ref", MAXVALUEFIELDNAME); + Element inputMaxLableNode = creator.create("label"); + inputMaxLableNode.setTextContent(RessourceFactory + .getInstance().getRessource( + callMeta.getLanguages(), MAXVALUEFIELDNAME, + MAXVALUEFIELDNAME)); + inputMaxNode.appendChild(inputMaxLableNode); + + Element inputMaxValueNode = creator.create("value"); + inputMaxValueNode.setTextContent(max.toString()); + inputMaxNode.appendChild(inputMaxValueNode); + + groupNode.appendChild(inputMinNode); + groupNode.appendChild(inputMaxNode); + + node.appendChild(groupNode); + } + + + protected void appendSingleValueDescribeData( + XMLUtils.ElementCreator artCreator, + XMLUtils.ElementCreator creator, + Document document, + Node node, + CallMeta callMeta, + Object o + ) { + SingleValueDescribeData svdb = (SingleValueDescribeData) o; + + Element groupNode = creator.create("group"); + artCreator.addAttr(groupNode, "state", svdb.getState(), true); + creator.addAttr(groupNode, "ref", svdb.getName()); + + Element groupNodeLableNode = creator.create("label"); + groupNodeLableNode.setTextContent(RessourceFactory + .getInstance().getRessource( + callMeta.getLanguages(), + svdb.getName(), + svdb.getName())); + groupNode.appendChild(groupNodeLableNode); + + Element inputNode = creator.create("input"); + creator.addAttr(inputNode, "ref", svdb.getName()); + + Element inputLableNode = creator.create("label"); + inputLableNode.setTextContent(""); + inputNode.appendChild(inputLableNode); + + Element inputValueNode = creator.create("value"); + inputValueNode.setTextContent(svdb.getValue()); + inputNode.appendChild(inputValueNode); + + groupNode.appendChild(inputNode); + + node.appendChild(groupNode); + } + + + protected void setHash(String uuid) { + this.hash = uuid + id + inputData.hashCode(); + } + + + protected String getHash() { + return this.hash; + } + + + /** + * @see de.intevation.gnv.state.State#getDescibeData() + */ + public List getDescibeData(String uuid) { + CacheFactory factory = CacheFactory.getInstance(); + if (factory.isInitialized()) { + // we use a cache + log.debug("Using cache."); + Cache cache = factory.getCache(); + String key = getHash(); + + net.sf.ehcache.Element value = cache.get(key); + if (value != null) { + // element already in cache, so return it. + log.debug("Found element in cache."); + return (List) (value.getObjectValue()); + } + else { + // element is not in cache yet, so we need to fetch data from + // database and put it into cache right now + log.debug("Element not in cache, we need to ask the database"); + try { + String[] filterValues = generateFilterValuesFromInputData(); + List data = queryDatabase(filterValues, uuid); + + cache.put(new net.sf.ehcache.Element(key, data)); + return data; + } + catch (QueryException qe) { + log.error(qe, qe); + } + } + } + else { + // we don't use a cache, so we have to query the database every + // single time + log.debug("Not using cache."); + String[] filterValues = generateFilterValuesFromInputData(); + Collection result = null; + try { + return queryDatabase(filterValues, uuid); + } + catch (RuntimeException e) { + log.error(e, e); + } + catch (QueryException e) { + log.error(e, e); + } + } + + return null; + } + + protected List queryDatabase(String[] filterValues, String uuid) + throws QueryException { + Collection result = null; + + if (queryID != null) { + QueryExecutor queryExecutor = + QueryExecutorFactory.getInstance().getQueryExecutor(); + + result = queryExecutor.executeQuery(queryID, filterValues); + } + return purifyResult(result, uuid); + } + + + public Map inputData() { + return inputData; + } + + /** + * @see de.intevation.gnv.state.State#getInputData() + */ + public Collection getInputData() throws StateException { + return this.inputData != null ? this.inputData.values() : null; + } + + public void endOfLife(Object globalContext) { + } +} +// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8: diff -r f99d8f92a640 -r 755dd2fa4a0a gnv-artifacts/src/main/java/de/intevation/gnv/state/StateFactory.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv-artifacts/src/main/java/de/intevation/gnv/state/StateFactory.java Fri Sep 28 12:13:53 2012 +0200 @@ -0,0 +1,55 @@ +/** + * + */ +package de.intevation.gnv.state; + +import org.apache.log4j.Logger; +import org.w3c.dom.Node; + +import de.intevation.gnv.artifacts.GNVArtifactBase; + +/** + * @author Tim Englich + * + */ +public class StateFactory { + + /** + * the logger, used to log exceptions and additonaly information + */ + private static Logger log = Logger.getLogger(GNVArtifactBase.class); + + private static StateFactory instance = null; + + /** + * Constructor + */ + public StateFactory() { + super(); + } + + public static StateFactory getInstance() { + if (instance == null) { + instance = new StateFactory(); + } + return instance; + } + + public State createState(Node configuration) { + log.debug("StateFactory.createState"); + State state = null; + try { + String classname = ((org.w3c.dom.Element)configuration).getAttribute("state"); + state = (State) (Class.forName(classname).newInstance()); + state.setup(configuration); + } catch (InstantiationException e) { + log.error(e, e); + } catch (IllegalAccessException e) { + log.error(e, e); + } catch (ClassNotFoundException e) { + log.error(e, e); + } + return state; + } + +} diff -r f99d8f92a640 -r 755dd2fa4a0a gnv-artifacts/src/main/java/de/intevation/gnv/state/describedata/DefaultKeyValueDescribeData.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv-artifacts/src/main/java/de/intevation/gnv/state/describedata/DefaultKeyValueDescribeData.java Fri Sep 28 12:13:53 2012 +0200 @@ -0,0 +1,69 @@ +/** + * + */ +package de.intevation.gnv.state.describedata; + +/** + * @author Tim Englich + * + */ +public class DefaultKeyValueDescribeData implements KeyValueDescibeData { + + /** + * + */ + private static final long serialVersionUID = -924469415242703108L; + + private String key; + + private String value = null; + + private String state; + + private boolean selected = false; + + public DefaultKeyValueDescribeData(String key, String value) { + this(key, value, null); + } + + public DefaultKeyValueDescribeData(String key, String value, String state) { + super(); + this.key = key; + this.value = value; + this.state = state; + } + + /** + * @see de.intevation.gnv.state.describedata.KeyValueDescibeData#getKey() + */ + public String getKey() { + return this.key; + } + + /** + * @see de.intevation.gnv.state.describedata.KeyValueDescibeData#getValue() + */ + public String getValue() { + return this.value; + } + + /** + * @see de.intevation.gnv.state.describedata.KeyValueDescibeData#isSelected() + */ + public boolean isSelected() { + return this.selected; + } + + /** + * @see de.intevation.gnv.state.describedata.KeyValueDescibeData#setSelected(boolean) + */ + public void setSelected(boolean selected) { + this.selected = selected; + } + + + public String getState() { + return this.state; + } + +} diff -r f99d8f92a640 -r 755dd2fa4a0a gnv-artifacts/src/main/java/de/intevation/gnv/state/describedata/DefaultMinMaxDescribeData.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv-artifacts/src/main/java/de/intevation/gnv/state/describedata/DefaultMinMaxDescribeData.java Fri Sep 28 12:13:53 2012 +0200 @@ -0,0 +1,104 @@ +/** + * + */ +package de.intevation.gnv.state.describedata; + +/** + * @author Tim Englich + * + */ +public class DefaultMinMaxDescribeData implements MinMaxDescribeData { + + /** + * + */ + private static final long serialVersionUID = -2917176219029052295L; + + private Object minValue = null; + + private Object maxValue = null; + + private String name = null; + + private String state = null; + + private final static String minName = "minvalue"; + + private final static String maxName = "maxvalue"; + + /** + * Constructor + */ + public DefaultMinMaxDescribeData( + String name, + Object minValue, + Object maxValue, + String state + ) { + super(); + this.name = name; + this.minValue = minValue; + this.maxValue = maxValue; + this.state = state; + } + + /** + * @see de.intevation.gnv.state.describedata.MinMaxDescribeData#getMaxValue() + */ + public Object getMaxValue() { + return this.maxValue; + } + + /** + * @see de.intevation.gnv.state.describedata.MinMaxDescribeData#getMinValue() + */ + public Object getMinValue() { + return this.minValue; + } + + /** + * @see java.lang.Object#toString() + */ + @Override + public String toString() { + return "MIN: " + this.minValue.toString() + " ; MAX: " + + this.maxValue.toString(); + } + + /** + * @see de.intevation.gnv.state.describedata.MinMaxDescribeData#getName() + */ + public String getMinName() { + return minName; + } + + /** + * @see de.intevation.gnv.state.describedata.MinMaxDescribeData#getMaxName() + */ + public String getMaxName() { + return maxName; + } + + /** + * @see de.intevation.gnv.state.describedata.MinMaxDescribeData#setMaxValue(java.lang.Object) + */ + public void setMaxValue(Object maxValue) { + this.maxValue = maxValue; + } + + /** + * @see de.intevation.gnv.state.describedata.MinMaxDescribeData#setMinValue(java.lang.Object) + */ + public void setMinValue(Object minValue) { + this.minValue = minValue; + } + + public String getName() { + return this.name; + } + + public String getState() { + return this.state; + } + +} diff -r f99d8f92a640 -r 755dd2fa4a0a gnv-artifacts/src/main/java/de/intevation/gnv/state/describedata/DefaultSingleValueDescribeData.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv-artifacts/src/main/java/de/intevation/gnv/state/describedata/DefaultSingleValueDescribeData.java Fri Sep 28 12:13:53 2012 +0200 @@ -0,0 +1,65 @@ +/** + * + */ +package de.intevation.gnv.state.describedata; + +/** + * @author Tim Englich + * + */ +public class DefaultSingleValueDescribeData implements SingleValueDescribeData { + + /** + * + */ + private static final long serialVersionUID = 3580176842483316917L; + + private String name = null; + + private String value = null; + + private String state = null; + + public DefaultSingleValueDescribeData(String name, String value) { + this(name, value, null); + } + + /** + * Constructor + * + * @param name + * @param value + */ + public DefaultSingleValueDescribeData( + String name, + String value, + String state + ) { + super(); + this.name = name; + this.value = value; + this.state = state; + } + + /** + * @see de.intevation.gnv.state.describedata.SingleValueDescribeData#getName() + */ + public String getName() { + return this.name; + } + + /** + * @see de.intevation.gnv.state.describedata.SingleValueDescribeData#getValue() + */ + public String getValue() { + return this.value; + } + + public void setValue(String value) { + this.value = value; + } + + public String getState() { + return this.state; + } +} diff -r f99d8f92a640 -r 755dd2fa4a0a gnv-artifacts/src/main/java/de/intevation/gnv/state/describedata/DescribeData.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv-artifacts/src/main/java/de/intevation/gnv/state/describedata/DescribeData.java Fri Sep 28 12:13:53 2012 +0200 @@ -0,0 +1,16 @@ +/** + * + */ +package de.intevation.gnv.state.describedata; + +import java.io.Serializable; + +/** + * Markerinterface + * + * @author Tim Englich + * + */ +public interface DescribeData extends Serializable { + +} diff -r f99d8f92a640 -r 755dd2fa4a0a gnv-artifacts/src/main/java/de/intevation/gnv/state/describedata/ExtendedKeyValueData.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv-artifacts/src/main/java/de/intevation/gnv/state/describedata/ExtendedKeyValueData.java Fri Sep 28 12:13:53 2012 +0200 @@ -0,0 +1,27 @@ +package de.intevation.gnv.state.describedata; + +import org.apache.log4j.Logger; + +/** + * @author Ingo Weinzierl (ingo.weinzierl@intevation.de) + */ +public class ExtendedKeyValueData +extends DefaultKeyValueDescribeData +{ + private static Logger logger = Logger.getLogger(ExtendedKeyValueData.class); + + protected String parameter; + + + public ExtendedKeyValueData( + String key, String value, String state, String parameter) + { + super(key, value, state); + this.parameter = parameter; + } + + public String getParameter() { + return parameter; + } +} +// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8: diff -r f99d8f92a640 -r 755dd2fa4a0a gnv-artifacts/src/main/java/de/intevation/gnv/state/describedata/KeyValueDescibeData.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv-artifacts/src/main/java/de/intevation/gnv/state/describedata/KeyValueDescibeData.java Fri Sep 28 12:13:53 2012 +0200 @@ -0,0 +1,24 @@ +/** + * + */ +package de.intevation.gnv.state.describedata; + +import java.io.Serializable; + +/** + * @author Tim Englich + * + */ +public interface KeyValueDescibeData extends Serializable { + + public String getKey(); + + public String getValue(); + + public String getState(); + + public boolean isSelected(); + + public void setSelected(boolean selected); + +} diff -r f99d8f92a640 -r 755dd2fa4a0a gnv-artifacts/src/main/java/de/intevation/gnv/state/describedata/MinMaxDescribeData.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv-artifacts/src/main/java/de/intevation/gnv/state/describedata/MinMaxDescribeData.java Fri Sep 28 12:13:53 2012 +0200 @@ -0,0 +1,27 @@ +/** + * + */ +package de.intevation.gnv.state.describedata; + +/** + * @author Tim Englich + * + */ +public interface MinMaxDescribeData extends DescribeData { + + public Object getMinValue(); + + public Object getMaxValue(); + + public void setMinValue(Object minValue); + + public void setMaxValue(Object maxValue); + + public String getName(); + + public String getMinName(); + + public String getMaxName(); + + public String getState(); +} diff -r f99d8f92a640 -r 755dd2fa4a0a gnv-artifacts/src/main/java/de/intevation/gnv/state/describedata/NamedArrayList.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv-artifacts/src/main/java/de/intevation/gnv/state/describedata/NamedArrayList.java Fri Sep 28 12:13:53 2012 +0200 @@ -0,0 +1,71 @@ +/** + * + */ +package de.intevation.gnv.state.describedata; + +import java.util.ArrayList; +import java.util.Collection; + +/** + * @author Tim Englich + * + */ +public class NamedArrayList extends ArrayList implements + NamedCollection { + /** + * + */ + private static final long serialVersionUID = 8172229594749676354L; + + private String name = null; + + private boolean multiSelect = false; + + /** + * Constructor + */ + public NamedArrayList(String name) { + this.name = name; + } + + /** + * Constructor + * + * @param initialCapacity + */ + public NamedArrayList(String name, int initialCapacity) { + super(initialCapacity); + this.name = name; + } + + /** + * Constructor + * + * @param c + */ + public NamedArrayList(String name, Collection c) { + super(c); + this.name = name; + } + + /** + * @see de.intevation.gnv.state.describedata.NamedCollection#getName() + */ + public String getName() { + return this.name; + } + + /** + * @see de.intevation.gnv.state.describedata.NamedCollection#isMultiSelect() + */ + public boolean isMultiSelect() { + return multiSelect; + } + + /** + * @see de.intevation.gnv.state.describedata.NamedCollection#setMultiSelect(boolean) + */ + public void setMultiSelect(boolean multiSelect) { + this.multiSelect = multiSelect; + } +} diff -r f99d8f92a640 -r 755dd2fa4a0a gnv-artifacts/src/main/java/de/intevation/gnv/state/describedata/NamedCollection.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv-artifacts/src/main/java/de/intevation/gnv/state/describedata/NamedCollection.java Fri Sep 28 12:13:53 2012 +0200 @@ -0,0 +1,19 @@ +/** + * + */ +package de.intevation.gnv.state.describedata; + +import java.util.Collection; + +/** + * @author Tim Englich + * + */ +public interface NamedCollection extends Collection { + + public String getName(); + + public boolean isMultiSelect(); + + public void setMultiSelect(boolean multiSelect); +} diff -r f99d8f92a640 -r 755dd2fa4a0a gnv-artifacts/src/main/java/de/intevation/gnv/state/describedata/SingleValueDescribeData.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv-artifacts/src/main/java/de/intevation/gnv/state/describedata/SingleValueDescribeData.java Fri Sep 28 12:13:53 2012 +0200 @@ -0,0 +1,19 @@ +/** + * + */ +package de.intevation.gnv.state.describedata; + +/** + * @author Tim Englich + * + */ +public interface SingleValueDescribeData extends DescribeData { + + public String getName(); + + public String getValue(); + + public void setValue(String value); + + public String getState(); +} diff -r f99d8f92a640 -r 755dd2fa4a0a gnv-artifacts/src/main/java/de/intevation/gnv/state/exception/StateException.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv-artifacts/src/main/java/de/intevation/gnv/state/exception/StateException.java Fri Sep 28 12:13:53 2012 +0200 @@ -0,0 +1,52 @@ +/** + * + */ +package de.intevation.gnv.state.exception; + +/** + * @author Tim Englich + * + */ +public class StateException extends Exception { + + /** + * The UID of the Class + */ + private static final long serialVersionUID = -1635921702746050244L; + + /** + * Constructor + */ + public StateException() { + super(); + } + + /** + * Constructor + * + * @param message + */ + public StateException(String message) { + super(message); + } + + /** + * Constructor + * + * @param cause + */ + public StateException(Throwable cause) { + super(cause); + } + + /** + * Constructor + * + * @param message + * @param cause + */ + public StateException(String message, Throwable cause) { + super(message, cause); + } + +} diff -r f99d8f92a640 -r 755dd2fa4a0a gnv-artifacts/src/main/java/de/intevation/gnv/state/layer/LayerOutputState.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv-artifacts/src/main/java/de/intevation/gnv/state/layer/LayerOutputState.java Fri Sep 28 12:13:53 2012 +0200 @@ -0,0 +1,412 @@ +/** + * + */ +package de.intevation.gnv.state.layer; + +import java.io.File; +import java.io.IOException; +import java.io.OutputStream; +import java.util.Collection; +import java.util.HashMap; +import java.util.Iterator; +import java.util.Map; + +import org.apache.log4j.Logger; +import org.w3c.dom.Document; +import org.w3c.dom.Element; +import org.w3c.dom.Node; + +import com.vividsolutions.jts.geom.Geometry; +import com.vividsolutions.jts.io.ParseException; +import com.vividsolutions.jts.io.WKTReader; + +import de.intevation.artifactdatabase.Config; +import de.intevation.artifactdatabase.XMLUtils; +import de.intevation.artifacts.ArtifactNamespaceContext; +import de.intevation.artifacts.CallContext; +import de.intevation.gnv.artifacts.context.GNVArtifactContext; +import de.intevation.gnv.geobackend.base.Result; +import de.intevation.gnv.geobackend.base.query.QueryExecutor; +import de.intevation.gnv.geobackend.base.query.QueryExecutorFactory; +import de.intevation.gnv.geobackend.base.query.exception.QueryException; +import de.intevation.gnv.raster.PaletteManager; +import de.intevation.gnv.state.InputData; +import de.intevation.gnv.state.OutputStateBase; +import de.intevation.gnv.state.exception.StateException; +import de.intevation.gnv.utils.FileUtils; +import de.intevation.gnv.utils.MapfileGenerator; +import de.intevation.gnv.utils.MetaWriter; +import de.intevation.gnv.utils.ShapeFileWriter; + +/** + * @author Tim Englich + * + */ +public class LayerOutputState extends OutputStateBase { + + /** + * the logger, used to log exceptions and additonaly information + */ + private static Logger log = Logger.getLogger(LayerOutputState.class); + + /** + * The UID of this Class. + */ + private static final long serialVersionUID = 9180957321704424049L; + + // TODO: Replace + public static final String LAYER_MODEL = "layer"; + + /** + * The ID for the Query fetching the Layer from the DB + */ + private String dataQueryID = null; + + /** + * The ID for the Query fetching the Geometry from the DB + * which should be used to Clip the Layerdata + */ + private String geometryQueryID = null; + + /** + * The ID for the Value which will hold the Geometrie-Value + */ + private String geometryID = null; + + private Boolean shapeFileLock = new Boolean(true); + + private String shapeFilePath; + + private String geometryType = null; + + public static final String SHAPEFILE_NAME = "data.shp"; + + /** + * Constructor + */ + public LayerOutputState() { + super(); + } + + /** + * @see de.intevation.gnv.state.OutputState#out(org.w3c.dom.Document, + * java.util.Collection, java.io.OutputStream, + * java.lang.String, de.intevation.artifacts.CallContext) + */ + public void out(Document format, Collection inputData, + OutputStream outputStream, String uuid, + CallContext callContext) throws StateException { + + log.debug("LayerOutputState.out"); + String outputMode = XMLUtils.xpathString( + format, XPATH_OUTPUT_MODE, ArtifactNamespaceContext.INSTANCE); + if (outputMode.equalsIgnoreCase("wms")) { + Collection data = this.fetchData(); + XMLUtils.toStream(this.getWMS(uuid, callContext, data),outputStream); + }else if (outputMode.equalsIgnoreCase("zip")){ + Collection data = this.fetchData(); + this.writeZip(uuid, callContext, outputStream, data); + } + } + + + /** + * Fetches the Data from the Databasebackend + * @return + */ + protected Collection fetchData(){ + log.debug("LayerOutputState.fetchData"); + // TODO PUT ALL in CACHE + Collection result = this.getData(this.queryID); + Collection data = null; + String geometryWKT = null; + if (result != null){ + QueryExecutor queryExecutor = QueryExecutorFactory.getInstance() + .getQueryExecutor(); + Iterator it = result.iterator(); + String[] queryValues = null; + if (it.hasNext()){ + Result resultValue = it.next(); + String table = resultValue.getString(0); + String where = resultValue.getString(1); + if (this.geometryID != null){ + InputData geometryInputData = + this.inputData.get(this.geometryID); + if (geometryInputData != null){ + + try { + Collection geometryData = queryExecutor + .executeQuery(this.geometryQueryID, + new String[]{geometryInputData.getValue()}); + Iterator git = geometryData.iterator(); + if (git.hasNext()){ + Result geometryValue = git.next(); + geometryWKT = geometryValue.getString(0); + } + } catch (QueryException e) { + log.error(e,e); + // TODO: what should happen?? + } + queryValues = new String[]{table, + where, + geometryWKT}; + }else{ + // TODO: Look into the presetting for an WKT + queryValues = new String[]{table,where}; + } + }else{ + // TODO: Look into the presetting for an WKT + queryValues = new String[]{table,where}; + + } + } + + try { + data = queryExecutor.executeQuery(dataQueryID, + queryValues); + if (data != null && geometryWKT != null){ + WKTReader wktReader = new WKTReader(); + Geometry border = wktReader.read(geometryWKT); + + Iterator dataIt = data.iterator(); + while (dataIt.hasNext()){ + // Trim the Geometries using the + // Geometry if on is available. + Result current = dataIt.next(); + String currentWKT = current.getString(0); + Geometry currentGeometry = null; + try { + currentGeometry = wktReader.read(currentWKT); + } catch (Exception e) { + log.error("Error parsing Geometry "+ currentWKT); + log.error(e,e); + } + + if (currentGeometry != null){ + Geometry newGeometry = currentGeometry.intersection(border); + current.addColumnValue(0, newGeometry.toText()); + } + } + } + } catch (QueryException e) { + log.error(e,e); + } catch (ParseException e){ + log.error(e,e); + } + } + return data; + } + + @Override + public void setup(Node configuration) { + log.debug("LayerOutputState.setup"); + super.setup(configuration); + this.dataQueryID = Config.getStringXPath(configuration, + "queryID-layerdata"); + this.geometryID = Config.getStringXPath(configuration, + "inputvalue-geometry"); + this.geometryQueryID = Config.getStringXPath(configuration, + "queryID-geometry"); + } + + protected String writeToShapeFile( + String uuid, + Collection data, + CallContext callContext + ) { + File baseDir = shapefileDirectory(callContext); + + File shapeDir = new File(baseDir, uuid); + boolean success = false; + boolean createdDir = false; + + try { + synchronized (shapeFileLock) { + int count = 0; + while (shapeDir.exists()) { + shapeDir = new File(baseDir, uuid + "-" + count); + ++count; + } + + if (!shapeDir.mkdirs()) { + log.error("cannot create directory '" + + shapeDir.getAbsolutePath() + "'"); + return null; + } + createdDir = true; + } + + File shapeFile = new File(shapeDir, SHAPEFILE_NAME); + if ((geometryType = ShapeFileWriter.writeDataToFile(shapeFile, "data", data)) == null){ + log.error("writing data into shapefile failed"); + return null; + } + + shapeFilePath = shapeDir.getAbsolutePath(); + success = true; + + callContext.afterCall(CallContext.STORE); + + return shapeFilePath; + } + finally { + if (!success && createdDir) { + FileUtils.deleteRecursive(shapeDir); + } + } + } + + protected void writeZip( + String uuid, + CallContext callContext, + OutputStream output, + Collection data + ) + throws StateException + { + try { + String p = getShapeFilePath(); + if (p != null) { + File dir = new File(p); + if (dir.isDirectory()) { + FileUtils.createZipArchive(dir, output); + } + } + else { + + if ((p = writeToShapeFile(uuid, data, callContext)) != null) { + FileUtils.createZipArchive(new File(p), output); + } + } + } + catch (IOException ioe) { + log.error(ioe.getLocalizedMessage(), ioe); + } + } + + public String getShapeFilePath() { + synchronized (shapeFileLock) { + return shapeFilePath; + } + } + + private static File shapefileDirectory(CallContext callContext) { + // TODO: Refactoring nessessary it should be used only one Shapefilepath + // for alle Modes. Code was taken from HorizontalCrossSectionMeshOutputState + GNVArtifactContext context = + (GNVArtifactContext)callContext.globalContext(); + File dir = (File)context.get( + GNVArtifactContext.HORIZONTAL_CROSS_SECTION_RESULT_SHAPEFILE_PATH_KEY); + return dir != null + ? dir + : GNVArtifactContext.DEFAULT_HORIZONTAL_CROSS_SECTION_PROFILE_SHAPEFILE_PATH; + } + + /** + * @see de.intevation.gnv.state.StateBase#endOfLife(java.lang.Object) + */ + @Override + public void endOfLife(Object globalContext) { + super.endOfLife(globalContext); + + // do it in background + new Thread() { + public void run() { + // TODO: Do the un-publishing WMS stuff. + String path = resetShapeFilePath(); + + if (path == null) { + return; + } + + File dir = new File(path); + + for (int i = 0; i < 10; ++i) { + if (!dir.exists() || FileUtils.deleteRecursive(dir)) { + MapfileGenerator.getInstance().update(); + return; + } + + try { + Thread.sleep(10000L); + } + catch (InterruptedException ie) { + } + } + + log.error("failed to remove directory '" + path + "'"); + } // run + }.start(); + } + + public String resetShapeFilePath() { + synchronized (shapeFileLock) { + String path = shapeFilePath; + shapeFilePath = null; + geometryType = null; + return path; + } + } + protected Document getWMS(String uuid, + CallContext callContext, + Collection data) + throws StateException + { + // TODO: Do the real WMS publishing here! + Document document = XMLUtils.newDocument(); + + Element pathElement = document.createElement("path"); + document.appendChild(pathElement); + + String path = getShapeFilePath(); + + if (path != null && new File(path).isDirectory()) { + pathElement.setTextContent(path); + } + else { + + if (data != null && + (path = writeToShapeFile(uuid, data, callContext)) != null) { + + String paramType = LAYER_MODEL+"_"+this.geometryType.toLowerCase(); + + Document meta = MetaWriter.writeLayerMeta(callContext, uuid, + path, paramType, + this.determineGeometryType()); + if (meta != null) { + MapfileGenerator.getInstance().update(); + return meta; + } + + pathElement.setTextContent(path); + } + } + + return document; + } + + private String determineGeometryType(){ + + String returnValue = this.geometryType.toLowerCase(); + + if (returnValue.equalsIgnoreCase("linestring")){ + returnValue = "Line"; + } + return returnValue; + } + + private static Map getPalettes( + CallContext callContext + ) { + //TODO: customize for product Layer + GNVArtifactContext context = + (GNVArtifactContext)callContext.globalContext(); + Map palettes = + (Map)context.get( + GNVArtifactContext.PALETTES_KEY); + return palettes != null + ? palettes + : new HashMap(); + } + +} diff -r f99d8f92a640 -r 755dd2fa4a0a gnv-artifacts/src/main/java/de/intevation/gnv/state/profile/horizontal/HorizontalProfileMeshCrossOutputState.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv-artifacts/src/main/java/de/intevation/gnv/state/profile/horizontal/HorizontalProfileMeshCrossOutputState.java Fri Sep 28 12:13:53 2012 +0200 @@ -0,0 +1,411 @@ +package de.intevation.gnv.state.profile.horizontal; + +import com.vividsolutions.jts.geom.Coordinate; + +import de.intevation.artifactdatabase.Config; + +import de.intevation.artifacts.CallContext; + +import de.intevation.gnv.artifacts.cache.CacheFactory; + +import de.intevation.gnv.artifacts.context.GNVArtifactContext; + +import de.intevation.gnv.chart.Chart; +import de.intevation.gnv.chart.ChartLabels; +import de.intevation.gnv.chart.HorizontalCrossProfileChart; + +import de.intevation.gnv.geobackend.base.DefaultResult; +import de.intevation.gnv.geobackend.base.DefaultResultDescriptor; +import de.intevation.gnv.geobackend.base.Result; +import de.intevation.gnv.geobackend.base.ResultDescriptor; + +import de.intevation.gnv.geobackend.base.query.QueryExecutor; +import de.intevation.gnv.geobackend.base.query.QueryExecutorFactory; + +import de.intevation.gnv.geobackend.base.query.exception.QueryException; + +import de.intevation.gnv.math.Interpolation2D; +import de.intevation.gnv.math.LinearMetrics; +import de.intevation.gnv.math.Point2d; + +import de.intevation.gnv.state.InputData; + +import de.intevation.gnv.utils.DistanceCalculator; +import de.intevation.gnv.utils.StringUtils; +import de.intevation.gnv.utils.WKTUtils; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collection; +import java.util.List; +import java.util.Locale; + +import org.apache.log4j.Logger; + +import org.jfree.chart.ChartTheme; + +import org.w3c.dom.Node; + +/** + * @author Tim Englich (tim.englich@intevation.de) + * @author Ingo Weinzierl (iweinzierl@intevation.de) + * @author Sascha L. Teichmann (sascha.teichmann@intevation.de) + */ +public class HorizontalProfileMeshCrossOutputState +extends HorizontalProfileOutputState +{ + + public static final boolean USE_INDEX_BUFFER = + Boolean.getBoolean("gnv.horizontal.profile.mesh.cross.index.buffer"); + + private static final long serialVersionUID = 2205958041745637263L; + + /** + * the logger, used to log exceptions and additonaly information + */ + private static Logger log = Logger.getLogger( + HorizontalProfileMeshCrossOutputState.class); + + private String ijkQueryID = null; + + /** + * Constructor + */ + public HorizontalProfileMeshCrossOutputState() { + super(); + } + + /** + * @see de.intevation.gnv.state.timeseries.TimeSeriesOutputState#setup(org.w3c.dom.Node) + */ + @Override + public void setup(Node configuration) { + super.setup(configuration); + this.ijkQueryID = Config.getStringXPath(configuration,"queryID-ijk"); + + } + + + @Override + protected Chart getChart( + ChartLabels chartLables, + ChartTheme theme, + Collection parameters, + Collection measurements, + Collection dates, + Object result, + Locale locale, + String uuid, + boolean linesVisible, + boolean shapesVisible, + CallContext callContext + ) { + Chart chart = null; + if (CACHE_CHART) { + log.info("Try to get horizontalprofilemeshcross chart from cache."); + chart = (Chart) getChartFromCache(uuid, callContext); + } + + if (chart != null) + return chart; + + log.info("Chart not in cache yet."); + chart = new HorizontalCrossProfileChart( + chartLables, + theme, + parameters, + measurements, + dates, + (Collection)result, + null, + locale, + linesVisible, + shapesVisible + ); + chart.generateChart(); + + if (CACHE_CHART) { + log.info("Put chart into cache."); + purifyChart(chart, uuid); + } + + return chart; + } + + private static int numSamples(CallContext callContext) { + GNVArtifactContext context = + (GNVArtifactContext)callContext.globalContext(); + Integer samples = (Integer)context.get( + GNVArtifactContext.HORIZONTAL_CROSS_SECTION_PROFILE_SAMPLES_KEY); + return samples != null + ? samples.intValue() + : GNVArtifactContext.DEFAULT_HORIZONTAL_CROSS_SECTION_PROFILE_SAMPLES; + } + + @Override + protected Object getChartResult(String uuid, CallContext callContext) { + log.debug("HorizontalProfileMeshCrossOutputState.getChartResult"); + Collection result = null; + if (CacheFactory.getInstance().isInitialized()) { + String key = uuid + super.getID(); + log.debug("Hash for Queryelements: " + key); + net.sf.ehcache.Element value = CacheFactory.getInstance().getCache().get(key); + if (value != null) { + result = (Collection) (value.getObjectValue()); + }else{ + + InputData meshLine = inputData.get("mesh_linestring"); + InputData meshId = inputData.get("meshid"); + + if (meshLine == null) { + log.error("mesh_linestring is not defined"); + throw new IllegalStateException("missing mesh_linestring"); + } + + if (meshId == null) { + log.error("meshid is not defined"); + throw new IllegalStateException("missing meshid"); + } + + Coordinate [] coords = WKTUtils.toCoordinates( + meshLine.getValue()); + + if (coords == null) { + throw new IllegalStateException("cannot read coordinates"); + } + + try { + String additionWhere = USE_INDEX_BUFFER + ? WKTUtils.worldCoordinatesToIndex( + coords, + result, + meshId.getValue(), + ijkQueryID) + : WKTUtils.TRUE_EXPRESSION; + + String[] addedFilterValues = StringUtils.append( + generateFilterValuesFromInputData(), + additionWhere); + + QueryExecutor queryExecutor = QueryExecutorFactory + .getInstance() + .getQueryExecutor(); + + result = process( + Arrays.asList(coords), + numSamples(callContext), + queryExecutor.executeQuery( + queryID, + addedFilterValues)); + } + catch (QueryException e) { + log.error(e,e); + } + + if (CacheFactory.getInstance().isInitialized()) { + CacheFactory.getInstance().getCache().put(new net.sf.ehcache.Element(key, result)); + } + + } + } + return result; + } + + + @Override + protected String createChartSubtitle(Locale locale, String uuid) { + log.debug("create chart subtitle for horizontal crossprofile charts."); + String subtitle = createTimePeriod(locale, uuid); + + return subtitle; + } + + + public static Collection process( + List path, + int numSamples, + Collection input + ) { + boolean debug = log.isDebugEnabled(); + + if (debug) { + log.debug("--- number of points before processing: " + input.size()); + log.debug(" number samples: " + numSamples); + } + + ArrayList output = new ArrayList(); + + Result last = null; + + int [] diffColums = null; + + SectionHandler sectionHandler = null; + + for (Result result: input) { + + if (sectionHandler == null) { + + ResultDescriptor rd = result.getResultDescriptor(); + diffColums = rd.getColumnIndices(DIFF_COLUMS); + int columns = rd.getColumnCount(); + + DefaultResultDescriptor resultDescriptor = + new DefaultResultDescriptor(); + + for (int j = 0; j < columns; ++j) { + String columnName = rd.getColumnName(j); + if (!StringUtils.contains(COLUMN_BLACKLIST, columnName)) { + resultDescriptor.addColumn( + columnName, + rd.getColumnClassName(j)); + } + } + + sectionHandler = new SectionHandler( + path, + numSamples, + output, + resultDescriptor); + + sectionHandler.setPrototyp(result); + } + + if (last != null && WKTUtils.different(last, result, diffColums)) { + sectionHandler.finish(); + sectionHandler.setPrototyp(result); + } + + sectionHandler.handle(result); + + last = result; + } + + if (sectionHandler != null) { + sectionHandler.finish(); + } + + if (debug) { + log.debug("--- number of points after processing: " + output.size()); + } + + return output; + } + + + private static final String [] DIFF_COLUMS = { + "GROUP1", + "GROUP2", + "GROUP3" + }; + + private static final String [] COLUMN_BLACKLIST = { + "MEDIAN.MESHPOINT.JPOSITION", + "MEDIAN.MESHPOINT.IPOSITION" + }; + + public static final double EPSILON = 1e-5d; + + public static final class SectionHandler + implements Interpolation2D.Consumer + { + private ArrayList points; + private List path; + private Collection output; + private Result prototyp; + private ResultDescriptor descriptor; + private boolean lastWasSuccess; + private int numSamples; + + public SectionHandler() { + } + + public SectionHandler( + List path, + int numSamples, + Collection output, + ResultDescriptor descriptor + ) { + this.path = path; + this.numSamples = numSamples; + this.output = output; + this.descriptor = descriptor; + points = new ArrayList(); + lastWasSuccess = true; + } + + public void finish() { + if (!points.isEmpty()) { + double distance = WKTUtils.toKM( + DistanceCalculator.calculateDistance(path)); + + if (distance > EPSILON) { + + Interpolation2D.interpolate( + path, + points, + 0d, + distance, + numSamples, + LinearMetrics.INSTANCE, + this); + } + + points.clear(); + } + lastWasSuccess = true; + } + + public void setPrototyp(Result prototyp) { + this.prototyp = prototyp; + } + + public void handle(Result result) { + Coordinate coordinate = + WKTUtils.toCoordinate(result.getString("SHAPE")); + double value = result.getDouble("YORDINATE"); + int iPos = result.getInteger("IPOSITION"); + int jPos = result.getInteger("JPOSITION"); + Point2d p = new Point2d( + coordinate.x, + coordinate.y, + value, + iPos, jPos); + points.add(p); + } + + public void interpolated(Coordinate coordinate, boolean success) { + + if (!success && !lastWasSuccess) { + // only insert null if last was valid. + // This prevents flooding the result set with nulls + // if interpolating over a large gap. + return; + } + + DefaultResult result = new DefaultResult(descriptor); + ResultDescriptor pd = prototyp.getResultDescriptor(); + + int pcolums = pd.getColumnCount(); + for (int i = 0, j = 0; i < pcolums; ++i) { + String colname = pd.getColumnName(i); + if (StringUtils.contains(COLUMN_BLACKLIST, colname)) { + continue; + } + if (colname.equals("SHAPE")) { + result.addColumnValue(j, WKTUtils.toWKT(coordinate)); + } + else if (colname.equals("YORDINATE")) { + result.addColumnValue(j, success + ? Double.valueOf(coordinate.z) + : null); + } + else { + result.addColumnValue(j, prototyp.getObject(i)); + } + ++j; + } + output.add(result); + lastWasSuccess = success; + } + } +} diff -r f99d8f92a640 -r 755dd2fa4a0a gnv-artifacts/src/main/java/de/intevation/gnv/state/profile/horizontal/HorizontalProfileOutputState.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv-artifacts/src/main/java/de/intevation/gnv/state/profile/horizontal/HorizontalProfileOutputState.java Fri Sep 28 12:13:53 2012 +0200 @@ -0,0 +1,347 @@ +/** + * + */ +package de.intevation.gnv.state.profile.horizontal; + +import com.vividsolutions.jts.io.ParseException; +import com.vividsolutions.jts.io.WKTReader; + +import de.intevation.artifacts.CallContext; + +import de.intevation.gnv.chart.Chart; +import de.intevation.gnv.chart.ChartLabels; +import de.intevation.gnv.chart.HorizontalProfileChart; + +import de.intevation.gnv.exports.DefaultExport; +import de.intevation.gnv.exports.DefaultProfile; + +import de.intevation.gnv.exports.Export.Profile; + +import de.intevation.gnv.exports.ShapeDataCollector; + +import de.intevation.gnv.geobackend.base.Result; + +import de.intevation.gnv.state.describedata.KeyValueDescibeData; + +import de.intevation.gnv.state.exception.StateException; + +import de.intevation.gnv.state.timeseries.TimeSeriesOutputState; + +import de.intevation.gnv.statistics.HorizontalProfileStatistics; +import de.intevation.gnv.statistics.Statistics; + +import de.intevation.gnv.utils.WKTUtils; + +import java.io.IOException; +import java.io.OutputStream; +import java.io.UnsupportedEncodingException; + +import java.text.SimpleDateFormat; + +import java.util.Collection; +import java.util.Date; +import java.util.Iterator; +import java.util.Locale; + +import org.apache.log4j.Logger; + +import org.jfree.chart.ChartTheme; + +/** + * @author Tim Englich (tim.englich@intevation.de) + */ +public class HorizontalProfileOutputState +extends TimeSeriesOutputState +{ + public static final String [] HORIZONTAL_PROFILE_COLUMNS = { + "SHAPE", + "YORDINATE", + "GROUP1" + // "GROUP2", + }; + + + public static final String [] HORIZONTAL_MESH_CSV_COLUMN_LABEL = { + "Longitude", + "Latitude", + "Value", + "ParameterID", + //"MeshID" + }; + + + public static final String [] HORIZONTAL_MEASUREMENT_CSV_COLUMN_LABEL = { + "Longitude", + "Latitude", + "Value", + "ParameterID", + //"SurveyID" + }; + /** + * The UID of this class + */ + private static final long serialVersionUID = 4401516087492028840L; + + private static Logger log = Logger + .getLogger(HorizontalProfileOutputState.class); + + public static final String DATE_FORMAT = "yyyy.MM.dd HH:mm:ss"; + + public static final String [] CHART_TITLE_META = { + "CRUISE", + "DEPTH", + "SHAPE" + }; + + + public static final String [] CHART_TITLE_META_RESSOURCES = { + "cruiseid", + "depth", + "coordinate" + }; + + public static final String [] TIMESERIES_CSV_PROFILE_NAMES = { + "SHAPE", + "YORDINATE", + "GROUP1", + "GROUP2", + "GROUP3" + }; + + public static final Profile TIMESERIES_CSV_PROFILE = + new DefaultProfile( + null, + ',', + '"', + '"', + "CSV", + "ISO-8859-1"); + + /** + * Constructor + */ + public HorizontalProfileOutputState() { + super(); + super.domainLable = "chart.horizontalprofile.title.xaxis"; + } + + + @Override + protected Chart getChart( + ChartLabels chartLables, + ChartTheme theme, + Collection parameters, + Collection measurements, + Collection dates, + Object result, + Locale locale, + String uuid, + boolean linesVisible, + boolean shapesVisible, + CallContext callContext + ) { + Chart chart = null; + + if (CACHE_CHART) { + log.info("Try to get horizontalprofile chart from cache."); + chart = (Chart) getChartFromCache(uuid, callContext); + } + + if (chart != null) + return chart; + + log.info("Chart not in cache yet."); + chart = new HorizontalProfileChart( + chartLables, + theme, + parameters, + measurements, + dates, + (Collection)result, + null, + locale, + linesVisible, + shapesVisible + ); + chart.generateChart(); + + if (CACHE_CHART) { + log.info("Put chart into cache."); + purifyChart(chart, uuid); + } + + return chart; + } + + + /** + * @see de.intevation.gnv.state.timeseries.TimeSeriesOutputState#getStatisticsGenerator() + */ + @Override + protected Statistics getStatisticsGenerator() { + return new HorizontalProfileStatistics(); + } + + + @Override + protected void createCSV(OutputStream out, Collection results) + throws UnsupportedEncodingException, IOException, StateException + { + log.debug("Create csv export for horizontal profiles."); + Iterator iter = results.iterator(); + Result res = iter.hasNext() ? (Result) iter.next() : null; + + if (res == null) + return; + + Profile profile = null; + int dataid = res.getInteger("DATAID").intValue(); + + // on meshes + if (dataid == 2) { + profile = new DefaultProfile( + HORIZONTAL_MESH_CSV_COLUMN_LABEL, + ',', + '"', + '"', + "CSV", + "ISO-8859-1"); + } + + // on measurements + else { + profile = new DefaultProfile( + HORIZONTAL_MEASUREMENT_CSV_COLUMN_LABEL, + ',', + '"', + '"', + "CSV", + "ISO-8859-1"); + } + + DefaultExport export = new DefaultExport( + new ShapeDataCollector(HORIZONTAL_PROFILE_COLUMNS)); + export.create(profile, out, results); + } + + + protected String createChartTitle(Locale locale, String uuid) { + String fisName = getFisName(locale); + log.debug("created title for horizontal profile chart: " + fisName); + + return fisName; + } + + + protected String createChartSubtitle(Locale locale, String uuid) { + log.debug("create chart subtitle."); + String subtitle = createTimePeriod(locale, uuid); + + // ODV results contain meta information about cruise, station and so on + Collection results = getODVResult(uuid); + if (results != null) { + Iterator iter = results.iterator(); + Result result = iter.hasNext() ? (Result) iter.next() : null; + + subtitle += subtitle.length() != 0 ? "\n" : ""; + subtitle += createMetaChartSubtitle(locale, result); + } + + return subtitle; + } + + + protected String createMetaChartSubtitle(Locale locale, Result result) { + log.debug("Fetch meta information and put it into subtitle."); + if (result == null) + return ""; + + StringBuilder meta = new StringBuilder(); + WKTReader wktReader = new WKTReader(); + + + for (int i = 0; i < CHART_TITLE_META.length; i++) { + String qry = CHART_TITLE_META[i]; + + if (qry.equals("SHAPE")) { + String wktPoint = result.getString(qry); + + meta.append(getMessage(locale,"coordinate","coordinate")); + meta.append(": "); + meta.append(WKTUtils.toText(wktPoint)); + } + else { + log.debug( + "Add " + qry + " to meta information of subtitle: " + + result.getString(qry) + ); + meta.append(getMessage( + locale, + CHART_TITLE_META_RESSOURCES[i], + CHART_TITLE_META_RESSOURCES[i] + )); + meta.append(": "); + meta.append(result.getString(qry)); + } + + if (i != CHART_TITLE_META.length-1) + meta.append("\n"); + } + + log.debug("Meta title for chart: " + meta.toString()); + return meta.toString(); + } + + + protected String createTimePeriod(Locale locale, String uuid) { + log.debug("create time period for chart subtitle."); + String subTitle = null; + Date startDate = null; + Date endDate = null; + + Collection dates = getDates(uuid); + if (dates == null) { + log.debug("No time period for subtitle."); + return ""; + } + + SimpleDateFormat format = new SimpleDateFormat(DATE_FORMAT); + KeyValueDescibeData data = null; + + Iterator iter = dates.iterator(); + while (iter.hasNext()) { + try { + data = (KeyValueDescibeData)iter.next(); + + if (!data.isSelected()) + continue; + + Date current = format.parse(data.getValue()); + long time = current.getTime(); + + if (startDate == null) { + startDate = current; + endDate = current; + } + else if (time < startDate.getTime()) { + startDate = current; + } + else if (time > endDate.getTime()) { + endDate = current; + } + } + catch (java.text.ParseException pe) { + log.warn("Error while parsing date: " + data.getValue(), pe); + } + } + + if (startDate != null && endDate != null) + subTitle = format.format(startDate)+" - "+format.format(endDate); + + subTitle = subTitle == null ? "" : subTitle; + + log.debug("created title for horizontal profile chart: " + subTitle); + + return subTitle; + } +} diff -r f99d8f92a640 -r 755dd2fa4a0a gnv-artifacts/src/main/java/de/intevation/gnv/state/profile/horizontal/NorthSouthEastWestState.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv-artifacts/src/main/java/de/intevation/gnv/state/profile/horizontal/NorthSouthEastWestState.java Fri Sep 28 12:13:53 2012 +0200 @@ -0,0 +1,88 @@ +/** + * + */ +package de.intevation.gnv.state.profile.horizontal; + +import de.intevation.artifacts.CallContext; +import de.intevation.artifacts.CallMeta; + +import de.intevation.gnv.artifacts.ressource.RessourceFactory; + +import de.intevation.gnv.geobackend.base.Result; + +import de.intevation.gnv.state.StateBase; + +import de.intevation.gnv.state.describedata.DefaultKeyValueDescribeData; +import de.intevation.gnv.state.describedata.KeyValueDescibeData; +import de.intevation.gnv.state.describedata.NamedArrayList; +import de.intevation.gnv.state.describedata.NamedCollection; + +import de.intevation.gnv.state.exception.StateException; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; + +/** + * @author Tim Englich + * + */ +public class NorthSouthEastWestState extends StateBase { + + + /** + * The UID of this Class + */ + private static final long serialVersionUID = -7989531326553305293L; + + protected String ipos; + protected String jpos; + + /** + * Constructor + */ + public NorthSouthEastWestState() { + } + + /** + * @see de.intevation.gnv.state.StateBase#purifyResult(java.util.Collection, java.lang.String) + */ + @Override + protected List purifyResult(Collection result, String uuid) { + List describeData = new ArrayList(); + + NamedCollection keyValueDescibeData = + new NamedArrayList(dataName, 2); + + keyValueDescibeData.setMultiSelect(super.dataMultiSelect); + keyValueDescibeData.add(new DefaultKeyValueDescribeData( + "IPOSITION", ipos)); + keyValueDescibeData.add(new DefaultKeyValueDescribeData( + "JPOSITION", jpos)); + describeData.add(keyValueDescibeData); + + return describeData; + } + + /** + * @see de.intevation.gnv.state.StateBase#initialize(java.lang.String, de.intevation.artifacts.CallMeta) + */ + @Override + public void initialize(String uuid, CallContext context) + throws StateException + { + CallMeta callMeta = context.getMeta(); + RessourceFactory factory = RessourceFactory.getInstance(); + + // XXX Workarround - we need these strings in purifyResult, but have no + // CallMeta object there which is necessary to get resources from + // RessourceFactory. Storing the strings here is not nice, because the + // Locale object could change! + ipos = factory.getRessource( + callMeta.getLanguages(), "iposition", "iposition"); + jpos = factory.getRessource( + callMeta.getLanguages(), "jposition", "jposition"); + } + + +} diff -r f99d8f92a640 -r 755dd2fa4a0a gnv-artifacts/src/main/java/de/intevation/gnv/state/profile/horizontalcrosssection/HorizontalCrossSectionMeshOutputState.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv-artifacts/src/main/java/de/intevation/gnv/state/profile/horizontalcrosssection/HorizontalCrossSectionMeshOutputState.java Fri Sep 28 12:13:53 2012 +0200 @@ -0,0 +1,713 @@ +package de.intevation.gnv.state.profile.horizontalcrosssection; + +import com.vividsolutions.jts.geom.Coordinate; +import com.vividsolutions.jts.geom.Envelope; +import com.vividsolutions.jts.geom.MultiLineString; +import com.vividsolutions.jts.geom.MultiPolygon; +import com.vividsolutions.jts.geom.Polygon; + +import de.intevation.artifactdatabase.Config; +import de.intevation.artifactdatabase.XMLUtils; + +import de.intevation.artifacts.ArtifactNamespaceContext; +import de.intevation.artifacts.CallContext; + +import de.intevation.gnv.artifacts.cache.CacheFactory; + +import de.intevation.gnv.artifacts.context.GNVArtifactContext; + +import de.intevation.gnv.geobackend.base.Result; +import de.intevation.gnv.geobackend.base.ResultDescriptor; + +import de.intevation.gnv.geobackend.base.query.QueryExecutor; +import de.intevation.gnv.geobackend.base.query.QueryExecutorFactory; + +import de.intevation.gnv.geobackend.base.query.exception.QueryException; + +import de.intevation.gnv.geobackend.sde.datasources.RasterObject; + +import de.intevation.gnv.math.AreaInterpolation; +import de.intevation.gnv.math.AttributedPoint2ds; +import de.intevation.gnv.math.Point2d; +import de.intevation.gnv.math.QueriedXYDepth; + +import de.intevation.gnv.raster.ExternalIndexConverter; +import de.intevation.gnv.raster.IsoAttributeGenerator; +import de.intevation.gnv.raster.JTSMultiLineStringProducer; +import de.intevation.gnv.raster.JTSMultiPolygonProducer; +import de.intevation.gnv.raster.Palette; +import de.intevation.gnv.raster.PaletteManager; +import de.intevation.gnv.raster.Raster; +import de.intevation.gnv.raster.Vectorizer; + +import de.intevation.gnv.state.InputData; +import de.intevation.gnv.state.OutputStateBase; + +import de.intevation.gnv.state.exception.StateException; + +import de.intevation.gnv.utils.FileUtils; +import de.intevation.gnv.utils.MapfileGenerator; +import de.intevation.gnv.utils.MetaWriter; +import de.intevation.gnv.utils.Pair; +import de.intevation.gnv.utils.ShapeFileWriter; +import de.intevation.gnv.utils.StringUtils; +import de.intevation.gnv.utils.WKTUtils; + +import java.awt.Dimension; + +import java.io.File; +import java.io.IOException; +import java.io.OutputStream; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.Date; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import org.apache.log4j.Logger; + +import org.w3c.dom.Document; +import org.w3c.dom.Element; +import org.w3c.dom.Node; + +/** + * @author Tim Englich (tim.englich@intevation.de) + * @author Sascha L. Teichmann (sascha.teichmann@intevation.de) + * @author Ingo Weinzierl (ingo.weinzierl@intevation.de) + */ +public class HorizontalCrossSectionMeshOutputState +extends OutputStateBase +{ + private static Logger log = Logger + .getLogger(HorizontalCrossSectionMeshOutputState.class); + + /** + * The UID of this Class + */ + private static final long serialVersionUID = 3233620652465061860L; + + public static final boolean USE_INDEX_BUFFER = + Boolean.getBoolean("gnv.horizontal.cross.section.mesh.index.buffer"); + + public static final String ISOLINES_NAME = "isolines.shp"; + public static final String POLYGON_NAME = "polygons.shp"; + public static final String LAYER_MODEL = "horizontalcrosssection"; + + private String ijkQueryID; + + private Boolean shapeFileLock = new Boolean(true); + + private String shapeFilePath; + + /** + * Constructor + */ + public HorizontalCrossSectionMeshOutputState() { + } + + public void initialize(String uuid, CallContext callContext) + throws StateException { + super.initialize(uuid, callContext); + if (log.isDebugEnabled()) { + log.debug("initialize output state " + uuid); + } + // fill the cache + getResult(uuid, callContext); + } + + public String getShapeFilePath() { + synchronized (shapeFileLock) { + return shapeFilePath; + } + } + + public void setShapeFilePath(String shapeFilePath) { + synchronized (shapeFileLock) { + this.shapeFilePath = shapeFilePath; + } + } + + public String resetShapeFilePath() { + synchronized (shapeFileLock) { + String path = shapeFilePath; + shapeFilePath = null; + return path; + } + } + + public void endOfLife(Object globalContext) { + super.endOfLife(globalContext); + + // do it in background + new Thread() { + public void run() { + // TODO: Do the un-publishing WMS stuff. + String path = resetShapeFilePath(); + + if (path == null) { + return; + } + + File dir = new File(path); + + for (int i = 0; i < 10; ++i) { + if (!dir.exists() || FileUtils.deleteRecursive(dir)) { + MapfileGenerator.getInstance().update(); + return; + } + + try { + Thread.sleep(10000L); + } + catch (InterruptedException ie) { + } + } + + log.error("failed to remove directory '" + path + "'"); + } // run + }.start(); + } + + public void out( + Document format, + Collection inputData, + OutputStream outputStream, + String uuid, + CallContext callContext + ) + throws StateException + { + String outputMode = XMLUtils.xpathString( + format, XPATH_OUTPUT_MODE, ArtifactNamespaceContext.INSTANCE); + + if (outputMode == null) { + throw new StateException("cannot find outputMode or mime"); + } + + outputMode = outputMode.toLowerCase(); + + if (log.isDebugEnabled()) { + log.debug("---- asking for: " + outputMode); + } + + if ("zip".equals(outputMode)) { + writeZip(uuid, callContext, outputStream); + } + else if ("wms".equals(outputMode)) { + XMLUtils.toStream( + getWMS(uuid, callContext), + outputStream); + } + else { + throw new StateException("unsupported output mode"); + } + } + + protected void writeZip( + String uuid, + CallContext callContext, + OutputStream output + ) + throws StateException + { + try { + String p = getShapeFilePath(); + if (p != null) { + File dir = new File(p); + if (dir.isDirectory()) { + FileUtils.createZipArchive(dir, output); + } + } + else { + AttributedPoint2ds result = getResult(uuid, callContext); + if (result != null + && (p = writeToShapeFile(uuid, result, callContext)) != null) { + FileUtils.createZipArchive(new File(p), output); + } + } + } + catch (IOException ioe) { + log.error(ioe.getLocalizedMessage(), ioe); + } + } + + protected Document getWMS(String uuid, CallContext callContext) + throws StateException + { + // TODO: Do the real WMS publishing here! + Document document = XMLUtils.newDocument(); + + Element pathElement = document.createElement("path"); + document.appendChild(pathElement); + + String path = getShapeFilePath(); + + if (path != null && new File(path).isDirectory()) { + pathElement.setTextContent(path); + } + else { + AttributedPoint2ds result = getResult(uuid, callContext); + if (result != null + && (path = writeToShapeFile(uuid, result, callContext)) != null) { + + InputData inputParam = inputData.get("parameterid"); + Map paletteManagers = + getPalettes(callContext); + String paramType = null; + + if (inputParam == null || paletteManagers == null) { + log.warn("Parameter-id not found."); + paramType = LAYER_MODEL; + } + else { + Integer parameterId = Integer.parseInt(inputParam.getValue()); + PaletteManager paletteManager = paletteManagers.get(parameterId); + + paramType = LAYER_MODEL + "_" + paletteManager.getName(); + } + + Document meta = MetaWriter.writeHorizontalcrosssectionMeta( + callContext, uuid, path, paramType); + if (meta != null) { + MapfileGenerator.getInstance().update(); + return meta; + } + + pathElement.setTextContent(path); + } + } + + return document; + } + + protected String writeToShapeFile( + String uuid, + AttributedPoint2ds result, + CallContext callContext + ) { + File baseDir = shapefileDirectory(callContext); + + File shapeDir = new File(baseDir, uuid); + + boolean success = false; + boolean createdDir = false; + + try { + synchronized (shapeFileLock) { + int count = 0; + while (shapeDir.exists()) { + shapeDir = new File(baseDir, uuid + "-" + count); + ++count; + } + + if (!shapeDir.mkdirs()) { + log.error("cannot create directory '" + + shapeDir.getAbsolutePath() + "'"); + return null; + } + createdDir = true; + } + + Map polygons = result.getPolygons(); + + List> isolines = + result.getLineStrings(); + + File polygonsFile = new File(shapeDir, POLYGON_NAME); + File isolinesFile = new File(shapeDir, ISOLINES_NAME); + + if (!ShapeFileWriter.writeMultiPolygonsToFile( + polygonsFile, + (Integer)result.getAttribute("parameter"), + (Integer)result.getAttribute("layer"), + (Date) result.getAttribute("date"), + polygons) + ) { + log.error("writing polygons failed"); + return null; + } + + if (!ShapeFileWriter.writeMultiLineStringsToFile( + isolinesFile, + (Integer)result.getAttribute("parameter"), + (Integer)result.getAttribute("layer"), + (Date) result.getAttribute("date"), + isolines) + ) { + log.error("writing isolines failed"); + return null; + } + + shapeFilePath = shapeDir.getAbsolutePath(); + success = true; + + callContext.afterCall(CallContext.STORE); + + return shapeFilePath; + } + finally { + if (!success && createdDir) { + FileUtils.deleteRecursive(shapeDir); + } + } + } + + + protected AttributedPoint2ds getResult(String uuid, CallContext callContext) + throws StateException + { + CacheFactory cf = CacheFactory.getInstance(); + String key = uuid + super.getID(); + + if (cf.isInitialized()) { + net.sf.ehcache.Element value = cf.getCache().get(key); + if (value != null) { + return (AttributedPoint2ds)value.getObjectValue(); + } + } + + AttributedPoint2ds result = produceResult(callContext); + + if (result != null && cf.isInitialized()) { + cf.getCache().put(new net.sf.ehcache.Element(key, result)); + } + + return result; + } + + protected AttributedPoint2ds produceResult(CallContext callContext) + throws StateException + { + InputData meshPolygon = inputData.get("mesh_polygon"); + InputData meshId = inputData.get("meshid"); + + if (meshPolygon == null) { + log.error("mesh_polygon is not defined"); + throw new StateException("missing mesh_linestring"); + } + + if (meshId == null) { + log.error("meshid is not defined"); + throw new StateException("missing meshid"); + } + + Polygon p = WKTUtils.toPolygon(meshPolygon.getValue()); + + if (p == null) { + log.error("no valid polygon"); + throw new StateException("no valid polygon"); + } + + try { + Envelope env = p.getEnvelopeInternal(); + + String additionWhere; + + if (USE_INDEX_BUFFER) { + Coordinate [] coords = new Coordinate [] { + new Coordinate(env.getMinX(), env.getMinY()), + new Coordinate(env.getMinX(), env.getMaxY()), + new Coordinate(env.getMaxX(), env.getMaxY()), + new Coordinate(env.getMaxX(), env.getMinY()) }; + + additionWhere = + WKTUtils.worldEnvelopeCoordinatesToIndex( + coords, + meshId.getValue(), + ijkQueryID); + } + else { + additionWhere = WKTUtils.TRUE_EXPRESSION; + } + + String[] addedFilterValues = StringUtils.append( + generateFilterValuesFromInputData(), + additionWhere); + + QueryExecutor queryExecutor = QueryExecutorFactory + .getInstance() + .getQueryExecutor(); + + return process( + env, + p, + callContext, + preProcess( + queryExecutor.executeQuery( + queryID, + addedFilterValues))); + } + catch (QueryException e) { + log.error(e,e); + } + + throw new StateException("no result produced"); + } + + public AttributedPoint2ds preProcess(Collection results) { + + boolean debug = log.isDebugEnabled(); + + if (debug) { + log.debug("--- preProcess: " + results.size() + " results"); + } + + AttributedPoint2ds ap2ds = new AttributedPoint2ds(); + + ArrayList points = new ArrayList(results.size()); + + int sIdx = -1; + int iIdx = -1; + int jIdx = -1; + int vIdx = -1; + + boolean firstWarn = true; + + for (Result result: results) { + + if (sIdx == -1) { + ResultDescriptor rd = result.getResultDescriptor(); + sIdx = rd.getColumnIndex("SHAPE"); + iIdx = rd.getColumnIndex("IPOSITION"); + jIdx = rd.getColumnIndex("JPOSITION"); + vIdx = rd.getColumnIndex("YORDINATE"); + int kIdx = rd.getColumnIndex("KPOSITION"); + int tIdx = rd.getColumnIndex("TIMEVALUE"); + int pIdx = rd.getColumnIndex("PARAMETERID"); + + if (sIdx == -1 || iIdx == -1 + || jIdx == -1 || kIdx == -1 + || vIdx == -1 || tIdx == -1 + || pIdx == -1 + ) { + log.error("missing column in result set"); + return null; + } + + ap2ds.setAttribute("date", result.getDate(tIdx)); + ap2ds.setAttribute("parameter", result.getInteger(pIdx)); + ap2ds.setAttribute("layer", result.getInteger(kIdx)); + } + Coordinate coord = WKTUtils.toCoordinate(result.getString(sIdx)); + if (coord == null) { + if (firstWarn) { + firstWarn = false; + log.warn("cannot fetch coordinate from result"); + } + continue; + } + double v = result.getDouble(vIdx); + int i = result.getInteger(iIdx); + int j = result.getInteger(jIdx); + + Point2d p2d = new Point2d(coord.x, coord.y, v, i, j); + points.add(p2d); + + } + ap2ds.setPoints(points); + + return ap2ds; + } + + public AttributedPoint2ds process( + Envelope boundingBox, + Polygon polygon, + CallContext callContext, + AttributedPoint2ds input + ) { + if (input == null) { + log.error("no data to interpolate"); + return null; + } + + Integer parameterId = + (Integer)input.getAttribute("parameter"); // XXX: hardcoded + + if (parameterId == null) { + log.error("missing parameter id"); + return null; + } + + Map paletteManagers = + getPalettes(callContext); + + PaletteManager paletteManager = paletteManagers.get(parameterId); + + if (paletteManager == null) { + log.error("no palette found for parameter id " + parameterId); + return null; + } + + boolean debug = log.isDebugEnabled(); + + if (debug) { + log.debug("interpolation"); + } + + AreaInterpolation interpolation = + new AreaInterpolation(); + + int numSamples = numSamples(callContext); + int groundInterpolation = getGroundInterpolation(callContext); + int extrapolationRounds = extrapolationRounds(callContext); + + if (!interpolation.interpolate( + input.getPoints(), + boundingBox, + new Dimension(numSamples, numSamples), + new QueriedXYDepth(groundInterpolation), + extrapolationRounds + )) { + log.error("interpolation failed"); + return null; + } + + // Do the post processing + Raster raster = new Raster( + interpolation.getRaster(), + numSamples); + + // TODO: Filter operations. + + if (debug) { + log.debug("to indexed raster"); + } + + // scan for regions with base palette + Palette basePalette = paletteManager.getBase(); + + int [] intRaster = raster.toIndexed(basePalette); + + // produce JFreeChart compatible polygons + + if (debug) { + log.debug("vectorize indexed raster"); + } + + // produce JTS compatible polygons + + JTSMultiPolygonProducer jtsmpp = new JTSMultiPolygonProducer( + polygon, + boundingBox.getMinX(), boundingBox.getMinY(), + boundingBox.getMaxX(), boundingBox.getMaxY()); + + int numRegions = new Vectorizer(intRaster, numSamples) + .process(jtsmpp); + + Map polygons = jtsmpp.getMultiPolygons( + new ExternalIndexConverter(basePalette)); + + jtsmpp.clear(); jtsmpp = null; // help gc + + int numColors = polygons.size(); + + if (debug) { + log.debug("number of regions: " + numRegions); + log.debug("number of colors: " + numColors); + } + // generate iso lines + + int numIso; + + if (numColors < 5) { numIso = 5; } + else if (numColors < 10) { numIso = 2; } + else { numIso = 0; } + + Palette isoPalette; + + if (numIso == 0) { // same palette + isoPalette = basePalette; + /* intRaster = intRaster; */ + } + else { + isoPalette = paletteManager.getLevel(numIso); + intRaster = raster.toIndexed(isoPalette); + } + + JTSMultiLineStringProducer jtslsp = new JTSMultiLineStringProducer( + polygon, + boundingBox.getMinX(), boundingBox.getMinY(), + boundingBox.getMaxX(), boundingBox.getMaxY()); + + numRegions = new Vectorizer(false, intRaster, numSamples) + .process(jtslsp); + + IsoAttributeGenerator iag = new IsoAttributeGenerator(isoPalette); + + List> lineStrings = + jtslsp.getMultiLineStrings(iag); + + jtslsp.clear(); jtslsp = null; // help gc + + input.setInterpolation(interpolation); + + input.setPolygons(polygons); + input.setLineStrings(lineStrings); + + return input; + } + + + @Override + public void setup(Node configuration) { + super.setup(configuration); + this.ijkQueryID = Config.getStringXPath(configuration,"queryID-ijk"); + + } + + private static int numSamples(CallContext callContext) { + GNVArtifactContext context = + (GNVArtifactContext)callContext.globalContext(); + Integer samples = (Integer)context.get( + GNVArtifactContext.HORIZONTAL_CROSS_SECTION_SAMPLES_KEY); + return samples != null + ? samples.intValue() + : GNVArtifactContext.DEFAULT_HORIZONTAL_CROSS_SECTION_SAMPLES; + } + + private static int extrapolationRounds(CallContext callContext) { + GNVArtifactContext context = + (GNVArtifactContext)callContext.globalContext(); + Integer extrapolationRounds = (Integer)context.get( + GNVArtifactContext.HORIZONTAL_CROSS_SECTION_EXTRAPOLATION_ROUNDS_KEY); + return extrapolationRounds != null + ? extrapolationRounds.intValue() + : GNVArtifactContext.DEFAULT_HORIZONTAL_CROSS_SECTION_EXTRAPOLATION_ROUNDS; + } + + private static File shapefileDirectory(CallContext callContext) { + GNVArtifactContext context = + (GNVArtifactContext)callContext.globalContext(); + File dir = (File)context.get( + GNVArtifactContext.HORIZONTAL_CROSS_SECTION_RESULT_SHAPEFILE_PATH_KEY); + return dir != null + ? dir + : GNVArtifactContext.DEFAULT_HORIZONTAL_CROSS_SECTION_PROFILE_SHAPEFILE_PATH; + } + + private static int getGroundInterpolation(CallContext callContext) { + GNVArtifactContext context = + (GNVArtifactContext)callContext.globalContext(); + + String interpolation = (String)context.get( + GNVArtifactContext.HORIZONTAL_CROSS_SECTION_GROUND_INTERPOLATION_KEY); + + return RasterObject.getInterpolationType(interpolation); + } + + private static Map getPalettes( + CallContext callContext + ) { + GNVArtifactContext context = + (GNVArtifactContext)callContext.globalContext(); + Map palettes = + (Map)context.get( + GNVArtifactContext.PALETTES_KEY); + return palettes != null + ? palettes + : new HashMap(); + } +} +// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 : diff -r f99d8f92a640 -r 755dd2fa4a0a gnv-artifacts/src/main/java/de/intevation/gnv/state/profile/vertical/VerticalProfileOutputState.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv-artifacts/src/main/java/de/intevation/gnv/state/profile/vertical/VerticalProfileOutputState.java Fri Sep 28 12:13:53 2012 +0200 @@ -0,0 +1,205 @@ +/** + * + */ +package de.intevation.gnv.state.profile.vertical; + +import java.io.IOException; +import java.io.OutputStream; +import java.io.UnsupportedEncodingException; +import java.util.Collection; +import java.util.Iterator; +import java.util.Locale; + +import org.apache.log4j.Logger; + +import org.jfree.chart.ChartTheme; + +import de.intevation.gnv.chart.Chart; +import de.intevation.gnv.chart.ChartLabels; +import de.intevation.gnv.chart.VerticalProfileChart; +import de.intevation.gnv.exports.DefaultExport; +import de.intevation.gnv.exports.DefaultDataCollector; +import de.intevation.gnv.exports.DefaultProfile; +import de.intevation.gnv.exports.Export.Profile; +import de.intevation.gnv.geobackend.base.Result; +import de.intevation.gnv.state.exception.StateException; +import de.intevation.gnv.state.timeseries.TimeSeriesOutputState; +import de.intevation.gnv.statistics.Statistics; +import de.intevation.gnv.statistics.VerticalProfileStatistics; + +import de.intevation.artifacts.CallContext; + +/** + * @author Tim Englich + * + */ +public class VerticalProfileOutputState extends TimeSeriesOutputState { + + public static final String [] VERTICAL_PROFILE_COLUMNS = { + "XORDINATE", // not quite sure if this is depth + "YORDINATE", + "GROUP1" + // "GROUP2", + // "GROUP3" + }; + + + public static final String [] VERTICAL_MESH_CSV_COLUMN_LABEL = { + "CentralDepth", + "Value", + "ParameterID" + // TODO "FeatureID", + // TODO "MeshID" + }; + + + public static final String [] VERTICAL_TIMESERIES_CSV_COLUMN_LABEL = { + "Depth", + "Value", + "ParameterID" + // TODO FeatureID missing + // TODO TimeseriesID missing + }; + + + public static final String [] VERTICAL_MEASUREMENT_CSV_COLUMN_LABEL = { + "Depth", + "Value", + "ParameterID" + // TODO FeatureID missing + // TODO SeriesID missing + }; + + + /** + * The UID of this class + */ + private static final long serialVersionUID = 4401516087492028840L; + + private static Logger log = Logger + .getLogger(TimeSeriesOutputState.class); + + /** + * Constructor + */ + public VerticalProfileOutputState() { + super(); + super.domainLable = "chart.verticalprofile.title.xaxis"; + } + + + @Override + protected Chart getChart( + ChartLabels chartLables, + ChartTheme theme, + Collection parameters, + Collection measurements, + Collection dates, + Object result, + Locale locale, + String uuid, + boolean linesVisible, + boolean shapesVisible, + CallContext callContext + ) { + Chart chart = null; + + if (CACHE_CHART) { + log.info("Try to get verticalprofile chart from cache."); + chart = (Chart) getChartFromCache(uuid, callContext); + } + + if (chart != null) + return chart; + + log.info("Chart not in cache yet."); + chart = new VerticalProfileChart( + chartLables, + theme, + parameters, + measurements, + dates, + (Collection)result, + null, + locale, + linesVisible, + shapesVisible + ); + chart.generateChart(); + + if (CACHE_CHART) { + log.info("Put chart into cache."); + purifyChart(chart, uuid); + } + + return chart; + } + + + @Override + protected void createCSV(OutputStream out, Collection results) + throws UnsupportedEncodingException, IOException, StateException + { + Iterator iter = results.iterator(); + Result res = iter.hasNext() ? (Result) iter.next() : null; + + if (res == null) + return; + + Profile profile = null; + int dataid = res.getInteger("DATAID").intValue(); + + // on meshes + if (dataid == 2) { + profile = new DefaultProfile( + VERTICAL_MESH_CSV_COLUMN_LABEL, + ',', + '"', + '"', + "CSV", + "ISO-8859-1"); + } + + // on timeseries + else if (dataid == 1) { + profile = new DefaultProfile( + VERTICAL_TIMESERIES_CSV_COLUMN_LABEL, + ',', + '"', + '"', + "CSV", + "ISO-8859-1"); + } + + // on measurements + else { + profile = new DefaultProfile( + VERTICAL_MEASUREMENT_CSV_COLUMN_LABEL, + ',', + '"', + '"', + "CSV", + "ISO-8859-1"); + } + + DefaultExport export = new DefaultExport( + new DefaultDataCollector(VERTICAL_PROFILE_COLUMNS)); + export.create(profile, out, results); + } + + + protected String createChartSubtitle(Locale locale, String uuid) { + return getSelectedFeatureName(uuid); + } + + + + /** + * @see de.intevation.gnv.state.timeseries.TimeSeriesOutputState#getStatisticsGenerator() + */ + @Override + protected Statistics getStatisticsGenerator() { + return new VerticalProfileStatistics(); + } + +} diff -r f99d8f92a640 -r 755dd2fa4a0a gnv-artifacts/src/main/java/de/intevation/gnv/state/profile/verticalcrosssection/OutputHelper.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv-artifacts/src/main/java/de/intevation/gnv/state/profile/verticalcrosssection/OutputHelper.java Fri Sep 28 12:13:53 2012 +0200 @@ -0,0 +1,87 @@ +package de.intevation.gnv.state.profile.verticalcrosssection; + +import de.intevation.gnv.jfreechart.CompactXYItems; +import de.intevation.gnv.jfreechart.PolygonSeries; + +import de.intevation.gnv.math.Interpolation3D; + +import gnu.trove.TDoubleArrayList; + +import org.apache.log4j.Logger; + +/** + * @author Sascha L. Teichmann (sascha.teichmann@intevation.de) + */ +public class OutputHelper +{ + private static Logger log = Logger.getLogger(OutputHelper.class); + + public static final double EPS = 1e-5d; + + private OutputHelper() { + } + + public static PolygonSeries createSeabedPolygon( + Interpolation3D interpolation, + Integer fill + ) { + double maxDepth = interpolation.getMaxDepth(); + double cellWidth = interpolation.getCellWidth(); + double cellHeight = interpolation.getCellHeight(); + + double [] depths = interpolation.getDepths(); + + double x = 0d; + + TDoubleArrayList vertices = new TDoubleArrayList(); + + PolygonSeries ps = new PolygonSeries(); + + for (int i = 0; i < depths.length; ++i, x += cellWidth) { + double depth = depths[i]; + + if (vertices.isEmpty()) { + if (Double.isNaN(depth) || depth == maxDepth) { + continue; + } + if (depth > 0d) depth = 0d; + vertices.add(x); vertices.add(maxDepth); + vertices.add(x); vertices.add(depth); + vertices.add(x+cellWidth); vertices.add(depth); + } + else { // in polygon + if (Double.isNaN(depth) || depth == maxDepth) { + vertices.add(x); vertices.add(maxDepth); + ps.addRing(new CompactXYItems(vertices.toNativeArray())); + vertices.reset(); + } + else { + if (depth > 0d) depth = 0d; + int N = vertices.size(); + if (N > 2 && Math.abs(depth - vertices.get(N-1)) < EPS) { + vertices.set(N-2, x+cellWidth); + } + else { + vertices.add(vertices.get(N-2)); vertices.add(depth); + vertices.add(x+cellWidth); vertices.add(depth); + } + } + } + } // for all depths + + if (!vertices.isEmpty()) { + vertices.add(vertices.get(vertices.size()-2)); + vertices.add(maxDepth); + ps.addRing(new CompactXYItems(vertices.toNativeArray())); + } + + if (ps.getItemCount() == 0) { + return null; + } + + ps.setAttribute("fill", fill); + + return ps; + } +} +// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 : diff -r f99d8f92a640 -r 755dd2fa4a0a gnv-artifacts/src/main/java/de/intevation/gnv/state/profile/verticalcrosssection/VerticalCrossSectionOutputState.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv-artifacts/src/main/java/de/intevation/gnv/state/profile/verticalcrosssection/VerticalCrossSectionOutputState.java Fri Sep 28 12:13:53 2012 +0200 @@ -0,0 +1,638 @@ +package de.intevation.gnv.state.profile.verticalcrosssection; + +import com.vividsolutions.jts.geom.Coordinate; + +import de.intevation.artifacts.CallContext; + +import de.intevation.gnv.artifacts.cache.CacheFactory; + +import de.intevation.gnv.artifacts.context.GNVArtifactContext; + +import de.intevation.gnv.artifacts.ressource.RessourceFactory; + +import de.intevation.gnv.chart.Chart; +import de.intevation.gnv.chart.ChartLabels; +import de.intevation.gnv.chart.VerticalCrossSectionChart; + +import de.intevation.gnv.geobackend.base.Result; +import de.intevation.gnv.geobackend.base.ResultDescriptor; + +import de.intevation.gnv.geobackend.base.query.QueryExecutor; +import de.intevation.gnv.geobackend.base.query.QueryExecutorFactory; + +import de.intevation.gnv.geobackend.base.query.exception.QueryException; + +import de.intevation.gnv.geobackend.sde.datasources.RasterObject; + +import de.intevation.gnv.jfreechart.PolygonDataset; +import de.intevation.gnv.jfreechart.PolygonSeries; + +import de.intevation.gnv.math.AttributedXYColumns; +import de.intevation.gnv.math.HeightValue; +import de.intevation.gnv.math.IJKey; +import de.intevation.gnv.math.Interpolation3D; +import de.intevation.gnv.math.LinearMetrics; +import de.intevation.gnv.math.QueriedXYDepth; +import de.intevation.gnv.math.XYColumn; + +import de.intevation.gnv.raster.Filter; +import de.intevation.gnv.raster.IsoAttributeGenerator; +import de.intevation.gnv.raster.IsoPolygonSeriesProducer; +import de.intevation.gnv.raster.Palette; +import de.intevation.gnv.raster.PaletteManager; +import de.intevation.gnv.raster.PolygonDatasetProducer; +import de.intevation.gnv.raster.Raster; +import de.intevation.gnv.raster.Vectorizer; + +import de.intevation.gnv.state.InputData; + +import de.intevation.gnv.state.describedata.KeyValueDescibeData; + +import de.intevation.gnv.state.exception.StateException; + +import de.intevation.gnv.state.timeseries.TimeSeriesOutputState; + +import de.intevation.gnv.statistics.Statistics; +import de.intevation.gnv.statistics.VerticalCrossSectionStatistics; + +import de.intevation.gnv.utils.DistanceCalculator; +import de.intevation.gnv.utils.StringUtils; +import de.intevation.gnv.utils.WKTUtils; + +import java.awt.Color; +import java.awt.Dimension; +import java.awt.Paint; + +import java.io.IOException; +import java.io.OutputStream; +import java.io.UnsupportedEncodingException; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collection; +import java.util.HashMap; +import java.util.Iterator; +import java.util.List; +import java.util.Locale; +import java.util.Map; + +import net.sf.ehcache.Cache; +import net.sf.ehcache.Element; + +import org.apache.log4j.Logger; + +import org.jfree.chart.ChartTheme; + +/** + * @author Tim Englich (tim.englich@intevation.de) + * @author Ingo Weinzierl (ingo.weinzierl@intevation.de) + * @author Sascha L. Teichmann (sascha.teichmann@intevation.de) + */ +public class VerticalCrossSectionOutputState extends TimeSeriesOutputState { + + public static final String CHART_TYPE = "verticalcrosssection"; + + public static final Integer GROUND_FILL_INDEX = Integer.valueOf(-2); + + public static final boolean USE_INDEX_BUFFER = + Boolean.getBoolean("gnv.vertical.cross.section.index.buffer"); + + public static final String[] ATTRIBUTE_LIST = { + "SHAPE", + "Z", + "YORDINATE", + "IPOSITION", + "JPOSITION", + "KPOSITION" + }; + + private static Logger log = Logger.getLogger( + VerticalCrossSectionOutputState.class); + + private String ijkQueryID = "horizontalprofile_meshpoint_cross_ij"; + + private String rangeLabel; + + /** + * The UID of this Class + */ + private static final long serialVersionUID = 3233620652465061860L; + + /** + * Constructor + */ + public VerticalCrossSectionOutputState() { + super(); + super.domainLable = "chart.verticalcrosssection.title.xaxis"; + this.rangeLabel = "chart.verticalcrosssection.title.yaxis"; + } + + @Override + public void initialize(String uuid, CallContext callContext) + throws StateException { + super.initialize(uuid, callContext); + + getChartResult(uuid, callContext); + } + + @Override + protected ChartLabels createChartLabels(Locale locale, String uuid) { + RessourceFactory factory = RessourceFactory.getInstance(); + InputData input = inputData.get(parameterValuesName); + String parameterName = input.getDescription()[0]; + + if (parameterName == null) + parameterName = "parameterid"; + + return new ChartLabels( + createChartTitle(locale, uuid), + createChartSubtitle(locale, uuid), + factory.getRessource(locale, domainLable, domainLable), + factory.getRessource(locale, rangeLabel, rangeLabel), + parameterName + ); + } + + + @Override + protected String createChartSubtitle(Locale locale, String uuid) { + InputData data = inputData.get(dateValueName); + String date = data.getDescription()[0]; + + if (date == null) + date = "dateid"; + + RessourceFactory factory = RessourceFactory.getInstance(); + String chartType = factory.getRessource( + locale, CHART_TYPE, CHART_TYPE); + + return chartType + ": " + date; + } + + + @Override + protected Object getChartResult(String uuid, CallContext callContext) { + log.debug("VerticalCrossSectionOutputState.getChartResult"); + String key = getHash(); + + CacheFactory factory = CacheFactory.getInstance(); + if (factory.isInitialized()) { + log.info("Using a cachce."); + Cache cache = factory.getCache(); + + Element element = cache.get(key); + if (element != null) + return element.getObjectValue(); + + log.debug("No results in cache yet."); + Object obj = getData(uuid, callContext); + cache.put(new Element(key, obj)); + + return obj; + } + else { + log.info("Not using a cache."); + return getData(uuid, callContext); + } + } + + + protected Object getData(String uuid, CallContext callContext) { + Collection result = null; + InputData meshLine = inputData.get("mesh_linestring"); + InputData meshId = inputData.get("meshid"); + + if (meshLine == null) { + log.error("mesh_linestring is not defined"); + throw new IllegalStateException("missing mesh_linestring"); + } + + if (meshId == null) { + log.error("meshid is not defined"); + throw new IllegalStateException("missing meshid"); + } + + Coordinate [] coords = WKTUtils.toCoordinates( + meshLine.getValue()); + + if (coords == null) { + throw new IllegalStateException("cannot read coordinates"); + } + + try { + String additionWhere = USE_INDEX_BUFFER + ? WKTUtils.worldCoordinatesToIndex( + coords, + result, + meshId.getValue(), + ijkQueryID) + : WKTUtils.TRUE_EXPRESSION; + + String[] addedFilterValues = StringUtils.append( + generateFilterValuesFromInputData(), + additionWhere); + + QueryExecutor exec = QueryExecutorFactory + .getInstance() + .getQueryExecutor(); + + result = exec.executeQuery(queryID, addedFilterValues); + } + catch (QueryException qe) { + log.error(qe, qe); + } + + Object obj = process( + Arrays.asList(coords), + preProcess(result), + callContext); + + return obj; + } + + + protected String getSelectedInputDataName(String uuid, String id) { + Collection values = getCollection(id, uuid); + + if (values != null) { + Iterator it = values.iterator(); + + while (it.hasNext()) { + KeyValueDescibeData data = (KeyValueDescibeData) it.next(); + + if (data.isSelected()) { + return data.getValue(); + } + } + } + return null; + } + + private static int getGroundInterpolation(CallContext callContext) { + GNVArtifactContext context = + (GNVArtifactContext)callContext.globalContext(); + + String interpolation = (String)context.get( + GNVArtifactContext.VERTICAL_CROSS_SECTION_GROUND_INTERPOLATION_KEY); + + return RasterObject.getInterpolationType(interpolation); + } + + private static Dimension getRasterSize(CallContext callContext) { + GNVArtifactContext context = + (GNVArtifactContext)callContext.globalContext(); + Dimension size = (Dimension)context.get( + GNVArtifactContext.VERTICAL_CROSS_SECTION_SAMPLES_KEY); + return size != null + ? size + : GNVArtifactContext.DEFAULT_VERTICAL_CROSS_SECTION_SAMPLES; + } + + private static List getFilterFactories( + CallContext callContext + ) { + GNVArtifactContext context = + (GNVArtifactContext)callContext.globalContext(); + List factories = (List)context.get( + GNVArtifactContext.VERTICAL_CROSS_SECTION_FILTER_FACTORIES_KEY); + return factories != null + ? factories + : new ArrayList(); + } + + private static Map getPalettes( + CallContext callContext + ) { + GNVArtifactContext context = + (GNVArtifactContext)callContext.globalContext(); + Map palettes = + (Map)context.get( + GNVArtifactContext.PALETTES_KEY); + return palettes != null + ? palettes + : new HashMap(); + } + + private static Paint getGroundFill(CallContext callContext) { + GNVArtifactContext context = + (GNVArtifactContext)callContext.globalContext(); + Paint fill = (Paint)context.get( + GNVArtifactContext.VERTICAL_CROSS_SECTION_GROUND_FILL_KEY); + return fill != null + ? fill + : GNVArtifactContext.DEFAULT_VERTICAL_CROSS_SECTION_GROUND_FILL; + } + + public static final double EPSILON = 1e-5d; + + protected Object process( + List path, + AttributedXYColumns columns, + CallContext callContext + ) { + Integer parameterId = + (Integer)columns.getAttribute("GROUP1"); // XXX: hardcoded + + if (parameterId == null) { + log.error("missing parameter id"); + return null; + } + + Map paletteManagers = + getPalettes(callContext); + + PaletteManager paletteManager = paletteManagers.get(parameterId); + + if (paletteManager == null) { + log.error("no palette found for parameter id " + parameterId); + return null; + } + + boolean debug = log.isDebugEnabled(); + + if (debug) { + log.debug("using palette '" + paletteManager.getName() + "'"); + } + + Dimension rasterSize = getRasterSize(callContext); + List filterFactories = getFilterFactories(callContext); + Interpolation3D interpolation = new Interpolation3D(rasterSize); + + double distance = DistanceCalculator.calculateDistance(path); + + if (distance < EPSILON) { + log.warn("distance too short for interpolation"); + return null; + } + + boolean success = interpolation.interpolate( + path, + columns.getXYColumns(), + 0d, + distance, + LinearMetrics.INSTANCE, + new QueriedXYDepth( + getGroundInterpolation(callContext))); + + if (!success) { + log.warn("interpolation failed"); + return null; + } + + // Do the post processing + Raster raster = new Raster( + interpolation.getRaster(), + rasterSize.width); + + for (Filter.Factory factory: filterFactories) { + raster = factory.create().filter(raster); + } + + if (debug) { + log.debug("to indexed raster"); + } + + // scan for regions with base palette + Palette basePalette = paletteManager.getBase(); + + int [] intRaster = raster.toIndexed(basePalette); + + // produce JFreeChart compatible polygons + + if (debug) { + log.debug("vectorize indexed raster"); + } + + double maxDepth = interpolation.getMaxDepth(); + + PolygonDatasetProducer pdsp = new PolygonDatasetProducer( + 0, 0, + distance, maxDepth); + + int numRegions = new Vectorizer(intRaster, rasterSize.width) + .process(pdsp); + + PolygonDataset pds = pdsp.getPolygonDataset(); + + // Count number of colors before generating seabed + // because its used to determine the number of iso lines. + int numColors = pds.getSeriesCount(); + + if (debug) { + log.debug("number of regions: " + numRegions); + log.debug("number of colors: " + numColors); + } + + // generate seabed polygon + + PolygonSeries seabed = OutputHelper.createSeabedPolygon( + interpolation, + GROUND_FILL_INDEX); + + if (seabed != null) { + pds.addSeries(seabed); + } + + // generate iso lines + + int numIso; + + if (numColors < 5) { numIso = 5; } + else if (numColors < 10) { numIso = 2; } + else { numIso = 0; } + + Palette isoPalette; + + if (numIso == 0) { // same palette + isoPalette = basePalette; + /* intRaster = intRaster; */ + } + else { + isoPalette = paletteManager.getLevel(numIso); + intRaster = raster.toIndexed(isoPalette); + } + + IsoPolygonSeriesProducer ipsp = new IsoPolygonSeriesProducer( + 0, 0, + distance, maxDepth); + + numRegions = new Vectorizer(false, intRaster, rasterSize.width) + .process(ipsp); + + IsoAttributeGenerator iag = new IsoAttributeGenerator(isoPalette); + Collection ps = ipsp.getSeries(iag); + ipsp.clear(); + + if (debug) { + log.debug("num of iso regions: " + numRegions); + log.debug("num of iso series: " + ps.size()); + } + + pds.addAllSeries(ps); + + columns.setInterpolation(interpolation); + columns.setPolygonDataset(pds); + + return columns; + } + + + protected AttributedXYColumns preProcess(Collection results) { + + AttributedXYColumns attColumns = new AttributedXYColumns(); + Map map = new HashMap(1013); + Iterator iter = results.iterator(); + + int sIdx = -1; + int iIdx = -1; + int jIdx = -1; + int kIdx = -1; + int vIdx = -1; + int zIdx = -1; + + while (iter.hasNext()) { + Result result = (Result) iter.next(); + + if (sIdx == -1) { + ResultDescriptor rd = result.getResultDescriptor(); + int columnCount = rd.getColumnCount(); + + sIdx = rd.getColumnIndex("SHAPE"); + iIdx = rd.getColumnIndex("IPOSITION"); + jIdx = rd.getColumnIndex("JPOSITION"); + kIdx = rd.getColumnIndex("KPOSITION"); + vIdx = rd.getColumnIndex("YORDINATE"); + zIdx = rd.getColumnIndex("Z"); + + for (int i = 0; i < columnCount; i++) { + String colName = rd.getColumnName(i); + + if (!StringUtils.contains(ATTRIBUTE_LIST, colName)) { + attColumns.setAttribute( + colName, + result.getObject(colName)); + } + } + } + + double v = result.getDouble(vIdx); + double z = result.getDouble(zIdx); + int i = result.getInteger(iIdx); + int j = result.getInteger(jIdx); + int k = result.getInteger(kIdx); + + IJKey key = new IJKey(i, j); + + XYColumn col = (XYColumn)map.get(key); + + if (col == null) { + Coordinate coord = WKTUtils.toCoordinate(result.getString(sIdx)); + if (coord == null) coord = new Coordinate(); + col = new XYColumn(coord.x, coord.y, i, j); + map.put(key, col); + } + + col.add(new HeightValue(z, v, k)); + } + + ArrayList cols = new ArrayList(map.values()); + attColumns.setXYColumns(cols); + + return attColumns; + } + + + @Override + protected Chart getChart( + ChartLabels chartLables, + ChartTheme theme, + Collection parameters, + Collection measurements, + Collection dates, + Object result, + Locale locale, + String uuid, + boolean linesVisible, + boolean shapesVisible, + CallContext callContext + ) { + Chart chart = null; + + if (CACHE_CHART) { + log.info("Try to get verticalcrosssection chart from cache."); + chart = (Chart) getChartFromCache(uuid, callContext); + } + + if (chart != null) + return chart; + + log.info("Chart not in cache yet."); + + if (!(result instanceof AttributedXYColumns)) { + log.error("result of wrong type"); + return null; + } + + AttributedXYColumns columns = (AttributedXYColumns)result; + + Integer parameterId = + (Integer)columns.getAttribute("GROUP1"); // XXX: hardcoded + + if (parameterId == null) { + log.error("missing parameter id"); + return null; + } + + Map paletteManagers = + getPalettes(callContext); + + PaletteManager paletteManager = paletteManagers.get(parameterId); + + if (paletteManager == null) { + log.error("no palette found for parameter id " + parameterId); + return null; + } + + HashMap special = new HashMap(); + special.put(GROUND_FILL_INDEX, getGroundFill(callContext)); + + chart = new VerticalCrossSectionChart( + columns, + paletteManager.getBase(), + special, + locale, + chartLables); + + chart.generateChart(); + ((VerticalCrossSectionChart)chart).setBackgroundPaint(Color.WHITE); + + if (CACHE_CHART) { + log.info("Put chart into cache."); + purifyChart(chart, uuid); + } + + return chart; + } + + /** + * @see de.intevation.gnv.state.timeseries.TimeSeriesOutputState#getStatisticsGenerator() + */ + @Override + protected Statistics getStatisticsGenerator() { + return new VerticalCrossSectionStatistics(); + } + + /** + * @see de.intevation.gnv.state.timeseries.TimeSeriesOutputState#createCSV(java.io.OutputStream, java.util.Collection) + */ + @Override + protected void createCSV( + OutputStream outputStream, + Collection chartResult + ) + throws UnsupportedEncodingException, IOException, StateException + { + // TODO: Implement a substitution which makes sense. + } +} +// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 : diff -r f99d8f92a640 -r 755dd2fa4a0a gnv-artifacts/src/main/java/de/intevation/gnv/state/timeseries/TimeSeriesOutputState.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv-artifacts/src/main/java/de/intevation/gnv/state/timeseries/TimeSeriesOutputState.java Fri Sep 28 12:13:53 2012 +0200 @@ -0,0 +1,948 @@ +package de.intevation.gnv.state.timeseries; + +import au.com.bytecode.opencsv.CSVWriter; + +import de.intevation.artifactdatabase.Config; +import de.intevation.artifactdatabase.XMLUtils; + +import de.intevation.artifacts.ArtifactNamespaceContext; +import de.intevation.artifacts.CallContext; +import de.intevation.artifacts.CallMeta; + +import de.intevation.gnv.artifacts.context.GNVArtifactContext; + +import de.intevation.gnv.artifacts.ressource.RessourceFactory; + +import de.intevation.gnv.chart.Chart; +import de.intevation.gnv.chart.ChartLabels; +import de.intevation.gnv.chart.DefaultHistogram; +import de.intevation.gnv.chart.TimeSeriesChart; +import de.intevation.gnv.chart.XMLChartTheme; + +import de.intevation.gnv.chart.exception.TechnicalChartException; + +import de.intevation.gnv.exports.ChartExportHelper; +import de.intevation.gnv.exports.DefaultDataCollector; +import de.intevation.gnv.exports.DefaultExport; +import de.intevation.gnv.exports.DefaultProfile; + +import de.intevation.gnv.exports.Export.Profile; + +import de.intevation.gnv.exports.SimpleOdvDataCollector; + +import de.intevation.gnv.geobackend.base.Result; + +import de.intevation.gnv.histogram.HistogramHelper; + +import de.intevation.gnv.state.InputData; +import de.intevation.gnv.state.OutputStateBase; + +import de.intevation.gnv.state.describedata.DefaultKeyValueDescribeData; +import de.intevation.gnv.state.describedata.KeyValueDescibeData; +import de.intevation.gnv.state.describedata.NamedArrayList; +import de.intevation.gnv.state.describedata.NamedCollection; + +import de.intevation.gnv.state.exception.StateException; + +import de.intevation.gnv.statistics.Statistic; +import de.intevation.gnv.statistics.StatisticSet; +import de.intevation.gnv.statistics.Statistics; +import de.intevation.gnv.statistics.TimeseriesStatistics; + +import de.intevation.gnv.statistics.exception.StatisticsException; + +import de.intevation.gnv.timeseries.gap.DefaultTimeGap; +import de.intevation.gnv.timeseries.gap.TimeGap; + +import de.intevation.gnv.utils.ArtifactXMLUtilities; + +import java.io.File; +import java.io.IOException; +import java.io.OutputStream; +import java.io.UnsupportedEncodingException; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.HashMap; +import java.util.Iterator; +import java.util.List; +import java.util.Locale; +import java.util.Map; +import java.util.Vector; + +import org.apache.log4j.Logger; + +import org.jfree.chart.ChartTheme; + +import org.w3c.dom.Document; +import org.w3c.dom.Element; +import org.w3c.dom.Node; +import org.w3c.dom.NodeList; + +/** + * @author Tim Englich (tim.englich@intevation.de) + * @author Ingo Weinzierl (ingo.weinzierl@intevation.de) + */ +public class TimeSeriesOutputState extends OutputStateBase { + + protected static final boolean CACHE_CHART = + Boolean.parseBoolean(System.getProperty("cache.chart", "false")); + + protected static final boolean PDF_FORMAT_LANDSCAPE = + Boolean.parseBoolean(System.getProperty("export.pdf.landscape","true")); + + protected static final String[] IMG_EXPORT_FORMAT = { + "PNG", "JPEG", "GIF" + }; + + /** + * The UID of this Class + */ + private static final long serialVersionUID = 4178407570503098858L; + + /** + * the logger, used to log exceptions and additonaly information + */ + private static Logger log = Logger + .getLogger(TimeSeriesOutputState.class); + + private static List timeGapDefinitions = null; + + protected String domainLable = "chart.timeseries.title.xaxis"; + + protected String featureValuesName = "featureid"; + protected String parameterValuesName = "parameterid"; + protected String measuremenValueName = "measurementid"; + protected String dateValueName = "dateid"; + + public static final String [] TIMESERIES_CSV_PROFILE_COLUMNS = { + "XORDINATE", + "YORDINATE", + "GROUP1", + "GROUP2", + "GROUP3" + }; + + + public static final String [] TIMESERIES_TIMESERIES_CSV_COLUMN_LABEL = { + "Date/Time", + "Value", + "ParameterID", + "MeasurementID", + "TimeseriesID" + }; + + public static final String [] TIMESERIES_MESH_CSV_COLUMN_LABEL = { + "Date/Time", + "Value", + "ParameterID", + "FeatureID", + "MeshID" + }; + + public static final String [] TIMESERIES_ODV_PROFILE_NAMES = { + "CRUISE", + "STATION", + "TYPE", + "SHAPE", + "BOTDEPTH", + "DEPTH", + "TIMEVALUE", + "DATAVALUE", + "PARAMETER" + }; + + + public static final String [] ODV_COLUMN_HEADER = { + "Cruise", + "Station", + "Type", + "Longitude [deegrees_east]", + "Latitude [deegrees_north]", + "Bot. Depth [m]", + "Depth [m]", + "Date/Time", + "Value", + "Parameterid" + }; + + /** + * Profile for exporting data to odv + * TODO Change TIMESERIES_PROFILE_NAMES, which belong to CSV exports + */ + public static final Profile TIMESERIES_ODV_PROFILE = + new DefaultProfile( + ODV_COLUMN_HEADER, + '\t', + CSVWriter.NO_QUOTE_CHARACTER, + CSVWriter.NO_ESCAPE_CHARACTER, + "ODV", + "ISO-8859-1"); + + /** + * Constructor + */ + public TimeSeriesOutputState() { + super(); + } + + + @Override + public void initialize(String uuid, CallContext context) + throws StateException + { + getChartResult(uuid, context); + } + + + /** + * @see de.intevation.gnv.transition.OutputTransition#out(java.lang.String, + * java.util.Collection, java.io.OutputStream, java.lang.String, + * de.intevation.artifacts.CallMeta) + */ + public void out( + Document format, + Collection inputData, + OutputStream outputStream, + String uuid, + CallContext callContext + ) throws StateException + { + log.debug("TimeSeriesOutputTransition.out"); + + String outputMode = XMLUtils.xpathString( + format, XPATH_OUTPUT_MODE, ArtifactNamespaceContext.INSTANCE); + + String mode = XMLUtils.xpathString( + format, XPATH_EXPORT_MODE, ArtifactNamespaceContext.INSTANCE); + + if (mode == null || mode.equals("")) { + mode = "img"; + } + + String mimeType = XMLUtils.xpathString( + format, XPATH_MIME_TYPE, ArtifactNamespaceContext.INSTANCE); + + CallMeta callMeta = callContext.getMeta(); + + int chartWidth = 600; + int chartHeight = 400; + boolean sVisible = false; + int binCount = 0; + int binWidth = 0; + + Map requestParameter = new HashMap(); + + // lines are always visible. if lines should be configurable we need a + // parameter in the user interface + boolean lVisible = true; + + try { + if (inputData != null) { + Iterator it = inputData.iterator(); + while (it.hasNext()) { + InputData ip = it.next(); + String optionName = ip.getName().trim(); + requestParameter.put(optionName, ip.getValue()); + + if (optionName.equals("width")) { + chartWidth = Integer.parseInt(ip.getValue()); + } + else if (optionName.equals("height")) { + chartHeight = Integer.parseInt(ip.getValue()); + } + else if (optionName.equals("points")) { + sVisible = Boolean.parseBoolean(ip.getValue()); + } + } + } + } catch (NumberFormatException e) { + log.error(e, e); + throw new StateException(e); + } + + try { + Collection parameters = + getParameters(uuid); + Collection measurements = + getMeasurements(uuid); + Collection dates = + getDates(uuid); + + Locale[] serverLocales = + RessourceFactory.getInstance().getLocales(); + Locale locale = + callMeta.getPreferredLocale(serverLocales); + + ChartLabels chartLables = createChartLabels(locale, uuid); + + log.debug( + "Best locale - regarding intersection of server and " + + "browser locales - is " + locale.toString() + ); + + String exportFormat = getExportFormat(mimeType); + + // CHART + if (outputMode.equalsIgnoreCase("chart")) { + log.debug("Chart will be generated."); + + if (mode.equalsIgnoreCase("img")) { + createChart( + outputStream, + parameters, + measurements, + dates, + chartLables, + callContext, + uuid, + exportFormat, + locale, + chartWidth, + chartHeight, + lVisible, + sVisible, + callContext + ); + } + else if (mode.equalsIgnoreCase("pdf")) { + createPDF( + outputStream, + parameters, + measurements, + dates, + chartLables, + uuid, + "A4", + true, + lVisible, + sVisible, + locale, + callContext + ); + } + else if (mode.equalsIgnoreCase("svg")) { + createSVG( + outputStream, + getParameters(uuid), + getMeasurements(uuid), + getDates(uuid), + createChartLabels(locale, uuid), + uuid, + locale, + chartWidth, + chartHeight, + lVisible, + sVisible, + callContext + ); + } + } + // HISTOGRAM + else if (outputMode.equalsIgnoreCase("histogram")) { + Collection results = (Collection) getChartResult(uuid, callContext); + requestParameter.put("locale", locale); + + Object[][] data = HistogramHelper.prepareHistogramData( + results, parameters, measurements, dates); + + int size = data.length; + Chart[] histograms = new Chart[size]; + + for (int i = 0; i < size; i++) { + ChartLabels labels = createHistogramLabels( + uuid, callContext, data[i]); + + ChartTheme theme = createStyle(callContext); + + histograms[i] = new DefaultHistogram( + labels, data[i], theme, requestParameter); + } + + if (mode.equalsIgnoreCase("img")) { + ChartExportHelper.exportHistograms( + outputStream, + histograms, + exportFormat, + chartWidth, + chartHeight + ); + } + else if (mode.equalsIgnoreCase("pdf")) { + ChartExportHelper.exportHistogramsAsPDF( + outputStream, + histograms, + "A4", + PDF_FORMAT_LANDSCAPE, + 50F, 50F, 50F, 50F + ); + } + else if (mode.equalsIgnoreCase("svg")) { + ChartExportHelper.exportHistogramsAsSVG( + outputStream, + histograms, + null, + chartWidth, + chartHeight + ); + } + } + else if (outputMode.equalsIgnoreCase("csv")) { + log.debug("CSV-File will be generated."); + Object result = getChartResult(uuid, callContext); + if (result instanceof Collection) { + this.createCSV( + outputStream, + (Collection)result); + } + } else if (outputMode.equalsIgnoreCase("statistics")) { + log.debug("Statistics will be generated."); + + Collection statistics; + + Statistics s = getStatisticsGenerator(); + Object result = getChartResult(uuid, callContext); + + if (result != null && s != null) { + statistics = s.calculateStatistics( + result, + parameters, + measurements, + dates); + } + else { + statistics = new ArrayList(); + } + + Document doc = writeStatistics2XML(statistics); + + XMLUtils.toStream(doc, outputStream); + + } + else if (outputMode.equalsIgnoreCase("odv")) { + Collection odvResult = this.getODVResult(uuid); + this.createODV(outputStream, odvResult); + } + } catch (IOException e) { + log.error(e, e); + throw new StateException(e); + } catch (TechnicalChartException e) { + log.error(e, e); + throw new StateException(e); + } catch (StatisticsException e) { + log.error(e, e); + throw new StateException(e); + } + } + + + protected String getExportFormat(String mime) { + for(int i = 0; i < IMG_EXPORT_FORMAT.length; i++) { + if (mime.trim().toUpperCase().indexOf(IMG_EXPORT_FORMAT[i]) > 0) + return IMG_EXPORT_FORMAT[i]; + } + + // no format found relating to mimeType, default export as PNG + return IMG_EXPORT_FORMAT[0]; + } + + + protected Collection getCleanedParameters(Collection parameters) { + Iterator iter = parameters.iterator(); + Collection parameter = new Vector(parameters); + while (iter.hasNext()) { + KeyValueDescibeData data = (KeyValueDescibeData)iter.next(); + if (!data.isSelected()) + parameter.remove(data); + } + + return parameter; + } + + + protected Collection getCleanedParameters(String uuid) { + return getCleanedParameters(getParameters(uuid)); + } + + + protected void createCSV(OutputStream out, Collection results) + throws UnsupportedEncodingException, IOException, StateException + { + Iterator iter = results.iterator(); + Result res = iter.hasNext() ? (Result) iter.next() : null; + + if (res == null) + return; + + Profile profile = null; + int dataid = res.getInteger("DATAID").intValue(); + + // on meshes + if (dataid == 2) { + profile = new DefaultProfile( + TIMESERIES_MESH_CSV_COLUMN_LABEL, + ',', + '"', + '"', + "CSV", + "ISO-8859-1"); + } + + // on timeseries + else { + profile = new DefaultProfile( + TIMESERIES_TIMESERIES_CSV_COLUMN_LABEL, + ',', + '"', + '"', + "CSV", + "ISO-8859-1"); + } + + DefaultExport export = new DefaultExport( + new DefaultDataCollector(TIMESERIES_CSV_PROFILE_COLUMNS)); + export.create(profile, out, results); + } + + + /** + * TODO Result is not used at the moment. Change result with correct data. + */ + protected void createODV(OutputStream outputStream, Collection result) + throws IOException, StateException { + + DefaultExport export = new DefaultExport(new SimpleOdvDataCollector( + TIMESERIES_ODV_PROFILE_NAMES)); + + if (result == null) + log.error("#################### RESULT == NULL #################"); + export.create(TIMESERIES_ODV_PROFILE, outputStream, result); + } + + /** + * @return + */ + protected Statistics getStatisticsGenerator() { + Statistics s = new TimeseriesStatistics(); + return s; + } + + protected Document writeStatistics2XML( Collection statistic) { + ArtifactXMLUtilities xmlUtilities = new ArtifactXMLUtilities(); + Document doc = XMLUtils.newDocument(); + if (statistic != null) { + Node statisticResults = xmlUtilities.createArtifactElement(doc, + "statistics"); + doc.appendChild(statisticResults); + Iterator it = statistic.iterator(); + while (it.hasNext()) { + StatisticSet set = it.next(); + Element setElement = xmlUtilities.createArtifactElement(doc, + "statistic"); + setElement.setAttribute("name", set.getName()); + + Iterator sit = set.getStatistics().iterator(); + while (sit.hasNext()){ + Statistic s = sit.next(); + Element result = xmlUtilities.createArtifactElement(doc, + "statistic-value"); + result.setAttribute("name", s.getKey()); + result.setAttribute("value", s.getStringValue()); + setElement.appendChild(result); + } + statisticResults.appendChild(setElement); + } + + } + return doc; + } + + + protected String getSelectedFeatureName(String uuid) { + Collection values = getCollection(featureValuesName, uuid); + + if (values != null) { + Iterator it = values.iterator(); + + while (it.hasNext()) { + KeyValueDescibeData data = (KeyValueDescibeData) it.next(); + return data.getValue(); + } + + return ""; + } + return ""; + } + + + /** + * @param outputStream + * @param parameters + * @param measurements + * @param timeSeriesName + * @param chartStyle + * @param chartLables + * @throws IOException + * @throws TechnicalChartException + */ + protected void createChart( + OutputStream outputStream, + Collection parameters, + Collection measurements, + Collection dates, + ChartLabels chartLables, + CallContext context, + String uuid, + String exportFormat, + Locale locale, + int width, + int height, + boolean linesVisible, + boolean shapesVisible, + CallContext callContext + ) + throws IOException, TechnicalChartException + { + log.debug("Create chart."); + Chart chart = getChart( + chartLables, + createStyle(context), + parameters, + measurements, + dates, + getChartResult(uuid, callContext), + locale, // Locale + uuid, + linesVisible, + shapesVisible, + callContext + ); + + if (chart == null) { + log.error("Could not initialize chart."); + return; + } + + log.debug( + "export chart as " + exportFormat + + " in " + width + "x" + height + ); + + ChartExportHelper.exportImage( + outputStream, + chart.generateChart(), + exportFormat, + width, + height + ); + } + + + protected void createPDF( + OutputStream outputStream, + Collection parameters, + Collection measurements, + Collection dates, + ChartLabels chartLables, + String uuid, + String exportFormat, + boolean landscape, + boolean linesVisible, + boolean shapesVisible, + Locale locale, + CallContext context + ) { + Chart chart = getChart( + chartLables, + createStyle(context), + parameters, + measurements, + dates, + getChartResult(uuid, context), + locale, + uuid, + linesVisible, + shapesVisible, + context + ); + + if (chart == null) { + log.error("Could not initialize chart."); + return; + } + + ChartExportHelper.exportPDF( + outputStream, + chart.generateChart(), + "A4", + PDF_FORMAT_LANDSCAPE, + 50F, 50F, 50F, 50F + ); + } + + + protected void createSVG( + OutputStream outputStream, + Collection parameters, + Collection measurements, + Collection dates, + ChartLabels chartLables, + String uuid, + Locale locale, + int width, + int height, + boolean linesVisible, + boolean shapesVisible, + CallContext callContext + ) { + Chart chart = getChart( + chartLables, + createStyle(callContext), + parameters, + measurements, + dates, + getChartResult(uuid, callContext), + locale, + uuid, + linesVisible, + shapesVisible, + callContext + ); + + if (chart == null) { + log.error("Could not initialize chart."); + return; + } + + ChartExportHelper.exportSVG( + outputStream, + chart.generateChart(), + null, + 600, 400 + ); + + log.debug("svg export finished."); + } + + + protected Chart getChart( + ChartLabels chartLables, + ChartTheme theme, + Collection parameters, + Collection measurements, + Collection dates, + Object result, + Locale locale, + String uuid, + boolean linesVisible, + boolean shapesVisible, + CallContext callContext + ) { + Chart chart = null; + + if (CACHE_CHART) { + log.info("Try to get timeseries chart from cache."); + chart = (Chart) getChartFromCache(uuid, callContext); + } + + if (chart != null) + return chart; + + log.info("Chart not in cache yet."); + chart = new TimeSeriesChart( + chartLables, + theme, + parameters, + measurements, + dates, + (Collection)result, + timeGapDefinitions, + locale, + linesVisible, + shapesVisible + ); + chart.generateChart(); + + if (CACHE_CHART) { + log.info("Put chart into cache."); + purifyChart(chart, uuid); + } + + return chart; + } + + protected ChartTheme createStyle(CallContext callContext) { + log.debug("Fetch chart theme from global context"); + + GNVArtifactContext context = + (GNVArtifactContext) callContext.globalContext(); + + XMLChartTheme theme = (XMLChartTheme) context.get( + GNVArtifactContext.CHART_TEMPLATE_KEY); + + return theme; + } + + protected ChartLabels createChartLabels(Locale locale, String uuid) { + return new ChartLabels( + createChartTitle(locale, uuid), + createChartSubtitle(locale, uuid), + RessourceFactory.getInstance().getRessource( + locale, + domainLable, + domainLable + ) + ); + } + + + protected String createChartTitle(Locale locale, String uuid) { + return getFisName(locale); + + } + + + protected String createChartSubtitle(Locale locale, String uuid) { + return getSelectedFeatureName(uuid); + } + + + protected ChartLabels createHistogramLabels( + String uuid, CallContext context, Object[] data) + { + return new ChartLabels((String) data[0], "", ""); + } + + + protected String getFisName(Locale locale) { + String returnValue = ""; + InputData input = inputData.get("fisname"); + + if (input != null) { + String value = input.getValue(); + + returnValue = RessourceFactory.getInstance().getRessource( + locale, + value, + value + ); + } + return returnValue; + } + + + protected String getSelectedInputDataName(String uuid, String key) { + Collection values = getCollection(key, uuid); + + if (values != null) { + Iterator it = values.iterator(); + + while (it.hasNext()) { + KeyValueDescibeData data = (KeyValueDescibeData) it.next(); + + if (data.isSelected()) { + return data.getValue(); + } + } + } + return null; + } + + + protected Collection getParameters(String uuid) { + return this.getCollection(parameterValuesName, uuid); + } + + protected Collection getMeasurements(String uuid) { + return this.getCollection(measuremenValueName, uuid); + } + protected Collection getDates(String uuid) { + return this.getCollection(dateValueName,uuid); + } + + @Override + public void setup(Node configuration) { + super.setup(configuration); + String featureNameValue = Config.getStringXPath(configuration, + "value-names/value-name[@name='feature']/@value"); + if (featureNameValue != null) { + this.featureValuesName = featureNameValue; + } + String parameterNameValue = Config.getStringXPath(configuration, + "value-names/value-name[@name='parameter']/@value"); + if (parameterNameValue != null) { + this.parameterValuesName = parameterNameValue; + } + String measurementNameValue = Config.getStringXPath(configuration, + "value-names/value-name[@name='measurement']/@value"); + if (measurementNameValue != null) { + this.measuremenValueName = measurementNameValue; + } + + String dateNameValue = Config.getStringXPath(configuration, + "value-names/value-name[@name='date']/@value"); + if (dateNameValue != null) { + this.dateValueName = dateNameValue; + } + if (timeGapDefinitions == null){ + Element gapDefinition = (Element)Config.getNodeXPath(configuration, + "time-gap-definition"); + synchronized (this.getClass()) { + if (gapDefinition != null){ + String link = gapDefinition.getAttribute("xlink:href"); + if (link != null ){ + String absolutFileName = Config.replaceConfigDir(link); + gapDefinition = (Element)new ArtifactXMLUtilities(). + readConfiguration(absolutFileName); + } + + NodeList gapDefinitions = Config.getNodeSetXPath(gapDefinition, + "/time-gaps/time-gap"); + if (gapDefinition != null){ + timeGapDefinitions = new ArrayList(gapDefinitions. + getLength()); + for (int i = 0; i < gapDefinitions.getLength(); i++){ + Element gapNode = (Element)gapDefinitions.item(i); + String unit = gapNode.getAttribute("unit"); + int key = Integer.parseInt(gapNode.getAttribute("key")); + int value = Integer.parseInt(gapNode.getAttribute("gap")); + log.info("Add new Timegap: "+key+" "+value+" "+ unit); + timeGapDefinitions.add(new DefaultTimeGap(unit, + key, + value)); + } + } + } + } + } + } + + /** + * @param collectionName + * @return + */ + protected Collection getCollection( + String collectionName, + String uuid) + { + NamedCollection c = new NamedArrayList(collectionName); + + InputData data = inputData.get(collectionName); + if (data == null) { + log.warn("No collection found with name: " + collectionName); + return c; + } + + String[] descs = data.getDescription(); + String[] values = data.splitValue(); + int size = values.length; + + for (int i = 0; i < size; i++){ + c.add(new DefaultKeyValueDescribeData( + values[i], descs[i], getID())); + } + + return c; + } +} +// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf-8 : diff -r f99d8f92a640 -r 755dd2fa4a0a gnv-artifacts/src/main/java/de/intevation/gnv/statistics/AbstractStatistics.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv-artifacts/src/main/java/de/intevation/gnv/statistics/AbstractStatistics.java Fri Sep 28 12:13:53 2012 +0200 @@ -0,0 +1,97 @@ +package de.intevation.gnv.statistics; + +import org.apache.commons.math.stat.descriptive.DescriptiveStatistics; + +import org.apache.commons.math.stat.regression.SimpleRegression; + +import org.apache.log4j.Logger; + +/** + * @author Sascha L. Teichmann (sascha.teichmann@intevation.de) + */ +public abstract class AbstractStatistics +implements Statistics +{ + private static Logger log = Logger.getLogger( + AbstractStatistics.class); + + public AbstractStatistics() { + } + + protected StatisticSet generateStatisticsValues( + DescriptiveStatistics lStatistics, + SimpleRegression lRegression, + String statisticName + ) { + StatisticSet statisticSet = new StatisticSet(statisticName); + + statisticSet.addStatistic( + new Statistic( + "gnviewer.statistics.descriptive.arithmeticMean", + lStatistics.getMean())); + + statisticSet.addStatistic( + new Statistic( + "gnviewer.statistics.descriptive.kurtosis", + lStatistics.getKurtosis())); + + statisticSet.addStatistic( + new Statistic( + "gnviewer.statistics.descriptive.max", + lStatistics.getMax())); + + statisticSet.addStatistic( + new Statistic( + "gnviewer.statistics.descriptive.min", + lStatistics.getMin())); + + statisticSet.addStatistic( + new Statistic( + "gnviewer.statistics.descriptive.n", + lStatistics.getN())); + + statisticSet.addStatistic( + new Statistic( + "gnviewer.statistics.descriptive.percentile.90", + lStatistics.getPercentile(90))); + + statisticSet.addStatistic( + new Statistic( + "gnviewer.statistics.descriptive.percentile.75", + lStatistics.getPercentile(75))); + + statisticSet.addStatistic( + new Statistic( + "gnviewer.statistics.descriptive.percentile.50", + lStatistics.getPercentile(50))); + + statisticSet.addStatistic( + new Statistic( + "gnviewer.statistics.descriptive.percentile.10", + lStatistics.getPercentile(10))); + + statisticSet.addStatistic( + new Statistic( + "gnviewer.statistics.descriptive.deviation", + lStatistics.getStandardDeviation())); + + statisticSet.addStatistic( + new Statistic( + "gnviewer.statistics.descriptive.variance", + lStatistics.getVariance())); + + statisticSet.addStatistic( + new Statistic( + "gnviewer.statistics.descriptive.intercept", + lRegression.getIntercept())); + + statisticSet.addStatistic( + new Statistic( + "gnviewer.statistics.descriptive.slope", + lRegression.getSlope())); + + return statisticSet; + } +} +// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 : + diff -r f99d8f92a640 -r 755dd2fa4a0a gnv-artifacts/src/main/java/de/intevation/gnv/statistics/HorizontalProfileStatistics.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv-artifacts/src/main/java/de/intevation/gnv/statistics/HorizontalProfileStatistics.java Fri Sep 28 12:13:53 2012 +0200 @@ -0,0 +1,86 @@ +/** + * + */ +package de.intevation.gnv.statistics; + +import java.sql.SQLException; +import java.util.Collection; + +import org.apache.log4j.Logger; + +import com.vividsolutions.jts.geom.Point; +import com.vividsolutions.jts.io.ParseException; +import com.vividsolutions.jts.io.WKTReader; + +import de.intevation.gnv.geobackend.base.Result; +import de.intevation.gnv.state.describedata.KeyValueDescibeData; +import de.intevation.gnv.utils.DistanceCalculator; + +/** + * @author Tim Englich + * + */ +public class HorizontalProfileStatistics extends TimeseriesStatistics { + + private static Logger log = Logger.getLogger(HorizontalProfileStatistics.class); + + private WKTReader wktReader = new WKTReader(); + + private DistanceCalculator dc = new DistanceCalculator(); + + private double distance = 0; + + /** + * Constructor + */ + public HorizontalProfileStatistics() { + super(); + } + + /** + * @see de.intevation.gnv.statistics.TimeseriesStatistics#calculateXOrdinateValue(de.intevation.gnv.geobackend.base.Result, de.intevation.gnv.geobackend.base.Result) + */ + @Override + protected double calculateXOrdinateValue(Result previousRow,Result row) + throws SQLException { + try { + Point start = (Point)this.wktReader.read(previousRow.getString("SHAPE")); + Point current = (Point)this.wktReader.read(row.getString("SHAPE")); + double delta = this.dc.calculateDistance(start, current); + + if (!Double.isNaN(delta)){ + this.distance = this.distance + delta; + } + } catch (ParseException e) { + log.error(e,e); + } + return this.distance; + } + + /** + * @see de.intevation.gnv.statistics.TimeseriesStatistics#generateStatisticsName(java.lang.String, java.lang.String, java.lang.String, java.util.Collection, java.util.Collection, java.util.Collection) + */ + @Override + protected String generateStatisticsName( + String break1, + String break2, + String break3, + Collection parameters, + Collection measurements, + Collection dates) { + return (this.findValueTitle(parameters, break1)+ " "+ + this.findValueTitle(measurements,break2)).trim()+" "+ + this.findValueTitle(dates,break3); + } + + /** + * @see de.intevation.gnv.statistics.TimeseriesStatistics#clearStatistics() + */ + @Override + protected void clearStatistics() { + log.debug("HorizontalProfileStatistics.clearStatistics"); + super.clearStatistics(); + this.distance = 0; + } + +} diff -r f99d8f92a640 -r 755dd2fa4a0a gnv-artifacts/src/main/java/de/intevation/gnv/statistics/Statistic.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv-artifacts/src/main/java/de/intevation/gnv/statistics/Statistic.java Fri Sep 28 12:13:53 2012 +0200 @@ -0,0 +1,61 @@ +/** + * Title: Statistic, $Header: /share/gdi/SDI-Suite/Repository/projekte/BSH-GDI/genericViewer/src/main/java/de/conterra/bsh/gdi/gnviewer/output/statistics/Statistic.java,v 1.2 2007/12/21 12:31:15 blume Exp $ + * Source: $Source: /share/gdi/SDI-Suite/Repository/projekte/BSH-GDI/genericViewer/src/main/java/de/conterra/bsh/gdi/gnviewer/output/statistics/Statistic.java,v $ + * created by: Stefan Blume (blume) + * erstellt am: 14.12.2007 + * Copyright: con terra GmbH, 2005 + * + * modified by: $Author: blume $ + * modified on: $Date: 2007/12/21 12:31:15 $ + * Version: $Revision: 1.2 $ + * TAG: $Name: $ + * locked from: $Locker: $ + * CVS State: $State: Exp $ + * Project: $ProjectName$ + */ +package de.intevation.gnv.statistics; + +import org.apache.log4j.Logger; + +/** + * The class Statistic fulfills the following purposes: + *
    + *
  1. + *
+ * + * @author blume + * @version 1.0 + * @serial 1.0 + * @see + * @since 14.12.2007 09:38:18 + */ +public class Statistic { + + /** + * Default Logging instance + */ + private static Logger sLogger = Logger.getLogger(Statistic.class); + private static boolean sDebug = sLogger.isDebugEnabled(); + + private double mValue; + private String mKey; + + public Statistic(String pKey, double pValue) { + mKey = pKey; + mValue = pValue; + } + + public double getValue() { + return mValue; + } + + public String getKey() { + return mKey; + } + + public String getStringValue() { + java.text.DecimalFormat df = new java.text.DecimalFormat("#.##"); + return df.format(mValue); + } + +} diff -r f99d8f92a640 -r 755dd2fa4a0a gnv-artifacts/src/main/java/de/intevation/gnv/statistics/StatisticSet.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv-artifacts/src/main/java/de/intevation/gnv/statistics/StatisticSet.java Fri Sep 28 12:13:53 2012 +0200 @@ -0,0 +1,40 @@ +/** + * + */ +package de.intevation.gnv.statistics; + +import java.util.ArrayList; +import java.util.Collection; + +/** + * @author Tim Englich + * + */ +public class StatisticSet { + + + private String name = null; + + private Collection statistics = new ArrayList(); + + /** + * Constructor + */ + public StatisticSet(String name) { + this.name = name; + } + + + public void addStatistic(Statistic statistic){ + this.statistics.add(statistic); + } + + public Collection getStatistics(){ + return this.statistics; + } + + public String getName(){ + return this.name; + } + +} diff -r f99d8f92a640 -r 755dd2fa4a0a gnv-artifacts/src/main/java/de/intevation/gnv/statistics/Statistics.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv-artifacts/src/main/java/de/intevation/gnv/statistics/Statistics.java Fri Sep 28 12:13:53 2012 +0200 @@ -0,0 +1,54 @@ +/** + * Title: Statistics, $Header: /share/gdi/SDI-Suite/Repository/projekte/BSH-GDI/genericViewer/src/main/java/de/conterra/bsh/gdi/gnviewer/output/statistics/Statistics.java,v 1.2 2008/01/30 12:38:34 blume Exp $ + * Source: $Source: /share/gdi/SDI-Suite/Repository/projekte/BSH-GDI/genericViewer/src/main/java/de/conterra/bsh/gdi/gnviewer/output/statistics/Statistics.java,v $ + * created by: Stefan Blume (blume) + * erstellt am: 14.12.2007 + * Copyright: con terra GmbH, 2005 + * + * modified by: $Author: blume $ + * modified on: $Date: 2008/01/30 12:38:34 $ + * Version: $Revision: 1.2 $ + * TAG: $Name: $ + * locked from: $Locker: $ + * CVS State: $State: Exp $ + * Project: $ProjectName$ + */ +package de.intevation.gnv.statistics; + +import java.util.Collection; + +import de.intevation.gnv.state.describedata.KeyValueDescibeData; + +import de.intevation.gnv.statistics.exception.StatisticsException; + +/** + * The interface Statistics fulfills the following purposes: + *
    + *
  1. Providng a marker interface for statistics.
  2. + *
+ * + * @author blume + * @version 1.0 + * @serial 1.0 + * @see + * @since 14.12.2007 09:34:32 + */ +public interface Statistics { + + /** + * + * @param resultSet + * @param parameters + * @param measurements + * @param dates + * @return + * @throws StatisticsException + */ + public Collection calculateStatistics( + Object resultSet, + Collection parameters, + Collection measurements, + Collection dates + ) + throws StatisticsException; +} diff -r f99d8f92a640 -r 755dd2fa4a0a gnv-artifacts/src/main/java/de/intevation/gnv/statistics/TimeseriesStatistics.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv-artifacts/src/main/java/de/intevation/gnv/statistics/TimeseriesStatistics.java Fri Sep 28 12:13:53 2012 +0200 @@ -0,0 +1,235 @@ +/** + * Title: TimeseriesStatistics, $Header: /share/gdi/SDI-Suite/Repository/projekte/BSH-GDI/genericViewer/src/main/java/de/conterra/bsh/gdi/gnviewer/output/statistics/TimeseriesStatistics.java,v 1.3 2008/08/18 14:50:33 drewnak Exp $ + * Source: $Source: /share/gdi/SDI-Suite/Repository/projekte/BSH-GDI/genericViewer/src/main/java/de/conterra/bsh/gdi/gnviewer/output/statistics/TimeseriesStatistics.java,v $ + * created by: Stefan Blume (blume) + * erstellt am: 06.12.2007 + * Copyright: con terra GmbH, 2005 + * + * modified by: $Author: drewnak $ + * modified on: $Date: 2008/08/18 14:50:33 $ + * Version: $Revision: 1.3 $ + * TAG: $Name: $ + * locked from: $Locker: $ + * CVS State: $State: Exp $ + * Project: $ProjectName$ + */ +package de.intevation.gnv.statistics; + +import java.sql.SQLException; +import java.util.ArrayList; +import java.util.Collection; +import java.util.Iterator; + +import org.apache.commons.math.stat.descriptive.DescriptiveStatistics; +import org.apache.commons.math.stat.regression.SimpleRegression; +import org.apache.log4j.Logger; + +import de.intevation.gnv.geobackend.base.Result; +import de.intevation.gnv.geobackend.base.ResultDescriptor; +import de.intevation.gnv.state.describedata.KeyValueDescibeData; +import de.intevation.gnv.statistics.exception.StatisticsException; + +/** + * The class TimeseriesStatistics fulfills the following purposes: + *
    + *
  1. + *
+ * + * @author blume + * @author Tim Englich + * @version 1.0 + * @serial 1.0 + * @see + * @since 06.12.2007 18:02:27 + */ +public class TimeseriesStatistics +extends AbstractStatistics +{ + + /** + * Default Logging instance + */ + private static Logger log = Logger.getLogger(TimeseriesStatistics.class); + + /** + * Constructor + */ + public TimeseriesStatistics() { + } + + /** + * @see de.intevation.gnv.statistics.Statistics#calculateStatistics(java.util.Collection, java.util.Collection, java.util.Collection, java.util.Collection) + */ + public Collection calculateStatistics( + Object result, + Collection parameters, + Collection measurements, + Collection dates + ) + throws StatisticsException { + + if (!(result instanceof Collection)) { + return new ArrayList(); + } + + Collection resultSet = (Collection)result; + + clearStatistics(); + + DescriptiveStatistics lStatistics = null; + SimpleRegression lRegression = null; + Collection statisticSets = new ArrayList(); + String break1, break2, break3; + int lSeries = 1; + + if (resultSet == null) { + return statisticSets; + } + + int b1Idx = -1; + int b2Idx = -1; + int b3Idx = -1; + int yIdx = -1; + try { + + Iterator resultIterator = resultSet.iterator(); + if (resultIterator.hasNext()) { + Result row = resultIterator.next(); + Result previousRow = row; + + if (b1Idx == -1) { + ResultDescriptor rd = row.getResultDescriptor(); + b1Idx = rd.getColumnIndex("GROUP1"); + b2Idx = rd.getColumnIndex("GROUP2"); + b3Idx = rd.getColumnIndex("GROUP3"); + yIdx = rd.getColumnIndex("YORDINATE"); + + if (b1Idx == -1 || b2Idx == -1 || b3Idx == -1 || yIdx == -1) { + return statisticSets; + } + } + break1 = row.getString(b1Idx); + break2 = row.getString(b2Idx); + break3 = row.getString(b3Idx); + lRegression = new SimpleRegression(); + lStatistics = new DescriptiveStatistics(); + while (resultIterator.hasNext()) { + + if (!break1.equals(row.getString(b1Idx)) + || !break2.equals(row.getString(b2Idx)) + || !break3.equals(row.getString(b3Idx)) + ) { + String statisticsName = generateStatisticsName( + break1, break2, + break3, parameters, + measurements, dates); + + statisticSets.add( + generateStatisticsValues( + lStatistics, + lRegression, + statisticsName)); + + lStatistics.clear(); + lRegression.clear(); + + clearStatistics(); + + Double yValue = row.getDouble(yIdx); + + if (yValue != null) { + lStatistics.addValue(yValue); + Double x = calculateXOrdinateValue(previousRow,row); + lRegression.addData(x, yValue); + } + + break1 = row.getString(b1Idx); + break2 = row.getString(b2Idx); + break3 = row.getString(b3Idx); + previousRow = row; + row = resultIterator.next(); + lSeries++; + } else { + + Double value = row.getDouble(yIdx); + if (value != null) { + lStatistics.addValue(value.doubleValue()); + Double x = calculateXOrdinateValue(previousRow,row); + lRegression.addData(x, value.doubleValue()); + } + previousRow = row; + row = resultIterator.next(); + } + + } + + Double yValue = row.getDouble(yIdx); + + if (yValue != null) { + lStatistics.addValue(yValue); + Double x = calculateXOrdinateValue(previousRow, row); + lRegression.addData(x, yValue); + } + + String statisticsName = generateStatisticsName( + break1, break2, + break3, parameters, + measurements, dates); + + statisticSets.add(generateStatisticsValues( + lStatistics, + lRegression, + statisticsName)); + lStatistics.clear(); + lRegression.clear(); + } + } catch (Exception e) { + log.error(e.getMessage(), e); + } + + return statisticSets; + } + + protected void clearStatistics(){} + + /** + * + * @param break1 + * @param break2 + * @param break3 + * @param parameters + * @param measurements + * @param dates + * @return + */ + protected String generateStatisticsName(String break1, + String break2, + String break3, + Collection parameters, + Collection measurements, + Collection dates){ + log.debug("TimeseriesStatistics.generateStatisticsName"); + return this.findValueTitle(parameters,break1)+ " "+ + this.findValueTitle(measurements,break2) + "m"; + } + + + protected String findValueTitle(Collection values, + String id) { + log.debug("TimeseriesStatistics.findValueTitle "+ id); + if (values != null) { + Iterator it = values.iterator(); + while (it.hasNext()) { + KeyValueDescibeData data = it.next(); + if (id.equals(data.getKey())) { + return data.getValue(); + } + } + } + return ""; + } + protected double calculateXOrdinateValue(Result previousRow, Result row) throws SQLException { + return new Double((row.getDate("XORDINATE")).getTime() / 1000 / 3600); + } + +} diff -r f99d8f92a640 -r 755dd2fa4a0a gnv-artifacts/src/main/java/de/intevation/gnv/statistics/VerticalCrossSectionStatistics.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv-artifacts/src/main/java/de/intevation/gnv/statistics/VerticalCrossSectionStatistics.java Fri Sep 28 12:13:53 2012 +0200 @@ -0,0 +1,52 @@ +package de.intevation.gnv.statistics; + +import java.util.Collection; +import java.util.ArrayList; + +import org.apache.log4j.Logger; + +import de.intevation.gnv.state.describedata.KeyValueDescibeData; + +import de.intevation.gnv.statistics.exception.StatisticsException; + +import de.intevation.gnv.math.AttributedXYColumns; + +/** + * @author Sascha L. Teichmann (sascha.teichmann@intevation.de) + */ +public class VerticalCrossSectionStatistics +extends AbstractStatistics +{ + private static Logger log = Logger.getLogger( + VerticalCrossSectionStatistics.class); + + public VerticalCrossSectionStatistics() { + } + + public Collection calculateStatistics( + Object result, + Collection parameters, + Collection measurements, + Collection dates + ) + throws StatisticsException { + + boolean debug = log.isDebugEnabled(); + + if (debug) { + log.debug("calculateStatistics --------------"); + } + + ArrayList statisticSet = + new ArrayList(); + + if (!(result instanceof AttributedXYColumns)) { + log.error("wrong type of result"); + return statisticSet; + } + AttributedXYColumns columns = (AttributedXYColumns)result; + + return statisticSet; + } +} +// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 : diff -r f99d8f92a640 -r 755dd2fa4a0a gnv-artifacts/src/main/java/de/intevation/gnv/statistics/VerticalProfileStatistics.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv-artifacts/src/main/java/de/intevation/gnv/statistics/VerticalProfileStatistics.java Fri Sep 28 12:13:53 2012 +0200 @@ -0,0 +1,45 @@ +/** + * + */ +package de.intevation.gnv.statistics; + +import java.sql.SQLException; +import java.util.Collection; + +import de.intevation.gnv.geobackend.base.Result; +import de.intevation.gnv.state.describedata.KeyValueDescibeData; + +/** + * @author Tim Englich + * + */ +public class VerticalProfileStatistics extends TimeseriesStatistics { + + /** + * Constructor + */ + public VerticalProfileStatistics() { + super(); + } + + @Override + protected double calculateXOrdinateValue(Result previousRow, Result row) throws SQLException { + return row.getDouble("XORDINATE"); + } + + @Override + protected String generateStatisticsName( + String break1, + String break2, + String break3, + Collection parameters, + Collection measurements, + Collection dates) { + + return (this.findValueTitle(parameters, break1)+ " "+ + this.findValueTitle(measurements,break2)).trim(); + } + + + +} diff -r f99d8f92a640 -r 755dd2fa4a0a gnv-artifacts/src/main/java/de/intevation/gnv/statistics/exception/StatisticsException.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv-artifacts/src/main/java/de/intevation/gnv/statistics/exception/StatisticsException.java Fri Sep 28 12:13:53 2012 +0200 @@ -0,0 +1,51 @@ +/** + * + */ +package de.intevation.gnv.statistics.exception; + +/** + * @author Tim Englich + * + */ +public class StatisticsException extends Exception { + + /** + * + */ + private static final long serialVersionUID = -7324280565076343394L; + + /** + * Constructor + */ + public StatisticsException() { + } + + /** + * Constructor + * + * @param arg0 + */ + public StatisticsException(String arg0) { + super(arg0); + } + + /** + * Constructor + * + * @param arg0 + */ + public StatisticsException(Throwable arg0) { + super(arg0); + } + + /** + * Constructor + * + * @param arg0 + * @param arg1 + */ + public StatisticsException(String arg0, Throwable arg1) { + super(arg0, arg1); + } + +} diff -r f99d8f92a640 -r 755dd2fa4a0a gnv-artifacts/src/main/java/de/intevation/gnv/timeseries/TimeSeriesArtifact.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv-artifacts/src/main/java/de/intevation/gnv/timeseries/TimeSeriesArtifact.java Fri Sep 28 12:13:53 2012 +0200 @@ -0,0 +1,51 @@ +/** + * + */ +package de.intevation.gnv.timeseries; + +import org.apache.log4j.Logger; +import org.w3c.dom.Document; + +import de.intevation.artifacts.ArtifactFactory; +import de.intevation.gnv.artifacts.GNVArtifactBase; + +/** + * @author Tim Englich + * @author Ingo Weinzierl + * + */ +public class TimeSeriesArtifact extends GNVArtifactBase { + + /** + * the logger, used to log exceptions and additonaly information + */ + private static Logger log = Logger.getLogger(TimeSeriesArtifact.class); + + /** + * The UID of this class + */ + private static final long serialVersionUID = -8291547966693867205L; + + /** + * Constructor + */ + public TimeSeriesArtifact() { + super(); + log.debug("TimeSeriesArtifact.Constructor"); + this.name = "timeSeries"; + } + + + /** + * @see de.intevation.gnv.artifacts.GNVArtifactBase#setup(java.lang.String, + * de.intevation.artifacts.ArtifactFactory, java.lang.Object + * org.w3c.dom.Document) + */ + @Override + public void setup(String identifier, ArtifactFactory factory, + Object context, Document data) { + log.debug("TimeSeriesArtifact.setup"); + super.setup(identifier, factory, context, data); + } +} +// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8: diff -r f99d8f92a640 -r 755dd2fa4a0a gnv-artifacts/src/main/java/de/intevation/gnv/timeseries/TimeSeriesMeshArtifact.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv-artifacts/src/main/java/de/intevation/gnv/timeseries/TimeSeriesMeshArtifact.java Fri Sep 28 12:13:53 2012 +0200 @@ -0,0 +1,19 @@ +package de.intevation.gnv.timeseries; + +public class TimeSeriesMeshArtifact extends TimeSeriesArtifact { + + /** + * + */ + private static final long serialVersionUID = 5680432486700275986L; + + /** + * + * Constructor + */ + public TimeSeriesMeshArtifact() { + super(); + super.name = super.name + "Mesh"; + } + +} diff -r f99d8f92a640 -r 755dd2fa4a0a gnv-artifacts/src/main/java/de/intevation/gnv/timeseries/gap/DefaultTimeGap.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv-artifacts/src/main/java/de/intevation/gnv/timeseries/gap/DefaultTimeGap.java Fri Sep 28 12:13:53 2012 +0200 @@ -0,0 +1,64 @@ +/** + * + */ +package de.intevation.gnv.timeseries.gap; +/** + * @author Tim Englich + * + */ +public class DefaultTimeGap implements TimeGap{ + + /** + * The UNIT of the TimeGap + * See the Constants in de.intevation.gnv.timeseries.gap.TimeGap + */ + private String unit; + + /** + * The Key of the TimeGap which must be equivalent to the + * Key used in the DWH + */ + private int key; + + /** + * The Value of the Gap. + * Use the Unit and the Time Constants to Calculate the + * value in Milliseconds + */ + private int value; + + /** + * Constructor + * @param unit + * @param key + * @param value + */ + public DefaultTimeGap(String unit, int key, int value) { + super(); + this.unit = unit; + this.key = key; + this.value = value; + } + + /** + * @see de.intevation.gnv.timeseries.gap.TimeGap#getUnit() + */ + public String getUnit() { + return this.unit; + } + + /** + * @see de.intevation.gnv.timeseries.gap.TimeGap#getKey() + */ + public int getKey() { + return this.key; + } + + /** + * @see de.intevation.gnv.timeseries.gap.TimeGap#getValue() + */ + public int getValue() { + return this.value; + } + +} diff -r f99d8f92a640 -r 755dd2fa4a0a gnv-artifacts/src/main/java/de/intevation/gnv/timeseries/gap/TimeGap.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv-artifacts/src/main/java/de/intevation/gnv/timeseries/gap/TimeGap.java Fri Sep 28 12:13:53 2012 +0200 @@ -0,0 +1,35 @@ +package de.intevation.gnv.timeseries.gap; +public interface TimeGap { + + public final static String TIME_UNIT_MINUTE = "m"; + public final static String TIME_UNIT_HOUR = "h"; + public final static String TIME_UNIT_DAY = "D"; + public final static String TIME_UNIT_WEEK = "W"; + public final static String TIME_UNIT_MONTH = "M"; + public final static String TIME_UNIT_YEAR = "Y"; + + public final static long MINUTE_IN_MILLIS = 60 * 1000; + public final static long HOUR_IN_MILLIS = 60 * MINUTE_IN_MILLIS; + public final static long DAY_IN_MILLIS = 24 * HOUR_IN_MILLIS; + public final static long WEEK_IN_MILLIS = 7 * DAY_IN_MILLIS; + + + /** + * Returns the Lookup-Key for the TimeGap + * @return + */ + int getKey(); + + /** + * Returns the Value of the TimeValue in the Unit which is also given. + * @return + */ + int getValue(); + + /** + * Returns the Unit of the Timegap (e.g. Minutes, Hours, Days, Weeks, Months, Years) + * @return + */ + String getUnit(); + +} diff -r f99d8f92a640 -r 755dd2fa4a0a gnv-artifacts/src/main/java/de/intevation/gnv/transition/DefaultTransition.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv-artifacts/src/main/java/de/intevation/gnv/transition/DefaultTransition.java Fri Sep 28 12:13:53 2012 +0200 @@ -0,0 +1,33 @@ +/** + * + */ +package de.intevation.gnv.transition; + +import de.intevation.gnv.state.State; + +/** + * @author Tim Englich + * + */ +public class DefaultTransition extends TransitionBase { + + /** + * The UID of this Class. + */ + private static final long serialVersionUID = -2610338646743984581L; + + /** + * Constructor + */ + public DefaultTransition() { + super(); + } + + /** + * @see de.intevation.gnv.transition.Transition#isValid(de.intevation.gnv.state.State) + */ + public boolean isValid(State state) { + return true; + } + +} diff -r f99d8f92a640 -r 755dd2fa4a0a gnv-artifacts/src/main/java/de/intevation/gnv/transition/PresettingsValueCompareTransition.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv-artifacts/src/main/java/de/intevation/gnv/transition/PresettingsValueCompareTransition.java Fri Sep 28 12:13:53 2012 +0200 @@ -0,0 +1,72 @@ +/** + * + */ +package de.intevation.gnv.transition; + +import java.util.Map; + +import org.apache.log4j.Logger; +import org.w3c.dom.Node; + +import de.intevation.artifactdatabase.Config; +import de.intevation.gnv.state.InputData; +import de.intevation.gnv.state.State; + +/** + * @author Tim Englich + * + */ +public class PresettingsValueCompareTransition extends TransitionBase { + + /** + * the logger, used to log exceptions and additonaly information + */ + private static Logger log = Logger.getLogger(PresettingsValueCompareTransition.class); + + private String dataName = null; + private String dataValue = null; + private String operator = null; + + /** + * The UID of this Class. + */ + private static final long serialVersionUID = -7846722158776823205L; + + /** + * Constructor + */ + public PresettingsValueCompareTransition() { + super(); + } + + /** + * @see de.intevation.gnv.transition.Transition#isValid(de.intevation.gnv.state.State) + */ + public boolean isValid(State state) { + Map preSettings = state.getPreSettings(); + if (preSettings != null){ + boolean dataAvailable = preSettings.containsKey(dataName); + if (dataAvailable){ + if (operator.equals("equal")){ + return preSettings.get(dataName).getValue().startsWith(dataValue); + }else if (operator.equals("notequal")){ + return !preSettings.get(dataName).getValue().startsWith(dataValue); + } + } + } + if (operator.equals("notequal")){ + return true; + } + return false; + } + + @Override + public void setup(Node configuration) { + super.setup(configuration); + this.dataName = Config.getStringXPath(configuration,"condition/@inputvalue"); + this.dataValue = Config.getStringXPath(configuration,"condition/@value"); + this.operator = Config.getStringXPath(configuration,"condition/@operator"); + } + + +} diff -r f99d8f92a640 -r 755dd2fa4a0a gnv-artifacts/src/main/java/de/intevation/gnv/transition/Transition.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv-artifacts/src/main/java/de/intevation/gnv/transition/Transition.java Fri Sep 28 12:13:53 2012 +0200 @@ -0,0 +1,41 @@ +package de.intevation.gnv.transition; + +import java.io.Serializable; + +import org.w3c.dom.Node; + +import de.intevation.gnv.state.State; + +/** + * + * @author Tim Englich + * + */ +public interface Transition extends Serializable{ + + /** + * Returns the ID of the State from which the Transition could be used + * @return the ID of the State from which the Transition could be used + */ + public String getFrom(); + + /** + * Returns the ID of the State where it is possible to go as next. + * @return the ID of the State where it is possible to go as next. + */ + public String getTo(); + + /** + * Determines if it is possible to go along this Transition or not. + * @param state the current State + * @return + */ + public boolean isValid(State state); + + /** + * Configures the Transition. + * @param configuration + */ + public void setup(Node configuration); + +} diff -r f99d8f92a640 -r 755dd2fa4a0a gnv-artifacts/src/main/java/de/intevation/gnv/transition/TransitionBase.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv-artifacts/src/main/java/de/intevation/gnv/transition/TransitionBase.java Fri Sep 28 12:13:53 2012 +0200 @@ -0,0 +1,52 @@ +/** + * + */ +package de.intevation.gnv.transition; + +import org.w3c.dom.Node; + +import de.intevation.artifactdatabase.Config; + +/** + * @author Tim Englich + * + */ +public abstract class TransitionBase implements Transition { + + /** + * The UID of this Class. + */ + private static final long serialVersionUID = -8542097519466477977L; + + private String from = null; + + private String to = null; + /** + * Constructor + */ + public TransitionBase() { + } + + /** + * @see de.intevation.gnv.transition.Transition#getFrom() + */ + public String getFrom() { + return this.from; + } + + /** + * @see de.intevation.gnv.transition.Transition#getTo() + */ + public String getTo() { + return this.to; + } + + /** + * @see de.intevation.gnv.transition.Transition#setup(org.w3c.dom.Node) + */ + public void setup(Node configuration) { + this.from = Config.getStringXPath(configuration,"from/@state"); + this.to = Config.getStringXPath(configuration,"to/@state"); + } + +} diff -r f99d8f92a640 -r 755dd2fa4a0a gnv-artifacts/src/main/java/de/intevation/gnv/transition/TransitionFactory.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv-artifacts/src/main/java/de/intevation/gnv/transition/TransitionFactory.java Fri Sep 28 12:13:53 2012 +0200 @@ -0,0 +1,55 @@ +/** + * + */ +package de.intevation.gnv.transition; + +import org.apache.log4j.Logger; +import org.w3c.dom.Node; + +import de.intevation.gnv.artifacts.GNVArtifactBase; + +/** + * @author Tim Englich + * + */ +public class TransitionFactory { + + /** + * the logger, used to log exceptions and additonaly information + */ + private static Logger log = Logger.getLogger(GNVArtifactBase.class); + + private static TransitionFactory instance = null; + + /** + * Constructor + */ + public TransitionFactory() { + super(); + } + + public static TransitionFactory getInstance() { + if (instance == null) { + instance = new TransitionFactory(); + } + return instance; + } + + public Transition createTransition(Node configuration) { + log.debug("TransitionFactory.createTransition"); + Transition state = null; + try { + String classname = ((org.w3c.dom.Element)configuration).getAttribute("transition"); + state = (Transition) (Class.forName(classname).newInstance()); + state.setup(configuration); + } catch (InstantiationException e) { + log.error(e, e); + } catch (IllegalAccessException e) { + log.error(e, e); + } catch (ClassNotFoundException e) { + log.error(e, e); + } + return state; + } + +} diff -r f99d8f92a640 -r 755dd2fa4a0a gnv-artifacts/src/main/java/de/intevation/gnv/transition/ValueCompareTransition.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv-artifacts/src/main/java/de/intevation/gnv/transition/ValueCompareTransition.java Fri Sep 28 12:13:53 2012 +0200 @@ -0,0 +1,82 @@ +/** + * + */ +package de.intevation.gnv.transition; + +import java.util.Iterator; + +import org.apache.log4j.Logger; +import org.w3c.dom.Node; + +import de.intevation.artifactdatabase.Config; +import de.intevation.gnv.state.InputData; +import de.intevation.gnv.state.State; +import de.intevation.gnv.state.exception.StateException; + +/** + * @author Tim Englich + * + */ +public class ValueCompareTransition extends TransitionBase { + + /** + * the logger, used to log exceptions and additonaly information + */ + private static Logger log = Logger.getLogger(ValueCompareTransition.class); + + private String dataName = null; + private String dataValue = null; + private String operator = null; + + /** + * The UID of this Class. + */ + private static final long serialVersionUID = -7846722158776823205L; + + /** + * Constructor + */ + public ValueCompareTransition() { + super(); + } + + /** + * @see de.intevation.gnv.transition.Transition#isValid(de.intevation.gnv.state.State) + */ + public boolean isValid(State state) { + + try { + Iterator it = state.getInputData().iterator(); + while (it.hasNext()){ + InputData inputData = it.next(); + if (inputData.getName().equals(this.dataName)){ + boolean returnValue = false; + if (operator.equals("equal")){ + returnValue = this.dataValue.equals(inputData.getValue()); + }else if (operator.equals("notequal")){ + returnValue = !this.dataValue.equals(inputData.getValue()); + } + return returnValue; + } + } + if (operator.equals("notequal")){ + // data is not given. So the constraint not Equals is fullfilled. + return true; + } + } catch (StateException e) { + log.error(e,e); + return false; + } + return false; + } + + @Override + public void setup(Node configuration) { + super.setup(configuration); + this.dataName = Config.getStringXPath(configuration,"condition/@inputvalue"); + this.dataValue = Config.getStringXPath(configuration,"condition/@value"); + this.operator = Config.getStringXPath(configuration,"condition/@operator"); + } + + +} diff -r f99d8f92a640 -r 755dd2fa4a0a gnv-artifacts/src/main/java/de/intevation/gnv/utils/ArtifactFactoryUtilities.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv-artifacts/src/main/java/de/intevation/gnv/utils/ArtifactFactoryUtilities.java Fri Sep 28 12:13:53 2012 +0200 @@ -0,0 +1,55 @@ +/** + * + */ +package de.intevation.gnv.utils; + +import org.apache.log4j.Logger; +import org.w3c.dom.Document; +import org.w3c.dom.Node; + +import de.intevation.artifacts.ArtifactFactory; + +/** + * @author Tim Englich + * + */ +public class ArtifactFactoryUtilities { + /** + * the logger, used to log exceptions and additonaly information + */ + private static Logger log = Logger + .getLogger(ArtifactFactoryUtilities.class); + + /** + * Constructor + */ + public ArtifactFactoryUtilities() { + } + + public ArtifactFactory createArtitfactFactor(Document config, + Node artifactFactoryNode) { + String className = artifactFactoryNode.getTextContent(); + + ArtifactFactory factory = null; + + try { + Class clazz = Class.forName(className); + factory = (ArtifactFactory) clazz.newInstance(); + } catch (ClassNotFoundException cnfe) { + log.error(cnfe.getLocalizedMessage(), cnfe); + } catch (InstantiationException ie) { + log.error(ie.getLocalizedMessage(), ie); + } catch (ClassCastException cce) { + log.error(cce.getLocalizedMessage(), cce); + } catch (IllegalAccessException iae) { + log.error(iae.getLocalizedMessage(), iae); + } + + if (factory != null) { + factory.setup(config, artifactFactoryNode); + log.info("Registering '" + factory.getName() + + "' as artifact factory."); + } + return factory; + } +} diff -r f99d8f92a640 -r 755dd2fa4a0a gnv-artifacts/src/main/java/de/intevation/gnv/utils/ArtifactXMLUtilities.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv-artifacts/src/main/java/de/intevation/gnv/utils/ArtifactXMLUtilities.java Fri Sep 28 12:13:53 2012 +0200 @@ -0,0 +1,162 @@ +/** + * + */ +package de.intevation.gnv.utils; + +import java.io.ByteArrayInputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.Serializable; +import java.io.StringWriter; +import java.io.UnsupportedEncodingException; + +import javax.xml.parsers.DocumentBuilder; +import javax.xml.parsers.DocumentBuilderFactory; +import javax.xml.parsers.ParserConfigurationException; +import javax.xml.transform.Transformer; +import javax.xml.transform.TransformerConfigurationException; +import javax.xml.transform.TransformerException; +import javax.xml.transform.TransformerFactory; +import javax.xml.transform.TransformerFactoryConfigurationError; +import javax.xml.transform.dom.DOMSource; +import javax.xml.transform.stream.StreamResult; + +import org.apache.log4j.Logger; +import org.w3c.dom.Document; +import org.w3c.dom.Element; +import org.w3c.dom.Node; +import org.xml.sax.SAXException; + +import de.intevation.artifacts.ArtifactNamespaceContext; + +/** + * @author Tim Englich + * + */ +public class ArtifactXMLUtilities implements Serializable { + /** + * + */ + private static final long serialVersionUID = -6236340358303411758L; + + /** + * the logger, used to log exceptions and additonaly information + */ + private static Logger log = Logger + .getLogger(ArtifactXMLUtilities.class); + + public static final String XFORM_URL = "http://www.w3.org/2002/xforms"; + public static final String XFORM_PREFIX = "xform"; + + /** + * Constructor + */ + public ArtifactXMLUtilities() { + } + + /** + * @param document + * @return + */ + public Element createArtifactElement(Document document, String name) { + Element node = document.createElementNS( + ArtifactNamespaceContext.NAMESPACE_URI, name); + node.setPrefix(ArtifactNamespaceContext.NAMESPACE_PREFIX); + return node; + } + + public String writeDocument2String(Document document) { + try { + TransformerFactory transformerFactory = TransformerFactory + .newInstance(); + Transformer transformer = transformerFactory.newTransformer(); + DOMSource source = new DOMSource(document); + StringWriter sw = new StringWriter(); + StreamResult result = new StreamResult(sw); + transformer.transform(source, result); + return sw.getBuffer().toString(); + } catch (TransformerConfigurationException e) { + log.error(e, e); + } catch (TransformerFactoryConfigurationError e) { + log.error(e, e); + } catch (TransformerException e) { + log.error(e, e); + } + return null; + } + + public static Document readDocument(InputStream inputStream) { + Document returnValue = null; + try { + DocumentBuilderFactory docBuilderFactory = DocumentBuilderFactory + .newInstance(); + DocumentBuilder docBuilder = docBuilderFactory.newDocumentBuilder(); + returnValue = docBuilder.parse(inputStream); + } catch (ParserConfigurationException e) { + log.error(e, e); + } catch (SAXException e) { + log.error(e, e); + } catch (IOException e) { + log.error(e, e); + } + return returnValue; + } + + public Document reInitDocument(Document document) { + try { + byte[] barray = this.writeDocument2String(document).getBytes( + "UTF-8"); + InputStream inputStream = new ByteArrayInputStream(barray); + return this.readDocument(inputStream); + } catch (UnsupportedEncodingException e) { + log.error(e, e); + } + return document; + } + + public static Element createXFormElement(Document document, String name) { + Element node = document.createElementNS(XFORM_URL, name); + node.setPrefix(XFORM_PREFIX); + return node; + } + + public Document createExceptionReport(String message, Document document) { + log.debug("ArtifactXMLUtilities.createExceptionReport"); + Element exceptionReportNode = this.createArtifactElement(document, + "exceptionreport"); + document.appendChild(exceptionReportNode); + Element exceptionNode = this.createArtifactElement(document, + "exception"); + exceptionNode.setTextContent(message); + exceptionReportNode.appendChild(exceptionNode); + return document; + } + + public Document createSuccessReport(String message, Document document) { + log.debug("ArtifactXMLUtilities.creatSuccessReport"); + Element reportNode = this.createArtifactElement(document, "result"); + document.appendChild(reportNode); + Element successNode = this.createArtifactElement(document, "success"); + successNode.setTextContent(message); + reportNode.appendChild(successNode); + return document; + } + + public Node readConfiguration(String fileName){ + try { + DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); + factory.setValidating(false); + return factory.newDocumentBuilder().parse(fileName).getChildNodes().item(0); + } catch (SAXException e) { + log.error(e,e); + return null; + } catch (IOException e) { + log.error(e,e); + return null; + } catch (ParserConfigurationException e) { + log.error(e,e); + return null; + } + } + +} diff -r f99d8f92a640 -r 755dd2fa4a0a gnv-artifacts/src/main/java/de/intevation/gnv/utils/DistanceCalculator.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv-artifacts/src/main/java/de/intevation/gnv/utils/DistanceCalculator.java Fri Sep 28 12:13:53 2012 +0200 @@ -0,0 +1,84 @@ +/** + * + */ +package de.intevation.gnv.utils; + +import com.vividsolutions.jts.geom.Point; +import com.vividsolutions.jts.geom.Coordinate; + +import java.util.List; + +/** + * @author Tim Englich + * + */ +public class DistanceCalculator { + + private final static double flattening = 1.0 / 298.257233563; + + private final static double earthRadius = 6378137.0 / 1000.0 ; + + /** + * Constructor + */ + public DistanceCalculator() { + } + + public static double calculateDistance(Point p1, Point p2){ + return calculateDistance(p1.getCoordinate(), p2.getCoordinate()); + } + + public static double calculateDistance(Coordinate p1, Coordinate p2){ + double resultValue = 0.0; + + double b1 = p1.y; + double b2 = p2.y; + + double l1 = p1.x; + double l2 = p2.x; + + + double F = (b1 + b2) / 2.0; + double G = (b1 - b2) / 2.0; + double l = (l1 - l2) / 2.0; + + F = (Math.PI / 180.0) * F; + G = (Math.PI / 180.0) * G; + l = (Math.PI / 180.0) * l; + + double S = ((Math.sin(G) * Math.sin(G)) * ((Math.cos(l) * Math.cos(l))))+ + ((Math.cos(F) * Math.cos(F)) * ((Math.sin(l) * Math.sin(l)))); + + double C = ((Math.cos(G) * Math.cos(G)) * ((Math.cos(l) * Math.cos(l))))+ + ((Math.sin(F) * Math.sin(F)) * ((Math.sin(l) * Math.sin(l)))); + + double w = Math.atan(Math.sqrt((S/C))); + + double D = 2.0 * w * earthRadius; + + double R = Math.sqrt((S*C)) / w; + + double H1 = (3.0 * R - 1.0 ) / (2.0 * C); + double H2 = (3.0 * R + 1.0 ) / (2.0 * S); + + resultValue = D * (1 + (flattening * H1 * (Math.sin(F) * Math.sin(F)) * + (Math.cos(G) * Math.cos(G))) - + (flattening * H2 * (Math.cos(F) * Math.cos(F)) * + (Math.sin(G) * Math.sin(G)))); + + return resultValue; + } + + public static final double calculateDistance(List path) { + int N = path.size(); + if (N < 2) { + return 0d; + } + double sum = 0d; + for (int i = 1; i < N; ++i) { + sum += calculateDistance(path.get(i-1), path.get(i)); + } + return sum; + } + +} diff -r f99d8f92a640 -r 755dd2fa4a0a gnv-artifacts/src/main/java/de/intevation/gnv/utils/FileUtils.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv-artifacts/src/main/java/de/intevation/gnv/utils/FileUtils.java Fri Sep 28 12:13:53 2012 +0200 @@ -0,0 +1,129 @@ +package de.intevation.gnv.utils; + +import java.io.BufferedInputStream; +import java.io.File; +import java.io.FileInputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; + +import java.util.Stack; + +import java.util.zip.ZipEntry; +import java.util.zip.ZipOutputStream; + +/** + * @author Sascha L. Teichmann (sascha.teichmann@intevation.de) + */ +public final class FileUtils +{ + private FileUtils() { + } + + public final static boolean deleteRecursive(File file) { + + if (file == null) { + return false; + } + + if (file.isDirectory()) { + File [] files = file.listFiles(); + if (files != null) { + for (File sub: files) { + if (!deleteRecursive(sub)) { + return false; + } + } + } + } + + return file.delete(); + } + + public static void createZipArchive( + File file, + OutputStream outputStream + ) + throws IOException + { + ZipOutputStream out = new ZipOutputStream(outputStream); + + if (file.isFile()) { + copyFileToZip("", file, out); + } + else if (file.isDirectory()) { + + Stack stack = new Stack(); + stack.push(new PrefixDir(file.getName() + "/", file)); + + while (!stack.isEmpty()) { + PrefixDir pd = stack.pop(); + + ZipEntry dirEntry = new ZipEntry(pd.prefix); + out.putNextEntry(dirEntry); + out.closeEntry(); + + File [] files = pd.dir.listFiles(); + if (files != null) { + for (File sub: files) { + if (sub.isDirectory()) { + stack.push(new PrefixDir( + pd.prefix + sub.getName() + "/", + sub)); + } + else if (sub.isFile()) { + copyFileToZip(pd.prefix, sub, out); + } + } + } + } + } + + out.finish(); + } + + private static final class PrefixDir { + + String prefix; + File dir; + + public PrefixDir(String prefix, File dir) { + this.prefix = prefix; + this.dir = dir; + } + + } // class PrefixDir + + private static void copyFileToZip( + String prefix, + File file, + ZipOutputStream out + ) + throws IOException + { + String entryName = prefix + file.getName(); + ZipEntry entry = new ZipEntry(entryName); + out.putNextEntry(entry); + InputStream in = null; + try { + in = + new BufferedInputStream( + new FileInputStream(file), 20*1024); + + byte [] buf = new byte[2048]; + + int r; + while ((r = in.read(buf)) > 0) { + out.write(buf, 0, r); + } + } + finally { + if (in != null) { + try { in.close(); } + catch (IOException ioe) {} + } + } + out.closeEntry(); + } +} +// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf-8 : diff -r f99d8f92a640 -r 755dd2fa4a0a gnv-artifacts/src/main/java/de/intevation/gnv/utils/IndexBuffer.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv-artifacts/src/main/java/de/intevation/gnv/utils/IndexBuffer.java Fri Sep 28 12:13:53 2012 +0200 @@ -0,0 +1,169 @@ +package de.intevation.gnv.utils; + +import java.awt.geom.Point2D; + +import java.awt.Point; + +import java.util.List; + +/** + * Create buffers around integer pairs (i_1..n), j_1..n). + * + * @author Sascha L. Teichmann (sascha.teichmann@intevation.de) + */ +public class IndexBuffer +{ + public static final double EPSILON = 1e-6d; + public static final double OFFSET = 1.0d; + + public static final String I_COLUMN = "IPOSITION"; + public static final String J_COLUMN = "JPOSITION"; + + public static final class Segment { + + private Segment next; + + private Point2D.Double n; + private double d1; + private double d2; + + private int iMin; + private int iMax; + + private int jMin; + private int jMax; + + public Segment(Point a, Point b, Segment next) { + + this.next = next; + + iMin = Math.min(a.x, b.x)-1; + iMax = Math.max(a.x, b.x)+1; + + jMin = Math.min(a.y, b.y)-1; + jMax = Math.max(a.y, b.y)+1; + + if (a.x > b.x) { + Point p = a; a = b; b = p; + } + + Point2D.Double p1, p2, p3; + + if (a.y < b.y) { + p1 = new Point2D.Double(a.x - OFFSET, a.y + 1 + OFFSET); + p2 = new Point2D.Double(b.x - OFFSET, b.y + 1 + OFFSET); + p3 = new Point2D.Double(a.x + 1 + OFFSET, a.y - OFFSET); + } + else { + p1 = new Point2D.Double(a.x + 1 + OFFSET, a.y + 1 + OFFSET); + p2 = new Point2D.Double(b.x + 1 + OFFSET, b.y + 1 + OFFSET); + p3 = new Point2D.Double(b.x - OFFSET, b.y - OFFSET); + } + + n = normalize(orthogonal(sub(p1, p2))); + + d1 = dot(n, p1); + d2 = dot(n, p3); + + if (d1 > d2) { + double d = d1; + d1 = d2; + d2 = d; + } + } + + public boolean check(int i, int j) { + if (i < iMin || i > iMax || j < jMin || j > jMax) { + return false; + } + double v = dot(n, i, j); + return v >= d1 && v <= d2; + } + + public void toWhereClause(StringBuilder sb, String iColumn, String jColumn) { + sb.append('(') + .append(iColumn).append(" >= ").append(iMin).append(" AND ") + .append(iColumn).append(" <= ").append(iMax).append(" AND ") + .append(jColumn).append(" >= ").append(jMin).append(" AND ") + .append(jColumn).append(" <= ").append(jMax).append(" AND (") + .append(n.x).append('*').append(iColumn).append(" + ") + .append(n.y).append('*').append(jColumn) + .append(") BETWEEN ").append(d1).append(" AND ").append(d2).append(')'); + } + } // class Segment + + protected Segment head; + + protected String iColumn; + protected String jColumn; + + public IndexBuffer(List points) { + this(points, I_COLUMN, J_COLUMN); + } + + public IndexBuffer(List points, String iColumn, String jColumn) { + this.iColumn = iColumn; + this.jColumn = jColumn; + + for (int i = 1, N = points.size(); i < N; ++i) { + Point p1 = (Point)points.get(i-1); + Point p2 = (Point)points.get(i); + head = new Segment(p1, p2, head); + } + } + + public boolean check(int i, int j) { + + Segment current = head; + while (current != null) { + if (current.check(i, j)) { + return true; + } + current = current.next; + } + return false; + } + + public String toWhereClause() { + + StringBuilder sb = new StringBuilder(); + + Segment current = head; + + while (current != null) { + if (current != head) { + sb.append(" OR "); + } + current.toWhereClause(sb, iColumn, jColumn); + current = current.next; + } + + return sb.toString(); + } + + public static Point2D.Double sub(Point2D.Double p1, Point2D.Double p2) { + return new Point2D.Double(p1.x - p2.x, p1.y - p2.y); + } + + public static final double dot(Point2D.Double p1, Point2D.Double p2) { + return p1.x*p2.x + p1.y*p2.y; + } + + public static final double dot(Point2D.Double p1, double x, double y) { + return p1.x*x + p1.y*y; + } + + public static final Point2D.Double scale(Point2D.Double p, double s) { + return new Point2D.Double(s*p.x, s*p.y); + } + + public static final Point2D.Double normalize(Point2D.Double p) { + double len2 = Math.sqrt(dot(p, p)); + return len2 > EPSILON ? scale(p, 1d/len2) : p; + } + + public static final Point2D.Double orthogonal(Point2D.Double p) { + return new Point2D.Double(p.y, -p.x); + } +} +// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8: diff -r f99d8f92a640 -r 755dd2fa4a0a gnv-artifacts/src/main/java/de/intevation/gnv/utils/InputValidator.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv-artifacts/src/main/java/de/intevation/gnv/utils/InputValidator.java Fri Sep 28 12:13:53 2012 +0200 @@ -0,0 +1,154 @@ +/** + * + */ +package de.intevation.gnv.utils; + +import java.util.Date; + +import org.apache.commons.validator.GenericValidator; +import org.apache.log4j.Logger; + +import com.vividsolutions.jts.geom.Coordinate; +import com.vividsolutions.jts.geom.GeometryFactory; +import com.vividsolutions.jts.geom.Point; + +import de.intevation.gnv.geobackend.util.DateUtils; +import de.intevation.gnv.utils.exception.ValidationException; + +/** + * @author Tim Englich + * + */ +public class InputValidator { + /** + * the logger, used to log exceptions and additonaly information + */ + private static Logger log = Logger.getLogger(InputValidator.class); + + + public final static String NODATASELECTEDVALUE = "n/n"; + + /** + * Constructor + */ + public InputValidator() { + super(); + } + + public boolean isInputValid(String minInput, String maxInput, String type) { + log.debug("InputValidator.isInputValid " + minInput + " " + maxInput + " " +type); + boolean returnValue = false; + if ("Date".equalsIgnoreCase(type)) { + try { + Date min = DateUtils.getDateFromString(minInput,DateUtils.DATE_PATTERN); + Date max = DateUtils.getDateFromString(maxInput,DateUtils.DATE_PATTERN); + int value = max.compareTo(min); + returnValue = value >= 0; + } catch (Exception e) { + log.error(e,e); + } + } else if ("Double".equalsIgnoreCase(type)) { + try { + double min = Double.parseDouble(minInput); + double max = Double.parseDouble(maxInput); + returnValue = max >= min; + } catch (Exception e) { + log.error(e,e); + } + } + log.debug("Is valid? " + returnValue); + return returnValue; + } + + public boolean isInputValid(String input, String type) { + log.debug("InputValidator.isInputValid " + input + " " + type); + boolean returnValue = false; + String[] values = input.split(","); + for (int i = 0; i < values.length; i++) { + boolean valid; + + if (NODATASELECTEDVALUE.equals(values[i].trim())){ + valid = true; + } else if ("Integer".equalsIgnoreCase(type)) { + valid = GenericValidator.isInt(values[i].trim()); + } else if ("Double".equalsIgnoreCase(type)) { + valid = GenericValidator.isDouble(values[i].trim()); + } else if ("String".equalsIgnoreCase(type)) { + valid = GenericValidator.matchRegexp(values[i], "[a-zA-Z0-9]"); // TODO: + // FIXME: + // VALIDATE + // REGEXP + } else if ("Date".equalsIgnoreCase(type)) { + valid = GenericValidator.isDate(values[i].trim(), + DateUtils.DATE_PATTERN, true); + } else if ("Point".equalsIgnoreCase(type)) { + valid = GenericValidator.matchRegexp(values[i], "[0-9]"); // TODO: + // FIXME: + // VALIDATE + // REGEXP + } else if ("AttributeName".equalsIgnoreCase(type)) { + valid = org.apache.commons.validator.GenericValidator + .matchRegexp(values[i], "[a-zA-Z0-9]"); // TODO: FIXME: + // VALIDATE + // REGEXP + } else if ("Coordinate".equalsIgnoreCase(type)) { + try { + valid = this.getPointValue(values[i]) != null; + } catch (ValidationException e) { + log.debug(e.getMessage()); + valid = false; + } + } else { + valid = false; + } + if (!valid) { + returnValue = false; + break; + } else { + returnValue = true; + } + } + log.debug("Is valid? " + returnValue); + return returnValue; + } + + + public Point getPointValue(String value) throws ValidationException{ + log.debug("InputValidator.getPointValue " + value); + String[] s, p; + + double x=0,y=0; + log.info("Position :"+value); + s = value.split(" "); + if (s.length != 2) { + throw new ValidationException("Kein Blank separiert Breite und Länge"); + } + p = s[0].split("[nNsS]"); + try { + if (p.length == 1) + y = new Double(p[0]); + else + y = new Double(p[0]) + new Double(p[1]) / new Double(60.); + if (s[0].toLowerCase().contains("s")) + y = -y; + } + catch (Exception e) { + throw new ValidationException("Kein N|S oder nicht im ersten Substring, zB 56n42"); + + } + p = s[1].split("[eEwW]"); + try { + if (p.length ==1) + x = new Double(p[0]); + else + x = new Double(p[0]) + new Double(p[1]) / new Double(60.) ; + if (s[1].toLowerCase().contains("w")) + x = -x; + } + catch (Exception e) { + throw new ValidationException("Kein E|W oder nicht im zweiten Substring"); + } + return new GeometryFactory().createPoint(new Coordinate(x,y)); + } + +} diff -r f99d8f92a640 -r 755dd2fa4a0a gnv-artifacts/src/main/java/de/intevation/gnv/utils/MapfileGenerator.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv-artifacts/src/main/java/de/intevation/gnv/utils/MapfileGenerator.java Fri Sep 28 12:13:53 2012 +0200 @@ -0,0 +1,417 @@ +package de.intevation.gnv.utils; + +import de.intevation.artifactdatabase.Config; +import de.intevation.artifactdatabase.XMLUtils; +import de.intevation.artifacts.ArtifactNamespaceContext; +import de.intevation.gnv.wms.LayerInfo; + +import java.io.File; +import java.io.FileNotFoundException; +import java.io.FileWriter; +import java.io.IOException; +import java.io.StringWriter; +import java.io.Writer; +import java.util.ArrayList; +import java.util.Date; +import java.util.List; + +import javax.xml.xpath.XPathConstants; + +import org.apache.log4j.Logger; + +import org.apache.velocity.Template; +import org.apache.velocity.VelocityContext; +import org.apache.velocity.app.VelocityEngine; + +import org.w3c.dom.Document; +import org.w3c.dom.Node; +import org.w3c.dom.NodeList; + + +/** + * @author Ingo Weinzierl (ingo.weinzierl@intevation.de) + */ +public class MapfileGenerator +extends Thread +{ + public static final String TEMPLATE_PATH = + "/artifact-database/gnv/map-generator/templates/path/text()"; + + public static final String TEMPLATE_MAPFILE = + "/artifact-database/gnv/map-generator/templates/maptemplate/text()"; + + public static final String MAPFILE_PATH = + "/artifact-database/gnv/map-generator/mapfile/@path"; + + public static final String SHAPEFILE_BASE_DIR = + "/artifact-database/gnv/shapefile-directory/@path"; + + public static final String VELOCITY_LOGFILE = + "/artifact-database/velocity/logfile/@path"; + + public static final String META_FILE_NAME = "meta.xml"; + + public static final String XPATH_LAYER = "/art:meta/art:layer"; + public static final String XPATH_LAYER_NAME = "art:name"; + public static final String XPATH_LAYER_TYPE = "art:type"; + public static final String XPATH_LAYER_DATA = "art:data"; + public static final String XPATH_LAYER_STATUS = "art:status"; + public static final String XPATH_LAYER_MODEL = "art:model"; + + protected static final long SLEEPTIME = 10 * 1000L; // 10 seconds + + private static Logger logger = Logger.getLogger(MapfileGenerator.class); + + private static MapfileGenerator instance; + + private File mapfile; + private String shapefileDirectory; + private String templatePath; + private String velocityLogfile; + + private VelocityEngine velocityEngine; + private boolean lock[]; + + + + private MapfileGenerator() { + lock = new boolean[1]; + } + + + public static void main(String[] args) { + // TODO IMPLEMENT ME + } + + + public static synchronized MapfileGenerator getInstance() { + if (instance == null) { + instance = new MapfileGenerator(); + instance.setDaemon(true); + instance.start(); + } + + return instance; + } + + + public void update() { + synchronized (lock) { + logger.debug("update"); + lock[0] = true; + lock.notify(); + } + } + + + public void run() { + logger.debug("Start MapfileGenerator thread..."); + try { + for (;;) { + synchronized (lock) { + while (!lock[0]) { + lock.wait(SLEEPTIME); + } + lock[0] = false; + } + + logger.debug("Start sync process now..."); + generate(); + } + } + catch (InterruptedException ie) { + logger.debug("MapfileGenerator thread got an interrupt."); + } + finally { + logger.debug("THREAD END"); + } + } + + + protected void generate() { + File basedir = new File(getShapefileBaseDir()); + List layers = new ArrayList(); + searchMetaInformation(basedir, layers); + writeMapfile(layers); + } + + + protected VelocityEngine getVelocityEngine() { + if (velocityEngine == null) { + velocityEngine = new VelocityEngine(); + try { + setupVelocity(velocityEngine); + } + catch (Exception e) { + logger.error(e, e); + return null; + } + } + return velocityEngine; + } + + + protected void setupVelocity(VelocityEngine engine) + throws Exception + { + engine.setProperty( + "input.encoding", + "UTF-8"); + + engine.setProperty( + VelocityEngine.RUNTIME_LOG, + getVelocityLogfile()); + + engine.setProperty( + "resource.loader", + "file"); + + engine.setProperty( + "file.resource.loader.path", + getTemplateBaseDir()); + + engine.init(); + } + + + protected String getVelocityLogfile() { + if (velocityLogfile == null) + velocityLogfile = Config.getStringXPath(VELOCITY_LOGFILE); + + return velocityLogfile; + } + + + protected String getTemplateBaseDir() { + if (templatePath == null) { + templatePath = Config.getStringXPath(TEMPLATE_PATH); + templatePath = Config.replaceConfigDir(templatePath); + } + + return templatePath; + } + + + protected Template getTemplateByName(String model) { + if (model.indexOf(".vm") < 0) { + model = model.concat(".vm"); + } + + try { + VelocityEngine engine = getVelocityEngine(); + if (engine == null) { + logger.error("Error while fetching VelocityEngine."); + return null; + } + + return engine.getTemplate(model); + } + catch (Exception e) { + logger.warn(e, e); + } + + return null; + } + + + protected Template getMapfileTemplate() + throws Exception + { + String mapfileName = Config.getStringXPath(TEMPLATE_MAPFILE); + return getTemplateByName(mapfileName); + } + + + protected String getShapefileBaseDir() { + if (shapefileDirectory == null) { + shapefileDirectory = Config.getStringXPath(SHAPEFILE_BASE_DIR); + shapefileDirectory = Config.replaceConfigDir(shapefileDirectory); + } + + return shapefileDirectory; + } + + + protected File getMapfile() { + if (mapfile == null) { + String tmp = Config.getStringXPath(MAPFILE_PATH); + tmp = Config.replaceConfigDir(tmp); + mapfile = new File(tmp); + } + + return mapfile; + } + + + protected void searchMetaInformation(File file, List store) { + if (file.isDirectory()) { + File[] files = file.listFiles(); + + if (files != null && files.length != 0) { + int size = files.length; + for (File tmp: files) { + searchMetaInformation(tmp, store); + } + } + } + else if (file.getName().equals(META_FILE_NAME)) { + LayerInfo[] info = parseMeta(file); + + int infoSize = info.length; + for (int j = 0; j < infoSize; j++) { + if (info[j] != null) { + store.add(info[j]); + } + } + } + } + + + protected LayerInfo[] parseMeta(File file) { + Document meta = XMLUtils.parseDocument(file); + List layers = new ArrayList(); + + NodeList layerset = (NodeList) XMLUtils.xpath( + meta, + XPATH_LAYER, + XPathConstants.NODESET, + ArtifactNamespaceContext.INSTANCE); + + int size = layerset.getLength(); + for (int i = 0; i < size; i++) { + LayerInfo info = parseLayer(layerset.item(i)); + + if (info != null && !info.isEmpty() && !info.isBroken()) { + layers.add(info); + } + else { + logger.warn("Found broken LayerInfo object."); + } + } + + return (LayerInfo[]) layers.toArray(new LayerInfo[layers.size()]); + } + + + protected LayerInfo parseLayer(Node layer) { + LayerInfo info = new LayerInfo(); + + String name = parseLayerAttr(layer, XPATH_LAYER_NAME); + if (name != null && !name.equals("")) { + info.setName(name); + } + + String model = parseLayerAttr(layer, XPATH_LAYER_MODEL); + if (model != null && !model.equals("")) { + info.setModel(model); + } + + String type = parseLayerAttr(layer, XPATH_LAYER_TYPE); + if (type != null && !type.equals("")) { + info.setType(type); + } + + String data = parseLayerAttr(layer, XPATH_LAYER_DATA); + if (data != null && !data.equals("")) { + info.setData(data); + } + + String status = parseLayerAttr(layer, XPATH_LAYER_STATUS); + if (status != null && !status.equals("")) { + info.setStatus(status); + } + + return info; + } + + + protected String parseLayerAttr(Node node, String xpath) { + return (String) XMLUtils.xpath( + node, + xpath, + XPathConstants.STRING, + ArtifactNamespaceContext.INSTANCE); + } + + + protected void writeMapfile(List layers) { + String tmpMapName = "mapfile" + new Date().getTime(); + + int layersize = layers.size(); + StringBuilder sb = new StringBuilder(); + StringWriter sw = null; + LayerInfo info = null; + + for (int i = 0; i < layersize; i++) { + sw = new StringWriter(); + info = (LayerInfo) layers.get(i); + + Template layerTemplate = getTemplateByName(info.getModel()); + VelocityContext context = new VelocityContext(); + context.put("info", info); + + try { + layerTemplate.merge(context, sw); + sb.append(sw.toString()); + } + catch (IOException ioe) { + logger.warn("Error while filling layer template."); + logger.warn(ioe, ioe); + } + } + + File map = getMapfile(); + Writer writer = null; + File tmp = null; + + try { + tmp = new File(map.getParent(), tmpMapName); + + tmp.createNewFile(); + writer = new FileWriter(tmp); + + VelocityContext context = new VelocityContext(); + context.put("LAYERS", sb.toString()); + + Template mapTemplate = getMapfileTemplate(); + if (mapTemplate == null) { + logger.warn("No mapfile template found."); + return; + } + + mapTemplate.merge(context, writer); + + // we need to create a temporary mapfile first und rename it into + // real mapfile because we don't run into race conditions on this + // way. (iw) + tmp.renameTo(map); + } + catch (FileNotFoundException fnfe) { + logger.error(fnfe, fnfe); + } + catch (IOException ioe) { + logger.error(ioe, ioe); + } + catch (Exception e) { + logger.error(e, e); + } + finally { + try { + // close file writer + if (writer != null) { + writer.close(); + } + + // remove temporary mapfile if an error occured and it still + // exists + if (tmp.exists()) { + tmp.delete(); + } + } + catch (IOException ioe) { + logger.debug(ioe, ioe); + } + } + } +} +// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8: diff -r f99d8f92a640 -r 755dd2fa4a0a gnv-artifacts/src/main/java/de/intevation/gnv/utils/MetaWriter.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv-artifacts/src/main/java/de/intevation/gnv/utils/MetaWriter.java Fri Sep 28 12:13:53 2012 +0200 @@ -0,0 +1,276 @@ +package de.intevation.gnv.utils; + +import java.io.File; +import java.io.FileNotFoundException; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.OutputStream; + +import org.apache.log4j.Logger; +import org.w3c.dom.Document; +import org.w3c.dom.Element; + +import de.intevation.artifactdatabase.XMLUtils; +import de.intevation.artifacts.ArtifactNamespaceContext; +import de.intevation.artifacts.CallContext; +import de.intevation.gnv.artifacts.context.GNVArtifactContext; +import de.intevation.gnv.wms.LayerInfo; + +/** + * @author Ingo Weinzierl (ingo.weinzierl@intevation.de) + */ +public class MetaWriter { + + private static Logger logger = Logger.getLogger(MetaWriter.class); + + public static final String NODE_MAPSERVER = "mapserver"; + public static final String NODE_SERVER = "server"; + public static final String NODE_MAP = "map"; + + public static final String META_FILE_NAME = "meta.xml"; + public static final String ISOLINES_NAME = "isolines.shp"; + public static final String POLYGON_NAME = "polygons.shp"; + public static final String LAYER_DATA_NAME = "data.shp"; + + private MetaWriter() { + } + + public static Document writeLayerMeta(CallContext context, + String uuid, + String path, + String paramType, + String layerType){ + Document meta = XMLUtils.newDocument(); + XMLUtils.ElementCreator creator = new XMLUtils.ElementCreator( + meta, + ArtifactNamespaceContext.NAMESPACE_URI, + ArtifactNamespaceContext.NAMESPACE_PREFIX); + Element root = creator.create("meta"); + meta.appendChild(root); + + writeAbstractMeta(context, meta, root); + writeLayerMeta(context, meta, root, uuid, paramType,layerType); + boolean success = writeMetaFile(path, meta); + + if (success){ + return meta; + }else{ + return null; + } + } + + public static Document writeHorizontalcrosssectionMeta( + CallContext context, + String uuid, + String path, + String paramType) + { + Document meta = XMLUtils.newDocument(); + XMLUtils.ElementCreator creator = new XMLUtils.ElementCreator( + meta, + ArtifactNamespaceContext.NAMESPACE_URI, + ArtifactNamespaceContext.NAMESPACE_PREFIX); + + Element root = creator.create("meta"); + meta.appendChild(root); + + writeAbstractMeta(context, meta, root); + writePolygonMeta(context, meta, root, uuid, path, paramType); + writeIsolineMeta(context, meta, root, uuid, path, paramType); + + boolean success = writeMetaFile(path, meta); + + if (success){ + return meta; + }else{ + return null; + } + } + + /** + * @param path + * @param meta + */ + private static boolean writeMetaFile(String path, Document meta) { + try { + File metaFile = new File(path, META_FILE_NAME); + + if (!metaFile.createNewFile() || !metaFile.canWrite()) { + logger.error("Error while writing meta file: "+metaFile.toString()); + return false; + } + + OutputStream out = null; + boolean success = false; + try { + out = new FileOutputStream(metaFile); + success = XMLUtils.toStream(meta, out); + } + finally { + if (out != null) { + try { out.close(); } + catch (IOException ioe) {} + } + } + + if (!success && metaFile.exists()) { + metaFile.delete(); + } + + return success; + } + catch (FileNotFoundException fnfe) { + logger.error(fnfe); + return false; + } + catch (IOException ioe) { + logger.error(ioe, ioe); + return false; + } + } + + + public static void writeAbstractMeta( + CallContext callContext, + Document document, + Element meta + ) { + XMLUtils.ElementCreator creator = new XMLUtils.ElementCreator( + document, + ArtifactNamespaceContext.NAMESPACE_URI, + ArtifactNamespaceContext.NAMESPACE_PREFIX); + + GNVArtifactContext context = + (GNVArtifactContext) callContext.globalContext(); + + String server = (String) + context.get(GNVArtifactContext.MAPSERVER_SERVER_PATH_KEY); + + String map = (String) + context.get(GNVArtifactContext.MAPSERVER_MAP_PATH_KEY); + + logger.debug("MAPSERVER PATH: " + server); + logger.debug("MAP PATH: " + map); + + Element mapserver = creator.create(NODE_MAPSERVER); + Element serverPath = creator.create(NODE_SERVER); + Element mapPath = creator.create(NODE_MAP); + + mapPath.setTextContent(map); + serverPath.setTextContent(server); + + mapserver.appendChild(serverPath); + mapserver.appendChild(mapPath); + meta.appendChild(mapserver); + } + + protected static void writeLayerMeta( + CallContext context, + Document document, + Element meta, + String uuid, + String paramType, + String layerType + ) { + XMLUtils.ElementCreator creator = new XMLUtils.ElementCreator( + document, + ArtifactNamespaceContext.NAMESPACE_URI, + ArtifactNamespaceContext.NAMESPACE_PREFIX); + + Element layer = creator.create(LayerInfo.LAYER); + Element model = creator.create(LayerInfo.LAYER_MODEL); + Element name = creator.create(LayerInfo.LAYER_NAME); + Element type = creator.create(LayerInfo.LAYER_TYPE); + Element status = creator.create(LayerInfo.LAYER_STATUS); + Element data = creator.create(LayerInfo.LAYER_DATA); + + model.setTextContent(paramType); + name.setTextContent(uuid); + type.setTextContent(layerType); + status.setTextContent("OFF"); + data.setTextContent(LAYER_DATA_NAME); + + layer.appendChild(model); + layer.appendChild(name); + layer.appendChild(type); + layer.appendChild(status); + layer.appendChild(data); + + meta.appendChild(layer); + } + + + + + public static void writePolygonMeta( + CallContext context, + Document document, + Element meta, + String uuid, + String path, + String paramType + ) { + XMLUtils.ElementCreator creator = new XMLUtils.ElementCreator( + document, + ArtifactNamespaceContext.NAMESPACE_URI, + ArtifactNamespaceContext.NAMESPACE_PREFIX); + + Element layer = creator.create(LayerInfo.LAYER); + Element model = creator.create(LayerInfo.LAYER_MODEL); + Element name = creator.create(LayerInfo.LAYER_NAME); + Element type = creator.create(LayerInfo.LAYER_TYPE); + Element status = creator.create(LayerInfo.LAYER_STATUS); + Element data = creator.create(LayerInfo.LAYER_DATA); + + model.setTextContent(paramType); + name.setTextContent(uuid); + type.setTextContent("POLYGON"); + status.setTextContent("OFF"); + data.setTextContent(POLYGON_NAME); + + layer.appendChild(model); + layer.appendChild(name); + layer.appendChild(type); + layer.appendChild(status); + layer.appendChild(data); + + meta.appendChild(layer); + } + + + public static void writeIsolineMeta( + CallContext context, + Document document, + Element meta, + String uuid, + String path, + String paramType + ) { + XMLUtils.ElementCreator creator = new XMLUtils.ElementCreator( + document, + ArtifactNamespaceContext.NAMESPACE_URI, + ArtifactNamespaceContext.NAMESPACE_PREFIX); + + Element layer = creator.create(LayerInfo.LAYER); + Element model = creator.create(LayerInfo.LAYER_MODEL); + Element name = creator.create(LayerInfo.LAYER_NAME); + Element type = creator.create(LayerInfo.LAYER_TYPE); + Element status = creator.create(LayerInfo.LAYER_STATUS); + Element data = creator.create(LayerInfo.LAYER_DATA); + + model.setTextContent(paramType+"_isolines"); + name.setTextContent(uuid); + type.setTextContent("LINE"); + status.setTextContent("OFF"); + data.setTextContent(ISOLINES_NAME); + + layer.appendChild(model); + layer.appendChild(name); + layer.appendChild(type); + layer.appendChild(status); + layer.appendChild(data); + + meta.appendChild(layer); + } +} +// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 : diff -r f99d8f92a640 -r 755dd2fa4a0a gnv-artifacts/src/main/java/de/intevation/gnv/utils/Pair.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv-artifacts/src/main/java/de/intevation/gnv/utils/Pair.java Fri Sep 28 12:13:53 2012 +0200 @@ -0,0 +1,30 @@ +package de.intevation.gnv.utils; + +import java.io.Serializable; + +/** + * @author Sascha L. Teichmann (sascha.teichmann@intevation.de) + */ +public final class Pair +implements Serializable +{ + private A a; + private B b; + + private Pair() { + } + + public Pair(A a, B b) { + this.a = a; + this.b = b; + } + + public A getA() { + return a; + } + + public B getB() { + return b; + } +} +// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 : diff -r f99d8f92a640 -r 755dd2fa4a0a gnv-artifacts/src/main/java/de/intevation/gnv/utils/ShapeFileWriter.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv-artifacts/src/main/java/de/intevation/gnv/utils/ShapeFileWriter.java Fri Sep 28 12:13:53 2012 +0200 @@ -0,0 +1,393 @@ +package de.intevation.gnv.utils; + +import java.io.File; +import java.io.IOException; +import java.io.Serializable; +import java.net.MalformedURLException; +import java.util.Collection; +import java.util.Date; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import org.apache.log4j.Logger; +import org.geotools.data.DataStoreFactorySpi; +import org.geotools.data.DataUtilities; +import org.geotools.data.DefaultTransaction; +import org.geotools.data.FeatureStore; +import org.geotools.data.Transaction; +import org.geotools.data.shapefile.ShapefileDataStore; +import org.geotools.data.shapefile.ShapefileDataStoreFactory; +import org.geotools.feature.FeatureCollection; +import org.geotools.feature.FeatureCollections; +import org.geotools.feature.SchemaException; +import org.geotools.feature.simple.SimpleFeatureBuilder; +import org.geotools.referencing.crs.DefaultGeographicCRS; +import org.opengis.feature.simple.SimpleFeature; +import org.opengis.feature.simple.SimpleFeatureType; + +import com.vividsolutions.jts.geom.Geometry; +import com.vividsolutions.jts.geom.MultiLineString; +import com.vividsolutions.jts.geom.MultiPolygon; +import com.vividsolutions.jts.io.ParseException; +import com.vividsolutions.jts.io.WKTReader; + +import de.intevation.gnv.geobackend.base.Result; + +/** + * @author Sascha L. Teichmann (sascha.teichmann@intevation.de) + */ +public final class ShapeFileWriter +{ + private static Logger log = Logger.getLogger( + ShapeFileWriter.class); + + private ShapeFileWriter() { + } + + public static boolean writeMultiLineStringsToFile( + File shapeFile, + Integer parameterId, + Integer layer, + Date date, + List> multiLineStrings + ) { + return writeMultiLineStringsToFile( + shapeFile, + parameterId, + layer, + date, + multiLineStrings, + "isolines"); + } + + public static boolean writeMultiLineStringsToFile( + File shapeFile, + Integer parameterId, + Integer layer, + Date date, + List> multiLineStrings, + String name + ) { + Map params = new HashMap(); + + try { + params.put("url", shapeFile.toURI().toURL()); + } + catch (MalformedURLException mue) { + log.error(mue.getLocalizedMessage(), mue); + return false; + } + + params.put("create spatial index", Boolean.TRUE); + + + if (name == null) { + name = shapeFile.getName(); + } + + SimpleFeatureType TYPE; + + try { + TYPE = DataUtilities.createType( + name, + "geom:MultiLineString:srid=4326," + + "PARAMETER:Integer," + + "LAYER:Integer," + + "DATE:Date," + + "VALUE:Double"); + } + catch (SchemaException se) { + log.error(se.getLocalizedMessage(), se); + return false; + } + + SimpleFeatureBuilder featureBuilder = + new SimpleFeatureBuilder(TYPE); + + FeatureCollection collection = + FeatureCollections.newCollection(); + + for (Pair pair: multiLineStrings) { + featureBuilder.add(pair.getB()); + featureBuilder.add(parameterId); + featureBuilder.add(layer); + featureBuilder.add(date); + featureBuilder.add(pair.getA()); + SimpleFeature feature = featureBuilder.buildFeature(null); + collection.add(feature); + } + + DataStoreFactorySpi dataStoreFactory = new ShapefileDataStoreFactory(); + + Transaction transaction = null; + + boolean success = false; + try { + ShapefileDataStore newDataStore = + (ShapefileDataStore)dataStoreFactory.createNewDataStore(params); + + newDataStore.createSchema(TYPE); + newDataStore.forceSchemaCRS(DefaultGeographicCRS.WGS84); + + transaction = new DefaultTransaction("create"); + + String typeName = newDataStore.getTypeNames()[0]; + + FeatureStore featureStore = + (FeatureStore) + newDataStore.getFeatureSource(typeName); + + featureStore.setTransaction(transaction); + + featureStore.addFeatures(collection); + transaction.commit(); + success = true; + } + catch (IOException ioe) { + log.error(ioe.getLocalizedMessage(), ioe); + } + finally { + if (transaction != null) { + if (!success) { + try { transaction.rollback(); } + catch (IOException ioe) {} + } + try { transaction.close(); } + catch (IOException ioe) {} + } + } + + return success; + } + + public static boolean writeMultiPolygonsToFile( + File shapeFile, + Integer parameterId, + Integer layer, + Date date, + Map multiPolygons + ) { + return writeMultiPolygonsToFile( + shapeFile, + parameterId, + layer, + date, + multiPolygons, + "polygons"); + } + + + public static String writeDataToFile(File shapeFile, + String name, + Collection data){ + String geomType = null; + + WKTReader wktReader = new WKTReader(); + + Map params = new HashMap(); + + try { + params.put("url", shapeFile.toURI().toURL()); + } + catch (MalformedURLException mue) { + log.error(mue.getLocalizedMessage(), mue); + return null; + } + + params.put("create spatial index", Boolean.TRUE); + + + if (name == null) { + name = shapeFile.getName(); + } + + SimpleFeatureType type = null; + SimpleFeatureBuilder featureBuilder = null; + FeatureCollection collection = + FeatureCollections.newCollection(); + + for (Result result: data) { + try { + Geometry g = wktReader.read(result.getString(0)); + if (type == null){ + try { + geomType = g.getGeometryType().toUpperCase(); + type = DataUtilities.createType( + name, + "geom:"+g.getGeometryType()+":srid=4326"); + // TODO add other AttributeTypes + } + catch (SchemaException se) { + log.error(se.getLocalizedMessage(), se); + return null; + } + featureBuilder = new SimpleFeatureBuilder(type); + } + featureBuilder.add(g); + SimpleFeature feature = featureBuilder.buildFeature(null); + collection.add(feature); + } catch (ParseException e) { + log.error(e,e); + } catch (java.lang.IllegalArgumentException e){ + log.error("cannot create geometry for "+result.getString(0)); + } + } + + DataStoreFactorySpi dataStoreFactory = new ShapefileDataStoreFactory(); + + Transaction transaction = null; + + boolean success = false; + try { + ShapefileDataStore newDataStore = + (ShapefileDataStore)dataStoreFactory.createNewDataStore(params); + + newDataStore.createSchema(type); + newDataStore.forceSchemaCRS(DefaultGeographicCRS.WGS84); + + transaction = new DefaultTransaction("create"); + + String typeName = newDataStore.getTypeNames()[0]; + + FeatureStore featureStore = + (FeatureStore) + newDataStore.getFeatureSource(typeName); + + featureStore.setTransaction(transaction); + + featureStore.addFeatures(collection); + transaction.commit(); + success = true; + } + catch (IOException ioe) { + log.error(ioe.getLocalizedMessage(), ioe); + } + finally { + if (transaction != null) { + if (!success) { + try { transaction.rollback(); } + catch (IOException ioe) {} + } + try { transaction.close(); } + catch (IOException ioe) {} + } + } + + return geomType; + + } + + public static boolean writeMultiPolygonsToFile( + File shapeFile, + Integer parameterId, + Integer layer, + Date date, + Map multiPolygons, + String name + ) { + Map params = new HashMap(); + + try { + params.put("url", shapeFile.toURI().toURL()); + } + catch (MalformedURLException mue) { + log.error(mue.getLocalizedMessage(), mue); + return false; + } + + params.put("create spatial index", Boolean.TRUE); + + + if (name == null) { + name = shapeFile.getName(); + } + + SimpleFeatureType TYPE; + + try { + TYPE = DataUtilities.createType( + name, + "geom:MultiPolygon:srid=4326," + + "PARAMETER:Integer," + + "LAYER:Integer," + + "DATE:Date," + + "CLASS:Integer"); + } + catch (SchemaException se) { + log.error(se.getLocalizedMessage(), se); + return false; + } + + SimpleFeatureBuilder featureBuilder = + new SimpleFeatureBuilder(TYPE); + + FeatureCollection collection = + FeatureCollections.newCollection(); + + for (Map.Entry entry: + multiPolygons.entrySet() + ) { + featureBuilder.add(entry.getValue()); + featureBuilder.add(parameterId); + featureBuilder.add(layer); + featureBuilder.add(date); + featureBuilder.add(entry.getKey()); + SimpleFeature feature = featureBuilder.buildFeature(null); + collection.add(feature); + } + + DataStoreFactorySpi dataStoreFactory = new ShapefileDataStoreFactory(); + + Transaction transaction = null; + + boolean success = false; + try { + ShapefileDataStore newDataStore = + (ShapefileDataStore)dataStoreFactory.createNewDataStore(params); + + newDataStore.createSchema(TYPE); + newDataStore.forceSchemaCRS(DefaultGeographicCRS.WGS84); + + transaction = new DefaultTransaction("create"); + + String typeName = newDataStore.getTypeNames()[0]; + + FeatureStore featureStore = + (FeatureStore) + newDataStore.getFeatureSource(typeName); + + featureStore.setTransaction(transaction); + + featureStore.addFeatures(collection); + transaction.commit(); + success = true; + } + catch (IOException ioe) { + log.error(ioe.getLocalizedMessage(), ioe); + } + finally { + if (transaction != null) { + if (!success) { + try { transaction.rollback(); } + catch (IOException ioe) {} + } + try { transaction.close(); } + catch (IOException ioe) {} + } + } + + return success; + } + + private static final Double asDouble(Object a) { + if (a instanceof Double) { + return (Double)a; + } + if (a instanceof Number) { + return Double.valueOf(((Number)a).doubleValue()); + } + return 0d; + } +} +// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 : diff -r f99d8f92a640 -r 755dd2fa4a0a gnv-artifacts/src/main/java/de/intevation/gnv/utils/StringUtils.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv-artifacts/src/main/java/de/intevation/gnv/utils/StringUtils.java Fri Sep 28 12:13:53 2012 +0200 @@ -0,0 +1,45 @@ +package de.intevation.gnv.utils; + +/** + * @author Sascha L. Teichmann + */ +public final class StringUtils +{ + private StringUtils() { + } + + public static final String [] append(String [] haystack, String straw) { + if (haystack == null) { + return new String [] { straw }; + } + String [] nhaystack = new String[haystack.length + 1]; + System.arraycopy(haystack, 0, nhaystack, 0, haystack.length); + nhaystack[haystack.length] = straw; + return nhaystack; + } + + public static final boolean contains(String [] haystack, String needle) { + if (haystack == null) { + return false; + } + + if (needle == null) { + for (int i = haystack.length - 1; i >= 0; --i) { + if (haystack[i] == null) { + return true; + } + } + } + else { + for (int i = haystack.length - 1; i >= 0; --i) { + String straw = haystack[i]; + if (straw != null && straw.equals(needle)) { + return true; + } + } + } + + return false; + } +} +// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8: diff -r f99d8f92a640 -r 755dd2fa4a0a gnv-artifacts/src/main/java/de/intevation/gnv/utils/WKTUtils.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv-artifacts/src/main/java/de/intevation/gnv/utils/WKTUtils.java Fri Sep 28 12:13:53 2012 +0200 @@ -0,0 +1,422 @@ +package de.intevation.gnv.utils; + +import com.vividsolutions.jts.geom.Coordinate; +import com.vividsolutions.jts.geom.LineString; +import com.vividsolutions.jts.geom.Point; +import com.vividsolutions.jts.geom.Polygon; + +import com.vividsolutions.jts.io.ParseException; +import com.vividsolutions.jts.io.WKTReader; + +import de.intevation.gnv.artifacts.ressource.RessourceFactory; + +import de.intevation.gnv.geobackend.base.Result; + +import de.intevation.gnv.geobackend.base.query.QueryExecutor; +import de.intevation.gnv.geobackend.base.query.QueryExecutorFactory; + +import de.intevation.gnv.geobackend.base.query.exception.QueryException; + +import de.intevation.gnv.math.LinearFunction; + +import java.text.MessageFormat; +import java.text.NumberFormat; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; +import java.util.Locale; + +import org.apache.commons.math.FunctionEvaluationException; + +import org.apache.commons.math.optimization.OptimizationException; + +import org.apache.commons.math.optimization.fitting.CurveFitter; + +import org.apache.commons.math.optimization.general.GaussNewtonOptimizer; + +import org.apache.log4j.Logger; + +public abstract class WKTUtils { + + private static Logger log = Logger.getLogger(WKTUtils.class); + + public static final double NAUTICAL_MILE = 1852.216d; + public static final double KILOMETER = 1000d; + + public static final String I_NAME = "MEDIAN.MESHPOINT.IPOSITION"; + public static final String J_NAME = "MEDIAN.MESHPOINT.JPOSITION"; + + public static final String TRUE_EXPRESSION = "FEATUREID=FEATUREID"; + + public static final String[] COORDINATE_OUT_FORMAT = { + "coordinate.template.northeast", + "coordinate.template.southeast", + "coordinate.template.northwest", + "coordinate.template.southwest" + }; + + public static final String DEFAULT_COORDINATE_TEMPLATE = + "{0}\u00b0N {1}'' {2}\u00b0E {3}''"; + + public static boolean different(Result a, Result b, int [] indices) { + for (int i = 0; i < indices.length; ++i) { + String oa = a.getString(indices[i]); + String ob = b.getString(indices[i]); + + if (oa == null && ob == null) { + continue; + } + + if (oa == null || ob == null) { + return true; + } + + if (!oa.equals(ob)) { + return true; + } + } + return false; + } + + public static Coordinate toCoordinate(String shape) { + try { + return shape != null + ? ((Point)(new WKTReader().read(shape))).getCoordinate() + : null; + } + catch (ParseException pe) { + log.error(pe); + } + catch (ClassCastException cce) { + log.error("cannot read WKT point", cce); + } + return null; + } + + public static Polygon toPolygon(String shape) { + try { + return (Polygon)new WKTReader().read(shape); + } + catch (ParseException pe) { + log.error(pe); + } + catch (ClassCastException cce) { + log.error("cannot read WKT polygon", cce); + } + return null; + } + + public static final double toKM(double distance) { + return (distance * NAUTICAL_MILE) / KILOMETER; + } + + + public static String toWKT(Coordinate coordinate) { + StringBuilder sb = new StringBuilder("POINT("); + sb.append(coordinate.x) + .append(' ') + .append(coordinate.y) + .append(')'); + return sb.toString(); + } + + public static final String indexBox( + java.awt.Point a, + java.awt.Point b, + String iName, + String jName + ) { + int minI = Math.min(a.x, b.x) - 1; + int maxI = Math.max(a.x, b.x) + 1; + int minJ = Math.min(a.y, b.y) - 1; + int maxJ = Math.max(a.y, b.y) + 1; + StringBuilder sb = new StringBuilder("(") + .append(iName).append(" >= ").append(minI) + .append(" AND ").append(iName).append(" <= ").append(maxI) + .append(" AND ").append(jName).append(" >= ").append(minJ) + .append(" AND ").append(jName).append(" <= ").append(maxJ) + .append(')'); + return sb.toString(); + } + + public static final String diagonalBox(List points) { + + if (points.get(0) != null && points.get(2) != null) { + return indexBox( + points.get(0), points.get(2), + I_NAME, + J_NAME); + } + + if (points.get(1) != null && points.get(3) != null) { + return indexBox( + points.get(1), points.get(3), + I_NAME, + J_NAME); + } + + return null; + } + + public static String worldEnvelopeCoordinatesToIndex( + Coordinate [] coords, + String meshid, + String ijkQueryID + ) + throws QueryException + { + List points = + new ArrayList(coords.length); + + ArrayList missingPoints = + new ArrayList(); + + createIJKPoints(coords, meshid, ijkQueryID, points, missingPoints); + + String additionWhere = null; + + if (missingPoints.size() == coords.length) { + log.debug("cannot create index buffer"); + } + else { + additionWhere = diagonalBox(points); + + if (additionWhere == null) { + // 3 Points are missing or are on one side of the envelope + boolean remainsMissingPoints = calculateIJ4MissingPoints( + coords, points, missingPoints); + + if (!remainsMissingPoints) { + additionWhere = diagonalBox(points); + } + } + } + + return additionWhere != null + ? additionWhere + : TRUE_EXPRESSION; + } + + public static String worldCoordinatesToIndex( + Coordinate [] coords, + Collection result, + String meshid, + String ijkQueryID + ) + throws QueryException + { + List points = new ArrayList(coords.length); + + ArrayList missingPoints = new ArrayList(); + + createIJKPoints(coords, meshid, ijkQueryID, points, missingPoints); + + String additionWhere = TRUE_EXPRESSION; + + if (missingPoints.size() == coords.length) { + log.debug("cannot create index buffer"); + } + else { // generate index filter + boolean remainsMissingPoints = calculateIJ4MissingPoints( + coords, points, missingPoints); + + if (!remainsMissingPoints) { + // TODO: Make Tablenames and Columns Configurable + IndexBuffer ib = new IndexBuffer( + points, + I_NAME, + J_NAME ); + additionWhere = ib.toWhereClause(); + log.debug("Additional Where Clause = "+additionWhere); + } + } // if generate index filter + + return additionWhere; + } + + + /** + * @param coords + * @param points + * @param missingPoints + * @return + */ + private static boolean calculateIJ4MissingPoints( + Coordinate [] coords, + List points, + ArrayList missingPoints + ) { + boolean remainsMissingPoints = !missingPoints.isEmpty(); + + if (remainsMissingPoints) { + // try to guess the missing (i, j) + CurveFitter iFitter = new CurveFitter(new GaussNewtonOptimizer(true)); + CurveFitter jFitter = new CurveFitter(new GaussNewtonOptimizer(true)); + + for (int i = 0, N = points.size(); i < N; ++i) { + java.awt.Point p = (java.awt.Point)points.get(i); + if (p != null) { + Coordinate coord = coords[i]; + iFitter.addObservedPoint(coord.x, p.x); + jFitter.addObservedPoint(coord.y, p.y); + } + } + try { + // XXX: Assumption: (i, j) are created by componentwise linear function. + // This is surely not correct because (x, y) are in a ellipsoid projection. + // TODO: use ellipsoid functions and fit with Levenberg Marquardt. + double [] iParams = iFitter.fit( + LinearFunction.INSTANCE, new double [] { 1d, 1d }); + + double [] jParams = jFitter.fit( + LinearFunction.INSTANCE, new double [] { 1d, 1d }); + + for (int i = missingPoints.size()-1; i >= 0; --i) { + Object [] a = (Object [])missingPoints.get(i); + Coordinate coord = (Coordinate)a[1]; + int pi = (int)Math.round(iParams[0]*coord.x + iParams[1]); + int pj = (int)Math.round(jParams[0]*coord.y + jParams[1]); + points.set( + ((Integer)a[0]).intValue(), + new java.awt.Point(pi, pj)); + } + + remainsMissingPoints = false; // we filled the gaps + } + catch (FunctionEvaluationException fee) { + log.error(fee); + } + catch (OptimizationException oe) { + log.error(oe); + } + } + return remainsMissingPoints; + } + + + /** + * @param coords + * @param meshid + * @param ijkQueryID + * @param points + * @param missingPoints + * @throws QueryException + */ + private static void createIJKPoints( + Coordinate[] coords, + String meshid, + String ijkQueryID, + List points, + ArrayList missingPoints + ) + throws QueryException + { + boolean debug = log.isDebugEnabled(); + + QueryExecutor queryExecutor = QueryExecutorFactory + .getInstance() + .getQueryExecutor(); + + for (int i = 0; i < coords.length; i++) { + + String wkt = toWKT(coords[i]); + + Collection result = queryExecutor.executeQuery( + ijkQueryID, + new String [] {meshid, wkt}); + + if (!result.isEmpty()) { + Result resultValue = result.iterator().next(); + int iPos = resultValue.getInteger(1); + int jPos = resultValue.getInteger(0); + if (debug) { + log.debug("Found Pos "+iPos+"/"+jPos +" for "+wkt); + } + points.add(i, new java.awt.Point(iPos,jPos)); + } + else { + if (debug) { + log.debug("No i/j Pos found for "+wkt); + } + missingPoints.add(new Object [] { Integer.valueOf(i), coords[i] }); + points.add(i, null); + // Special Case no i,j found for Coordinate + } + } + } + + public static Coordinate [] toCoordinates(String wkt) { + try { + LineString ls = (LineString)new WKTReader().read(wkt); + return ls.getCoordinates(); + } + catch (ParseException pe) { + log.error("cannot read WKT line string", pe); + } + catch (ClassCastException cce) { + log.error("cannot read WKT line string", cce); + } + return null; + } + + public static String toText(String wkt) { + return toText(Locale.getDefault(), wkt); + } + + public static String toText(Locale locale, String wkt) { + String formattedCoordinate = null; + try { + Point p = (Point)new WKTReader().read(wkt); + double lat = p.getY(); + double lon =p.getX(); + + int choice = 0; + + if (lat <0 ) { + choice += 1; + lat=-lat; + } + + if (lon <0 ) { + choice += 2; + lon=-lon; + } + + RessourceFactory factory = RessourceFactory.getInstance(); + String template = factory.getRessource( + locale, + COORDINATE_OUT_FORMAT[choice], + DEFAULT_COORDINATE_TEMPLATE + ); + + NumberFormat minFormatter = NumberFormat.getInstance(locale); + minFormatter.setMaximumFractionDigits(3); + minFormatter.setMinimumFractionDigits(3); + + String minLat = minFormatter.format(60.*(lat-((int)lat))); + String minLon = minFormatter.format(60.*(lon-((int)lon))); + + NumberFormat degFormatter = NumberFormat.getInstance(locale); + degFormatter.setMinimumIntegerDigits(2); + + String formLat = degFormatter.format((int)lat); + String formLon = degFormatter.format((int)lon); + + MessageFormat formatter = new MessageFormat(template); + + Object[] args = { + formLat, minLat, + formLon, minLon + }; + + return formatter.format(args); + + } + catch (ParseException e) { + log.warn(e,e); + } + + return null; + } +} diff -r f99d8f92a640 -r 755dd2fa4a0a gnv-artifacts/src/main/java/de/intevation/gnv/utils/exception/ValidationException.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv-artifacts/src/main/java/de/intevation/gnv/utils/exception/ValidationException.java Fri Sep 28 12:13:53 2012 +0200 @@ -0,0 +1,48 @@ +/** + * + */ +package de.intevation.gnv.utils.exception; +/** + * @author Tim Englich + * + */ +public class ValidationException extends Exception { + + /** + * The Uid of this Class + */ + private static final long serialVersionUID = -6189218101861801079L; + + /** + * Constructor + */ + public ValidationException() { + super(); + } + + /** + * Constructor + * @param arg0 + */ + public ValidationException(String arg0) { + super(arg0); + } + + /** + * Constructor + * @param arg0 + */ + public ValidationException(Throwable arg0) { + super(arg0); + } + + /** + * Constructor + * @param arg0 + * @param arg1 + */ + public ValidationException(String arg0, Throwable arg1) { + super(arg0, arg1); + } + +} diff -r f99d8f92a640 -r 755dd2fa4a0a gnv-artifacts/src/main/java/de/intevation/gnv/wms/LayerInfo.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv-artifacts/src/main/java/de/intevation/gnv/wms/LayerInfo.java Fri Sep 28 12:13:53 2012 +0200 @@ -0,0 +1,79 @@ +package de.intevation.gnv.wms; + +/** + * @author Ingo Weinzierl (ingo.weinzierl@intevation.de) + */ +public class LayerInfo { + + public static final String LAYER = "layer"; + public static final String LAYER_MODEL = "model"; + public static final String LAYER_NAME = "name"; + public static final String LAYER_TYPE = "type"; + public static final String LAYER_DATA = "data"; + public static final String LAYER_STATUS = "status"; + + private String name; + private String type; + private String data; + private String status; + private String model; + + + public LayerInfo() { + } + + + public void setData(String data) { + this.data = data; + } + + public String getData() { + return data; + } + + public void setName(String name) { + this.name = name; + } + + public String getName() { + return name; + } + + public void setModel(String model) { + this.model = model; + } + + public String getModel() { + return model; + } + + public void setType(String type) { + this.type = type; + } + + public String getType() { + return type; + } + + public void setStatus(String status) { + this.status = status; + } + + public String getStatus() { + return status; + } + + public boolean isEmpty() { + if (name == null && data == null && type == null && status == null) + return true; + + return false; + } + + public boolean isBroken() { + if (name == null || data == null || type == null) + return true; + + return false; + } +} diff -r f99d8f92a640 -r 755dd2fa4a0a gnv-artifacts/src/main/resources/lang/artifactMessages.properties --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv-artifacts/src/main/resources/lang/artifactMessages.properties Fri Sep 28 12:13:53 2012 +0200 @@ -0,0 +1,71 @@ +fis_marnet = Marnet +fis_imis = IMIS +fis_staun = STAUN +fis_modeldata = Modeldata +fis_delphin = Delphin +fis_thermosalinograph = Thermosalinograph +fis_chemusurvey = Chemusurvey +fis_gts = GTS +fis_bsh_ctd = CTD +fis_bsh_xbt = XBT +fis_eisklimatologie = Eisklimatologie +fis_sst = SST +fis_seastate = Sea State +fis_seacat = SeaCat +fis_currentmeter = Current Meter +fis_icestations = Ice Station Report +fis_nauthis = Nauthis +fis_contis=Contis + +meshid= Mesh +fis = Data set +product= Product +timeSeries= Timeseries +verticalProfile = Verticalprofile +horizontalProfile = Horizontalprofile +horizontalProfileCross = Horizontales Schnittprofil +horizontalCrossSection = Horizontal cross-section +verticalcrosssection = Vertical cross-section +layer = Layer +featureid = Station +mesh_coordinate = Geographic position (e.g. 56n30 6e20) +mesh_linestring = Line (WKT) +mesh_polygon = Area (WKT) +mesh_point = Mesh Point +measurementid = Measurement depth/height [m] +depthrange = Measurementarea depth/height [m] +mindepthid = Deepest Layer +maxdepthid = Highest Layer +parameterid = Parameter +yearid = Year +layerid = Layer +timeinterval = Time period +minvalue = from +maxvalue = to +dateid = Measurement date +vehicleid = Ship +cruiseid = Cruise +trackid = Track +seriesid = Series +surveyid = Survey Info +axisid = Axis +depthid = Layer and Depth range [m] +iposition = West-East-Axis +jposition = North-South-Axis +instantaneouspoint_point = Momentanmesspunkt +areaid=Area +subareaid=Subarea +depth=depth +coordinate=coordinate +coordinate.template.northeast={0}\u00b0N {1}'' {2}\u00b0E {3}'' +coordinate.template.southeast={0}\u00b0S {1}'' {2}\u00b0E {3}'' +coordinate.template.northwest={0}\u00b0N {1}'' {2}\u00b0W {3}'' +coordinate.template.southwest={0}\u00b0S {1}'' {2}\u00b0W {3}'' + +chart.timeseries.date.format=yyyy-MMM-dd +chart.timeseries.title.xaxis=Time [UTC] +chart.verticalprofile.title.xaxis=Depth [m] +chart.verticalcrosssection.title.xaxis=Distance [km] +chart.verticalcrosssection.title.yaxis=Depth [m] +chart.horizontalprofile.title.xaxis=Distance [km] +chart.horizontalcrosssection.title.xaxis=Latitude [m] diff -r f99d8f92a640 -r 755dd2fa4a0a gnv-artifacts/src/main/resources/lang/artifactMessages_de.properties --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv-artifacts/src/main/resources/lang/artifactMessages_de.properties Fri Sep 28 12:13:53 2012 +0200 @@ -0,0 +1,71 @@ +fis_marnet = Marnet +fis_imis = IMIS +fis_staun = STAUN +fis_modeldata = Modelldaten +fis_delphin = Delphin +fis_thermosalinograph = Thermosalinograph +fis_chemusurvey = Chemusurvey +fis_gts = GTS +fis_bsh_ctd = CTD +fis_bsh_xbt = XBT +fis_eisklimatologie = Eisklimatologie +fis_sst = SST +fis_seastate = Seegangsarchiv +fis_seacat = SeaCat +fis_currentmeter = Strommesser +fis_icestations = Eismeldungen +fis_nauthis = Nauthis +fis_contis=Contis + +fis = Fachinformationssystem +product= Produkt +timeSeries= Zeitserie +verticalProfile = Vertikalprofil +horizontalProfile = Horizontalprofil +horizontalProfileCross = Horizontales Schnittprofil +horizontalCrossSection = Horizontalschnitt +verticalcrosssection = Profilschnitt +layer = Layer +featureid = Station +meshid= Datengitter +mesh_coordinate = Geographische Position (z.B. 56n30 6e20) +mesh_linestring = Linienzug als WKT +mesh_polygon = Fläche als WKT +mesh_point = Gitterzelle/Knotenpunkt +measurementid = Messung Tiefe/Höhe [m] +depthrange = Messbereich Tiefe/Höhe [m] +mindepthid = Untere Grenzschicht +maxdepthid = Obere Grenzschicht +parameterid = Parameter +yearid = Jahr +layerid = Layer +timeinterval = Zeitfenster +minvalue = von +maxvalue = bis +dateid = Zeitpunkt +vehicleid = Schiff +cruiseid = Reise +trackid = Track +seriesid = Mess-Serie +surveyid = Messabschnitt +axisid = Achse +depthid = Ebene und Tiefenbereich [m] +iposition = West-Ost-Achse +jposition = Nord-S\u00fcd-Achse +instantaneouspoint_point = Messpunkt +areaid=Gebiet +subareaid=Teilgebiet +depth=Tiefe +coordinate=Koordinate +coordinate.template.northeast={0}\u00b0N {1}'' {2}\u00b0O {3}'' +coordinate.template.southeast={0}\u00b0S {1}'' {2}\u00b0O {3}'' +coordinate.template.northwest={0}\u00b0N {1}'' {2}\u00b0W {3}'' +coordinate.template.southwest={0}\u00b0S {1}'' {2}\u00b0W {3}'' + +chart.timeseries.date.format=dd-MMM-yyyy +chart.timeseries.title.xaxis=Zeit [UTC] +chart.verticalprofile.title.xaxis=Tiefe [m] +chart.verticalcrosssection.title.xaxis=Distanz [km] +chart.verticalcrosssection.title.yaxis=Tiefe [m] +chart.horizontalprofile.title.xaxis=Distanz [km] +chart.horizontalcrosssection.title.xaxis=Ausdehnung [m] diff -r f99d8f92a640 -r 755dd2fa4a0a gnv-artifacts/src/main/resources/lang/artifactMessages_de_DE.properties --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv-artifacts/src/main/resources/lang/artifactMessages_de_DE.properties Fri Sep 28 12:13:53 2012 +0200 @@ -0,0 +1,71 @@ +fis_marnet = Marnet +fis_imis = IMIS +fis_staun = STAUN +fis_modeldata = Modelldaten +fis_delphin = Delphin +fis_thermosalinograph = Thermosalinograph +fis_chemusurvey = Chemusurvey +fis_gts = GTS +fis_bsh_ctd = CTD +fis_bsh_xbt = XBT +fis_eisklimatologie = Eisklimatologie +fis_sst = SST +fis_seastate = Seegangsarchiv +fis_seacat = SeaCat +fis_currentmeter = Strommesser +fis_icestations = Eismeldungen +fis_nauthis = Nauthis +fis_contis=Contis + +fis= Fachinformationssystem +product= Produkt +timeSeries= Zeitserie +verticalProfile = Vertikalprofil +horizontalProfile = Horizontalprofil +horizontalProfileCross = Horizontales Schnittprofil +horizontalCrossSection = Horizontalschnitt +verticalcrosssection = Profilschnitt +layer = Layer +featureid = Station +meshid= Datengitter +mesh_coordinate = Geographische Position (z.B. 56n30 6e20) +mesh_linestring = Linienzug als WKT +mesh_polygon = Fläche als WKT +mesh_point = Gitterzelle/Knotenpunkt +measurementid = Messung Tiefe/Höhe [m] +depthrange = Messbereich Tiefe/Höhe [m] +mindepthid = Untere Grenzschicht +maxdepthid = Obere Grenzschicht +parameterid = Parameter +yearid = Jahr +layerid = Layer +timeinterval = Zeitfenster +minvalue = von +maxvalue = bis +dateid = Zeitpunkt +vehicleid = Schiff +cruiseid = Reise +trackid = Track +seriesid = Mess-Serie +surveyid = Messabschnitt +axisid = Achse +depthid = Ebene und Tiefenbereich [m] +iposition = West-Ost-Achse +jposition = Nord-S\u00fcd-Achse +instantaneouspoint_point = Messpunkt +areaid=Gebiet +subareaid=Teilgebiet +depth=Tiefe +coordinate=Koordinate +coordinate.template.northeast={0}\u00b0N {1}'' {2}\u00b0O {3}'' +coordinate.template.southeast={0}\u00b0S {1}'' {2}\u00b0O {3}'' +coordinate.template.northwest={0}\u00b0N {1}'' {2}\u00b0W {3}'' +coordinate.template.southwest={0}\u00b0S {1}'' {2}\u00b0W {3}'' + +chart.timeseries.date.format=dd-MMM-yyyy +chart.timeseries.title.xaxis=Zeit [UTC] +chart.verticalprofile.title.xaxis=Tiefe [m] +chart.verticalcrosssection.title.xaxis=Distanz [km] +chart.verticalcrosssection.title.yaxis=Tiefe [m] +chart.horizontalprofile.title.xaxis=Distanz [km] +chart.horizontalcrosssection.title.xaxis=Ausdehnung [m] diff -r f99d8f92a640 -r 755dd2fa4a0a gnv-artifacts/src/main/resources/lang/artifactMessages_en.properties --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv-artifacts/src/main/resources/lang/artifactMessages_en.properties Fri Sep 28 12:13:53 2012 +0200 @@ -0,0 +1,72 @@ +fis_marnet = Marnet +fis_imis = IMIS +fis_staun = STAUN +fis_modeldata = Modeldata +fis_delphin = Delphin +fis_thermosalinograph = Thermosalinograph +fis_chemusurvey = Chemusurvey +fis_gts = GTS +fis_bsh_ctd = CTD +fis_bsh_xbt = XBT +fis_eisklimatologie = Iceclimatology +fis_sst = SST +fis_seastate = Sea State +fis_seacat = SeaCat +fis_currentmeter = Current Meter +fis_icestations = Ice Station Report +fis_nauthis = Nauthis +fis_contis=Contis + +meshid= Mesh +fis = Data set +product= Product +timeSeries= Timeseries +verticalProfile = Verticalprofile +horizontalProfile = Horizontalprofile +horizontalProfileCross = Horizontales Schnittprofil +horizontalCrossSection = Horizontal cross-section +verticalcrosssection = Vertical cross-section +layer = Layer +featureid = Station +mesh_coordinate = Geographic position (e.g. 56n30 6e20) +mesh_linestring = Line (WKT) +mesh_polygon = Area (WKT) +mesh_point = Mesh Point +measurementid = Measurement depth/height [m] +depthrange = Measurementarea depth/height [m] +mindepthid = Deepest Layer +maxdepthid = Highest Layer +parameterid = Parameter +yearid = Year +layerid = Layer +timeinterval = Time period +minvalue = from +maxvalue = to +dateid = Measurement date +vehicleid = Ship +cruiseid = Cruise +trackid = Track +seriesid = Series +surveyid = Survey Info +axisid = Axis +depthid = Layer and Depth range [m] +iposition = West-East-Axis +jposition = North-South-Axis +instantaneouspoint_point = Instantaneouspoint +areaid=Area +subareaid=Subarea +depth=depth +coordinate=coordinate +coordinate.template.northeast={0}\u00b0N {1}'' {2}\u00b0E {3}'' +coordinate.template.southeast={0}\u00b0S {1}'' {2}\u00b0E {3}'' +coordinate.template.northwest={0}\u00b0N {1}'' {2}\u00b0W {3}'' +coordinate.template.southwest={0}\u00b0S {1}'' {2}\u00b0W {3}'' + + +chart.timeseries.date.format=yyyy-MMM-dd +chart.timeseries.title.xaxis=Time [UTC] +chart.verticalprofile.title.xaxis=Depth [m] +chart.verticalcrosssection.title.xaxis=Distance [km] +chart.verticalcrosssection.title.yaxis=Depth [m] +chart.horizontalprofile.title.xaxis=Distance [km] +chart.horizontalcrosssection.title.xaxis=Latitude [m] diff -r f99d8f92a640 -r 755dd2fa4a0a gnv-artifacts/src/main/resources/lang/lang.conf --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv-artifacts/src/main/resources/lang/lang.conf Fri Sep 28 12:13:53 2012 +0200 @@ -0,0 +1,3 @@ +de_DE +de +en diff -r f99d8f92a640 -r 755dd2fa4a0a gnv-artifacts/src/test/java/de/intevation/gnv/artifacts/GNVArtifactsTestCaseBase.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv-artifacts/src/test/java/de/intevation/gnv/artifacts/GNVArtifactsTestCaseBase.java Fri Sep 28 12:13:53 2012 +0200 @@ -0,0 +1,191 @@ +/** + * + */ +package de.intevation.gnv.artifacts; + +import java.io.ByteArrayInputStream; +import java.io.File; +import java.io.FileNotFoundException; +import java.io.FileOutputStream; +import java.io.IOException; + +import javax.xml.parsers.DocumentBuilder; +import javax.xml.parsers.DocumentBuilderFactory; +import javax.xml.parsers.ParserConfigurationException; + +import junit.framework.TestCase; + +import org.apache.log4j.BasicConfigurator; +import org.apache.log4j.Logger; +import org.w3c.dom.Document; +import org.xml.sax.SAXException; + +import de.intevation.artifactdatabase.Config; +import de.intevation.artifactdatabase.DefaultCallMeta; +import de.intevation.artifactdatabase.DefaultPreferredLocale; +import de.intevation.artifactdatabase.FactoryBootstrap; +import de.intevation.artifacts.Artifact; +import de.intevation.artifacts.ArtifactFactory; +import de.intevation.artifacts.CallContext; +import de.intevation.artifacts.CallMeta; +import de.intevation.artifacts.PreferredLocale; +import de.intevation.gnv.utils.ArtifactXMLUtilities; + +/** + * @author Tim Englich + * + */ +public abstract class GNVArtifactsTestCaseBase extends TestCase { + + /** + * the logger, used to log exceptions and additonaly information + */ + private static Logger log = null; + + static { + BasicConfigurator.configure(); + log = Logger.getLogger(GNVArtifactsTestCaseBase.class); + } + + private String configurationDir = "doc/conf"; + + protected FactoryBootstrap bootstrap = null; + + /** + * Constructor + */ + public GNVArtifactsTestCaseBase() { + } + + /** + * Constructor + * @param name + */ + public GNVArtifactsTestCaseBase(String name) { + super(name); + } + + public abstract void testArtifact(); + /** + * @see junit.framework.TestCase#setUp() + */ + protected void setUp() throws Exception { + log.debug("GNVArtifactsTestCase.setUp"); + super.setUp(); + log.info(Config.CONFIG_DIR + " ==> " + configurationDir); + System.setProperty(Config.CONFIG_DIR, configurationDir); + log.info("Bootstrap wird initialisiert."); + bootstrap = new FactoryBootstrap(); + bootstrap.boot(); + } + + protected void writeDocument2Log(Document document) { + log.debug(new ArtifactXMLUtilities().writeDocument2String(document)); + } + + protected Document readDocument(String fileName) { + Document returnValue = null; + try { + DocumentBuilderFactory docBuilderFactory = DocumentBuilderFactory + .newInstance(); + docBuilderFactory.setNamespaceAware(true); + DocumentBuilder docBuilder = docBuilderFactory.newDocumentBuilder(); + returnValue = docBuilder.parse(new File(fileName)); + } catch (ParserConfigurationException e) { + log.error(e, e); + } catch (SAXException e) { + log.error(e, e); + } catch (IOException e) { + log.error(e, e); + } + return returnValue; + } + + protected void check4ExceptionReport(Document document) throws Exception { + document = new ArtifactXMLUtilities().reInitDocument(document); + String message = Config.getStringXPath(document, + "/exceptionreport/exception"); + if (message != null) { + throw new Exception(message); + } + } + + /** + * @return + */ + protected CallContext createCallContext(ArtifactFactory artifactFactory) { + CallMeta callMeta = new DefaultCallMeta( + new PreferredLocale[] { new DefaultPreferredLocale("de_DE", + 1.0f) }); + CallContext cc = new TestCallContext(bootstrap.getContext(), callMeta,artifactFactory); + return cc; + } + + /** + * @param artifact + * @param cc + * @param describeDocument TODO + * @throws Exception + */ + protected void doNextStep(Artifact artifact, CallContext cc, + String feedDocument, String advanceDocument, Document describeDocument) + throws Exception { + Document outputData = artifact.describe(describeDocument,cc); +// this.writeDocument2Log(outputData); + outputData = artifact.feed(this.readDocument(feedDocument), cc); + this.check4ExceptionReport(outputData); + outputData = artifact.advance(this.readDocument(advanceDocument), cc); +// this.writeDocument2Log(outputData); + this.check4ExceptionReport(outputData); + + } + + protected void createFile(byte[] content, String fileName) { + try { + FileOutputStream fos = new FileOutputStream(new File(fileName)); + ByteArrayInputStream bis = new ByteArrayInputStream(content); + byte[] buf = new byte[4096]; + while (bis.read(buf) > 0) { + fos.write(buf); + } + fos.flush(); + fos.close(); + } catch (FileNotFoundException e) { + log.error(e, e); + } catch (IOException e) { + log.error(e, e); + } + } + + /** + * @param artefactName + */ + protected ArtifactFactory getArtifactFactory(String artefactName) { + log.debug("GNVArtifactsTestCase.getArtifactFactory"); + ArtifactFactory[] artifactFactories = bootstrap.getArtifactFactories(); + for (int i = 0; i < artifactFactories.length; i++) { + if (artifactFactories[i].getName().equals(artefactName)) { + log.debug("ArtifactFactory wurde gefunden."); + return artifactFactories[i]; + } + } + return null; + } + + /** + * @param artifactFactory + * @return + */ + protected Artifact createArtifact(ArtifactFactory artifactFactory) { + Document setupData = null; + Artifact artifact = artifactFactory.createArtifact( + "" + System.currentTimeMillis(), + bootstrap.getContext(), + setupData); + assertNotNull(artifact); + log.debug("Artifact is available"); + return artifact; + } + + +} diff -r f99d8f92a640 -r 755dd2fa4a0a gnv-artifacts/src/test/java/de/intevation/gnv/artifacts/GNVArtifactsTestSuite.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv-artifacts/src/test/java/de/intevation/gnv/artifacts/GNVArtifactsTestSuite.java Fri Sep 28 12:13:53 2012 +0200 @@ -0,0 +1,22 @@ +package de.intevation.gnv.artifacts; + +import junit.framework.Test; +import junit.framework.TestSuite; + +public class GNVArtifactsTestSuite { + + public static Test suite() { + TestSuite suite = new TestSuite("Test for de.intevation.gnv.artifacts"); + suite.addTestSuite(TimeSeriesPointTimeSeriesTestCase.class); + suite.addTestSuite(MeshVerticalProfileTestCase.class); + suite.addTestSuite(MeshHorizontalProfileTestCase.class); + suite.addTestSuite(MeshHorizontalCrossSectionTestCase.class); + suite.addTestSuite(MeshTimeSeriesTestCase.class); + suite.addTestSuite(TimeSeriesPointVerticalProfileTestCase.class); + suite.addTestSuite(MeshVerticalCrossSectionTestCase.class); + suite.addTestSuite(InstantaneousPointHorizontalProfileTestCase.class); + suite.addTestSuite(InstantaneousPointVerticalProfileTestCase.class); + return suite; + } + +} diff -r f99d8f92a640 -r 755dd2fa4a0a gnv-artifacts/src/test/java/de/intevation/gnv/artifacts/InstantaneousPointHorizontalProfileTestCase.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv-artifacts/src/test/java/de/intevation/gnv/artifacts/InstantaneousPointHorizontalProfileTestCase.java Fri Sep 28 12:13:53 2012 +0200 @@ -0,0 +1,126 @@ +/** + * + */ +package de.intevation.gnv.artifacts; + +import java.io.FileOutputStream; + +import org.apache.log4j.Logger; +import org.w3c.dom.Document; + +import de.intevation.artifacts.Artifact; +import de.intevation.artifacts.ArtifactFactory; +import de.intevation.artifacts.CallContext; + +/** + * @author Tim Englich + * + */ +public class InstantaneousPointHorizontalProfileTestCase extends + GNVArtifactsTestCaseBase { + + private static Logger log = Logger.getLogger(InstantaneousPointHorizontalProfileTestCase.class); + + /** + * Constructor + */ + public InstantaneousPointHorizontalProfileTestCase() { + } + + /** + * Constructor + * @param name + */ + public InstantaneousPointHorizontalProfileTestCase(String name) { + super(name); + } + + /** + * @see de.intevation.gnv.artifacts.GNVArtifactsTestCaseBase#testArtifact() + */ + @Override + public void testArtifact() { + try { + log.debug("GNVArtifactsTestCase." + + "testHorizontalProfileInstantaneousPointArtifact"); + String artefactName = "fis_delphin"; + ArtifactFactory artifactFactory = this + .getArtifactFactory(artefactName); + assertNotNull(artifactFactory); + log.debug("VerticalProfile-ArtifactFactory is available"); + + Artifact artifact = createArtifact(artifactFactory); + + CallContext cc = createCallContext(artifactFactory); + Document describeDocument = this.readDocument("src/test/ressources/horizontalProfile_instantaneouspoint/horizontalprofile_describe.xml"); + + int steps = 9; + + for (int i = 0; i < steps; i++){ + + this.doNextStep( + artifact, + cc, + "src/test/ressources/horizontalProfile_instantaneouspoint/" + + "horizontalprofile_step_0"+i+"_feed.xml", + "src/test/ressources/horizontalProfile_instantaneouspoint/" + + "horizontalprofile_step_0"+i+"_advance.xml", + describeDocument); + } + + Document outputData = artifact.describe(describeDocument, cc); + FileOutputStream fos = null; + FileOutputStream fos2 = null; + FileOutputStream fos3 = null; + FileOutputStream fos4 = null; + try { + fos = new FileOutputStream( + "src/test/results/horizontalprofile_instantaneouspoint" + + System.currentTimeMillis() + ".png"); + fos2 = new FileOutputStream( + "src/test/results/horizontalprofile_instantaneouspoint" + + System.currentTimeMillis() + ".xml"); + fos3 = new FileOutputStream( + "src/test/results/horizontalprofile_instantaneouspoint" + + System.currentTimeMillis() + ".csv"); + fos4 = new FileOutputStream( + "src/test/results/horizontalprofile_instantaneouspoint" + + System.currentTimeMillis() + ".odv"); + artifact.out(this.readDocument("src/test/ressources/" + + "horizontalProfile_instantaneouspoint/" + + "horizontalprofile_step_08_out_statistics.xml"), + fos2,cc); + artifact.out(this.readDocument("src/test/ressources/" + + "horizontalProfile_instantaneouspoint/" + + "horizontalprofile_step_08_out_chart.xml"), + fos,cc); + artifact.out(this.readDocument("src/test/ressources/" + + "horizontalProfile_instantaneouspoint/" + + "horizontalprofile_step_08_out_csv.xml"), + fos3,cc); + artifact.out(this.readDocument("src/test/ressources/" + + "horizontalProfile_instantaneouspoint/" + + "horizontalprofile_step_08_out_odv.xml"), + fos4,cc); + } catch (Exception e) { + log.error(e, e); + fail(); + } finally { + try { + fos.flush(); + fos.close(); + fos2.flush(); + fos2.close(); + fos3.flush(); + fos3.close(); + } catch (Exception e) { + log.error(e, e); + } + } + } catch (Exception e) { + log.error(e, e); + fail(); + } + } + +} diff -r f99d8f92a640 -r 755dd2fa4a0a gnv-artifacts/src/test/java/de/intevation/gnv/artifacts/InstantaneousPointVerticalProfileTestCase.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv-artifacts/src/test/java/de/intevation/gnv/artifacts/InstantaneousPointVerticalProfileTestCase.java Fri Sep 28 12:13:53 2012 +0200 @@ -0,0 +1,125 @@ +/** + * + */ +package de.intevation.gnv.artifacts; + +import java.io.FileOutputStream; + +import org.apache.log4j.Logger; +import org.w3c.dom.Document; + +import de.intevation.artifacts.Artifact; +import de.intevation.artifacts.ArtifactFactory; +import de.intevation.artifacts.CallContext; + +/** + * @author Tim Englich + * + */ +public class InstantaneousPointVerticalProfileTestCase extends + GNVArtifactsTestCaseBase { + + private static Logger log = Logger.getLogger(InstantaneousPointVerticalProfileTestCase.class); + + /** + * Constructor + */ + public InstantaneousPointVerticalProfileTestCase() { + } + + /** + * Constructor + * @param name + */ + public InstantaneousPointVerticalProfileTestCase(String name) { + super(name); + } + + /** + * @see de.intevation.gnv.artifacts.GNVArtifactsTestCaseBase#testArtifact() + */ + @Override + public void testArtifact() { + try { + log.debug("GNVArtifactsTestCase.testVerticalProfileArtifact"); + String artefactName = "fis_bsh_ctd"; + ArtifactFactory artifactFactory = this + .getArtifactFactory(artefactName); + assertNotNull(artifactFactory); + log.debug("VerticalProfile-ArtifactFactory is available"); + + Artifact artifact = createArtifact(artifactFactory); + + CallContext cc = createCallContext(artifactFactory); + Document describeDocument = this.readDocument("src/test/ressources/verticalprofile_instantaneouspoint/verticalprofile_describe.xml"); + + int steps = 5; + + for (int i = 1; i <= steps; i++){ + this.doNextStep( + artifact, + cc, + "src/test/ressources/verticalprofile_instantaneouspoint/" + + "verticalprofile_step_0"+i+"_feed.xml", + "src/test/ressources/verticalprofile_instantaneouspoint/" + + "verticalprofile_step_0"+i+"_advance.xml", + describeDocument); + } + + // Vierter Schritt + Document outputData = artifact.describe(describeDocument,cc); + FileOutputStream fos = null; + FileOutputStream fos2 = null; + FileOutputStream fos3 = null; + FileOutputStream fos4 = null; + try { + fos = new FileOutputStream( + "src/test/results/verticalprofile_instantaneouspoint" + + System.currentTimeMillis() + ".png"); + fos2 = new FileOutputStream( + "src/test/results/verticalprofile_instantaneouspoint" + + System.currentTimeMillis() + ".xml"); + fos3 = new FileOutputStream( + "src/test/results/verticalprofile_instantaneouspoint" + + System.currentTimeMillis() + ".csv"); + fos4 = new FileOutputStream( + "src/test/results/verticalprofile_instantaneouspoint" + + System.currentTimeMillis() + ".odv"); + artifact.out(this.readDocument("src/test/ressources/" + + "verticalprofile_instantaneouspoint/" + + "verticalprofile_step_05_out_statistics.xml"), + fos2, cc); + artifact.out(this.readDocument("src/test/ressources/" + + "verticalprofile_instantaneouspoint/" + + "verticalprofile_step_05_out_chart.xml"), + fos, cc); + artifact.out(this.readDocument("src/test/ressources/" + + "verticalprofile_instantaneouspoint/" + + "verticalprofile_step_05_out_csv.xml"), + fos3, cc); + artifact.out(this.readDocument("src/test/ressources/" + + "verticalprofile_instantaneouspoint/" + + "verticalprofile_step_05_out_odv.xml"), + fos4, cc); + } catch (Exception e) { + log.error(e, e); + fail(); + } finally { + try { + fos.flush(); + fos.close(); + fos2.flush(); + fos2.close(); + fos3.flush(); + fos3.close(); + } catch (Exception e) { + log.error(e, e); + } + } + } catch (Exception e) { + log.error(e, e); + fail(); + } + } + +} diff -r f99d8f92a640 -r 755dd2fa4a0a gnv-artifacts/src/test/java/de/intevation/gnv/artifacts/MeshHorizontalCrossSectionTestCase.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv-artifacts/src/test/java/de/intevation/gnv/artifacts/MeshHorizontalCrossSectionTestCase.java Fri Sep 28 12:13:53 2012 +0200 @@ -0,0 +1,105 @@ +/** + * + */ +package de.intevation.gnv.artifacts; + +import java.io.FileOutputStream; + +import org.apache.log4j.Logger; +import org.w3c.dom.Document; + +import de.intevation.artifacts.Artifact; +import de.intevation.artifacts.ArtifactFactory; +import de.intevation.artifacts.CallContext; + +/** + * @author Tim Englich + * + */ +public class MeshHorizontalCrossSectionTestCase extends + GNVArtifactsTestCaseBase { + + private static Logger log = Logger.getLogger(MeshHorizontalCrossSectionTestCase.class); + + /** + * Constructor + */ + public MeshHorizontalCrossSectionTestCase() { + } + + /** + * Constructor + * @param name + */ + public MeshHorizontalCrossSectionTestCase(String name) { + super(name); + } + + /** + * @see de.intevation.gnv.artifacts.GNVArtifactsTestCaseBase#testArtifact() + */ + @Override + public void testArtifact() { + try { + log.debug("GNVArtifactsTestCase.testHorizontalCrossSectionMeshArtifact"); + String artefactName = "fis_modeldata"; + ArtifactFactory artifactFactory = this + .getArtifactFactory(artefactName); + assertNotNull(artifactFactory); + log.debug("HorizontalCrossSectionMesh-ArtifactFactory is available"); + + Artifact artifact = createArtifact(artifactFactory); + + CallContext cc = createCallContext(artifactFactory); + Document describeDocument = this.readDocument("src/test/ressources/horizontalcrosssection_mesh/horizontalcrosssection_describe.xml"); + int steps = 8; + + for (int i = 1; i <= steps; i++){ + this.doNextStep( + artifact, + cc, + "src/test/ressources/horizontalcrosssection_mesh/" + + "horizontalcrosssection_step_0"+i+"_feed.xml", + "src/test/ressources/horizontalcrosssection_mesh/" + + "horizontalcrosssection_step_0"+i+"_advance.xml", + describeDocument); + } + + Document outputData = artifact.describe(describeDocument,cc); + FileOutputStream fos = null; + FileOutputStream fos2 = null; + try { + fos = new FileOutputStream( + "src/test/results/horizontalcrosssection_mesh" + + System.currentTimeMillis() + ".zip"); + fos2 = new FileOutputStream( + "src/test/results/horizontalcrosssection_mesh" + + System.currentTimeMillis() + ".txt"); + artifact.out(this.readDocument("src/test/ressources/" + + "horizontalcrosssection_mesh/" + + "horizontalcrosssection_step_0"+steps+"_out_zip.xml"), + fos, cc); + artifact.out(this.readDocument("src/test/ressources/" + + "horizontalcrosssection_mesh/" + + "horizontalcrosssection_step_0"+steps+"_out_wms.xml"), + fos2,cc); + } catch (Exception e) { + log.error(e, e); + fail(); + } finally { + try { + fos.flush(); + fos.close(); + fos2.flush(); + fos2.close(); + } catch (Exception e) { + log.error(e, e); + } + } + } catch (Exception e) { + log.error(e, e); + fail(); + } + } + +} diff -r f99d8f92a640 -r 755dd2fa4a0a gnv-artifacts/src/test/java/de/intevation/gnv/artifacts/MeshHorizontalProfileTestCase.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv-artifacts/src/test/java/de/intevation/gnv/artifacts/MeshHorizontalProfileTestCase.java Fri Sep 28 12:13:53 2012 +0200 @@ -0,0 +1,130 @@ +/** + * + */ +package de.intevation.gnv.artifacts; + +import java.io.FileOutputStream; + +import org.apache.log4j.Logger; +import org.w3c.dom.Document; + +import de.intevation.artifacts.Artifact; +import de.intevation.artifacts.ArtifactFactory; +import de.intevation.artifacts.CallContext; + +/** + * @author Tim Englich + * + */ +public class MeshHorizontalProfileTestCase extends GNVArtifactsTestCaseBase { + + private static Logger log = Logger.getLogger(MeshHorizontalProfileTestCase.class); + + /** + * Constructor + */ + public MeshHorizontalProfileTestCase() { + } + + /** + * Constructor + * @param name + */ + public MeshHorizontalProfileTestCase(String name) { + super(name); + } + + /** + * @see de.intevation.gnv.artifacts.GNVArtifactsTestCaseBase#testArtifact() + */ + @Override + public void testArtifact() { + try { + log.debug("GNVArtifactsTestCase." + + "testHorizontalProfileInstantaneousPointArtifact"); + String artefactName = "fis_modeldata"; + ArtifactFactory artifactFactory = this + .getArtifactFactory(artefactName); + assertNotNull(artifactFactory); + log.debug("VerticalProfile-ArtifactFactory is available"); + + Artifact artifact = createArtifact(artifactFactory); + + CallContext cc = createCallContext(artifactFactory); + Document describeDocument = this.readDocument("src/test/ressources/horizontalProfile_mesh/horizontalprofile_describe.xml"); + + int steps = 11; + + for (int i = 1; i <= steps; i++){ + String number = ""+i; + if (i < 10){ + number = "0"+number; + } + this.doNextStep( + artifact, + cc, + "src/test/ressources/horizontalProfile_mesh/" + + "horizontalprofile_step_"+number+"_feed.xml", + "src/test/ressources/horizontalProfile_mesh/" + + "horizontalprofile_step_"+number+"_advance.xml", + describeDocument); + } + + Document outputData = artifact.describe(describeDocument,cc); + FileOutputStream fos = null; + FileOutputStream fos2 = null; + FileOutputStream fos3 = null; + FileOutputStream fos4 = null; + try { + fos = new FileOutputStream( + "src/test/results/horizontalProfile_mesh" + + System.currentTimeMillis() + ".png"); + fos2 = new FileOutputStream( + "src/test/results/horizontalProfile_mesh" + + System.currentTimeMillis() + ".xml"); + fos3 = new FileOutputStream( + "src/test/results/horizontalProfile_mesh" + + System.currentTimeMillis() + ".csv"); + fos4 = new FileOutputStream( + "src/test/results/horizontalProfile_mesh" + + System.currentTimeMillis() + ".odv"); + artifact.out(this.readDocument("src/test/ressources/" + + "horizontalProfile_mesh/" + + "horizontalprofile_step_"+steps+"_out_statistics.xml"), + fos2, cc); + artifact.out(this.readDocument("src/test/ressources/" + + "horizontalProfile_mesh/" + + "horizontalprofile_step_"+steps+"_out_chart.xml"), + fos, cc); + artifact.out(this.readDocument("src/test/ressources/" + + "horizontalProfile_mesh/" + + "horizontalprofile_step_"+steps+"_out_csv.xml"), + fos3, cc); + artifact.out(this.readDocument("src/test/ressources/" + + "horizontalProfile_mesh/" + + "horizontalprofile_step_"+steps+"_out_odv.xml"), + fos4, cc); + } catch (Exception e) { + log.error(e, e); + fail(); + } finally { + try { + fos.flush(); + fos.close(); + fos2.flush(); + fos2.close(); + fos3.flush(); + fos3.close(); + fos4.flush(); + fos4.close(); + } catch (Exception e) { + log.error(e, e); + } + } + } catch (Exception e) { + log.error(e, e); + fail(); + } + } + +} diff -r f99d8f92a640 -r 755dd2fa4a0a gnv-artifacts/src/test/java/de/intevation/gnv/artifacts/MeshTimeSeriesTestCase.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv-artifacts/src/test/java/de/intevation/gnv/artifacts/MeshTimeSeriesTestCase.java Fri Sep 28 12:13:53 2012 +0200 @@ -0,0 +1,128 @@ +/** + * + */ +package de.intevation.gnv.artifacts; + +import java.io.FileOutputStream; + +import org.apache.log4j.Logger; +import org.w3c.dom.Document; + +import de.intevation.artifacts.Artifact; +import de.intevation.artifacts.ArtifactFactory; +import de.intevation.artifacts.CallContext; + +/** + * @author Tim Englich + * + */ +public class MeshTimeSeriesTestCase extends GNVArtifactsTestCaseBase { + + private static Logger log = Logger.getLogger(MeshTimeSeriesTestCase.class); + + /** + * Constructor + */ + public MeshTimeSeriesTestCase() { + } + + /** + * Constructor + * @param name + */ + public MeshTimeSeriesTestCase(String name) { + super(name); + } + + /** + * @see de.intevation.gnv.artifacts.GNVArtifactsTestCaseBase#testArtifact() + */ + @Override + public void testArtifact() { + try { + log.debug("GNVArtifactsTestCase.testTimeSeriesMeshArtifact"); + String artefactName = "fis_modeldata"; + ArtifactFactory artifactFactory = this + .getArtifactFactory(artefactName); + assertNotNull(artifactFactory); + log.debug("TimeSeriesMesh-ArtifactFactory is available"); + + Artifact artifact = createArtifact(artifactFactory); + + CallContext cc = createCallContext(artifactFactory); + + Document describeDocument = this.readDocument("src/test/ressources/timeseries_mesh/timeseries_describe.xml"); + + int steps = 8; + + for (int i = 1; i <= steps; i++){ + this.doNextStep( + artifact, + cc, + "src/test/ressources/timeseries_mesh/" + + "timeseries_step_0"+i+"_feed.xml", + "src/test/ressources/timeseries_mesh/" + + "timeseries_step_0"+i+"_advance.xml", + describeDocument); + } + // Achter Schritt + Document outputData = artifact.describe(describeDocument,cc); + FileOutputStream fos = null; + FileOutputStream fos2 = null; + FileOutputStream fos3 = null; + FileOutputStream fos4 = null; + try { + fos = new FileOutputStream("src/test/results/timeseries_mesh" + + System.currentTimeMillis() + + ".png"); + fos2 = new FileOutputStream("src/test/results/timeseries_mesh" + + System.currentTimeMillis() + + ".xml"); + fos3 = new FileOutputStream("src/test/results/timeseries_mesh" + + System.currentTimeMillis() + + ".csv"); + fos4 = new FileOutputStream("src/test/results/timeseries_mesh" + + System.currentTimeMillis() + + ".odv"); + artifact + .out( + this + .readDocument("src/test/ressources/timeseries_mesh/timeseries_step_08_out_statistics.xml"), + fos2, cc); + artifact + .out( + this + .readDocument("src/test/ressources/timeseries_mesh/timeseries_step_08_out_chart.xml"), + fos, cc); + artifact + .out( + this + .readDocument("src/test/ressources/timeseries_mesh/timeseries_step_08_out_csv.xml"), + fos3, cc); + artifact + .out( + this + .readDocument("src/test/ressources/timeseries_mesh/timeseries_step_08_out_odv.xml"), + fos4, cc); + } catch (Exception e) { + log.error(e, e); + fail(); + } finally { + try { + fos.flush(); + fos.close(); + fos2.flush(); + fos2.close(); + fos3.flush(); + fos3.close(); + } catch (Exception e) { + log.error(e, e); + } + } + } catch (Exception e) { + log.error(e, e); + fail(); + } + } + +} diff -r f99d8f92a640 -r 755dd2fa4a0a gnv-artifacts/src/test/java/de/intevation/gnv/artifacts/MeshVerticalCrossSectionTestCase.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv-artifacts/src/test/java/de/intevation/gnv/artifacts/MeshVerticalCrossSectionTestCase.java Fri Sep 28 12:13:53 2012 +0200 @@ -0,0 +1,120 @@ +/** + * + */ +package de.intevation.gnv.artifacts; + +import java.io.FileOutputStream; + +import org.apache.log4j.Logger; +import org.w3c.dom.Document; + +import de.intevation.artifacts.Artifact; +import de.intevation.artifacts.ArtifactFactory; +import de.intevation.artifacts.CallContext; + +/** + * @author Tim Englich + * + */ +public class MeshVerticalCrossSectionTestCase extends GNVArtifactsTestCaseBase { + + private static Logger log = Logger.getLogger(MeshVerticalCrossSectionTestCase.class); + + /** + * Constructor + */ + public MeshVerticalCrossSectionTestCase() { + } + + /** + * Constructor + * @param name + */ + public MeshVerticalCrossSectionTestCase(String name) { + super(name); + } + + /** + * @see de.intevation.gnv.artifacts.GNVArtifactsTestCaseBase#testArtifact() + */ + @Override + public void testArtifact() { + try { + log.debug("GNVArtifactsTestCase." + + "testHVerticalCrossSectionMeshArtifact"); + String artefactName = "fis_modeldata"; + ArtifactFactory artifactFactory = this + .getArtifactFactory(artefactName); + assertNotNull(artifactFactory); + log.debug("VerticalProfile-ArtifactFactory is available"); + + Artifact artifact = createArtifact(artifactFactory); + + CallContext cc = createCallContext(artifactFactory); + Document describeDocument = this.readDocument("src/test/ressources/verticalcrosssection_mesh/verticalcrosssection_describe.xml"); + + int steps = 7; + + for (int i = 1; i <= steps; i++){ + + this.doNextStep( + artifact, + cc, + "src/test/ressources/verticalcrosssection_mesh/" + + "verticalcrosssection_step_0"+i+"_feed.xml", + "src/test/ressources/verticalcrosssection_mesh/" + + "verticalcrosssection_step_0"+i+"_advance.xml", + describeDocument); + } + + Document outputData = artifact.describe(describeDocument,cc); + FileOutputStream fos = null; + FileOutputStream fos2 = null; + FileOutputStream fos3 = null; + try { + fos = new FileOutputStream( + "src/test/results/verticalcrosssection_mesh" + + System.currentTimeMillis() + ".png"); + + fos2 = new FileOutputStream( + "src/test/results/verticalcrosssection_mesh" + + System.currentTimeMillis() + ".csv"); + fos3 = new FileOutputStream( + "src/test/results/verticalcrosssection_mesh" + + System.currentTimeMillis() + ".odv"); + artifact.out(this.readDocument("src/test/ressources/" + + "verticalcrosssection_mesh/" + + "verticalcrosssection_step_0"+steps+"_out_chart.xml"), + fos, cc); + artifact.out(this.readDocument("src/test/ressources/" + + "verticalcrosssection_mesh/" + + "verticalcrosssection_step_0"+steps+"_out_csv.xml"), + fos2,cc); + // TODO: FIXME: ODV-Export nach Reparatur wieder Testbar machen. +// artifact.out(this.readDocument("src/test/ressources/" + +// "verticalcrosssection_mesh/" + +// "verticalcrosssection_step_0"+steps+"_out_odv.xml"), +// fos3,cc); + + } catch (Exception e) { + log.error(e, e); + fail(); + } finally { + try { + fos.flush(); + fos.close(); + fos2.flush(); + fos2.close(); + fos3.flush(); + fos3.close(); + } catch (Exception e) { + log.error(e, e); + } + } + } catch (Exception e) { + log.error(e, e); + fail(); + } + } + +} diff -r f99d8f92a640 -r 755dd2fa4a0a gnv-artifacts/src/test/java/de/intevation/gnv/artifacts/MeshVerticalProfileTestCase.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv-artifacts/src/test/java/de/intevation/gnv/artifacts/MeshVerticalProfileTestCase.java Fri Sep 28 12:13:53 2012 +0200 @@ -0,0 +1,131 @@ +/** + * + */ +package de.intevation.gnv.artifacts; + +import java.io.FileOutputStream; + +import org.apache.log4j.Logger; +import org.w3c.dom.Document; + +import de.intevation.artifacts.Artifact; +import de.intevation.artifacts.ArtifactFactory; +import de.intevation.artifacts.CallContext; + +/** + * @author Tim Englich + * + */ +public class MeshVerticalProfileTestCase extends GNVArtifactsTestCaseBase { + + private static Logger log = Logger.getLogger(MeshVerticalProfileTestCase.class); + + /** + * Constructor + */ + public MeshVerticalProfileTestCase() { + } + + /** + * Constructor + * @param name + */ + public MeshVerticalProfileTestCase(String name) { + super(name); + } + + /** + * @see de.intevation.gnv.artifacts.GNVArtifactsTestCaseBase#testArtifact() + */ + @Override + public void testArtifact() { + try { + log.debug("GNVArtifactsTestCase.testVerticalProfileArtifact"); + String artefactName = "fis_modeldata"; + ArtifactFactory artifactFactory = this + .getArtifactFactory(artefactName); + assertNotNull(artifactFactory); + log.debug("VerticalProfile-ArtifactFactory is available"); + + Artifact artifact = createArtifact(artifactFactory); + + CallContext cc = createCallContext(artifactFactory); + Document describeDocument = this.readDocument("src/test/ressources/" + + "verticalprofile_mesh/" + + "verticalprofile_describe.xml"); + + int steps = 11; + + for (int i = 1; i <= steps; i++){ + String number = ""+i; + if (i < 10){ + number = "0"+number; + } + this.doNextStep( + artifact, + cc, + "src/test/ressources/verticalprofile_mesh/" + + "verticalprofile_step_"+number+"_feed.xml", + "src/test/ressources/verticalprofile_mesh/" + + "verticalprofile_step_"+number+"_advance.xml", + describeDocument); + } + // 10. Schritt + Document outputData = artifact.describe(describeDocument,cc); + FileOutputStream fos = null; + FileOutputStream fos2 = null; + FileOutputStream fos3 = null; + FileOutputStream fos4 = null; + try { + fos = new FileOutputStream( + "src/test/results/verticalprofile_mesh" + + System.currentTimeMillis() + ".png"); + fos2 = new FileOutputStream( + "src/test/results/verticalprofile_mesh" + + System.currentTimeMillis() + ".xml"); + fos3 = new FileOutputStream( + "src/test/results/verticalprofile_mesh" + + System.currentTimeMillis() + ".csv"); + fos4 = new FileOutputStream( + "src/test/results/verticalprofile_mesh" + + System.currentTimeMillis() + ".odv"); + artifact.out(this.readDocument("src/test/ressources/" + + "verticalprofile_mesh/" + + "verticalprofile_step_"+steps+"_out_statistics.xml"), + fos2, cc); + artifact.out(this.readDocument("src/test/ressources/" + + "verticalprofile_mesh/" + + "verticalprofile_step_"+steps+"_out_chart.xml"), + fos, cc); + artifact.out(this.readDocument("src/test/ressources/" + + "verticalprofile_mesh/" + + "verticalprofile_step_"+steps+"_out_csv.xml"), + fos3, cc); + artifact.out(this.readDocument("src/test/ressources/" + + "verticalprofile_mesh/" + + "verticalprofile_step_"+steps+"_out_odv.xml"), + fos4, cc); + } catch (Exception e) { + log.error(e, e); + fail(); + } finally { + try { + fos.flush(); + fos.close(); + fos2.flush(); + fos2.close(); + fos3.flush(); + fos3.close(); + fos4.flush(); + fos4.close(); + } catch (Exception e) { + log.error(e, e); + } + } + } catch (Exception e) { + log.error(e, e); + fail(); + } + } + +} diff -r f99d8f92a640 -r 755dd2fa4a0a gnv-artifacts/src/test/java/de/intevation/gnv/artifacts/TestArtifactDatabase.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv-artifacts/src/test/java/de/intevation/gnv/artifacts/TestArtifactDatabase.java Fri Sep 28 12:13:53 2012 +0200 @@ -0,0 +1,98 @@ +/** + * + */ +package de.intevation.gnv.artifacts; + +import org.w3c.dom.Document; + +import de.intevation.artifacts.ArtifactDatabase; +import de.intevation.artifacts.ArtifactDatabaseException; +import de.intevation.artifacts.ArtifactFactory; +import de.intevation.artifacts.CallMeta; + +/** + * @author Tim Englich + * + */ +public class TestArtifactDatabase implements ArtifactDatabase { + + private ArtifactFactory artifactFactory = null; + /** + * Constructor + */ + public TestArtifactDatabase(ArtifactFactory artifactFactory) { + this.artifactFactory = artifactFactory; + } + + /** + * @see de.intevation.artifacts.ArtifactDatabase#advance(java.lang.String, org.w3c.dom.Document, de.intevation.artifacts.CallMeta) + */ + public Document advance(String artifact, Document target, CallMeta callMeta) + throws ArtifactDatabaseException { + + return null; + } + + /** + * @see de.intevation.artifacts.ArtifactDatabase#artifactFactoryNamesAndDescriptions() + */ + public String[][] artifactFactoryNamesAndDescriptions() { + + return null; + } + + /** + * @see de.intevation.artifacts.ArtifactDatabase#createArtifactWithFactory(java.lang.String, de.intevation.artifacts.CallMeta, org.w3c.dom.Document) + */ + public Document createArtifactWithFactory(String factory, + CallMeta callMeta, + Document data) + throws ArtifactDatabaseException { + + return null; + } + + /** + * @see de.intevation.artifacts.ArtifactDatabase#describe(java.lang.String, org.w3c.dom.Document, de.intevation.artifacts.CallMeta) + */ + public Document describe(String artifact, Document data, CallMeta callMeta) + throws ArtifactDatabaseException { + + return null; + } + + /** + * @see de.intevation.artifacts.ArtifactDatabase#feed(java.lang.String, org.w3c.dom.Document, de.intevation.artifacts.CallMeta) + */ + public Document feed(String artifact, Document data, CallMeta callMeta) + throws ArtifactDatabaseException { + + return null; + } + + /** + * @see de.intevation.artifacts.ArtifactDatabase#getInternalArtifactFactory(java.lang.String) + */ + public ArtifactFactory getInternalArtifactFactory(String factoryName) { + return this.artifactFactory; + } + + /** + * @see de.intevation.artifacts.ArtifactDatabase#out(java.lang.String, org.w3c.dom.Document, de.intevation.artifacts.CallMeta) + */ + public DeferredOutput out(String artifact, Document format, + CallMeta callMeta) + throws ArtifactDatabaseException { + + return null; + } + + public Document process(String service, Document input, CallMeta callMeta) { + return null; + } + + public String[][] serviceNamesAndDescriptions() { + return null; + } + +} diff -r f99d8f92a640 -r 755dd2fa4a0a gnv-artifacts/src/test/java/de/intevation/gnv/artifacts/TestCallContext.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv-artifacts/src/test/java/de/intevation/gnv/artifacts/TestCallContext.java Fri Sep 28 12:13:53 2012 +0200 @@ -0,0 +1,68 @@ +/** + * + */ +package de.intevation.gnv.artifacts; + +import de.intevation.artifacts.ArtifactDatabase; +import de.intevation.artifacts.ArtifactFactory; +import de.intevation.artifacts.CallContext; +import de.intevation.artifacts.CallMeta; + +/** + * @author Tim Englich + * + */ +public class TestCallContext implements CallContext { + + + + private Object globalContext = null; + private CallMeta callMeta = null; + private ArtifactFactory artifactFactory = null; + private ArtifactDatabase artifactDatabase = null; + /** + * Constructor + */ + public TestCallContext(Object globalContext, + CallMeta callMeta, + ArtifactFactory artifactFactory) { + this.globalContext = globalContext; + this.callMeta = callMeta; + this.artifactDatabase = new TestArtifactDatabase(artifactFactory); + } + + /** + * @see de.intevation.artifacts.CallContext#afterBackground(int) + */ + public void afterBackground(int action) { + } + + /** + * @see de.intevation.artifacts.CallContext#afterCall(int) + */ + public void afterCall(int action) { + } + + /** + * @see de.intevation.artifacts.CallContext#globalContext() + */ + public Object globalContext() { + return this.globalContext; + } + + public CallMeta getMeta() { + return this.callMeta; + } + + public Object getContextValue(Object key) { + return null; + } + + public Object putContextValue(Object key, Object value) { + return null; + } + + public ArtifactDatabase getDatabase() { + return this.artifactDatabase; + } +} diff -r f99d8f92a640 -r 755dd2fa4a0a gnv-artifacts/src/test/java/de/intevation/gnv/artifacts/TimeSeriesPointTimeSeriesTestCase.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv-artifacts/src/test/java/de/intevation/gnv/artifacts/TimeSeriesPointTimeSeriesTestCase.java Fri Sep 28 12:13:53 2012 +0200 @@ -0,0 +1,124 @@ +/** + * + */ +package de.intevation.gnv.artifacts; + +import java.io.FileOutputStream; + +import org.apache.log4j.Logger; +import org.w3c.dom.Document; + +import de.intevation.artifacts.Artifact; +import de.intevation.artifacts.ArtifactFactory; +import de.intevation.artifacts.CallContext; + +/** + * @author Tim Englich + * + */ +public class TimeSeriesPointTimeSeriesTestCase extends GNVArtifactsTestCaseBase { + + + /** + * the logger, used to log exceptions and additonaly information + */ + private static Logger log = Logger.getLogger(TimeSeriesPointTimeSeriesTestCase.class); + + /** + * Constructor + */ + public TimeSeriesPointTimeSeriesTestCase() { + } + + /** + * Constructor + * @param name + */ + public TimeSeriesPointTimeSeriesTestCase(String name) { + super(name); + } + + /** + * @see de.intevation.gnv.artifacts.GNVArtifactsTestCaseBase#testArtifact() + */ + @Override + public void testArtifact() { + log.debug("GNVArtifactsTestCase.testTimeSeriesArtifact"); + try { + String artefactName = "fis_marnet"; + ArtifactFactory artifactFactory = this + .getArtifactFactory(artefactName); + assertNotNull(artifactFactory); + log.debug("TimeSeries-ArtifactFactory is available"); + + Artifact artifact = createArtifact(artifactFactory); + + CallContext cc = createCallContext(artifactFactory); + + // Erster Schritt + + Document describeDocument = this.readDocument("src/test/ressources/timeseries/timeseries_describe.xml"); + + int steps = 6; + + for (int i = 1; i <= steps; i++){ + + this.doNextStep( + artifact, + cc, + "src/test/ressources/timeseries/" + + "timeseries_step_0"+i+"_feed.xml", + "src/test/ressources/timeseries/" + + "timeseries_step_0"+i+"_advance.xml", + describeDocument); + } + + Document outputData = artifact.describe(describeDocument,cc); + FileOutputStream fos = null; + FileOutputStream fos2 = null; + FileOutputStream fos3 = null; + FileOutputStream fos4 = null; + try { + fos = new FileOutputStream("src/test/results/timeseries" + + System.currentTimeMillis() + + ".png"); + fos2 = new FileOutputStream("src/test/results/timeseries" + + System.currentTimeMillis() + + ".xml"); + fos3 = new FileOutputStream("src/test/results/timeseries" + + System.currentTimeMillis() + + ".csv"); + fos4 = new FileOutputStream("src/test/results/timeseries" + + System.currentTimeMillis() + + ".odv"); + + artifact.out(this + .readDocument("src/test/ressources/timeseries/timeseries_step_06_out_chart.xml"), + fos, cc); + artifact.out(this + .readDocument("src/test/ressources/timeseries/timeseries_step_06_out_statistics.xml"), + fos2, cc); + artifact.out(this + .readDocument("src/test/ressources/timeseries/timeseries_step_06_out_csv.xml"), + fos3, cc); + artifact.out(this + .readDocument("src/test/ressources/timeseries/timeseries_step_06_out_odv.xml"), + fos4, cc); + } catch (Exception e) { + log.error(e, e); + fail(); + } finally { + try { + fos.flush(); + fos.close(); + } catch (Exception e) { + log.error(e, e); + } + } + } catch (Exception e) { + log.error(e, e); + fail(); + } + } + +} diff -r f99d8f92a640 -r 755dd2fa4a0a gnv-artifacts/src/test/java/de/intevation/gnv/artifacts/TimeSeriesPointVerticalProfileTestCase.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv-artifacts/src/test/java/de/intevation/gnv/artifacts/TimeSeriesPointVerticalProfileTestCase.java Fri Sep 28 12:13:53 2012 +0200 @@ -0,0 +1,127 @@ +/** + * + */ +package de.intevation.gnv.artifacts; + +import java.io.FileOutputStream; + +import org.apache.log4j.Logger; +import org.w3c.dom.Document; + +import de.intevation.artifacts.Artifact; +import de.intevation.artifacts.ArtifactFactory; +import de.intevation.artifacts.CallContext; + +/** + * @author Tim Englich + * + */ +public class TimeSeriesPointVerticalProfileTestCase extends + GNVArtifactsTestCaseBase { + + private static Logger log = Logger.getLogger(TimeSeriesPointVerticalProfileTestCase.class); + + /** + * Constructor + */ + public TimeSeriesPointVerticalProfileTestCase() { + } + + /** + * Constructor + * @param name + */ + public TimeSeriesPointVerticalProfileTestCase(String name) { + super(name); + } + + /** + * @see de.intevation.gnv.artifacts.GNVArtifactsTestCaseBase#testArtifact() + */ + @Override + public void testArtifact() { + try { + log.debug("GNVArtifactsTestCase.testVerticalProfileArtifact"); + String artefactName = "fis_marnet"; + ArtifactFactory artifactFactory = this + .getArtifactFactory(artefactName); + assertNotNull(artifactFactory); + log.debug("VerticalProfile-ArtifactFactory is available"); + + Artifact artifact = createArtifact(artifactFactory); + + CallContext cc = createCallContext(artifactFactory); + + Document describeDocument = this.readDocument("src/test/ressources/verticalprofile/verticalprofile_describe.xml"); + int steps = 7; + + for (int i = 1; i <= steps; i++){ + this.doNextStep( + artifact, + cc, + "src/test/ressources/verticalprofile/" + + "verticalprofile_step_0"+i+"_feed.xml", + "src/test/ressources/verticalprofile/" + + "verticalprofile_step_0"+i+"_advance.xml", + describeDocument); + } + + // Vierter Schritt + Document outputData = artifact.describe(describeDocument,cc); + FileOutputStream fos = null; + FileOutputStream fos2 = null; + FileOutputStream fos3 = null; + FileOutputStream fos4 = null; + try { + fos = new FileOutputStream("src/test/results/verticalprofile" + + System.currentTimeMillis() + + ".png"); + fos2 = new FileOutputStream("src/test/results/verticalprofile" + + System.currentTimeMillis() + + ".xml"); + fos3 = new FileOutputStream("src/test/results/verticalprofile" + + System.currentTimeMillis() + + ".csv"); + fos4 = new FileOutputStream("src/test/results/verticalprofile" + + System.currentTimeMillis() + + ".odv"); + artifact.out(this.readDocument("src/test/ressources/" + + "verticalprofile/" + + "verticalprofile_step_07_out_statistics.xml"), + fos2, cc); + artifact.out(this.readDocument("src/test/ressources/" + + "verticalprofile/" + + "verticalprofile_step_07_out_chart.xml"), + fos, cc); + artifact.out(this.readDocument("src/test/ressources/" + + "verticalprofile/" + + "verticalprofile_step_07_out_csv.xml"), + fos3, cc); + artifact.out(this.readDocument("src/test/ressources/" + + "verticalprofile/" + + "verticalprofile_step_07_out_odv.xml"), + fos4, cc); + } catch (Exception e) { + log.error(e, e); + fail(); + } finally { + try { + fos.flush(); + fos.close(); + fos2.flush(); + fos2.close(); + fos3.flush(); + fos3.close(); + fos4.flush(); + fos4.close(); + } catch (Exception e) { + log.error(e, e); + } + } + } catch (Exception e) { + log.error(e, e); + fail(); + } + } + +} diff -r f99d8f92a640 -r 755dd2fa4a0a gnv-artifacts/src/test/java/de/intevation/gnv/artifacts/ressource/RessourceFactoryTestCase.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv-artifacts/src/test/java/de/intevation/gnv/artifacts/ressource/RessourceFactoryTestCase.java Fri Sep 28 12:13:53 2012 +0200 @@ -0,0 +1,59 @@ +package de.intevation.gnv.artifacts.ressource; + +import junit.framework.TestCase; + +import org.apache.log4j.BasicConfigurator; +import org.apache.log4j.Logger; + +import de.intevation.artifactdatabase.DefaultPreferredLocale; +import de.intevation.artifacts.PreferredLocale; + +/** + * @author Tim Englich + * + */ +public class RessourceFactoryTestCase extends TestCase { + /** + * the logger, used to log exceptions and additonaly information + */ + private static Logger log = null; + + static { + BasicConfigurator.configure(); + log = Logger.getLogger(RessourceFactoryTestCase.class); + } + + /** + * Constructor + * + * @param name + */ + public RessourceFactoryTestCase(String name) { + super(name); + } + + /** + * @see junit.framework.TestCase#setUp() + */ + @Override + protected void setUp() throws Exception { + super.setUp(); + // System.setProperty("artifact.ressource.dir", + // "src/test/ressources/lang"); + } + + public void testRessurceFactoryTestCase() { + ; + String value = RessourceFactory.getInstance() + .getRessource( + new PreferredLocale[] { new DefaultPreferredLocale( + "de", 1.0f) }, "fis_modeldata", "N/N"); + log.debug(value); + value = RessourceFactory.getInstance() + .getRessource( + new PreferredLocale[] { new DefaultPreferredLocale( + "en", 1.0f) }, "fis_modeldata", "N/N"); + log.debug(value); + } + +} diff -r f99d8f92a640 -r 755dd2fa4a0a gnv-artifacts/src/test/java/de/intevation/gnv/artifacts/util/DistanceCalculatorTestCase.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv-artifacts/src/test/java/de/intevation/gnv/artifacts/util/DistanceCalculatorTestCase.java Fri Sep 28 12:13:53 2012 +0200 @@ -0,0 +1,30 @@ +package de.intevation.gnv.artifacts.util; + +import com.vividsolutions.jts.geom.Coordinate; +import com.vividsolutions.jts.geom.GeometryFactory; +import com.vividsolutions.jts.geom.Point; + +import de.intevation.gnv.utils.DistanceCalculator; + +import junit.framework.TestCase; + +public class DistanceCalculatorTestCase extends TestCase { + + public DistanceCalculatorTestCase(String name) { + super(name); + } + + public void testDistanceCalculator(){ + + GeometryFactory gf = new GeometryFactory(); + + // Distance between Berlin and Tokio + Point p1 = gf.createPoint(new Coordinate(13.4000, 52.5167)); + Point p2 = gf.createPoint(new Coordinate(139.7667, 35.7000)); + + double s = new DistanceCalculator().calculateDistance(p1, p2); + + assertEquals(8941.201227763724, s); + } + +} diff -r f99d8f92a640 -r 755dd2fa4a0a gnv-artifacts/src/test/java/de/intevation/gnv/artifacts/util/ShapeFileWriterTestCase.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv-artifacts/src/test/java/de/intevation/gnv/artifacts/util/ShapeFileWriterTestCase.java Fri Sep 28 12:13:53 2012 +0200 @@ -0,0 +1,88 @@ +/** + * + */ +package de.intevation.gnv.artifacts.util; + +import java.io.File; +import java.io.FileReader; +import java.util.ArrayList; +import java.util.Date; + +import junit.framework.TestCase; + +import org.apache.log4j.BasicConfigurator; +import org.apache.log4j.Logger; + +import com.vividsolutions.jts.geom.MultiLineString; +import com.vividsolutions.jts.io.WKTReader; + +import de.intevation.gnv.utils.Pair; +import de.intevation.gnv.utils.ShapeFileWriter; + +/** + * @author Tim Englich + * + */ +public class ShapeFileWriterTestCase extends TestCase { + + /** + * the logger, used to log exceptions and additonaly information + */ + private static Logger log = null; + + static { + BasicConfigurator.configure(); + log = Logger.getLogger(ShapeFileWriterTestCase.class); + } + + /** + * Constructor + * @param name + */ + public ShapeFileWriterTestCase(String name) { + super(name); + } + + + public void testMultiLineStringWriter(){ + + try { + String wkt = "MULTILINESTRING ((10 10, 20 20),(15 15, 30 15))"; + String wkt1 = "MULTILINESTRING ((10 5, 20 20),(15 15, 30 15))"; + String wkt2 = "MULTILINESTRING ((10 10, 8 20),(15 15, 30 15))"; + String wkt3 = "MULTILINESTRING ((8 10, 20 20),(15 15, 30 15))"; + File isolineFile = new File("src/test/ressources/isolines.wkt"); + MultiLineString multiLineString = (MultiLineString)new WKTReader().read(new FileReader(isolineFile)); + MultiLineString multiLineString1 = (MultiLineString)new WKTReader().read(wkt1); + MultiLineString multiLineString2 = (MultiLineString)new WKTReader().read(wkt2); + MultiLineString multiLineString3 = (MultiLineString)new WKTReader().read(wkt3); + ArrayList> multiLineStrings = + new ArrayList>(); + multiLineStrings.add( + new Pair( + 1.2, + multiLineString)); + multiLineStrings.add( + new Pair( + 1.3, + multiLineString1)); + multiLineStrings.add( + new Pair( + 1.4, + multiLineString2)); + multiLineStrings.add( + new Pair( + 1.5, + multiLineString3)); + + java.io.File shapeFile = new java.io.File("/tmp/test"+System.currentTimeMillis()+".shp"); + + ShapeFileWriter.writeMultiLineStringsToFile(shapeFile, 1, 1, new Date(), multiLineStrings); + + } catch (Exception e) { + log.error(e,e); + fail(); + } + } + +} diff -r f99d8f92a640 -r 755dd2fa4a0a gnv-artifacts/src/test/ressources/horizontalProfile_instantaneouspoint/horizontalprofile_describe.xml --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv-artifacts/src/test/ressources/horizontalProfile_instantaneouspoint/horizontalprofile_describe.xml Fri Sep 28 12:13:53 2012 +0200 @@ -0,0 +1,7 @@ + + + + + + true + \ No newline at end of file diff -r f99d8f92a640 -r 755dd2fa4a0a gnv-artifacts/src/test/ressources/horizontalProfile_instantaneouspoint/horizontalprofile_step_00_advance.xml --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv-artifacts/src/test/ressources/horizontalProfile_instantaneouspoint/horizontalprofile_step_00_advance.xml Fri Sep 28 12:13:53 2012 +0200 @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff -r f99d8f92a640 -r 755dd2fa4a0a gnv-artifacts/src/test/ressources/horizontalProfile_instantaneouspoint/horizontalprofile_step_00_feed.xml --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv-artifacts/src/test/ressources/horizontalProfile_instantaneouspoint/horizontalprofile_step_00_feed.xml Fri Sep 28 12:13:53 2012 +0200 @@ -0,0 +1,9 @@ + + + + + + + + + \ No newline at end of file diff -r f99d8f92a640 -r 755dd2fa4a0a gnv-artifacts/src/test/ressources/horizontalProfile_instantaneouspoint/horizontalprofile_step_01_advance.xml --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv-artifacts/src/test/ressources/horizontalProfile_instantaneouspoint/horizontalprofile_step_01_advance.xml Fri Sep 28 12:13:53 2012 +0200 @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff -r f99d8f92a640 -r 755dd2fa4a0a gnv-artifacts/src/test/ressources/horizontalProfile_instantaneouspoint/horizontalprofile_step_01_feed.xml --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv-artifacts/src/test/ressources/horizontalProfile_instantaneouspoint/horizontalprofile_step_01_feed.xml Fri Sep 28 12:13:53 2012 +0200 @@ -0,0 +1,9 @@ + + + + + + + + + \ No newline at end of file diff -r f99d8f92a640 -r 755dd2fa4a0a gnv-artifacts/src/test/ressources/horizontalProfile_instantaneouspoint/horizontalprofile_step_02_advance.xml --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv-artifacts/src/test/ressources/horizontalProfile_instantaneouspoint/horizontalprofile_step_02_advance.xml Fri Sep 28 12:13:53 2012 +0200 @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff -r f99d8f92a640 -r 755dd2fa4a0a gnv-artifacts/src/test/ressources/horizontalProfile_instantaneouspoint/horizontalprofile_step_02_feed.xml --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv-artifacts/src/test/ressources/horizontalProfile_instantaneouspoint/horizontalprofile_step_02_feed.xml Fri Sep 28 12:13:53 2012 +0200 @@ -0,0 +1,9 @@ + + + + + + + + + \ No newline at end of file diff -r f99d8f92a640 -r 755dd2fa4a0a gnv-artifacts/src/test/ressources/horizontalProfile_instantaneouspoint/horizontalprofile_step_03_advance.xml --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv-artifacts/src/test/ressources/horizontalProfile_instantaneouspoint/horizontalprofile_step_03_advance.xml Fri Sep 28 12:13:53 2012 +0200 @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff -r f99d8f92a640 -r 755dd2fa4a0a gnv-artifacts/src/test/ressources/horizontalProfile_instantaneouspoint/horizontalprofile_step_03_feed.xml --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv-artifacts/src/test/ressources/horizontalProfile_instantaneouspoint/horizontalprofile_step_03_feed.xml Fri Sep 28 12:13:53 2012 +0200 @@ -0,0 +1,9 @@ + + + + + + + + + \ No newline at end of file diff -r f99d8f92a640 -r 755dd2fa4a0a gnv-artifacts/src/test/ressources/horizontalProfile_instantaneouspoint/horizontalprofile_step_04_advance.xml --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv-artifacts/src/test/ressources/horizontalProfile_instantaneouspoint/horizontalprofile_step_04_advance.xml Fri Sep 28 12:13:53 2012 +0200 @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff -r f99d8f92a640 -r 755dd2fa4a0a gnv-artifacts/src/test/ressources/horizontalProfile_instantaneouspoint/horizontalprofile_step_04_feed.xml --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv-artifacts/src/test/ressources/horizontalProfile_instantaneouspoint/horizontalprofile_step_04_feed.xml Fri Sep 28 12:13:53 2012 +0200 @@ -0,0 +1,9 @@ + + + + + + + + + \ No newline at end of file diff -r f99d8f92a640 -r 755dd2fa4a0a gnv-artifacts/src/test/ressources/horizontalProfile_instantaneouspoint/horizontalprofile_step_05_advance.xml --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv-artifacts/src/test/ressources/horizontalProfile_instantaneouspoint/horizontalprofile_step_05_advance.xml Fri Sep 28 12:13:53 2012 +0200 @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff -r f99d8f92a640 -r 755dd2fa4a0a gnv-artifacts/src/test/ressources/horizontalProfile_instantaneouspoint/horizontalprofile_step_05_feed.xml --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv-artifacts/src/test/ressources/horizontalProfile_instantaneouspoint/horizontalprofile_step_05_feed.xml Fri Sep 28 12:13:53 2012 +0200 @@ -0,0 +1,9 @@ + + + + + + + + + \ No newline at end of file diff -r f99d8f92a640 -r 755dd2fa4a0a gnv-artifacts/src/test/ressources/horizontalProfile_instantaneouspoint/horizontalprofile_step_06_advance.xml --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv-artifacts/src/test/ressources/horizontalProfile_instantaneouspoint/horizontalprofile_step_06_advance.xml Fri Sep 28 12:13:53 2012 +0200 @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff -r f99d8f92a640 -r 755dd2fa4a0a gnv-artifacts/src/test/ressources/horizontalProfile_instantaneouspoint/horizontalprofile_step_06_feed.xml --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv-artifacts/src/test/ressources/horizontalProfile_instantaneouspoint/horizontalprofile_step_06_feed.xml Fri Sep 28 12:13:53 2012 +0200 @@ -0,0 +1,9 @@ + + + + + + + + + \ No newline at end of file diff -r f99d8f92a640 -r 755dd2fa4a0a gnv-artifacts/src/test/ressources/horizontalProfile_instantaneouspoint/horizontalprofile_step_07_advance.xml --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv-artifacts/src/test/ressources/horizontalProfile_instantaneouspoint/horizontalprofile_step_07_advance.xml Fri Sep 28 12:13:53 2012 +0200 @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff -r f99d8f92a640 -r 755dd2fa4a0a gnv-artifacts/src/test/ressources/horizontalProfile_instantaneouspoint/horizontalprofile_step_07_feed.xml --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv-artifacts/src/test/ressources/horizontalProfile_instantaneouspoint/horizontalprofile_step_07_feed.xml Fri Sep 28 12:13:53 2012 +0200 @@ -0,0 +1,10 @@ + + + + + + + + + + \ No newline at end of file diff -r f99d8f92a640 -r 755dd2fa4a0a gnv-artifacts/src/test/ressources/horizontalProfile_instantaneouspoint/horizontalprofile_step_08_advance.xml --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv-artifacts/src/test/ressources/horizontalProfile_instantaneouspoint/horizontalprofile_step_08_advance.xml Fri Sep 28 12:13:53 2012 +0200 @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff -r f99d8f92a640 -r 755dd2fa4a0a gnv-artifacts/src/test/ressources/horizontalProfile_instantaneouspoint/horizontalprofile_step_08_feed.xml --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv-artifacts/src/test/ressources/horizontalProfile_instantaneouspoint/horizontalprofile_step_08_feed.xml Fri Sep 28 12:13:53 2012 +0200 @@ -0,0 +1,9 @@ + + + + + + + + + \ No newline at end of file diff -r f99d8f92a640 -r 755dd2fa4a0a gnv-artifacts/src/test/ressources/horizontalProfile_instantaneouspoint/horizontalprofile_step_08_out_chart.xml --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv-artifacts/src/test/ressources/horizontalProfile_instantaneouspoint/horizontalprofile_step_08_out_chart.xml Fri Sep 28 12:13:53 2012 +0200 @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff -r f99d8f92a640 -r 755dd2fa4a0a gnv-artifacts/src/test/ressources/horizontalProfile_instantaneouspoint/horizontalprofile_step_08_out_csv.xml --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv-artifacts/src/test/ressources/horizontalProfile_instantaneouspoint/horizontalprofile_step_08_out_csv.xml Fri Sep 28 12:13:53 2012 +0200 @@ -0,0 +1,10 @@ + + + + + + + + + + \ No newline at end of file diff -r f99d8f92a640 -r 755dd2fa4a0a gnv-artifacts/src/test/ressources/horizontalProfile_instantaneouspoint/horizontalprofile_step_08_out_odv.xml --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv-artifacts/src/test/ressources/horizontalProfile_instantaneouspoint/horizontalprofile_step_08_out_odv.xml Fri Sep 28 12:13:53 2012 +0200 @@ -0,0 +1,10 @@ + + + + + + + + + + \ No newline at end of file diff -r f99d8f92a640 -r 755dd2fa4a0a gnv-artifacts/src/test/ressources/horizontalProfile_instantaneouspoint/horizontalprofile_step_08_out_statistics.xml --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv-artifacts/src/test/ressources/horizontalProfile_instantaneouspoint/horizontalprofile_step_08_out_statistics.xml Fri Sep 28 12:13:53 2012 +0200 @@ -0,0 +1,10 @@ + + + + + + + + + + \ No newline at end of file diff -r f99d8f92a640 -r 755dd2fa4a0a gnv-artifacts/src/test/ressources/horizontalProfile_mesh/horizontalprofile_describe.xml --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv-artifacts/src/test/ressources/horizontalProfile_mesh/horizontalprofile_describe.xml Fri Sep 28 12:13:53 2012 +0200 @@ -0,0 +1,7 @@ + + + + + + true + \ No newline at end of file diff -r f99d8f92a640 -r 755dd2fa4a0a gnv-artifacts/src/test/ressources/horizontalProfile_mesh/horizontalprofile_step_01_advance.xml --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv-artifacts/src/test/ressources/horizontalProfile_mesh/horizontalprofile_step_01_advance.xml Fri Sep 28 12:13:53 2012 +0200 @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff -r f99d8f92a640 -r 755dd2fa4a0a gnv-artifacts/src/test/ressources/horizontalProfile_mesh/horizontalprofile_step_01_feed.xml --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv-artifacts/src/test/ressources/horizontalProfile_mesh/horizontalprofile_step_01_feed.xml Fri Sep 28 12:13:53 2012 +0200 @@ -0,0 +1,9 @@ + + + + + + + + + \ No newline at end of file diff -r f99d8f92a640 -r 755dd2fa4a0a gnv-artifacts/src/test/ressources/horizontalProfile_mesh/horizontalprofile_step_02_advance.xml --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv-artifacts/src/test/ressources/horizontalProfile_mesh/horizontalprofile_step_02_advance.xml Fri Sep 28 12:13:53 2012 +0200 @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff -r f99d8f92a640 -r 755dd2fa4a0a gnv-artifacts/src/test/ressources/horizontalProfile_mesh/horizontalprofile_step_02_feed.xml --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv-artifacts/src/test/ressources/horizontalProfile_mesh/horizontalprofile_step_02_feed.xml Fri Sep 28 12:13:53 2012 +0200 @@ -0,0 +1,9 @@ + + + + + + + + + \ No newline at end of file diff -r f99d8f92a640 -r 755dd2fa4a0a gnv-artifacts/src/test/ressources/horizontalProfile_mesh/horizontalprofile_step_03_advance.xml --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv-artifacts/src/test/ressources/horizontalProfile_mesh/horizontalprofile_step_03_advance.xml Fri Sep 28 12:13:53 2012 +0200 @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff -r f99d8f92a640 -r 755dd2fa4a0a gnv-artifacts/src/test/ressources/horizontalProfile_mesh/horizontalprofile_step_03_feed.xml --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv-artifacts/src/test/ressources/horizontalProfile_mesh/horizontalprofile_step_03_feed.xml Fri Sep 28 12:13:53 2012 +0200 @@ -0,0 +1,9 @@ + + + + + + + + + \ No newline at end of file diff -r f99d8f92a640 -r 755dd2fa4a0a gnv-artifacts/src/test/ressources/horizontalProfile_mesh/horizontalprofile_step_04_advance.xml --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv-artifacts/src/test/ressources/horizontalProfile_mesh/horizontalprofile_step_04_advance.xml Fri Sep 28 12:13:53 2012 +0200 @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff -r f99d8f92a640 -r 755dd2fa4a0a gnv-artifacts/src/test/ressources/horizontalProfile_mesh/horizontalprofile_step_04_feed.xml --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv-artifacts/src/test/ressources/horizontalProfile_mesh/horizontalprofile_step_04_feed.xml Fri Sep 28 12:13:53 2012 +0200 @@ -0,0 +1,9 @@ + + + + + + + + + \ No newline at end of file diff -r f99d8f92a640 -r 755dd2fa4a0a gnv-artifacts/src/test/ressources/horizontalProfile_mesh/horizontalprofile_step_05_advance.xml --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv-artifacts/src/test/ressources/horizontalProfile_mesh/horizontalprofile_step_05_advance.xml Fri Sep 28 12:13:53 2012 +0200 @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff -r f99d8f92a640 -r 755dd2fa4a0a gnv-artifacts/src/test/ressources/horizontalProfile_mesh/horizontalprofile_step_05_feed.xml --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv-artifacts/src/test/ressources/horizontalProfile_mesh/horizontalprofile_step_05_feed.xml Fri Sep 28 12:13:53 2012 +0200 @@ -0,0 +1,9 @@ + + + + + + + + + \ No newline at end of file diff -r f99d8f92a640 -r 755dd2fa4a0a gnv-artifacts/src/test/ressources/horizontalProfile_mesh/horizontalprofile_step_06_advance.xml --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv-artifacts/src/test/ressources/horizontalProfile_mesh/horizontalprofile_step_06_advance.xml Fri Sep 28 12:13:53 2012 +0200 @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff -r f99d8f92a640 -r 755dd2fa4a0a gnv-artifacts/src/test/ressources/horizontalProfile_mesh/horizontalprofile_step_06_feed.xml --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv-artifacts/src/test/ressources/horizontalProfile_mesh/horizontalprofile_step_06_feed.xml Fri Sep 28 12:13:53 2012 +0200 @@ -0,0 +1,9 @@ + + + + + + + + + \ No newline at end of file diff -r f99d8f92a640 -r 755dd2fa4a0a gnv-artifacts/src/test/ressources/horizontalProfile_mesh/horizontalprofile_step_07_advance.xml --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv-artifacts/src/test/ressources/horizontalProfile_mesh/horizontalprofile_step_07_advance.xml Fri Sep 28 12:13:53 2012 +0200 @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff -r f99d8f92a640 -r 755dd2fa4a0a gnv-artifacts/src/test/ressources/horizontalProfile_mesh/horizontalprofile_step_07_feed.xml --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv-artifacts/src/test/ressources/horizontalProfile_mesh/horizontalprofile_step_07_feed.xml Fri Sep 28 12:13:53 2012 +0200 @@ -0,0 +1,9 @@ + + + + + + + + + \ No newline at end of file diff -r f99d8f92a640 -r 755dd2fa4a0a gnv-artifacts/src/test/ressources/horizontalProfile_mesh/horizontalprofile_step_08_advance.xml --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv-artifacts/src/test/ressources/horizontalProfile_mesh/horizontalprofile_step_08_advance.xml Fri Sep 28 12:13:53 2012 +0200 @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff -r f99d8f92a640 -r 755dd2fa4a0a gnv-artifacts/src/test/ressources/horizontalProfile_mesh/horizontalprofile_step_08_feed.xml --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv-artifacts/src/test/ressources/horizontalProfile_mesh/horizontalprofile_step_08_feed.xml Fri Sep 28 12:13:53 2012 +0200 @@ -0,0 +1,10 @@ + + + + + + + + + + \ No newline at end of file diff -r f99d8f92a640 -r 755dd2fa4a0a gnv-artifacts/src/test/ressources/horizontalProfile_mesh/horizontalprofile_step_09_advance.xml --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv-artifacts/src/test/ressources/horizontalProfile_mesh/horizontalprofile_step_09_advance.xml Fri Sep 28 12:13:53 2012 +0200 @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff -r f99d8f92a640 -r 755dd2fa4a0a gnv-artifacts/src/test/ressources/horizontalProfile_mesh/horizontalprofile_step_09_feed.xml --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv-artifacts/src/test/ressources/horizontalProfile_mesh/horizontalprofile_step_09_feed.xml Fri Sep 28 12:13:53 2012 +0200 @@ -0,0 +1,10 @@ + + + + + + + + + + \ No newline at end of file diff -r f99d8f92a640 -r 755dd2fa4a0a gnv-artifacts/src/test/ressources/horizontalProfile_mesh/horizontalprofile_step_10_advance.xml --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv-artifacts/src/test/ressources/horizontalProfile_mesh/horizontalprofile_step_10_advance.xml Fri Sep 28 12:13:53 2012 +0200 @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff -r f99d8f92a640 -r 755dd2fa4a0a gnv-artifacts/src/test/ressources/horizontalProfile_mesh/horizontalprofile_step_10_feed.xml --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv-artifacts/src/test/ressources/horizontalProfile_mesh/horizontalprofile_step_10_feed.xml Fri Sep 28 12:13:53 2012 +0200 @@ -0,0 +1,9 @@ + + + + + + + + + \ No newline at end of file diff -r f99d8f92a640 -r 755dd2fa4a0a gnv-artifacts/src/test/ressources/horizontalProfile_mesh/horizontalprofile_step_11_advance.xml --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv-artifacts/src/test/ressources/horizontalProfile_mesh/horizontalprofile_step_11_advance.xml Fri Sep 28 12:13:53 2012 +0200 @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff -r f99d8f92a640 -r 755dd2fa4a0a gnv-artifacts/src/test/ressources/horizontalProfile_mesh/horizontalprofile_step_11_feed.xml --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv-artifacts/src/test/ressources/horizontalProfile_mesh/horizontalprofile_step_11_feed.xml Fri Sep 28 12:13:53 2012 +0200 @@ -0,0 +1,10 @@ + + + + + + + + + + \ No newline at end of file diff -r f99d8f92a640 -r 755dd2fa4a0a gnv-artifacts/src/test/ressources/horizontalProfile_mesh/horizontalprofile_step_11_out_chart.xml --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv-artifacts/src/test/ressources/horizontalProfile_mesh/horizontalprofile_step_11_out_chart.xml Fri Sep 28 12:13:53 2012 +0200 @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff -r f99d8f92a640 -r 755dd2fa4a0a gnv-artifacts/src/test/ressources/horizontalProfile_mesh/horizontalprofile_step_11_out_csv.xml --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv-artifacts/src/test/ressources/horizontalProfile_mesh/horizontalprofile_step_11_out_csv.xml Fri Sep 28 12:13:53 2012 +0200 @@ -0,0 +1,10 @@ + + + + + + + + + + diff -r f99d8f92a640 -r 755dd2fa4a0a gnv-artifacts/src/test/ressources/horizontalProfile_mesh/horizontalprofile_step_11_out_odv.xml --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv-artifacts/src/test/ressources/horizontalProfile_mesh/horizontalprofile_step_11_out_odv.xml Fri Sep 28 12:13:53 2012 +0200 @@ -0,0 +1,10 @@ + + + + + + + + + + \ No newline at end of file diff -r f99d8f92a640 -r 755dd2fa4a0a gnv-artifacts/src/test/ressources/horizontalProfile_mesh/horizontalprofile_step_11_out_statistics.xml --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv-artifacts/src/test/ressources/horizontalProfile_mesh/horizontalprofile_step_11_out_statistics.xml Fri Sep 28 12:13:53 2012 +0200 @@ -0,0 +1,10 @@ + + + + + + + + + + \ No newline at end of file diff -r f99d8f92a640 -r 755dd2fa4a0a gnv-artifacts/src/test/ressources/horizontalcrosssection_mesh/horizontalcrosssection_describe.xml --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv-artifacts/src/test/ressources/horizontalcrosssection_mesh/horizontalcrosssection_describe.xml Fri Sep 28 12:13:53 2012 +0200 @@ -0,0 +1,7 @@ + + + + + + true + \ No newline at end of file diff -r f99d8f92a640 -r 755dd2fa4a0a gnv-artifacts/src/test/ressources/horizontalcrosssection_mesh/horizontalcrosssection_step_01_advance.xml --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv-artifacts/src/test/ressources/horizontalcrosssection_mesh/horizontalcrosssection_step_01_advance.xml Fri Sep 28 12:13:53 2012 +0200 @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff -r f99d8f92a640 -r 755dd2fa4a0a gnv-artifacts/src/test/ressources/horizontalcrosssection_mesh/horizontalcrosssection_step_01_feed.xml --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv-artifacts/src/test/ressources/horizontalcrosssection_mesh/horizontalcrosssection_step_01_feed.xml Fri Sep 28 12:13:53 2012 +0200 @@ -0,0 +1,9 @@ + + + + + + + + + \ No newline at end of file diff -r f99d8f92a640 -r 755dd2fa4a0a gnv-artifacts/src/test/ressources/horizontalcrosssection_mesh/horizontalcrosssection_step_02_advance.xml --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv-artifacts/src/test/ressources/horizontalcrosssection_mesh/horizontalcrosssection_step_02_advance.xml Fri Sep 28 12:13:53 2012 +0200 @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff -r f99d8f92a640 -r 755dd2fa4a0a gnv-artifacts/src/test/ressources/horizontalcrosssection_mesh/horizontalcrosssection_step_02_feed.xml --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv-artifacts/src/test/ressources/horizontalcrosssection_mesh/horizontalcrosssection_step_02_feed.xml Fri Sep 28 12:13:53 2012 +0200 @@ -0,0 +1,9 @@ + + + + + + + + + \ No newline at end of file diff -r f99d8f92a640 -r 755dd2fa4a0a gnv-artifacts/src/test/ressources/horizontalcrosssection_mesh/horizontalcrosssection_step_03_advance.xml --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv-artifacts/src/test/ressources/horizontalcrosssection_mesh/horizontalcrosssection_step_03_advance.xml Fri Sep 28 12:13:53 2012 +0200 @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff -r f99d8f92a640 -r 755dd2fa4a0a gnv-artifacts/src/test/ressources/horizontalcrosssection_mesh/horizontalcrosssection_step_03_feed.xml --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv-artifacts/src/test/ressources/horizontalcrosssection_mesh/horizontalcrosssection_step_03_feed.xml Fri Sep 28 12:13:53 2012 +0200 @@ -0,0 +1,9 @@ + + + + + + + + + \ No newline at end of file diff -r f99d8f92a640 -r 755dd2fa4a0a gnv-artifacts/src/test/ressources/horizontalcrosssection_mesh/horizontalcrosssection_step_04_advance.xml --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv-artifacts/src/test/ressources/horizontalcrosssection_mesh/horizontalcrosssection_step_04_advance.xml Fri Sep 28 12:13:53 2012 +0200 @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff -r f99d8f92a640 -r 755dd2fa4a0a gnv-artifacts/src/test/ressources/horizontalcrosssection_mesh/horizontalcrosssection_step_04_feed.xml --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv-artifacts/src/test/ressources/horizontalcrosssection_mesh/horizontalcrosssection_step_04_feed.xml Fri Sep 28 12:13:53 2012 +0200 @@ -0,0 +1,9 @@ + + + + + + + + + \ No newline at end of file diff -r f99d8f92a640 -r 755dd2fa4a0a gnv-artifacts/src/test/ressources/horizontalcrosssection_mesh/horizontalcrosssection_step_05_advance.xml --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv-artifacts/src/test/ressources/horizontalcrosssection_mesh/horizontalcrosssection_step_05_advance.xml Fri Sep 28 12:13:53 2012 +0200 @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff -r f99d8f92a640 -r 755dd2fa4a0a gnv-artifacts/src/test/ressources/horizontalcrosssection_mesh/horizontalcrosssection_step_05_feed.xml --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv-artifacts/src/test/ressources/horizontalcrosssection_mesh/horizontalcrosssection_step_05_feed.xml Fri Sep 28 12:13:53 2012 +0200 @@ -0,0 +1,9 @@ + + + + + + + + + \ No newline at end of file diff -r f99d8f92a640 -r 755dd2fa4a0a gnv-artifacts/src/test/ressources/horizontalcrosssection_mesh/horizontalcrosssection_step_06_advance.xml --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv-artifacts/src/test/ressources/horizontalcrosssection_mesh/horizontalcrosssection_step_06_advance.xml Fri Sep 28 12:13:53 2012 +0200 @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff -r f99d8f92a640 -r 755dd2fa4a0a gnv-artifacts/src/test/ressources/horizontalcrosssection_mesh/horizontalcrosssection_step_06_feed.xml --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv-artifacts/src/test/ressources/horizontalcrosssection_mesh/horizontalcrosssection_step_06_feed.xml Fri Sep 28 12:13:53 2012 +0200 @@ -0,0 +1,9 @@ + + + + + + + + + \ No newline at end of file diff -r f99d8f92a640 -r 755dd2fa4a0a gnv-artifacts/src/test/ressources/horizontalcrosssection_mesh/horizontalcrosssection_step_07_advance.xml --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv-artifacts/src/test/ressources/horizontalcrosssection_mesh/horizontalcrosssection_step_07_advance.xml Fri Sep 28 12:13:53 2012 +0200 @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff -r f99d8f92a640 -r 755dd2fa4a0a gnv-artifacts/src/test/ressources/horizontalcrosssection_mesh/horizontalcrosssection_step_07_feed.xml --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv-artifacts/src/test/ressources/horizontalcrosssection_mesh/horizontalcrosssection_step_07_feed.xml Fri Sep 28 12:13:53 2012 +0200 @@ -0,0 +1,9 @@ + + + + + + + + + \ No newline at end of file diff -r f99d8f92a640 -r 755dd2fa4a0a gnv-artifacts/src/test/ressources/horizontalcrosssection_mesh/horizontalcrosssection_step_08_advance.xml --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv-artifacts/src/test/ressources/horizontalcrosssection_mesh/horizontalcrosssection_step_08_advance.xml Fri Sep 28 12:13:53 2012 +0200 @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff -r f99d8f92a640 -r 755dd2fa4a0a gnv-artifacts/src/test/ressources/horizontalcrosssection_mesh/horizontalcrosssection_step_08_feed.xml --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv-artifacts/src/test/ressources/horizontalcrosssection_mesh/horizontalcrosssection_step_08_feed.xml Fri Sep 28 12:13:53 2012 +0200 @@ -0,0 +1,9 @@ + + + + + + + + + \ No newline at end of file diff -r f99d8f92a640 -r 755dd2fa4a0a gnv-artifacts/src/test/ressources/horizontalcrosssection_mesh/horizontalcrosssection_step_08_out_wms.xml --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv-artifacts/src/test/ressources/horizontalcrosssection_mesh/horizontalcrosssection_step_08_out_wms.xml Fri Sep 28 12:13:53 2012 +0200 @@ -0,0 +1,10 @@ + + + + + + + + + + \ No newline at end of file diff -r f99d8f92a640 -r 755dd2fa4a0a gnv-artifacts/src/test/ressources/horizontalcrosssection_mesh/horizontalcrosssection_step_08_out_zip.xml --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv-artifacts/src/test/ressources/horizontalcrosssection_mesh/horizontalcrosssection_step_08_out_zip.xml Fri Sep 28 12:13:53 2012 +0200 @@ -0,0 +1,11 @@ + + + + + + + + + + + diff -r f99d8f92a640 -r 755dd2fa4a0a gnv-artifacts/src/test/ressources/isolines.wkt --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv-artifacts/src/test/ressources/isolines.wkt Fri Sep 28 12:13:53 2012 +0200 @@ -0,0 +1,52 @@ +MULTILINESTRING ((4.355421574235005 -7.503513066218794, 3.1939758211056706 -7.503513066218794, 3.1939758211056706 -7.81615944397791, 0.5807228765646674 -7.81615944397791, 0.5807228765646674 -8.128805821737027, 0 -8.128805821737027), + (297.3301128011097 -67.21897121821003, 296.4590284862627 -67.21897121821003, 296.4590284862627 -67.53161759596915, 295.29758273313337 -67.53161759596915, 295.29758273313337 -67.84426397372826, 294.42649841828637 -67.84426397372826, 294.42649841828637 -68.15691035148738, 293.5554141034394 -68.15691035148738, 293.5554141034394 -68.46955672924649, 292.39396835031005 -68.46955672924649, 292.39396835031005 -68.78220310700561, 291.522884035463 -68.78220310700561, 291.522884035463 -69.09484948476472, 290.651799720616 -69.09484948476472, 290.651799720616 -69.40749586252385, 289.49035396748667 -69.40749586252385, 289.49035396748667 -69.72014224028295, 288.6192696526397 -69.72014224028295, 288.6192696526397 -70.03278861804208, 287.7481853377927 -70.03278861804208, 287.7481853377927 -70.3454349958012, 280.198787942452 -70.3454349958012, 280.198787942452 -70.65808137356031, 276.714450683064 -70.65808137356031, 276.714450683064 -70.97072775131943, 276.13372780649934 -70.97072775131943, 276.13372780649934 -70.65808137356031, 274.97228205337 -70.65808137356031, 274.97228205337 -70.3454349958012, 273.52047486195835 -70.3454349958012, 273.52047486195835 -70.03278861804208, 272.359029108829 -70.03278861804208, 272.359029108829 -69.72014224028295, 270.9072219174173 -69.72014224028295, 270.9072219174173 -69.40749586252385, 269.45541472600564 -69.40749586252385, 269.45541472600564 -69.09484948476472, 268.003607534594 -69.09484948476472, 268.003607534594 -68.78220310700561, 266.2614389049 -68.78220310700561, 266.2614389049 -68.46955672924649, 264.519270275206 -68.46955672924649, 264.519270275206 -68.15691035148738, 262.777101645512 -68.15691035148738, 262.777101645512 -67.84426397372826, 261.03493301581796 -67.84426397372826, 261.03493301581796 -67.53161759596915, 259.29276438612396 -67.53161759596915, 259.29276438612396 -67.21897121821003, 257.55059575642997 -67.21897121821003, 257.55059575642997 -66.9063248404509, 255.80842712673598 -66.9063248404509, 255.80842712673598 -66.5936784626918, 254.06625849704199 -66.5936784626918, 254.06625849704199 -66.28103208493268, 249.1301140462423 -66.28103208493268, 249.1301140462423 -65.96838570717357, 245.35541534857197 -65.96838570717357, 245.35541534857197 -65.65573932941444, 242.45180096574862 -65.65573932941444, 242.45180096574862 -65.34309295165534, 239.25782514464296 -65.34309295165534, 239.25782514464296 -65.03044657389621, 236.64457220010195 -65.03044657389621, 236.64457220010195 -64.71780019613709, 233.74095781727863 -64.71780019613709, 233.74095781727863 -64.40515381837798, 231.1277048727376 -64.40515381837798, 231.1277048727376 -64.09250744061886, 229.96625911960828 -64.09250744061886, 229.96625911960828 -63.77986106285975, 228.51445192819662 -63.77986106285975, 228.51445192819662 -63.46721468510063, 227.35300617506726 -63.46721468510063, 227.35300617506726 -63.15456830734151, 225.9011989836556 -63.15456830734151, 225.9011989836556 -62.8419219295824, 224.44939179224394 -62.8419219295824, 224.44939179224394 -62.52927555182328, 222.99758460083228 -62.52927555182328, 222.99758460083228 -62.21662917406417, 221.5457774094206 -62.21662917406417, 221.5457774094206 -61.90398279630505, 219.8036087797266 -61.90398279630505, 219.8036087797266 -61.591336418545936, 218.0614401500326 -61.591336418545936, 218.0614401500326 -61.27869004078681, 215.73854864377392 -61.27869004078681, 215.73854864377392 -60.9660436630277, 212.8349342609506 -60.9660436630277, 212.8349342609506 -60.65339728526858, 199.47830809996324 -60.65339728526858, 199.47830809996324 -60.34075090750947, 195.7036094022929 -60.34075090750947, 195.7036094022929 -60.65339728526858, 194.54216364916357 -60.65339728526858, 194.54216364916357 -60.9660436630277, 193.0903564577519 -60.9660436630277, 193.0903564577519 -61.27869004078681, 191.92891070462255 -61.27869004078681, 191.92891070462255 -61.591336418545936, 190.4771035132109 -61.591336418545936, 190.4771035132109 -61.90398279630505, 189.31565776008156 -61.90398279630505, 189.31565776008156 -62.21662917406417, 188.15421200695224 -62.21662917406417, 188.15421200695224 -62.52927555182328, 186.99276625382288 -62.52927555182328, 186.99276625382288 -62.8419219295824, 185.83132050069355 -62.8419219295824, 185.83132050069355 -63.15456830734151, 184.96023618584655 -63.15456830734151, 184.96023618584655 -63.46721468510063, 184.08915187099956 -63.46721468510063, 184.08915187099956 -63.77986106285975, 183.21806755615256 -63.77986106285975, 183.21806755615256 -64.09250744061886, 182.05662180302323 -64.09250744061886, 182.05662180302323 -64.40515381837798, 181.1855374881762 -64.40515381837798, 181.1855374881762 -64.71780019613709, 180.3144531733292 -64.71780019613709, 180.3144531733292 -65.03044657389621, 179.15300742019988 -65.03044657389621, 179.15300742019988 -65.34309295165534, 178.2819231053529 -65.34309295165534, 178.2819231053529 -65.65573932941444, 177.12047735222356 -65.65573932941444, 177.12047735222356 -65.96838570717357, 176.24939303737654 -65.96838570717357, 176.24939303737654 -66.28103208493268, 175.0879472842472 -66.28103208493268, 175.0879472842472 -66.5936784626918, 173.92650153111788 -66.5936784626918, 173.92650153111788 -66.9063248404509, 171.02288714829453 -66.9063248404509, 171.02288714829453 -67.21897121821003, 167.82891132718888 -67.21897121821003, 167.82891132718888 -67.53161759596915, 164.34457406780086 -67.53161759596915, 164.34457406780086 -67.84426397372826, 160.2795139318482 -67.84426397372826, 160.2795139318482 -68.15691035148738, 155.3433694810485 -68.15691035148738, 155.3433694810485 -68.46955672924649, 149.2457792771195 -68.46955672924649, 149.2457792771195 -68.78220310700561, 137.0505988692615 -68.78220310700561, 137.0505988692615 -68.46955672924649, 133.85662304815583 -68.46955672924649, 133.85662304815583 -68.15691035148738, 131.24337010361484 -68.15691035148738, 131.24337010361484 -67.84426397372826, 129.50120147392082 -67.84426397372826, 129.50120147392082 -67.53161759596915, 127.75903284422682 -67.53161759596915, 127.75903284422682 -67.21897121821003, 126.30722565281515 -67.21897121821003, 126.30722565281515 -66.9063248404509, 124.85541846140349 -66.9063248404509, 124.85541846140349 -66.5936784626918, 123.40361126999181 -66.5936784626918, 123.40361126999181 -66.28103208493268, 122.24216551686249 -66.28103208493268, 122.24216551686249 -65.96838570717357, 120.79035832545081 -65.96838570717357, 120.79035832545081 -65.65573932941444, 119.62891257232148 -65.65573932941444, 119.62891257232148 -65.34309295165534, 118.46746681919214 -65.34309295165534, 118.46746681919214 -65.03044657389621, 116.14457531293347 -65.03044657389621, 116.14457531293347 -64.71780019613709, 112.9505994918278 -64.71780019613709, 112.9505994918278 -64.40515381837798, 110.62770798556913 -64.40515381837798, 110.62770798556913 -64.09250744061886, 108.30481647931046 -64.09250744061886, 108.30481647931046 -63.77986106285975, 106.56264784961647 -63.77986106285975, 106.56264784961647 -63.46721468510063, 98.14216613942878 -63.46721468510063, 98.14216613942878 -63.15456830734151, 92.91566025034678 -63.15456830734151, 92.91566025034678 -63.46721468510063, 89.14096155267644 -63.46721468510063, 89.14096155267644 -63.77986106285975, 86.52770860813544 -63.77986106285975, 86.52770860813544 -64.09250744061886, 84.20481710187677 -64.09250744061886, 84.20481710187677 -64.40515381837798, 76.36505826825376 -64.40515381837798, 76.36505826825376 -64.71780019613709, 72.59035957058342 -64.71780019613709), + (72.29999813230108 -64.71780019613709, 69.68674518776008 -64.71780019613709, 69.68674518776008 -64.40515381837798, 66.78313080493675 -64.40515381837798, 66.78313080493675 -64.09250744061886, 64.16987786039574 -64.09250744061886, 64.16987786039574 -63.77986106285975, 61.55662491585474 -63.77986106285975, 61.55662491585474 -63.46721468510063, 59.81445628616074 -63.46721468510063, 59.81445628616074 -63.15456830734151, 58.653010533031406 -63.15456830734151, 58.653010533031406 -62.8419219295824, 57.49156477990207 -62.8419219295824, 57.49156477990207 -62.52927555182328, 56.330119026772735 -62.52927555182328, 56.330119026772735 -62.21662917406417, 55.45903471192573 -62.21662917406417, 55.45903471192573 -61.90398279630505, 54.297588958796396 -61.90398279630505, 54.297588958796396 -61.591336418545936, 53.4265046439494 -61.591336418545936, 53.4265046439494 -61.27869004078681, 52.5554203291024 -61.27869004078681, 52.5554203291024 -60.9660436630277, 51.68433601425539 -60.9660436630277, 51.68433601425539 -60.65339728526858, 50.8132516994084 -60.65339728526858, 50.8132516994084 -60.34075090750947, 50.232528822843726 -60.34075090750947, 50.232528822843726 -60.02810452975035, 49.36144450799673 -60.02810452975035, 49.36144450799673 -59.715458151991236, 47.909637316585055 -59.715458151991236, 47.909637316585055 -59.40281177423212, 46.74819156345572 -59.40281177423212, 46.74819156345572 -59.090165396473004, 45.29638437204405 -59.090165396473004, 45.29638437204405 -58.77751901871389, 44.13493861891472 -58.77751901871389, 44.13493861891472 -58.464872640954766, 42.97349286578539 -58.464872640954766, 42.97349286578539 -58.15222626319565, 41.81204711265605 -58.15222626319565, 41.81204711265605 -57.839579885436535, 40.65060135952672 -57.839579885436535, 40.65060135952672 -57.52693350767742, 39.48915560639738 -57.52693350767742, 39.48915560639738 -57.214287129918304, 38.32770985326805 -57.214287129918304, 38.32770985326805 -56.90164075215919, 37.16626410013871 -56.90164075215919, 37.16626410013871 -56.58899437440007, 35.714456908727044 -56.58899437440007, 35.714456908727044 -56.27634799664095, 33.972288279033044 -56.27634799664095, 33.972288279033044 -55.963701618881835, 32.23011964933904 -55.963701618881835, 32.23011964933904 -55.65105524112272, 30.48795101964504 -55.65105524112272, 30.48795101964504 -55.338408863363604, 28.165059513386367 -55.338408863363604, 28.165059513386367 -55.02576248560449, 24.971083692280697 -55.02576248560449, 24.971083692280697 -55.338408863363604, 22.93855362430436 -55.338408863363604, 22.93855362430436 -55.65105524112272, 21.777107871175026 -55.65105524112272, 21.777107871175026 -55.963701618881835, 20.61566211804569 -55.963701618881835, 20.61566211804569 -56.27634799664095, 19.74457780319869 -56.27634799664095), + (4.355421574235005 -55.02576248560449, 3.774698697670338 -55.02576248560449, 3.774698697670338 -55.338408863363604, 2.6132529445410033 -55.338408863363604, 2.6132529445410033 -55.65105524112272, 1.7421686296940022 -55.65105524112272, 1.7421686296940022 -55.963701618881835, 0.5807228765646674 -55.963701618881835, 0.5807228765646674 -56.27634799664095, 0 -56.27634799664095), + (25.551806568845365 0, 25.551806568845365 -0.3126463777591164, 25.842168007127697 -0.3126463777591164, 25.842168007127697 -0.6252927555182328, 26.132529445410032 -0.6252927555182328, 26.132529445410032 -0.9379391332773492, 26.422890883692364 -0.9379391332773492, 26.422890883692364 -1.2505855110364656, 26.7132523219747 -1.2505855110364656, 26.7132523219747 -1.563231888795582, 27.003613760257032 -1.563231888795582, 27.003613760257032 -2.8138173998320477, 26.7132523219747 -2.8138173998320477, 26.7132523219747 -3.126463777591164, 26.422890883692364 -3.126463777591164, 26.422890883692364 -3.4391101553502805, 26.132529445410032 -3.4391101553502805, 26.132529445410032 -3.751756533109397, 25.551806568845365 -3.751756533109397, 25.551806568845365 -4.064402910868513, 24.680722253998365 -4.064402910868513, 24.680722253998365 -4.37704928862763, 23.80963793915136 -4.37704928862763, 23.80963793915136 -4.689695666386746, 22.648192186022026 -4.689695666386746, 22.648192186022026 -5.002342044145863, 21.486746432892694 -5.002342044145863, 21.486746432892694 -5.314988421904979, 20.034939241481023 -5.314988421904979, 20.034939241481023 -5.627634799664095, 19.74457780319869 -5.627634799664095))MULTILINESTRING ((297.3301128011097 -61.27869004078681, 297.03975136282736 -61.27869004078681, 297.03975136282736 -61.591336418545936, 296.16866704798036 -61.591336418545936, 296.16866704798036 -61.90398279630505, 295.29758273313337 -61.90398279630505, 295.29758273313337 -62.21662917406417, 294.42649841828637 -62.21662917406417, 294.42649841828637 -62.52927555182328, 293.26505266515704 -62.52927555182328, 293.26505266515704 -62.8419219295824, 292.39396835031005 -62.8419219295824, 292.39396835031005 -63.15456830734151, 291.522884035463 -63.15456830734151, 291.522884035463 -63.46721468510063, 290.651799720616 -63.46721468510063, 290.651799720616 -63.77986106285975, 289.780715405769 -63.77986106285975, 289.780715405769 -64.09250744061886, 288.909631090922 -64.09250744061886, 288.909631090922 -64.40515381837798, 288.038546776075 -64.40515381837798, 288.038546776075 -64.71780019613709, 278.7469807510403 -64.71780019613709, 278.7469807510403 -65.03044657389621, 275.5530049299347 -65.03044657389621, 275.5530049299347 -64.71780019613709, 274.39155917680534 -64.71780019613709, 274.39155917680534 -64.40515381837798, 273.230113423676 -64.40515381837798, 273.230113423676 -64.09250744061886, 271.77830623226436 -64.09250744061886, 271.77830623226436 -63.77986106285975, 270.32649904085264 -63.77986106285975, 270.32649904085264 -63.46721468510063, 269.1650532877233 -63.46721468510063, 269.1650532877233 -63.15456830734151, 267.71324609631165 -63.15456830734151, 267.71324609631165 -62.8419219295824, 265.97107746661766 -62.8419219295824, 265.97107746661766 -62.52927555182328, 264.22890883692367 -62.52927555182328, 264.22890883692367 -62.21662917406417, 262.19637876894734 -62.21662917406417, 262.19637876894734 -61.90398279630505, 260.16384870097096 -61.90398279630505, 260.16384870097096 -61.591336418545936, 258.13131863299463 -61.591336418545936, 258.13131863299463 -61.27869004078681, 256.0987885650183 -61.27869004078681, 256.0987885650183 -60.9660436630277, 254.06625849704199 -60.9660436630277, 254.06625849704199 -60.65339728526858, 250.0011983610893 -60.65339728526858, 250.0011983610893 -60.34075090750947, 245.93613822513663 -60.34075090750947, 245.93613822513663 -60.02810452975035, 242.16143952746629 -60.02810452975035, 242.16143952746629 -59.715458151991236, 238.6771022680783 -59.715458151991236, 238.6771022680783 -59.40281177423212, 235.1927650086903 -59.40281177423212, 235.1927650086903 -59.090165396473004, 231.9987891875846 -59.090165396473004, 231.9987891875846 -58.77751901871389, 230.2566205578906 -58.77751901871389, 230.2566205578906 -58.464872640954766, 229.09517480476129 -58.464872640954766, 229.09517480476129 -58.15222626319565, 227.93372905163193 -58.15222626319565, 227.93372905163193 -57.839579885436535, 226.7722832985026 -57.839579885436535, 226.7722832985026 -57.52693350767742, 225.61083754537327 -57.52693350767742, 225.61083754537327 -57.214287129918304, 224.1590303539616 -57.214287129918304, 224.1590303539616 -56.90164075215919, 222.99758460083228 -56.90164075215919, 222.99758460083228 -56.58899437440007, 221.5457774094206 -56.58899437440007, 221.5457774094206 -56.27634799664095, 220.09397021800893 -56.27634799664095, 220.09397021800893 -55.963701618881835, 218.35180158831494 -55.963701618881835, 218.35180158831494 -55.65105524112272, 216.3192715203386 -55.65105524112272, 216.3192715203386 -55.338408863363604, 213.99638001407993 -55.338408863363604, 213.99638001407993 -55.02576248560449, 210.2216813164096 -55.02576248560449, 210.2216813164096 -54.71311610784537, 199.47830809996324 -54.71311610784537, 199.47830809996324 -54.40046973008626, 197.15541659370456 -54.40046973008626, 197.15541659370456 -54.08782335232714, 196.86505515542223 -54.08782335232714, 196.86505515542223 -54.40046973008626, 195.41324796401057 -54.40046973008626, 195.41324796401057 -54.71311610784537, 194.25180221088124 -54.71311610784537, 194.25180221088124 -55.02576248560449, 192.79999501946958 -55.02576248560449, 192.79999501946958 -55.338408863363604, 191.3481878280579 -55.338408863363604, 191.3481878280579 -55.65105524112272, 190.18674207492856 -55.65105524112272, 190.18674207492856 -55.963701618881835, 188.7349348835169 -55.963701618881835, 188.7349348835169 -56.27634799664095, 187.57348913038757 -56.27634799664095, 187.57348913038757 -56.58899437440007, 186.41204337725821 -56.58899437440007, 186.41204337725821 -56.90164075215919, 185.2505976241289 -56.90164075215919, 185.2505976241289 -57.214287129918304, 184.08915187099956 -57.214287129918304, 184.08915187099956 -57.52693350767742, 183.21806755615256 -57.52693350767742, 183.21806755615256 -57.839579885436535, 182.05662180302323 -57.839579885436535, 182.05662180302323 -58.15222626319565, 181.1855374881762 -58.15222626319565, 181.1855374881762 -58.464872640954766, 180.02409173504688 -58.464872640954766, 180.02409173504688 -58.77751901871389, 178.86264598191755 -58.77751901871389, 178.86264598191755 -59.090165396473004, 177.99156166707056 -59.090165396473004, 177.99156166707056 -59.40281177423212, 176.8301159139412 -59.40281177423212, 176.8301159139412 -59.715458151991236, 175.66867016081187 -59.715458151991236, 175.66867016081187 -60.02810452975035, 174.79758584596487 -60.02810452975035, 174.79758584596487 -60.34075090750947, 171.6036100248592 -60.34075090750947, 171.6036100248592 -60.65339728526858, 167.53854988890654 -60.65339728526858, 167.53854988890654 -60.9660436630277, 163.47348975295387 -60.9660436630277, 163.47348975295387 -61.27869004078681, 157.08553811074253 -61.27869004078681, 157.08553811074253 -61.591336418545936, 137.63132174582617 -61.591336418545936, 137.63132174582617 -61.27869004078681, 135.01806880128515 -61.27869004078681, 135.01806880128515 -60.9660436630277, 132.6951772950265 -60.9660436630277, 132.6951772950265 -60.65339728526858, 130.9530086653325 -60.65339728526858, 130.9530086653325 -60.34075090750947, 129.50120147392082 -60.34075090750947, 129.50120147392082 -60.02810452975035, 128.04939428250916 -60.02810452975035, 128.04939428250916 -59.715458151991236, 126.59758709109748 -59.715458151991236, 126.59758709109748 -59.40281177423212, 125.43614133796815 -59.40281177423212, 125.43614133796815 -59.090165396473004, 124.27469558483881 -59.090165396473004, 124.27469558483881 -58.77751901871389, 123.11324983170948 -58.77751901871389, 123.11324983170948 -58.464872640954766, 121.95180407858015 -58.464872640954766, 121.95180407858015 -58.15222626319565, 120.79035832545081 -58.15222626319565, 120.79035832545081 -57.839579885436535, 119.62891257232148 -57.839579885436535, 119.62891257232148 -57.52693350767742, 118.75782825747447 -57.52693350767742, 118.75782825747447 -57.214287129918304, 117.59638250434514 -57.214287129918304, 117.59638250434514 -56.90164075215919, 114.40240668323948 -56.90164075215919, 114.40240668323948 -56.58899437440007, 111.78915373869847 -56.58899437440007, 111.78915373869847 -56.27634799664095, 109.75662367072213 -56.27634799664095, 109.75662367072213 -55.963701618881835, 108.01445504102813 -55.963701618881835, 108.01445504102813 -55.65105524112272, 106.56264784961647 -55.65105524112272, 106.56264784961647 -55.338408863363604, 101.04578052225212 -55.338408863363604, 101.04578052225212 -55.02576248560449, 90.88313018237044 -55.02576248560449, 90.88313018237044 -55.338408863363604, 87.9795157995471 -55.338408863363604, 87.9795157995471 -55.65105524112272, 85.94698573157078 -55.65105524112272, 85.94698573157078 -55.963701618881835, 84.20481710187677 -55.963701618881835, 84.20481710187677 -56.27634799664095, 76.6554197065361 -56.27634799664095, 76.6554197065361 -56.58899437440007, 72.59035957058342 -56.58899437440007), + (72.29999813230108 -56.58899437440007, 69.39638374947775 -56.58899437440007, 69.39638374947775 -56.27634799664095, 66.78313080493675 -56.27634799664095, 66.78313080493675 -55.963701618881835, 64.46023929867808 -55.963701618881835, 64.46023929867808 -55.65105524112272, 61.84698635413707 -55.65105524112272, 61.84698635413707 -55.338408863363604, 60.395179162725405 -55.338408863363604, 60.395179162725405 -55.02576248560449, 59.23373340959607 -55.02576248560449, 59.23373340959607 -54.71311610784537, 58.072287656466735 -54.71311610784537, 58.072287656466735 -54.40046973008626, 57.20120334161974 -54.40046973008626, 57.20120334161974 -54.08782335232714, 56.0397575884904 -54.08782335232714, 56.0397575884904 -53.775176974568026, 55.1686732736434 -53.775176974568026, 55.1686732736434 -53.462530596808904, 54.297588958796396 -53.462530596808904, 54.297588958796396 -53.14988421904979, 53.71686608223173 -53.14988421904979, 53.71686608223173 -52.83723784129067, 52.84578176738473 -52.83723784129067, 52.84578176738473 -52.52459146353156, 51.97469745253773 -52.52459146353156, 51.97469745253773 -52.21194508577244, 51.39397457597306 -52.21194508577244, 51.39397457597306 -51.899298708013326, 50.52289026112606 -51.899298708013326, 50.52289026112606 -51.58665233025421, 49.942167384561394 -51.58665233025421, 49.942167384561394 -51.27400595249509, 49.07108306971439 -51.27400595249509, 49.07108306971439 -50.96135957473597, 47.909637316585055 -50.96135957473597, 47.909637316585055 -50.64871319697686, 46.74819156345572 -50.64871319697686, 46.74819156345572 -50.33606681921774, 45.58674581032639 -50.33606681921774, 45.58674581032639 -50.023420441458626, 44.71566149547939 -50.023420441458626, 44.71566149547939 -49.71077406369951, 43.55421574235005 -49.71077406369951, 43.55421574235005 -49.398127685940395, 42.39276998922072 -49.398127685940395, 42.39276998922072 -49.08548130818128, 41.23132423609138 -49.08548130818128, 41.23132423609138 -48.772834930422164, 40.36023992124438 -48.772834930422164, 40.36023992124438 -48.46018855266304, 39.19879416811505 -48.46018855266304, 39.19879416811505 -48.147542174903926, 38.32770985326805 -48.147542174903926, 38.32770985326805 -47.83489579714481, 37.16626410013871 -47.83489579714481, 37.16626410013871 -47.522249419385695, 35.714456908727044 -47.522249419385695, 35.714456908727044 -47.20960304162658, 34.26264971731538 -47.20960304162658, 34.26264971731538 -46.89695666386746, 32.81084252590371 -46.89695666386746, 32.81084252590371 -46.58431028610835, 31.359035334492038 -46.58431028610835, 31.359035334492038 -46.271663908349225, 29.616866704798035 -46.271663908349225, 29.616866704798035 -45.95901753059011, 27.5843366368217 -45.95901753059011, 27.5843366368217 -45.646371152830994, 24.39036081571603 -45.646371152830994, 24.39036081571603 -45.95901753059011, 22.06746930945736 -45.95901753059011, 22.06746930945736 -46.271663908349225, 20.906023556328027 -46.271663908349225, 20.906023556328027 -46.58431028610835, 19.74457780319869 -46.58431028610835), + (72.29999813230108 -7.81615944397791, 70.26746806432475 -7.81615944397791, 70.26746806432475 -8.128805821737027, 67.07349224321908 -8.128805821737027, 67.07349224321908 -8.441452199496144, 63.29879354554874 -8.441452199496144, 63.29879354554874 -8.75409857725526, 59.5240948478784 -8.75409857725526, 59.5240948478784 -9.066744955014375, 55.74939615020807 -9.066744955014375, 55.74939615020807 -9.379391332773492, 51.68433601425539 -9.379391332773492, 51.68433601425539 -9.69203771053261, 47.61927587830272 -9.69203771053261, 47.61927587830272 -10.004684088291725, 44.13493861891472 -10.004684088291725, 44.13493861891472 -10.31733046605084, 40.06987848296205 -10.31733046605084, 40.06987848296205 -10.629976843809958, 36.29517978529171 -10.629976843809958, 36.29517978529171 -10.942623221569075, 32.23011964933904 -10.942623221569075, 32.23011964933904 -11.25526959932819, 28.165059513386367 -11.25526959932819, 28.165059513386367 -11.567915977087306, 24.680722253998365 -11.567915977087306, 24.680722253998365 -11.880562354846424, 21.777107871175026 -11.880562354846424, 21.777107871175026 -12.193208732605541, 19.74457780319869 -12.193208732605541), + (92.62529881206444 0, 92.62529881206444 -0.3126463777591164, 92.91566025034678 -0.3126463777591164, 92.91566025034678 -0.6252927555182328, 93.20602168862911 -0.6252927555182328, 93.20602168862911 -0.9379391332773492, 93.49638312691144 -0.9379391332773492, 93.49638312691144 -1.2505855110364656, 93.78674456519379 -1.2505855110364656, 93.78674456519379 -1.563231888795582, 94.07710600347612 -1.563231888795582, 94.07710600347612 -3.126463777591164, 93.78674456519379 -3.126463777591164, 93.78674456519379 -3.4391101553502805, 93.20602168862911 -3.4391101553502805, 93.20602168862911 -3.751756533109397, 92.62529881206444 -3.751756533109397, 92.62529881206444 -4.064402910868513, 92.04457593549978 -4.064402910868513, 92.04457593549978 -4.37704928862763, 91.17349162065278 -4.37704928862763, 91.17349162065278 -4.689695666386746, 90.01204586752344 -4.689695666386746, 90.01204586752344 -5.002342044145863, 88.85060011439411 -5.002342044145863, 88.85060011439411 -5.314988421904979, 87.68915436126477 -5.314988421904979, 87.68915436126477 -5.627634799664095, 86.23734716985311 -5.627634799664095, 86.23734716985311 -5.940281177423212, 84.4951785401591 -5.940281177423212, 84.4951785401591 -6.252927555182328, 82.7530099104651 -6.252927555182328, 82.7530099104651 -6.565573932941445, 80.72047984248876 -6.565573932941445, 80.72047984248876 -6.878220310700561, 78.3975883362301 -6.878220310700561, 78.3975883362301 -7.1908666884596775, 76.07469682997143 -7.1908666884596775, 76.07469682997143 -7.503513066218794, 73.46144388543043 -7.503513066218794, 73.46144388543043 -7.81615944397791, 72.59035957058342 -7.81615944397791), + (4.355421574235005 -43.7704928862763, 3.4843372593880044 -43.7704928862763, 3.4843372593880044 -44.08313926403542, 1.4518071914116684 -44.08313926403542, 1.4518071914116684 -44.39578564179453, 0 -44.39578564179453), + (4.355421574235005 -13.13114786588289, 0.5807228765646674 -13.13114786588289, 0.5807228765646674 -13.443794243642007, 0 -13.443794243642007))MULTILINESTRING ((4.355421574235005 -33.765808797984576, 2.9036143828233367 -33.765808797984576, 2.9036143828233367 -34.07845517574369, 0 -34.07845517574369), + (72.29999813230108 -48.46018855266304, 72.00963669401875 -48.46018855266304, 72.00963669401875 -48.147542174903926, 69.39638374947775 -48.147542174903926, 69.39638374947775 -47.83489579714481, 67.07349224321908 -47.83489579714481, 67.07349224321908 -47.522249419385695, 65.04096217524274 -47.522249419385695, 65.04096217524274 -47.20960304162658, 62.718070668984076 -47.20960304162658, 62.718070668984076 -46.89695666386746, 60.97590203929008 -46.89695666386746, 60.97590203929008 -46.58431028610835, 59.81445628616074 -46.58431028610835, 59.81445628616074 -46.271663908349225, 58.94337197131374 -46.271663908349225, 58.94337197131374 -45.95901753059011, 58.072287656466735 -45.95901753059011, 58.072287656466735 -45.646371152830994, 57.20120334161974 -45.646371152830994, 57.20120334161974 -45.33372477507188, 56.330119026772735 -45.33372477507188, 56.330119026772735 -45.02107839731276, 55.74939615020807 -45.02107839731276, 55.74939615020807 -44.70843201955365, 54.87831183536107 -44.70843201955365, 54.87831183536107 -44.39578564179453, 54.297588958796396 -44.39578564179453, 54.297588958796396 -44.08313926403542, 53.4265046439494 -44.08313926403542, 53.4265046439494 -43.7704928862763, 52.84578176738473 -43.7704928862763, 52.84578176738473 -43.45784650851718, 52.265058890820065 -43.45784650851718, 52.265058890820065 -43.14520013075806, 51.68433601425539 -43.14520013075806, 51.68433601425539 -42.83255375299895, 50.8132516994084 -42.83255375299895, 50.8132516994084 -42.51990737523983, 50.232528822843726 -42.51990737523983, 50.232528822843726 -42.20726099748072, 49.65180594627906 -42.20726099748072, 49.65180594627906 -41.8946146197216, 48.78072163143206 -41.8946146197216, 48.78072163143206 -41.581968241962485, 47.61927587830272 -41.581968241962485, 47.61927587830272 -41.26932186420336, 46.74819156345572 -41.26932186420336, 46.74819156345572 -40.95667548644425, 45.58674581032639 -40.95667548644425, 45.58674581032639 -40.64402910868513, 44.71566149547939 -40.64402910868513, 44.71566149547939 -40.331382730926016, 43.55421574235005 -40.331382730926016, 43.55421574235005 -40.0187363531669, 42.68313142750305 -40.0187363531669, 42.68313142750305 -39.706089975407785, 41.81204711265605 -39.706089975407785, 41.81204711265605 -39.39344359764867, 40.65060135952672 -39.39344359764867, 40.65060135952672 -39.080797219889554, 39.779517044679714 -39.080797219889554, 39.779517044679714 -38.76815084213044, 38.61807129155038 -38.76815084213044, 38.61807129155038 -38.455504464371316, 37.746986976703376 -38.455504464371316, 37.746986976703376 -38.1428580866122, 36.29517978529171 -38.1428580866122, 36.29517978529171 -37.830211708853085, 35.13373403216237 -37.830211708853085, 35.13373403216237 -37.51756533109397, 33.681926840750705 -37.51756533109397, 33.681926840750705 -37.204918953334854, 32.23011964933904 -37.204918953334854, 32.23011964933904 -36.89227257557574, 30.48795101964504 -36.89227257557574, 30.48795101964504 -36.57962619781662, 28.745782389951035 -36.57962619781662, 28.745782389951035 -36.2669798200575, 26.132529445410032 -36.2669798200575, 26.132529445410032 -35.954333442298385, 23.51927650086903 -35.954333442298385, 23.51927650086903 -36.2669798200575, 20.61566211804569 -36.2669798200575, 20.61566211804569 -36.57962619781662, 19.74457780319869 -36.57962619781662), + (170.15180283344753 0, 170.15180283344753 -0.3126463777591164, 170.44216427172987 -0.3126463777591164, 170.44216427172987 -0.9379391332773492, 170.7325257100122 -0.9379391332773492, 170.7325257100122 -1.2505855110364656, 171.02288714829453 -1.2505855110364656, 171.02288714829453 -1.8758782665546985, 171.31324858657686 -1.8758782665546985, 171.31324858657686 -2.8138173998320477, 171.02288714829453 -2.8138173998320477, 171.02288714829453 -3.126463777591164, 170.7325257100122 -3.126463777591164, 170.7325257100122 -3.4391101553502805, 170.44216427172987 -3.4391101553502805, 170.44216427172987 -3.751756533109397, 170.15180283344753 -3.751756533109397, 170.15180283344753 -4.064402910868513, 169.57107995688287 -4.064402910868513, 169.57107995688287 -4.37704928862763, 168.69999564203587 -4.37704928862763, 168.69999564203587 -4.689695666386746, 167.82891132718888 -4.689695666386746, 167.82891132718888 -5.002342044145863, 166.95782701234188 -5.002342044145863, 166.95782701234188 -5.314988421904979, 165.79638125921252 -5.314988421904979, 165.79638125921252 -5.627634799664095, 164.6349355060832 -5.627634799664095, 164.6349355060832 -5.940281177423212, 163.18312831467154 -5.940281177423212, 163.18312831467154 -6.252927555182328, 160.86023680841285 -6.252927555182328, 160.86023680841285 -6.565573932941445, 158.24698386387186 -6.565573932941445, 158.24698386387186 -6.878220310700561, 155.63373091933084 -6.878220310700561, 155.63373091933084 -7.1908666884596775, 153.02047797478986 -7.1908666884596775, 153.02047797478986 -7.503513066218794, 150.1168635919665 -7.503513066218794, 150.1168635919665 -7.81615944397791, 147.21324920914319 -7.81615944397791, 147.21324920914319 -8.128805821737027, 144.30963482631984 -8.128805821737027, 144.30963482631984 -8.441452199496144, 141.40602044349652 -8.441452199496144, 141.40602044349652 -8.75409857725526, 137.9216831841085 -8.75409857725526, 137.9216831841085 -9.066744955014375, 134.14698448643816 -9.066744955014375, 134.14698448643816 -9.379391332773492, 130.3722857887678 -9.379391332773492, 130.3722857887678 -9.69203771053261, 126.59758709109748 -9.69203771053261, 126.59758709109748 -10.004684088291725, 122.53252695514482 -10.004684088291725, 122.53252695514482 -10.31733046605084, 118.17710538090981 -10.31733046605084, 118.17710538090981 -10.629976843809958, 114.40240668323948 -10.629976843809958, 114.40240668323948 -10.942623221569075, 110.3373465472868 -10.942623221569075, 110.3373465472868 -11.25526959932819, 106.27228641133412 -11.25526959932819, 106.27228641133412 -11.567915977087306, 102.49758771366379 -11.567915977087306, 102.49758771366379 -11.880562354846424, 98.72288901599346 -11.880562354846424, 98.72288901599346 -12.193208732605541, 94.94819031832311 -12.193208732605541, 94.94819031832311 -12.505855110364656, 91.46385305893511 -12.505855110364656, 91.46385305893511 -12.818501488123772, 87.9795157995471 -12.818501488123772, 87.9795157995471 -13.13114786588289, 84.20481710187677 -13.13114786588289, 84.20481710187677 -13.443794243642007, 80.1397569659241 -13.443794243642007, 80.1397569659241 -13.756440621401122, 75.49397395340675 -13.756440621401122, 75.49397395340675 -14.069086999160238, 72.59035957058342 -14.069086999160238), + (72.29999813230108 -14.069086999160238, 70.84819094088942 -14.069086999160238, 70.84819094088942 -14.381733376919355, 65.91204649008975 -14.381733376919355, 65.91204649008975 -14.694379754678472, 60.68554060100774 -14.694379754678472, 60.68554060100774 -15.007026132437588, 55.74939615020807 -15.007026132437588, 55.74939615020807 -15.319672510196703, 50.232528822843726 -15.319672510196703, 50.232528822843726 -15.63231888795582, 45.87710724860872 -15.63231888795582, 45.87710724860872 -15.944965265714938, 41.521685674373714 -15.944965265714938, 41.521685674373714 -16.257611643474053, 37.16626410013871 -16.257611643474053, 37.16626410013871 -16.57025802123317, 32.23011964933904 -16.57025802123317, 32.23011964933904 -16.882904398992288, 27.003613760257032 -16.882904398992288, 27.003613760257032 -17.195550776751404, 24.099999377433697 -17.195550776751404, 24.099999377433697 -17.50819715451052, 21.19638499461036 -17.50819715451052, 21.19638499461036 -17.820843532269635, 19.74457780319869 -17.820843532269635), + (4.355421574235005 -18.13348991002875, 3.4843372593880044 -18.13348991002875, 3.4843372593880044 -18.44613628778787, 0 -18.44613628778787), + (297.3301128011097 -55.65105524112272, 297.03975136282736 -55.65105524112272, 297.03975136282736 -55.963701618881835, 295.87830560969803 -55.963701618881835, 295.87830560969803 -56.27634799664095, 295.00722129485104 -56.27634799664095, 295.00722129485104 -56.58899437440007, 294.13613698000404 -56.58899437440007, 294.13613698000404 -56.90164075215919, 293.26505266515704 -56.90164075215919, 293.26505266515704 -57.214287129918304, 292.39396835031005 -57.214287129918304, 292.39396835031005 -57.52693350767742, 291.8132454737453 -57.52693350767742, 291.8132454737453 -57.839579885436535, 290.94216115889833 -57.839579885436535, 290.94216115889833 -58.15222626319565, 290.07107684405133 -58.15222626319565, 290.07107684405133 -58.464872640954766, 289.19999252920434 -58.464872640954766, 289.19999252920434 -58.77751901871389, 288.32890821435734 -58.77751901871389, 288.32890821435734 -59.090165396473004, 277.29517355962867 -59.090165396473004, 277.29517355962867 -59.40281177423212, 276.13372780649934 -59.40281177423212, 276.13372780649934 -59.090165396473004, 274.97228205337 -59.090165396473004, 274.97228205337 -58.77751901871389, 273.8108363002407 -58.77751901871389, 273.8108363002407 -58.464872640954766, 272.64939054711135 -58.464872640954766, 272.64939054711135 -58.15222626319565, 271.48794479398197 -58.15222626319565, 271.48794479398197 -57.839579885436535, 270.32649904085264 -57.839579885436535, 270.32649904085264 -57.52693350767742, 268.874691849441 -57.52693350767742, 268.874691849441 -57.214287129918304, 267.71324609631165 -57.214287129918304, 267.71324609631165 -56.90164075215919, 266.2614389049 -56.90164075215919, 266.2614389049 -56.58899437440007, 264.519270275206 -56.58899437440007, 264.519270275206 -56.27634799664095, 262.19637876894734 -56.27634799664095, 262.19637876894734 -55.963701618881835, 259.8734872626886 -55.963701618881835, 259.8734872626886 -55.65105524112272, 257.26023431814764 -55.65105524112272, 257.26023431814764 -55.338408863363604, 254.93734281188898 -55.338408863363604, 254.93734281188898 -55.02576248560449, 251.7433669907833 -55.02576248560449, 251.7433669907833 -54.71311610784537, 247.09758397826596 -54.71311610784537, 247.09758397826596 -54.40046973008626, 242.45180096574862 -54.40046973008626, 242.45180096574862 -54.08782335232714, 238.96746370636063 -54.08782335232714, 238.96746370636063 -53.775176974568026, 235.48312644697262 -53.775176974568026, 235.48312644697262 -53.462530596808904, 232.28915062586694 -53.462530596808904, 232.28915062586694 -53.14988421904979, 230.54698199617295 -53.14988421904979, 230.54698199617295 -52.83723784129067, 229.38553624304362 -52.83723784129067, 229.38553624304362 -52.52459146353156, 228.51445192819662 -52.52459146353156, 228.51445192819662 -52.21194508577244, 227.35300617506726 -52.21194508577244, 227.35300617506726 -51.899298708013326, 226.48192186022027 -51.899298708013326, 226.48192186022027 -51.58665233025421, 225.32047610709094 -51.58665233025421, 225.32047610709094 -51.27400595249509, 224.1590303539616 -51.27400595249509, 224.1590303539616 -50.96135957473597, 222.99758460083228 -50.96135957473597, 222.99758460083228 -50.64871319697686, 221.5457774094206 -50.64871319697686, 221.5457774094206 -50.33606681921774, 220.38433165629127 -50.33606681921774, 220.38433165629127 -50.023420441458626, 218.64216302659727 -50.023420441458626, 218.64216302659727 -49.71077406369951, 216.89999439690325 -49.71077406369951, 216.89999439690325 -49.398127685940395, 214.28674145236226 -49.398127685940395, 214.28674145236226 -49.08548130818128, 211.09276563125658 -49.08548130818128, 211.09276563125658 -48.772834930422164, 202.09156104450423 -48.772834930422164, 202.09156104450423 -48.46018855266304, 198.89758522339858 -48.46018855266304, 198.89758522339858 -48.147542174903926, 195.7036094022929 -48.147542174903926, 195.7036094022929 -48.46018855266304, 194.25180221088124 -48.46018855266304, 194.25180221088124 -48.772834930422164, 192.79999501946958 -48.772834930422164, 192.79999501946958 -49.08548130818128, 191.63854926634022 -49.08548130818128, 191.63854926634022 -49.398127685940395, 190.18674207492856 -49.398127685940395, 190.18674207492856 -49.71077406369951, 188.7349348835169 -49.71077406369951, 188.7349348835169 -50.023420441458626, 187.57348913038757 -50.023420441458626, 187.57348913038757 -50.33606681921774, 186.12168193897588 -50.33606681921774, 186.12168193897588 -50.64871319697686, 184.96023618584655 -50.64871319697686, 184.96023618584655 -50.96135957473597, 183.79879043271723 -50.96135957473597, 183.79879043271723 -51.27400595249509, 182.6373446795879 -51.27400595249509, 182.6373446795879 -51.58665233025421, 181.47589892645854 -51.58665233025421, 181.47589892645854 -51.899298708013326, 180.3144531733292 -51.899298708013326, 180.3144531733292 -52.21194508577244, 179.15300742019988 -52.21194508577244, 179.15300742019988 -52.52459146353156, 177.99156166707056 -52.52459146353156, 177.99156166707056 -52.83723784129067, 176.8301159139412 -52.83723784129067, 176.8301159139412 -53.14988421904979, 175.9590315990942 -53.14988421904979, 175.9590315990942 -53.462530596808904, 174.79758584596487 -53.462530596808904, 174.79758584596487 -53.775176974568026, 170.7325257100122 -53.775176974568026, 170.7325257100122 -54.08782335232714, 165.79638125921252 -54.08782335232714, 165.79638125921252 -54.40046973008626, 157.6662609873072 -54.40046973008626, 157.6662609873072 -54.71311610784537, 142.2771047583435 -54.71311610784537, 142.2771047583435 -54.40046973008626, 138.21204462239083 -54.40046973008626, 138.21204462239083 -54.08782335232714, 135.88915311613218 -54.08782335232714, 135.88915311613218 -53.775176974568026, 133.85662304815583 -53.775176974568026, 133.85662304815583 -53.462530596808904, 132.40481585674416 -53.462530596808904, 132.40481585674416 -53.14988421904979, 130.9530086653325 -53.14988421904979, 130.9530086653325 -52.83723784129067, 129.50120147392082 -52.83723784129067, 129.50120147392082 -52.52459146353156, 128.3397557207915 -52.52459146353156, 128.3397557207915 -52.21194508577244, 127.17830996766216 -52.21194508577244, 127.17830996766216 -51.899298708013326, 126.01686421453282 -51.899298708013326, 126.01686421453282 -51.58665233025421, 125.14577989968582 -51.58665233025421, 125.14577989968582 -51.27400595249509, 123.98433414655648 -51.27400595249509, 123.98433414655648 -50.96135957473597, 123.11324983170948 -50.96135957473597, 123.11324983170948 -50.64871319697686, 122.24216551686249 -50.64871319697686, 122.24216551686249 -50.33606681921774, 121.08071976373314 -50.33606681921774, 121.08071976373314 -50.023420441458626, 120.20963544888615 -50.023420441458626, 120.20963544888615 -49.71077406369951, 119.33855113403915 -49.71077406369951, 119.33855113403915 -49.398127685940395, 118.46746681919214 -49.398127685940395, 118.46746681919214 -49.08548130818128, 117.30602106606281 -49.08548130818128, 117.30602106606281 -48.772834930422164, 114.40240668323948 -48.772834930422164, 114.40240668323948 -48.46018855266304, 112.36987661526314 -48.46018855266304, 112.36987661526314 -48.147542174903926, 110.62770798556913 -48.147542174903926, 110.62770798556913 -47.83489579714481, 108.88553935587512 -47.83489579714481, 108.88553935587512 -47.522249419385695, 107.7240936027458 -47.522249419385695, 107.7240936027458 -47.20960304162658, 106.27228641133412 -47.20960304162658, 106.27228641133412 -46.89695666386746, 101.91686483709913 -46.89695666386746, 101.91686483709913 -46.58431028610835, 96.69035894801712 -46.58431028610835, 96.69035894801712 -46.271663908349225, 92.91566025034678 -46.271663908349225, 92.91566025034678 -46.58431028610835, 89.72168442924111 -46.58431028610835, 89.72168442924111 -46.89695666386746, 87.39879292298244 -46.89695666386746, 87.39879292298244 -47.20960304162658, 85.65662429328843 -47.20960304162658, 85.65662429328843 -47.522249419385695, 83.91445566359444 -47.522249419385695, 83.91445566359444 -47.83489579714481, 76.94578114481843 -47.83489579714481, 76.94578114481843 -48.147542174903926, 72.59035957058342 -48.147542174903926))MULTILINESTRING ((246.80722253998363 0, 246.80722253998363 -0.3126463777591164, 247.09758397826596 -0.3126463777591164, 247.09758397826596 -0.9379391332773492, 247.3879454165483 -0.9379391332773492, 247.3879454165483 -1.8758782665546985, 247.67830685483062 -1.8758782665546985, 247.67830685483062 -2.5011710220729313, 247.3879454165483 -2.5011710220729313, 247.3879454165483 -3.4391101553502805, 247.09758397826596 -3.4391101553502805, 247.09758397826596 -3.751756533109397, 246.80722253998363 -3.751756533109397, 246.80722253998363 -4.064402910868513, 246.5168611017013 -4.064402910868513, 246.5168611017013 -4.37704928862763, 245.93613822513663 -4.37704928862763, 245.93613822513663 -4.689695666386746, 245.6457767868543 -4.689695666386746, 245.6457767868543 -5.002342044145863, 245.06505391028963 -5.002342044145863, 245.06505391028963 -5.314988421904979, 244.48433103372497 -5.314988421904979, 244.48433103372497 -5.627634799664095, 243.61324671887797 -5.627634799664095, 243.61324671887797 -5.940281177423212, 242.74216240403095 -5.940281177423212, 242.74216240403095 -6.252927555182328, 242.16143952746629 -6.252927555182328, 242.16143952746629 -6.565573932941445, 241.2903552126193 -6.565573932941445, 241.2903552126193 -6.878220310700561, 240.4192708977723 -6.878220310700561, 240.4192708977723 -7.1908666884596775, 239.83854802120763 -7.1908666884596775, 239.83854802120763 -7.503513066218794, 238.6771022680783 -7.503513066218794, 238.6771022680783 -7.81615944397791, 237.80601795323128 -7.81615944397791, 237.80601795323128 -8.128805821737027, 236.93493363838428 -8.128805821737027, 236.93493363838428 -8.441452199496144, 235.77348788525495 -8.441452199496144, 235.77348788525495 -8.75409857725526, 234.61204213212562 -8.75409857725526, 234.61204213212562 -9.066744955014375, 233.74095781727863 -9.066744955014375, 233.74095781727863 -9.379391332773492, 232.57951206414927 -9.379391332773492, 232.57951206414927 -9.69203771053261, 231.1277048727376 -9.69203771053261, 231.1277048727376 -10.004684088291725, 229.67589768132595 -10.004684088291725, 229.67589768132595 -10.31733046605084, 228.2240904899143 -10.31733046605084, 228.2240904899143 -10.629976843809958, 226.48192186022027 -10.629976843809958, 226.48192186022027 -10.942623221569075, 224.73975323052628 -10.942623221569075, 224.73975323052628 -11.25526959932819, 222.70722316254992 -11.25526959932819, 222.70722316254992 -11.567915977087306, 220.6746930945736 -11.567915977087306, 220.6746930945736 -11.880562354846424, 218.0614401500326 -11.880562354846424, 218.0614401500326 -12.193208732605541, 214.5771028906446 -12.193208732605541, 214.5771028906446 -12.505855110364656, 210.2216813164096 -12.505855110364656, 210.2216813164096 -12.818501488123772, 200.34939241481024 -12.818501488123772, 200.34939241481024 -13.13114786588289, 192.79999501946958 -13.13114786588289, 192.79999501946958 -13.443794243642007, 187.8638505686699 -13.443794243642007, 187.8638505686699 -13.756440621401122, 183.5084289944349 -13.756440621401122, 183.5084289944349 -14.069086999160238, 180.02409173504688 -14.069086999160238, 180.02409173504688 -14.381733376919355, 176.24939303737654 -14.381733376919355, 176.24939303737654 -14.694379754678472, 171.6036100248592 -14.694379754678472, 171.6036100248592 -15.007026132437588, 166.3771041357772 -15.007026132437588, 166.3771041357772 -15.319672510196703, 157.95662242558953 -15.319672510196703, 157.95662242558953 -15.63231888795582, 148.08433352399018 -15.63231888795582, 148.08433352399018 -15.944965265714938, 139.6638518138025 -15.944965265714938, 139.6638518138025 -16.257611643474053, 132.98553873330883 -16.257611643474053, 132.98553873330883 -16.57025802123317, 127.46867140594449 -16.57025802123317, 127.46867140594449 -16.882904398992288, 123.69397270827415 -16.882904398992288, 123.69397270827415 -17.195550776751404, 119.33855113403915 -17.195550776751404, 119.33855113403915 -17.50819715451052, 115.27349099808647 -17.50819715451052, 115.27349099808647 -17.820843532269635, 111.2084308621338 -17.820843532269635, 111.2084308621338 -18.13348991002875, 107.14337072618113 -18.13348991002875, 107.14337072618113 -18.44613628778787, 102.49758771366379 -18.44613628778787, 102.49758771366379 -18.758782665546985, 98.43252757771111 -18.758782665546985, 98.43252757771111 -19.0714290433061, 94.94819031832311 -19.0714290433061, 94.94819031832311 -19.38407542106522, 90.88313018237044 -19.38407542106522, 90.88313018237044 -19.696721798824335, 86.81807004641777 -19.696721798824335, 86.81807004641777 -20.00936817658345, 82.7530099104651 -20.00936817658345, 82.7530099104651 -20.322014554342566, 78.97831121279476 -20.322014554342566, 78.97831121279476 -20.63466093210168, 74.62288963855976 -20.63466093210168, 74.62288963855976 -20.9473073098608, 72.59035957058342 -20.9473073098608), + (72.29999813230108 -20.9473073098608, 70.55782950260709 -20.9473073098608, 70.55782950260709 -21.259953687619916, 67.65421511978374 -21.259953687619916, 67.65421511978374 -21.57260006537903, 64.75060073696041 -21.57260006537903, 64.75060073696041 -21.88524644313815, 62.137347792419405 -21.88524644313815, 62.137347792419405 -22.197892820897266, 60.10481772444307 -22.197892820897266, 60.10481772444307 -22.51053919865638, 58.653010533031406 -22.51053919865638, 58.653010533031406 -22.823185576415497, 57.20120334161974 -22.823185576415497, 57.20120334161974 -23.135831954174613, 55.74939615020807 -23.135831954174613, 55.74939615020807 -23.44847833193373, 54.587950397078735 -23.44847833193373, 54.587950397078735 -23.761124709692847, 53.71686608223173 -23.761124709692847, 53.71686608223173 -24.073771087451963, 52.84578176738473 -24.073771087451963, 52.84578176738473 -24.386417465211082, 51.97469745253773 -24.386417465211082, 51.97469745253773 -24.699063842970197, 51.39397457597306 -24.699063842970197, 51.39397457597306 -25.011710220729313, 51.10361313769073 -25.011710220729313, 51.10361313769073 -25.32435659848843, 50.52289026112606 -25.32435659848843, 50.52289026112606 -25.637002976247544, 50.232528822843726 -25.637002976247544, 50.232528822843726 -26.26229573176578, 49.942167384561394 -26.26229573176578, 49.942167384561394 -27.20023486504313, 50.232528822843726 -27.20023486504313, 50.232528822843726 -27.82552762056136, 50.52289026112606 -27.82552762056136, 50.52289026112606 -28.450820376079594, 50.8132516994084 -28.450820376079594, 50.8132516994084 -28.76346675383871, 51.10361313769073 -28.76346675383871, 51.10361313769073 -29.076113131597825, 51.39397457597306 -29.076113131597825, 51.39397457597306 -29.388759509356944, 51.68433601425539 -29.388759509356944, 51.68433601425539 -29.70140588711606, 51.97469745253773 -29.70140588711606, 51.97469745253773 -30.014052264875176, 52.5554203291024 -30.014052264875176, 52.5554203291024 -30.32669864263429, 52.84578176738473 -30.32669864263429, 52.84578176738473 -30.639345020393407, 53.13614320566706 -30.639345020393407, 53.13614320566706 -30.951991398152526, 53.71686608223173 -30.951991398152526, 53.71686608223173 -31.26463777591164, 54.007227520514064 -31.26463777591164, 54.007227520514064 -31.577284153670757, 54.587950397078735 -31.577284153670757, 54.587950397078735 -31.889930531429876, 54.87831183536107 -31.889930531429876, 54.87831183536107 -32.20257690918899, 55.45903471192573 -32.20257690918899, 55.45903471192573 -32.51522328694811, 56.0397575884904 -32.51522328694811, 56.0397575884904 -32.82786966470722, 56.62048046505507 -32.82786966470722, 56.62048046505507 -33.14051604246634, 57.20120334161974 -33.14051604246634, 57.20120334161974 -33.45316242022545, 57.49156477990207 -33.45316242022545, 57.49156477990207 -33.765808797984576, 58.072287656466735 -33.765808797984576, 58.072287656466735 -34.07845517574369, 58.653010533031406 -34.07845517574369, 58.653010533031406 -34.39110155350281, 59.5240948478784 -34.39110155350281, 59.5240948478784 -34.70374793126192, 60.10481772444307 -34.70374793126192, 60.10481772444307 -35.01639430902104, 60.68554060100774 -35.01639430902104, 60.68554060100774 -35.329040686780154, 61.84698635413707 -35.329040686780154, 61.84698635413707 -35.64168706453927, 63.00843210726641 -35.64168706453927, 63.00843210726641 -35.954333442298385, 64.46023929867808 -35.954333442298385, 64.46023929867808 -36.2669798200575, 65.91204649008975 -36.2669798200575, 65.91204649008975 -36.57962619781662, 67.36385368150141 -36.57962619781662, 67.36385368150141 -36.89227257557574, 68.81566087291309 -36.89227257557574, 68.81566087291309 -37.204918953334854, 70.55782950260709 -37.204918953334854, 70.55782950260709 -37.51756533109397, 72.29999813230108 -37.51756533109397), + (297.3301128011097 -49.71077406369951, 296.4590284862627 -49.71077406369951, 296.4590284862627 -50.023420441458626, 295.5879441714157 -50.023420441458626, 295.5879441714157 -50.33606681921774, 294.7168598565687 -50.33606681921774, 294.7168598565687 -50.64871319697686, 293.8457755417217 -50.64871319697686, 293.8457755417217 -50.96135957473597, 292.9746912268747 -50.96135957473597, 292.9746912268747 -51.27400595249509, 292.39396835031005 -51.27400595249509, 292.39396835031005 -51.58665233025421, 291.522884035463 -51.58665233025421, 291.522884035463 -51.899298708013326, 290.651799720616 -51.899298708013326, 290.651799720616 -52.21194508577244, 290.07107684405133 -52.21194508577244, 290.07107684405133 -52.52459146353156, 289.19999252920434 -52.52459146353156, 289.19999252920434 -52.83723784129067, 288.6192696526397 -52.83723784129067, 288.6192696526397 -53.14988421904979, 287.7481853377927 -53.14988421904979, 287.7481853377927 -53.462530596808904, 286.58673958466335 -53.462530596808904, 286.58673958466335 -53.14988421904979, 275.843366368217 -53.14988421904979, 275.843366368217 -52.83723784129067, 274.97228205337 -52.83723784129067, 274.97228205337 -52.52459146353156, 274.101197738523 -52.52459146353156, 274.101197738523 -52.21194508577244, 272.9397519853937 -52.21194508577244, 272.9397519853937 -51.899298708013326, 272.0686676705467 -51.899298708013326, 272.0686676705467 -51.58665233025421, 270.9072219174173 -51.58665233025421, 270.9072219174173 -51.27400595249509, 269.745776164288 -51.27400595249509, 269.745776164288 -50.96135957473597, 268.874691849441 -50.96135957473597, 268.874691849441 -50.64871319697686, 267.71324609631165 -50.64871319697686, 267.71324609631165 -50.33606681921774, 266.5518003431823 -50.33606681921774, 266.5518003431823 -50.023420441458626, 265.390354590053 -50.023420441458626, 265.390354590053 -49.71077406369951, 262.777101645512 -49.71077406369951, 262.777101645512 -49.398127685940395, 260.16384870097096 -49.398127685940395, 260.16384870097096 -49.08548130818128, 257.55059575642997 -49.08548130818128, 257.55059575642997 -48.772834930422164, 254.93734281188898 -48.772834930422164, 254.93734281188898 -48.46018855266304, 250.0011983610893 -48.46018855266304, 250.0011983610893 -48.147542174903926, 243.9036081571603 -48.147542174903926, 243.9036081571603 -47.83489579714481, 240.4192708977723 -47.83489579714481, 240.4192708977723 -47.522249419385695, 237.51565651494894 -47.522249419385695, 237.51565651494894 -47.20960304162658, 234.90240357040796 -47.20960304162658, 234.90240357040796 -46.89695666386746, 232.28915062586694 -46.89695666386746, 232.28915062586694 -46.58431028610835, 230.54698199617295 -46.58431028610835, 230.54698199617295 -46.271663908349225, 229.96625911960828 -46.271663908349225, 229.96625911960828 -45.95901753059011, 229.09517480476129 -45.95901753059011, 229.09517480476129 -45.646371152830994, 228.2240904899143 -45.646371152830994, 228.2240904899143 -45.33372477507188, 227.35300617506726 -45.33372477507188, 227.35300617506726 -45.02107839731276, 226.48192186022027 -45.02107839731276, 226.48192186022027 -44.70843201955365, 225.61083754537327 -44.70843201955365, 225.61083754537327 -44.39578564179453, 224.73975323052628 -44.39578564179453, 224.73975323052628 -44.08313926403542, 223.86866891567928 -44.08313926403542, 223.86866891567928 -43.7704928862763, 222.70722316254992 -43.7704928862763, 222.70722316254992 -43.45784650851718, 221.83613884770293 -43.45784650851718, 221.83613884770293 -43.14520013075806, 220.6746930945736 -43.14520013075806, 220.6746930945736 -42.83255375299895, 219.51324734144427 -42.83255375299895, 219.51324734144427 -42.51990737523983, 217.19035583518558 -42.51990737523983, 217.19035583518558 -42.20726099748072, 214.5771028906446 -42.20726099748072, 214.5771028906446 -41.8946146197216, 211.09276563125658 -41.8946146197216, 211.09276563125658 -41.581968241962485, 203.83372967419825 -41.581968241962485, 203.83372967419825 -41.26932186420336, 200.0590309765279 -41.26932186420336, 200.0590309765279 -40.95667548644425, 197.44577803198692 -40.95667548644425, 197.44577803198692 -40.64402910868513, 196.5746937171399 -40.64402910868513, 196.5746937171399 -40.95667548644425, 195.41324796401057 -40.95667548644425, 195.41324796401057 -41.26932186420336, 193.9614407725989 -41.26932186420336, 193.9614407725989 -41.581968241962485, 192.50963358118724 -41.581968241962485, 192.50963358118724 -41.8946146197216, 191.05782638977556 -41.8946146197216, 191.05782638977556 -42.20726099748072, 189.89638063664623 -42.20726099748072, 189.89638063664623 -42.51990737523983, 188.44457344523457 -42.51990737523983, 188.44457344523457 -42.83255375299895, 186.99276625382288 -42.83255375299895, 186.99276625382288 -43.14520013075806, 185.83132050069355 -43.14520013075806, 185.83132050069355 -43.45784650851718, 184.3795133092819 -43.45784650851718, 184.3795133092819 -43.7704928862763, 182.92770611787023 -43.7704928862763, 182.92770611787023 -44.08313926403542, 181.76626036474087 -44.08313926403542, 181.76626036474087 -44.39578564179453, 180.60481461161154 -44.39578564179453, 180.60481461161154 -44.70843201955365, 179.15300742019988 -44.70843201955365, 179.15300742019988 -45.02107839731276, 177.99156166707056 -45.02107839731276, 177.99156166707056 -45.33372477507188, 177.12047735222356 -45.33372477507188, 177.12047735222356 -45.646371152830994, 175.9590315990942 -45.646371152830994, 175.9590315990942 -45.95901753059011, 174.79758584596487 -45.95901753059011, 174.79758584596487 -46.271663908349225, 169.28071851860054 -46.271663908349225, 169.28071851860054 -46.58431028610835, 161.73132112325987 -46.58431028610835, 161.73132112325987 -46.89695666386746, 149.82650215368417 -46.89695666386746, 149.82650215368417 -46.58431028610835, 141.69638188177885 -46.58431028610835, 141.69638188177885 -46.271663908349225, 138.7927674989555 -46.271663908349225, 138.7927674989555 -45.95901753059011, 137.0505988692615 -45.95901753059011, 137.0505988692615 -45.646371152830994, 135.30843023956749 -45.646371152830994, 135.30843023956749 -45.33372477507188, 133.85662304815583 -45.33372477507188, 133.85662304815583 -45.02107839731276, 132.6951772950265 -45.02107839731276, 132.6951772950265 -44.70843201955365, 131.53373154189717 -44.70843201955365, 131.53373154189717 -44.39578564179453, 130.3722857887678 -44.39578564179453, 130.3722857887678 -44.08313926403542, 129.50120147392082 -44.08313926403542, 129.50120147392082 -43.7704928862763, 128.3397557207915 -43.7704928862763, 128.3397557207915 -43.45784650851718, 127.46867140594449 -43.45784650851718, 127.46867140594449 -43.14520013075806, 126.59758709109748 -43.14520013075806, 126.59758709109748 -42.83255375299895, 125.72650277625048 -42.83255375299895, 125.72650277625048 -42.51990737523983, 125.14577989968582 -42.51990737523983, 125.14577989968582 -42.20726099748072, 124.27469558483881 -42.20726099748072, 124.27469558483881 -41.8946146197216, 123.40361126999181 -41.8946146197216, 123.40361126999181 -41.581968241962485, 122.82288839342715 -41.581968241962485, 122.82288839342715 -41.26932186420336, 121.95180407858015 -41.26932186420336, 121.95180407858015 -40.95667548644425, 121.08071976373314 -40.95667548644425, 121.08071976373314 -40.64402910868513, 120.49999688716848 -40.64402910868513, 120.49999688716848 -40.331382730926016, 119.62891257232148 -40.331382730926016, 119.62891257232148 -40.0187363531669, 119.0481896957568 -40.0187363531669, 119.0481896957568 -39.706089975407785, 118.17710538090981 -39.706089975407785, 118.17710538090981 -39.39344359764867, 117.01565962778048 -39.39344359764867, 117.01565962778048 -39.080797219889554, 114.98312955980414 -39.080797219889554, 114.98312955980414 -38.76815084213044, 113.24096093011013 -38.76815084213044, 113.24096093011013 -38.455504464371316, 111.78915373869847 -38.455504464371316, 111.78915373869847 -38.1428580866122, 110.3373465472868 -38.1428580866122, 110.3373465472868 -37.830211708853085, 109.17590079415747 -37.830211708853085, 109.17590079415747 -37.51756533109397, 108.01445504102813 -37.51756533109397, 108.01445504102813 -37.204918953334854, 106.8530092878988 -37.204918953334854, 106.8530092878988 -36.89227257557574, 104.82047921992246 -36.89227257557574, 104.82047921992246 -36.57962619781662, 101.33614196053446 -36.57962619781662, 101.33614196053446 -36.2669798200575, 97.85180470114645 -36.2669798200575, 97.85180470114645 -35.954333442298385, 90.01204586752344 -35.954333442298385, 90.01204586752344 -36.2669798200575, 87.68915436126477 -36.2669798200575, 87.68915436126477 -36.57962619781662, 85.65662429328843 -36.57962619781662, 85.65662429328843 -36.89227257557574, 84.20481710187677 -36.89227257557574, 84.20481710187677 -37.204918953334854, 76.07469682997143 -37.204918953334854, 76.07469682997143 -37.51756533109397, 72.59035957058342 -37.51756533109397))MULTILINESTRING ((179.15300742019988 -30.014052264875176, 179.15300742019988 -29.388759509356944, 179.44336885848222 -29.388759509356944, 179.44336885848222 -29.076113131597825, 179.15300742019988 -29.076113131597825, 179.15300742019988 -28.450820376079594, 178.86264598191755 -28.450820376079594, 178.86264598191755 -28.138173998320475, 178.57228454363522 -28.138173998320475, 178.57228454363522 -27.82552762056136, 177.99156166707056 -27.82552762056136, 177.99156166707056 -27.512881242802244, 177.12047735222356 -27.512881242802244, 177.12047735222356 -27.20023486504313, 175.9590315990942 -27.20023486504313, 175.9590315990942 -26.887588487284013, 172.1843329014239 -26.887588487284013, 172.1843329014239 -27.20023486504313, 170.15180283344753 -27.20023486504313, 170.15180283344753 -27.512881242802244, 168.1192727654712 -27.512881242802244, 168.1192727654712 -27.82552762056136, 166.08674269749486 -27.82552762056136, 166.08674269749486 -28.138173998320475, 164.34457406780086 -28.138173998320475, 164.34457406780086 -28.450820376079594, 162.31204399982454 -28.450820376079594, 162.31204399982454 -28.76346675383871, 159.98915249356585 -28.76346675383871, 159.98915249356585 -29.076113131597825, 158.24698386387186 -29.076113131597825, 158.24698386387186 -29.388759509356944, 157.08553811074253 -29.388759509356944, 157.08553811074253 -29.70140588711606, 155.92409235761318 -29.70140588711606, 155.92409235761318 -30.014052264875176, 155.3433694810485 -30.014052264875176, 155.3433694810485 -30.951991398152526, 155.92409235761318 -30.951991398152526, 155.92409235761318 -31.26463777591164, 156.7951766724602 -31.26463777591164, 156.7951766724602 -31.577284153670757, 158.24698386387186 -31.577284153670757, 158.24698386387186 -31.889930531429876, 159.98915249356585 -31.889930531429876, 159.98915249356585 -32.20257690918899, 162.0216825615422 -32.20257690918899, 162.0216825615422 -32.51522328694811, 166.08674269749486 -32.51522328694811, 166.08674269749486 -32.82786966470722, 171.02288714829453 -32.82786966470722, 171.02288714829453 -33.14051604246634, 174.79758584596487 -33.14051604246634, 174.79758584596487 -32.82786966470722, 175.37830872252954 -32.82786966470722, 175.37830872252954 -32.51522328694811, 175.9590315990942 -32.51522328694811, 175.9590315990942 -32.20257690918899, 176.24939303737654 -32.20257690918899, 176.24939303737654 -31.889930531429876, 176.8301159139412 -31.889930531429876, 176.8301159139412 -31.577284153670757, 177.4108387905059 -31.577284153670757, 177.4108387905059 -31.26463777591164, 177.70120022878822 -31.26463777591164, 177.70120022878822 -30.951991398152526, 178.2819231053529 -30.951991398152526, 178.2819231053529 -30.639345020393407, 178.57228454363522 -30.639345020393407, 178.57228454363522 -30.32669864263429, 178.86264598191755 -30.32669864263429, 178.86264598191755 -30.014052264875176, 179.15300742019988 -30.014052264875176), + (297.3301128011097 -9.69203771053261, 297.03975136282736 -9.69203771053261, 297.03975136282736 -10.004684088291725, 296.749389924545 -10.004684088291725, 296.749389924545 -10.31733046605084, 296.4590284862627 -10.31733046605084, 296.4590284862627 -10.629976843809958, 296.16866704798036 -10.629976843809958, 296.16866704798036 -10.942623221569075, 295.5879441714157 -10.942623221569075, 295.5879441714157 -11.25526959932819, 295.29758273313337 -11.25526959932819, 295.29758273313337 -11.567915977087306, 294.7168598565687 -11.567915977087306, 294.7168598565687 -11.880562354846424, 294.42649841828637 -11.880562354846424, 294.42649841828637 -12.193208732605541, 293.8457755417217 -12.193208732605541, 293.8457755417217 -12.505855110364656, 293.26505266515704 -12.505855110364656, 293.26505266515704 -12.818501488123772, 292.6843297885924 -12.818501488123772, 292.6843297885924 -13.13114786588289, 292.39396835031005 -13.13114786588289, 292.39396835031005 -13.443794243642007, 291.8132454737453 -13.443794243642007, 291.8132454737453 -13.756440621401122, 291.23252259718066 -13.756440621401122, 291.23252259718066 -14.069086999160238, 290.651799720616 -14.069086999160238, 290.651799720616 -14.381733376919355, 290.07107684405133 -14.381733376919355, 290.07107684405133 -14.694379754678472, 289.49035396748667 -14.694379754678472, 289.49035396748667 -15.007026132437588, 288.909631090922 -15.007026132437588, 288.909631090922 -15.319672510196703, 288.32890821435734 -15.319672510196703, 288.32890821435734 -15.63231888795582, 287.7481853377927 -15.63231888795582, 287.7481853377927 -15.944965265714938, 286.8771010229457 -15.944965265714938, 286.8771010229457 -16.257611643474053, 286.0060167080987 -16.257611643474053, 286.0060167080987 -16.57025802123317, 285.425293831534 -16.57025802123317, 285.425293831534 -16.882904398992288, 284.554209516687 -16.882904398992288, 284.554209516687 -17.195550776751404, 283.97348664012236 -17.195550776751404, 283.97348664012236 -17.50819715451052, 283.10240232527536 -17.50819715451052, 283.10240232527536 -17.820843532269635, 282.5216794487107 -17.820843532269635, 282.5216794487107 -18.13348991002875, 281.65059513386365 -18.13348991002875, 281.65059513386365 -18.44613628778787, 281.069872257299 -18.44613628778787, 281.069872257299 -18.758782665546985, 280.4891493807343 -18.758782665546985, 280.4891493807343 -19.0714290433061, 279.6180650658873 -19.0714290433061, 279.6180650658873 -19.38407542106522, 279.03734218932266 -19.38407542106522, 279.03734218932266 -19.696721798824335, 278.456619312758 -19.696721798824335, 278.456619312758 -20.00936817658345, 277.585534997911 -20.00936817658345, 277.585534997911 -20.322014554342566, 277.00481212134633 -20.322014554342566, 277.00481212134633 -20.63466093210168, 276.42408924478167 -20.63466093210168, 276.42408924478167 -20.9473073098608, 274.97228205337 -20.9473073098608, 274.97228205337 -21.259953687619916, 273.8108363002407 -21.259953687619916, 273.8108363002407 -21.57260006537903, 272.359029108829 -21.57260006537903, 272.359029108829 -21.88524644313815, 271.19758335569963 -21.88524644313815, 271.19758335569963 -22.197892820897266, 270.0361376025703 -22.197892820897266, 270.0361376025703 -22.51053919865638, 269.1650532877233 -22.51053919865638, 269.1650532877233 -22.823185576415497, 268.003607534594 -22.823185576415497, 268.003607534594 -23.135831954174613, 267.132523219747 -23.135831954174613, 267.132523219747 -23.44847833193373, 266.2614389049 -23.44847833193373, 266.2614389049 -23.761124709692847, 265.390354590053 -23.761124709692847, 265.390354590053 -24.073771087451963, 263.06746308379434 -24.073771087451963, 263.06746308379434 -24.386417465211082, 260.7445715775356 -24.386417465211082, 260.7445715775356 -24.699063842970197, 258.42168007127697 -24.699063842970197, 258.42168007127697 -25.011710220729313, 256.679511441583 -25.011710220729313, 256.679511441583 -25.32435659848843, 255.2277042501713 -25.32435659848843, 255.2277042501713 -25.637002976247544, 253.19517418219496 -25.637002976247544, 253.19517418219496 -25.949649354006663, 245.93613822513663 -25.949649354006663, 245.93613822513663 -26.26229573176578, 242.16143952746629 -26.26229573176578, 242.16143952746629 -26.574942109524894, 241.2903552126193 -26.574942109524894, 241.2903552126193 -26.887588487284013, 240.4192708977723 -26.887588487284013, 240.4192708977723 -27.20023486504313, 239.5481865829253 -27.20023486504313, 239.5481865829253 -27.512881242802244, 238.6771022680783 -27.512881242802244, 238.6771022680783 -27.82552762056136, 237.80601795323128 -27.82552762056136, 237.80601795323128 -28.138173998320475, 237.2252950766666 -28.138173998320475, 237.2252950766666 -28.450820376079594, 236.35421076181962 -28.450820376079594, 236.35421076181962 -28.76346675383871, 235.77348788525495 -28.76346675383871, 235.77348788525495 -29.076113131597825, 235.1927650086903 -29.076113131597825, 235.1927650086903 -29.388759509356944, 234.61204213212562 -29.388759509356944, 234.61204213212562 -29.70140588711606, 234.3216806938433 -29.70140588711606, 234.3216806938433 -30.014052264875176, 233.74095781727863 -30.014052264875176, 233.74095781727863 -30.32669864263429, 233.4505963789963 -30.32669864263429, 233.4505963789963 -30.639345020393407, 233.16023494071393 -30.639345020393407, 233.16023494071393 -30.951991398152526, 232.8698735024316 -30.951991398152526, 232.8698735024316 -31.26463777591164, 232.57951206414927 -31.26463777591164, 232.57951206414927 -31.577284153670757, 232.28915062586694 -31.577284153670757, 232.28915062586694 -33.14051604246634, 232.57951206414927 -33.14051604246634, 232.57951206414927 -33.765808797984576, 232.8698735024316 -33.765808797984576, 232.8698735024316 -34.07845517574369, 233.16023494071393 -34.07845517574369, 233.16023494071393 -34.39110155350281, 233.4505963789963 -34.39110155350281, 233.4505963789963 -34.70374793126192, 234.03131925556096 -34.70374793126192, 234.03131925556096 -35.01639430902104, 234.61204213212562 -35.01639430902104, 234.61204213212562 -35.329040686780154, 234.90240357040796 -35.329040686780154, 234.90240357040796 -35.64168706453927, 235.77348788525495 -35.64168706453927, 235.77348788525495 -35.954333442298385, 236.35421076181962 -35.954333442298385, 236.35421076181962 -36.2669798200575, 236.93493363838428 -36.2669798200575, 236.93493363838428 -36.57962619781662, 237.80601795323128 -36.57962619781662, 237.80601795323128 -36.89227257557574, 238.6771022680783 -36.89227257557574, 238.6771022680783 -37.204918953334854, 239.5481865829253 -37.204918953334854, 239.5481865829253 -37.51756533109397, 240.4192708977723 -37.51756533109397, 240.4192708977723 -37.830211708853085, 241.58071665090162 -37.830211708853085, 241.58071665090162 -38.1428580866122, 243.03252384231328 -38.1428580866122, 243.03252384231328 -38.455504464371316, 254.64698137360665 -38.455504464371316, 254.64698137360665 -38.76815084213044, 256.0987885650183 -38.76815084213044, 256.0987885650183 -39.080797219889554, 258.13131863299463 -39.080797219889554, 258.13131863299463 -39.39344359764867, 260.4542101392533 -39.39344359764867, 260.4542101392533 -39.706089975407785, 262.777101645512 -39.706089975407785, 262.777101645512 -40.0187363531669, 265.09999315177066 -40.0187363531669, 265.09999315177066 -40.331382730926016, 265.6807160283353 -40.331382730926016, 265.6807160283353 -40.64402910868513, 266.5518003431823 -40.64402910868513, 266.5518003431823 -40.95667548644425, 267.132523219747 -40.95667548644425, 267.132523219747 -41.26932186420336, 267.71324609631165 -41.26932186420336, 267.71324609631165 -41.581968241962485, 268.58433041115865 -41.581968241962485, 268.58433041115865 -41.8946146197216, 269.1650532877233 -41.8946146197216, 269.1650532877233 -42.20726099748072, 269.745776164288 -42.20726099748072, 269.745776164288 -42.51990737523983, 270.61686047913497 -42.51990737523983, 270.61686047913497 -42.83255375299895, 271.19758335569963 -42.83255375299895, 271.19758335569963 -43.14520013075806, 271.77830623226436 -43.14520013075806, 271.77830623226436 -43.45784650851718, 272.64939054711135 -43.45784650851718, 272.64939054711135 -43.7704928862763, 273.230113423676 -43.7704928862763, 273.230113423676 -44.08313926403542, 274.101197738523 -44.08313926403542, 274.101197738523 -44.39578564179453, 274.6819206150877 -44.39578564179453, 274.6819206150877 -44.70843201955365, 275.26264349165234 -44.70843201955365, 275.26264349165234 -45.02107839731276, 276.13372780649934 -45.02107839731276, 276.13372780649934 -45.33372477507188, 280.4891493807343 -45.33372477507188, 280.4891493807343 -45.646371152830994, 283.10240232527536 -45.646371152830994, 283.10240232527536 -45.95901753059011, 285.71565526981635 -45.95901753059011, 285.71565526981635 -46.271663908349225, 288.32890821435734 -46.271663908349225, 288.32890821435734 -45.95901753059011, 288.909631090922 -45.95901753059011, 288.909631090922 -45.646371152830994, 289.49035396748667 -45.646371152830994, 289.49035396748667 -45.33372477507188, 290.07107684405133 -45.33372477507188, 290.07107684405133 -45.02107839731276, 290.651799720616 -45.02107839731276, 290.651799720616 -44.70843201955365, 291.23252259718066 -44.70843201955365, 291.23252259718066 -44.39578564179453, 292.10360691202766 -44.39578564179453, 292.10360691202766 -44.08313926403542, 292.6843297885924 -44.08313926403542, 292.6843297885924 -43.7704928862763, 293.5554141034394 -43.7704928862763, 293.5554141034394 -43.45784650851718, 294.13613698000404 -43.45784650851718, 294.13613698000404 -43.14520013075806, 295.00722129485104 -43.14520013075806, 295.00722129485104 -42.83255375299895, 295.5879441714157 -42.83255375299895, 295.5879441714157 -42.51990737523983, 296.4590284862627 -42.51990737523983, 296.4590284862627 -42.20726099748072, 297.3301128011097 -42.20726099748072))MULTILINESTRING ((297.3301128011097 -109.73887859344985, 296.4590284862627 -109.73887859344985, 296.4590284862627 -109.42623221569075, 295.29758273313337 -109.42623221569075, 295.29758273313337 -109.11358583793162, 294.13613698000404 -109.11358583793162, 294.13613698000404 -108.80093946017251, 292.6843297885924 -108.80093946017251, 292.6843297885924 -108.48829308241339, 291.23252259718066 -108.48829308241339, 291.23252259718066 -108.17564670465428, 289.780715405769 -108.17564670465428, 289.780715405769 -107.86300032689516, 288.038546776075 -107.86300032689516, 288.038546776075 -107.55035394913605, 287.45782389951034 -107.55035394913605, 287.45782389951034 -107.86300032689516, 286.8771010229457 -107.86300032689516, 286.8771010229457 -108.17564670465428, 286.0060167080987 -108.17564670465428, 286.0060167080987 -108.48829308241339, 285.1349323932517 -108.48829308241339, 285.1349323932517 -108.80093946017251, 284.554209516687 -108.80093946017251, 284.554209516687 -109.11358583793162, 283.97348664012236 -109.11358583793162, 283.97348664012236 -109.42623221569075, 283.10240232527536 -109.42623221569075, 283.10240232527536 -109.73887859344985, 282.5216794487107 -109.73887859344985, 282.5216794487107 -110.05152497120898, 281.940956572146 -110.05152497120898, 281.940956572146 -110.3641713489681, 281.3602336955813 -110.3641713489681, 281.3602336955813 -110.67681772672721, 280.77951081901665 -110.67681772672721, 280.77951081901665 -110.98946410448633, 279.90842650416965 -110.98946410448633, 279.90842650416965 -111.30211048224544, 279.327703627605 -111.30211048224544, 279.327703627605 -111.61475686000456, 278.7469807510403 -111.61475686000456, 278.7469807510403 -111.92740323776367, 278.16625787447566 -111.92740323776367, 278.16625787447566 -112.24004961552279, 277.585534997911 -112.24004961552279, 277.585534997911 -112.5526959932819, 276.714450683064 -112.5526959932819, 276.714450683064 -112.86534237104102, 274.97228205337 -112.86534237104102, 274.97228205337 -112.5526959932819, 272.64939054711135 -112.5526959932819, 272.64939054711135 -112.24004961552279, 270.0361376025703 -112.24004961552279, 270.0361376025703 -111.92740323776367, 265.97107746661766 -111.92740323776367, 265.97107746661766 -111.61475686000456, 263.648185960359 -111.61475686000456, 263.648185960359 -111.30211048224544, 262.19637876894734 -111.30211048224544, 262.19637876894734 -110.98946410448633, 261.03493301581796 -110.98946410448633, 261.03493301581796 -110.67681772672721, 259.8734872626886 -110.67681772672721, 259.8734872626886 -110.3641713489681, 259.00240294784163 -110.3641713489681, 259.00240294784163 -110.05152497120898, 258.13131863299463 -110.05152497120898, 258.13131863299463 -109.73887859344985, 257.26023431814764 -109.73887859344985, 257.26023431814764 -109.42623221569075, 256.38915000330064 -109.42623221569075, 256.38915000330064 -109.11358583793162, 255.51806568845365 -109.11358583793162, 255.51806568845365 -108.80093946017251, 254.93734281188898 -108.80093946017251, 254.93734281188898 -108.48829308241339, 254.06625849704199 -108.48829308241339, 254.06625849704199 -108.17564670465428, 253.77589705875965 -108.17564670465428, 253.77589705875965 -108.48829308241339, 253.4855356204773 -108.48829308241339, 253.4855356204773 -109.73887859344985, 253.19517418219496 -109.73887859344985, 253.19517418219496 -111.30211048224544, 252.90481274391263 -111.30211048224544, 252.90481274391263 -112.86534237104102, 252.6144513056303 -112.86534237104102, 252.6144513056303 -115.05386701535484, 252.32408986734796 -115.05386701535484, 252.32408986734796 -117.86768441518689, 252.03372842906563 -117.86768441518689, 252.03372842906563 -122.24473370381452, 251.7433669907833 -122.24473370381452, 251.7433669907833 -131.93677141434713), + (234.61204213212562 -116.61709890415042, 234.61204213212562 -114.74122063759572, 234.3216806938433 -114.74122063759572, 234.3216806938433 -112.5526959932819, 234.03131925556096 -112.5526959932819, 234.03131925556096 -110.67681772672721, 233.74095781727863 -110.67681772672721, 233.74095781727863 -109.42623221569075, 233.4505963789963 -109.42623221569075, 233.4505963789963 -108.17564670465428, 233.16023494071393 -108.17564670465428, 233.16023494071393 -107.23770757137693, 232.8698735024316 -107.23770757137693, 232.8698735024316 -106.29976843809958, 232.57951206414927 -106.29976843809958, 232.57951206414927 -105.36182930482224, 232.28915062586694 -105.36182930482224, 232.28915062586694 -104.42389017154488, 231.9987891875846 -104.42389017154488, 231.9987891875846 -103.79859741602665, 231.70842774930227 -103.79859741602665, 231.70842774930227 -103.17330466050842, 231.41806631101994 -103.17330466050842, 231.41806631101994 -102.54801190499018, 231.1277048727376 -102.54801190499018, 231.1277048727376 -102.23536552723107, 230.54698199617295 -102.23536552723107, 230.54698199617295 -101.92271914947194, 229.96625911960828 -101.92271914947194, 229.96625911960828 -101.61007277171284, 229.09517480476129 -101.61007277171284, 229.09517480476129 -101.29742639395371, 228.51445192819662 -101.29742639395371, 228.51445192819662 -100.9847800161946, 227.93372905163193 -100.9847800161946, 227.93372905163193 -100.67213363843548, 227.06264473678493 -100.67213363843548, 227.06264473678493 -100.35948726067637, 226.48192186022027 -100.35948726067637, 226.48192186022027 -100.04684088291725, 225.61083754537327 -100.04684088291725, 225.61083754537327 -99.73419450515813, 225.0301146688086 -99.73419450515813, 225.0301146688086 -99.42154812739902, 224.1590303539616 -99.42154812739902, 224.1590303539616 -99.1089017496399, 223.28794603911462 -99.1089017496399, 223.28794603911462 -98.79625537188079, 222.4168617242676 -98.79625537188079, 222.4168617242676 -98.48360899412167, 221.83613884770293 -98.48360899412167, 221.83613884770293 -98.17096261636256, 220.96505453285593 -98.17096261636256, 220.96505453285593 -97.85831623860344, 219.8036087797266 -97.85831623860344, 219.8036087797266 -97.54566986084433, 219.51324734144427 -97.54566986084433))MULTILINESTRING ((189.6060191983639 -91.91803506118022, 185.54095906241122 -91.91803506118022, 185.54095906241122 -91.60538868342111, 183.5084289944349 -91.60538868342111, 183.5084289944349 -91.29274230566199, 182.05662180302323 -91.29274230566199, 182.05662180302323 -91.60538868342111, 180.02409173504688 -91.60538868342111, 180.02409173504688 -91.91803506118022, 178.86264598191755 -91.91803506118022, 178.86264598191755 -92.23068143893934, 177.99156166707056 -92.23068143893934, 177.99156166707056 -92.54332781669845, 177.70120022878822 -92.54332781669845, 177.70120022878822 -92.85597419445757, 177.12047735222356 -92.85597419445757, 177.12047735222356 -93.1686205722167, 176.53975447565887 -93.1686205722167, 176.53975447565887 -93.4812669499758, 175.9590315990942 -93.4812669499758, 175.9590315990942 -93.79391332773493, 175.37830872252954 -93.79391332773493, 175.37830872252954 -94.10655970549404, 175.0879472842472 -94.10655970549404, 175.0879472842472 -94.41920608325316, 174.50722440768254 -94.41920608325316, 174.50722440768254 -94.73185246101227, 173.63614009283555 -94.73185246101227, 173.63614009283555 -95.04449883877139, 172.76505577798855 -95.04449883877139, 172.76505577798855 -95.35714521653051, 171.89397146314155 -95.35714521653051, 171.89397146314155 -95.66979159428962, 171.02288714829453 -95.66979159428962, 171.02288714829453 -95.98243797204874, 169.8614413951652 -95.98243797204874, 169.8614413951652 -96.29508434980785, 168.9903570803182 -96.29508434980785, 168.9903570803182 -96.60773072756697, 168.1192727654712 -96.60773072756697, 168.1192727654712 -96.92037710532608, 167.2481884506242 -96.92037710532608, 167.2481884506242 -97.2330234830852, 166.08674269749486 -97.2330234830852, 166.08674269749486 -97.54566986084433, 165.21565838264786 -97.54566986084433, 165.21565838264786 -97.85831623860344, 164.34457406780086 -97.85831623860344, 164.34457406780086 -98.17096261636256, 163.18312831467154 -98.17096261636256, 163.18312831467154 -98.48360899412167, 162.31204399982454 -98.48360899412167, 162.31204399982454 -98.79625537188079, 161.4409596849775 -98.79625537188079, 161.4409596849775 -99.1089017496399, 160.56987537013052 -99.1089017496399, 160.56987537013052 -99.42154812739902, 159.69879105528352 -99.42154812739902, 159.69879105528352 -99.73419450515813, 158.82770674043653 -99.73419450515813, 158.82770674043653 -100.04684088291725, 157.95662242558953 -100.04684088291725, 157.95662242558953 -100.35948726067637, 157.08553811074253 -100.35948726067637, 157.08553811074253 -100.67213363843548, 156.2144537958955 -100.67213363843548, 156.2144537958955 -100.9847800161946, 155.05300804276618 -100.9847800161946, 155.05300804276618 -101.29742639395371, 154.18192372791918 -101.29742639395371, 154.18192372791918 -101.61007277171284, 153.02047797478986 -101.61007277171284, 153.02047797478986 -101.92271914947194, 152.14939365994286 -101.92271914947194, 152.14939365994286 -102.23536552723107, 151.27830934509586 -102.23536552723107, 151.27830934509586 -102.54801190499018, 150.69758646853117 -102.54801190499018, 150.69758646853117 -102.8606582827493, 150.1168635919665 -102.8606582827493, 150.1168635919665 -103.17330466050842, 149.53614071540184 -103.17330466050842, 149.53614071540184 -103.48595103826753, 148.95541783883718 -103.48595103826753, 148.95541783883718 -103.79859741602665, 148.3746949622725 -103.79859741602665, 148.3746949622725 -104.11124379378576, 147.50361064742552 -104.11124379378576, 147.50361064742552 -104.42389017154488, 146.92288777086085 -104.42389017154488, 146.92288777086085 -104.73653654930399, 146.3421648942962 -104.73653654930399, 146.3421648942962 -105.04918292706311, 145.7614420177315 -105.04918292706311, 145.7614420177315 -105.36182930482224, 145.18071914116683 -105.36182930482224, 145.18071914116683 -105.67447568258135, 144.59999626460217 -105.67447568258135, 144.59999626460217 -105.98712206034047, 144.0192733880375 -105.98712206034047, 144.0192733880375 -106.29976843809958, 143.43855051147284 -106.29976843809958, 143.43855051147284 -106.6124148158587, 142.85782763490818 -106.6124148158587, 142.85782763490818 -106.92506119361781, 142.2771047583435 -106.92506119361781, 142.2771047583435 -107.23770757137693, 141.69638188177885 -107.23770757137693, 141.69638188177885 -107.55035394913605, 141.11565900521418 -107.55035394913605, 141.11565900521418 -107.86300032689516, 140.5349361286495 -107.86300032689516, 140.5349361286495 -108.17564670465428, 139.95421325208483 -108.17564670465428, 139.95421325208483 -108.48829308241339, 139.6638518138025 -108.48829308241339, 139.6638518138025 -108.80093946017251, 139.08312893723783 -108.80093946017251, 139.08312893723783 -109.11358583793162, 138.7927674989555 -109.11358583793162, 138.7927674989555 -109.42623221569075, 138.21204462239083 -109.42623221569075, 138.21204462239083 -109.73887859344985, 137.9216831841085 -109.73887859344985, 137.9216831841085 -110.05152497120898, 137.34096030754384 -110.05152497120898, 137.34096030754384 -110.3641713489681, 137.0505988692615 -110.3641713489681, 137.0505988692615 -110.67681772672721, 136.76023743097917 -110.67681772672721, 136.76023743097917 -110.98946410448633, 136.1795145544145 -110.98946410448633, 136.1795145544145 -111.30211048224544, 135.88915311613218 -111.30211048224544, 135.88915311613218 -111.61475686000456, 135.59879167784982 -111.61475686000456, 135.59879167784982 -111.92740323776367, 135.01806880128515 -111.92740323776367, 135.01806880128515 -112.24004961552279, 134.72770736300282 -112.24004961552279, 134.72770736300282 -112.5526959932819, 134.4373459247205 -112.5526959932819, 134.4373459247205 -112.86534237104102, 134.14698448643816 -112.86534237104102, 134.14698448643816 -113.17798874880015, 133.85662304815583 -113.17798874880015, 133.85662304815583 -113.49063512655925, 133.5662616098735 -113.49063512655925, 133.5662616098735 -113.80328150431838, 133.27590017159116 -113.80328150431838, 133.27590017159116 -114.11592788207749, 132.98553873330883 -114.11592788207749, 132.98553873330883 -114.42857425983661, 132.6951772950265 -114.42857425983661, 132.6951772950265 -114.74122063759572, 132.40481585674416 -114.74122063759572, 132.40481585674416 -115.05386701535484, 132.11445441846183 -115.05386701535484, 132.11445441846183 -115.36651339311396, 131.8240929801795 -115.36651339311396, 131.8240929801795 -115.67915977087307, 131.53373154189717 -115.67915977087307, 131.53373154189717 -115.9918061486322, 131.24337010361484 -115.9918061486322, 131.24337010361484 -116.3044525263913, 130.9530086653325 -116.3044525263913, 130.9530086653325 -116.92974528190953, 130.66264722705014 -116.92974528190953, 130.66264722705014 -117.24239165966866, 130.3722857887678 -117.24239165966866, 130.3722857887678 -117.55503803742778, 130.08192435048548 -117.55503803742778, 130.08192435048548 -118.18033079294601, 129.79156291220315 -118.18033079294601, 129.79156291220315 -118.49297717070512, 129.50120147392082 -118.49297717070512, 129.50120147392082 -119.11826992622335, 129.21084003563848 -119.11826992622335, 129.21084003563848 -119.43091630398247, 128.92047859735615 -119.43091630398247, 128.92047859735615 -120.0562090595007, 128.3397557207915 -120.0562090595007, 128.3397557207915 -120.36885543725982, 128.04939428250916 -120.36885543725982, 128.04939428250916 -120.68150181501893, 127.75903284422682 -120.68150181501893, 127.75903284422682 -120.99414819277806, 127.46867140594449 -120.99414819277806, 127.46867140594449 -121.30679457053716, 127.17830996766216 -121.30679457053716, 127.17830996766216 -121.61944094829629, 126.88794852937983 -121.61944094829629, 126.88794852937983 -121.9320873260554, 126.59758709109748 -121.9320873260554, 126.59758709109748 -122.24473370381452, 126.30722565281515 -122.24473370381452, 126.30722565281515 -122.55738008157363, 126.01686421453282 -122.55738008157363, 126.01686421453282 -122.87002645933275, 125.72650277625048 -122.87002645933275, 125.72650277625048 -123.18267283709187, 125.43614133796815 -123.18267283709187, 125.43614133796815 -123.8079655926101, 125.14577989968582 -123.8079655926101, 125.14577989968582 -124.12061197036921, 124.85541846140349 -124.12061197036921, 124.85541846140349 -124.74590472588744, 124.56505702312116 -124.74590472588744, 124.56505702312116 -125.05855110364656, 124.27469558483881 -125.05855110364656, 124.27469558483881 -125.6838438591648, 123.98433414655648 -125.6838438591648, 123.98433414655648 -126.30913661468303, 123.69397270827415 -126.30913661468303, 123.69397270827415 -127.24707574796038, 123.40361126999181 -127.24707574796038, 123.40361126999181 -128.18501488123772, 123.11324983170948 -128.18501488123772, 123.11324983170948 -129.12295401451507, 122.82288839342715 -129.12295401451507, 122.82288839342715 -130.68618590331067, 122.53252695514482 -130.68618590331067, 122.53252695514482 -133.1873569253836, 122.24216551686249 -133.1873569253836, 122.24216551686249 -139.1276381028068, 122.53252695514482 -139.1276381028068, 122.53252695514482 -142.56674825815708, 122.82288839342715 -142.56674825815708, 122.82288839342715 -145.06791928023, 123.11324983170948 -145.06791928023, 123.11324983170948 -147.25644392454382, 123.40361126999181 -147.25644392454382, 123.40361126999181 -149.44496856885763, 123.69397270827415 -149.44496856885763, 123.69397270827415 -151.32084683541234, 123.98433414655648 -151.32084683541234, 123.98433414655648 -152.88407872420794, 124.27469558483881 -152.88407872420794, 124.27469558483881 -154.75995699076262, 124.56505702312116 -154.75995699076262, 124.56505702312116 -156.32318887955822, 124.85541846140349 -156.32318887955822, 124.85541846140349 -158.1990671461129, 125.14577989968582 -158.1990671461129, 125.14577989968582 -159.7622990349085, 125.43614133796815 -159.7622990349085, 125.43614133796815 -161.32553092370406, 125.72650277625048 -161.32553092370406, 125.72650277625048 -163.51405556801788, 126.01686421453282 -163.51405556801788, 126.01686421453282 -165.7025802123317, 126.30722565281515 -165.7025802123317, 126.30722565281515 -167.5784584788864, 126.59758709109748 -167.5784584788864, 126.59758709109748 -168.20375123440462), + (297.3301128011097 -90.66744955014376, 297.03975136282736 -90.66744955014376, 297.03975136282736 -90.98009592790288, 295.5879441714157 -90.98009592790288, 295.5879441714157 -91.29274230566199, 293.8457755417217 -91.29274230566199, 293.8457755417217 -91.60538868342111, 292.39396835031005 -91.60538868342111, 292.39396835031005 -91.91803506118022, 290.651799720616 -91.91803506118022, 290.651799720616 -92.23068143893934, 288.6192696526397 -92.23068143893934, 288.6192696526397 -92.54332781669845, 286.8771010229457 -92.54332781669845, 286.8771010229457 -92.85597419445757, 285.425293831534 -92.85597419445757, 285.425293831534 -93.1686205722167, 284.2638480784047 -93.1686205722167, 284.2638480784047 -93.4812669499758, 282.81204088699303 -93.4812669499758, 282.81204088699303 -93.79391332773493, 281.65059513386365 -93.79391332773493, 281.65059513386365 -94.10655970549404, 280.198787942452 -94.10655970549404, 280.198787942452 -94.41920608325316, 279.327703627605 -94.41920608325316, 279.327703627605 -94.73185246101227, 278.16625787447566 -94.73185246101227, 278.16625787447566 -95.04449883877139, 277.00481212134633 -95.04449883877139, 277.00481212134633 -95.35714521653051, 275.5530049299347 -95.35714521653051, 275.5530049299347 -95.04449883877139, 274.39155917680534 -95.04449883877139, 274.39155917680534 -94.73185246101227, 273.230113423676 -94.73185246101227, 273.230113423676 -94.41920608325316, 272.0686676705467 -94.41920608325316, 272.0686676705467 -94.10655970549404, 270.61686047913497 -94.10655970549404, 270.61686047913497 -93.79391332773493, 269.45541472600564 -93.79391332773493, 269.45541472600564 -93.4812669499758, 268.003607534594 -93.4812669499758, 268.003607534594 -93.1686205722167, 266.5518003431823 -93.1686205722167, 266.5518003431823 -92.85597419445757, 264.80963171348833 -92.85597419445757, 264.80963171348833 -92.54332781669845, 263.93854739864133 -92.54332781669845, 263.93854739864133 -92.23068143893934, 263.06746308379434 -92.23068143893934, 263.06746308379434 -91.91803506118022, 261.906017330665 -91.91803506118022, 261.906017330665 -91.60538868342111, 261.03493301581796 -91.60538868342111, 261.03493301581796 -91.29274230566199, 260.16384870097096 -91.29274230566199, 260.16384870097096 -90.98009592790288, 259.29276438612396 -90.98009592790288, 259.29276438612396 -90.66744955014376, 258.42168007127697 -90.66744955014376, 258.42168007127697 -90.35480317238465, 257.26023431814764 -90.35480317238465, 257.26023431814764 -90.04215679462553, 256.38915000330064 -90.04215679462553, 256.38915000330064 -89.7295104168664, 255.51806568845365 -89.7295104168664, 255.51806568845365 -89.4168640391073, 254.64698137360665 -89.4168640391073, 254.64698137360665 -89.10421766134817, 253.19517418219496 -89.10421766134817, 253.19517418219496 -89.4168640391073, 252.90481274391263 -89.4168640391073, 252.90481274391263 -89.7295104168664, 252.6144513056303 -89.7295104168664, 252.6144513056303 -90.04215679462553, 252.32408986734796 -90.04215679462553, 252.32408986734796 -90.35480317238465, 251.7433669907833 -90.35480317238465, 251.7433669907833 -90.66744955014376, 251.45300555250097 -90.66744955014376, 251.45300555250097 -90.98009592790288, 251.16264411421864 -90.98009592790288, 251.16264411421864 -91.29274230566199, 250.8722826759363 -91.29274230566199, 250.8722826759363 -91.60538868342111, 250.29155979937164 -91.60538868342111, 250.29155979937164 -91.91803506118022, 250.0011983610893 -91.91803506118022, 250.0011983610893 -92.23068143893934, 249.71083692280698 -92.23068143893934, 249.71083692280698 -92.54332781669845, 249.1301140462423 -92.54332781669845, 249.1301140462423 -92.85597419445757, 248.83975260795998 -92.85597419445757, 248.83975260795998 -93.1686205722167, 248.2590297313953 -93.1686205722167, 248.2590297313953 -93.4812669499758, 247.67830685483062 -93.4812669499758, 247.67830685483062 -93.79391332773493, 247.3879454165483 -93.79391332773493, 247.3879454165483 -94.10655970549404, 246.80722253998363 -94.10655970549404, 246.80722253998363 -94.41920608325316, 245.93613822513663 -94.41920608325316, 245.93613822513663 -94.73185246101227, 244.7746924720073 -94.73185246101227, 244.7746924720073 -95.04449883877139, 242.74216240403095 -95.04449883877139, 242.74216240403095 -94.73185246101227, 242.16143952746629 -94.73185246101227, 242.16143952746629 -94.41920608325316, 241.87107808918395 -94.41920608325316, 241.87107808918395 -93.79391332773493, 241.58071665090162 -93.79391332773493, 241.58071665090162 -93.4812669499758, 241.2903552126193 -93.4812669499758, 241.2903552126193 -93.1686205722167, 240.99999377433696 -93.1686205722167, 240.99999377433696 -92.85597419445757, 240.70963233605463 -92.85597419445757, 240.70963233605463 -92.54332781669845, 240.4192708977723 -92.54332781669845, 240.4192708977723 -91.91803506118022, 240.12890945948996 -91.91803506118022, 240.12890945948996 -91.60538868342111, 239.83854802120763 -91.60538868342111, 239.83854802120763 -91.29274230566199, 239.5481865829253 -91.29274230566199, 239.5481865829253 -90.98009592790288, 239.25782514464296 -90.98009592790288, 239.25782514464296 -90.66744955014376, 238.96746370636063 -90.66744955014376, 238.96746370636063 -90.35480317238465, 238.6771022680783 -90.35480317238465, 238.6771022680783 -90.04215679462553, 238.0963793915136 -90.04215679462553, 238.0963793915136 -89.7295104168664, 237.80601795323128 -89.7295104168664, 237.80601795323128 -89.4168640391073, 237.51565651494894 -89.4168640391073, 237.51565651494894 -89.10421766134817, 237.2252950766666 -89.10421766134817, 237.2252950766666 -88.79157128358906, 236.93493363838428 -88.79157128358906, 236.93493363838428 -88.47892490582994, 236.35421076181962 -88.47892490582994, 236.35421076181962 -88.16627852807083, 236.06384932353728 -88.16627852807083, 236.06384932353728 -87.85363215031171, 235.77348788525495 -87.85363215031171, 235.77348788525495 -87.5409857725526, 235.1927650086903 -87.5409857725526, 235.1927650086903 -87.22833939479348, 234.90240357040796 -87.22833939479348, 234.90240357040796 -86.91569301703436, 234.3216806938433 -86.91569301703436, 234.3216806938433 -86.60304663927525, 233.74095781727863 -86.60304663927525, 233.74095781727863 -86.29040026151613, 233.4505963789963 -86.29040026151613, 233.4505963789963 -85.97775388375702, 232.8698735024316 -85.97775388375702, 232.8698735024316 -85.6651075059979, 232.28915062586694 -85.6651075059979, 232.28915062586694 -85.35246112823879, 231.70842774930227 -85.35246112823879, 231.70842774930227 -85.03981475047966, 230.83734343445528 -85.03981475047966, 230.83734343445528 -84.72716837272054, 229.67589768132595 -84.72716837272054, 229.67589768132595 -84.41452199496143, 228.51445192819662 -84.41452199496143, 228.51445192819662 -84.10187561720231, 227.35300617506726 -84.10187561720231, 227.35300617506726 -83.7892292394432, 226.19156042193794 -83.7892292394432, 226.19156042193794 -83.47658286168408, 224.73975323052628 -83.47658286168408, 224.73975323052628 -83.16393648392497, 223.57830747739695 -83.16393648392497, 223.57830747739695 -82.85129010616585, 222.12650028598526 -82.85129010616585, 222.12650028598526 -82.53864372840673, 220.6746930945736 -82.53864372840673, 220.6746930945736 -82.22599735064762, 219.51324734144427 -82.22599735064762, 219.51324734144427 -82.53864372840673, 219.22288590316194 -82.53864372840673, 219.22288590316194 -82.85129010616585, 218.9325244648796 -82.85129010616585, 218.9325244648796 -83.16393648392497, 218.64216302659727 -83.16393648392497, 218.64216302659727 -83.47658286168408, 218.35180158831494 -83.47658286168408, 218.35180158831494 -83.7892292394432, 218.0614401500326 -83.7892292394432, 218.0614401500326 -84.10187561720231, 217.77107871175025 -84.10187561720231, 217.77107871175025 -84.41452199496143, 217.48071727346792 -84.41452199496143, 217.48071727346792 -85.03981475047966, 217.19035583518558 -85.03981475047966, 217.19035583518558 -85.35246112823879))MULTILINESTRING ((106.56264784961647 -229.16979489743233, 106.56264784961647 -224.48009923104559, 106.27228641133412 -224.48009923104559, 106.27228641133412 -224.16745285328648, 105.98192497305179 -224.16745285328648, 105.98192497305179 -230.10773403070968), + (72.29999813230108 -86.91569301703436, 69.68674518776008 -86.91569301703436, 69.68674518776008 -86.60304663927525, 67.07349224321908 -86.60304663927525, 67.07349224321908 -86.29040026151613, 64.46023929867808 -86.29040026151613, 64.46023929867808 -85.97775388375702, 62.137347792419405 -85.97775388375702, 62.137347792419405 -85.6651075059979, 60.395179162725405 -85.6651075059979, 60.395179162725405 -85.35246112823879, 58.653010533031406 -85.35246112823879, 58.653010533031406 -85.03981475047966, 57.49156477990207 -85.03981475047966, 57.49156477990207 -84.72716837272054, 56.0397575884904 -84.72716837272054, 56.0397575884904 -84.41452199496143, 54.87831183536107 -84.41452199496143, 54.87831183536107 -84.10187561720231, 53.71686608223173 -84.10187561720231, 53.71686608223173 -83.7892292394432, 52.84578176738473 -83.7892292394432, 52.84578176738473 -83.47658286168408, 51.68433601425539 -83.47658286168408, 51.68433601425539 -83.16393648392497, 50.8132516994084 -83.16393648392497, 50.8132516994084 -82.85129010616585, 49.942167384561394 -82.85129010616585, 49.942167384561394 -82.53864372840673, 48.78072163143206 -82.53864372840673, 48.78072163143206 -82.22599735064762, 47.61927587830272 -82.22599735064762, 47.61927587830272 -81.9133509728885, 46.45783012517339 -81.9133509728885, 46.45783012517339 -81.60070459512939, 45.29638437204405 -81.60070459512939, 45.29638437204405 -81.28805821737026, 44.13493861891472 -81.28805821737026, 44.13493861891472 -80.97541183961116, 42.97349286578539 -80.97541183961116, 42.97349286578539 -80.66276546185203, 42.102408550938385 -80.66276546185203, 42.102408550938385 -80.35011908409292, 40.94096279780905 -80.35011908409292, 40.94096279780905 -80.0374727063338, 40.06987848296205 -80.0374727063338, 40.06987848296205 -79.72482632857468, 38.90843272983271 -79.72482632857468, 38.90843272983271 -79.41217995081557, 37.746986976703376 -79.41217995081557, 37.746986976703376 -79.09953357305645, 35.714456908727044 -79.09953357305645, 35.714456908727044 -78.78688719529734, 33.39156540246837 -78.78688719529734, 33.39156540246837 -78.47424081753822, 30.77831245792737 -78.47424081753822, 30.77831245792737 -78.16159443977911, 25.551806568845365 -78.16159443977911, 25.551806568845365 -78.47424081753822, 24.39036081571603 -78.47424081753822, 24.39036081571603 -78.78688719529734, 23.228915062586694 -78.78688719529734, 23.228915062586694 -79.09953357305645, 22.357830747739694 -79.09953357305645, 22.357830747739694 -79.41217995081557, 21.486746432892694 -79.41217995081557, 21.486746432892694 -79.72482632857468, 20.61566211804569 -79.72482632857468, 20.61566211804569 -80.0374727063338, 19.74457780319869 -80.0374727063338), + (297.3301128011097 -80.66276546185203, 296.4590284862627 -80.66276546185203, 296.4590284862627 -80.97541183961116, 295.5879441714157 -80.97541183961116, 295.5879441714157 -81.28805821737026, 294.42649841828637 -81.28805821737026, 294.42649841828637 -81.60070459512939, 293.26505266515704 -81.60070459512939, 293.26505266515704 -81.9133509728885, 292.10360691202766 -81.9133509728885, 292.10360691202766 -82.22599735064762, 290.94216115889833 -82.22599735064762, 290.94216115889833 -82.53864372840673, 290.07107684405133 -82.53864372840673, 290.07107684405133 -82.85129010616585, 288.909631090922 -82.85129010616585, 288.909631090922 -83.16393648392497, 287.45782389951034 -83.16393648392497, 287.45782389951034 -83.47658286168408, 284.84457095496936 -83.47658286168408, 284.84457095496936 -83.7892292394432, 282.5216794487107 -83.7892292394432, 282.5216794487107 -84.10187561720231, 280.4891493807343 -84.10187561720231, 280.4891493807343 -84.41452199496143, 278.7469807510403 -84.41452199496143, 278.7469807510403 -84.72716837272054, 277.00481212134633 -84.72716837272054, 277.00481212134633 -85.03981475047966, 275.843366368217 -85.03981475047966, 275.843366368217 -84.72716837272054, 274.6819206150877 -84.72716837272054, 274.6819206150877 -84.41452199496143, 273.52047486195835 -84.41452199496143, 273.52047486195835 -84.10187561720231, 272.359029108829 -84.10187561720231, 272.359029108829 -83.7892292394432, 270.9072219174173 -83.7892292394432, 270.9072219174173 -83.47658286168408, 269.45541472600564 -83.47658286168408, 269.45541472600564 -83.16393648392497, 268.003607534594 -83.16393648392497, 268.003607534594 -82.85129010616585, 266.5518003431823 -82.85129010616585, 266.5518003431823 -82.53864372840673, 265.09999315177066 -82.53864372840673, 265.09999315177066 -82.22599735064762, 263.93854739864133 -82.22599735064762, 263.93854739864133 -81.9133509728885, 262.777101645512 -81.9133509728885, 262.777101645512 -81.60070459512939, 261.6156558923827 -81.60070459512939, 261.6156558923827 -81.28805821737026, 260.4542101392533 -81.28805821737026, 260.4542101392533 -80.97541183961116, 259.29276438612396 -80.97541183961116, 259.29276438612396 -80.66276546185203, 258.13131863299463 -80.66276546185203, 258.13131863299463 -80.35011908409292, 256.9698728798653 -80.35011908409292, 256.9698728798653 -80.0374727063338, 255.80842712673598 -80.0374727063338, 255.80842712673598 -79.72482632857468, 254.64698137360665 -79.72482632857468, 254.64698137360665 -79.41217995081557, 252.6144513056303 -79.41217995081557, 252.6144513056303 -79.72482632857468, 251.45300555250097 -79.72482632857468, 251.45300555250097 -80.0374727063338, 250.0011983610893 -80.0374727063338, 250.0011983610893 -80.35011908409292, 247.67830685483062 -80.35011908409292, 247.67830685483062 -80.66276546185203, 244.7746924720073 -80.66276546185203, 244.7746924720073 -80.35011908409292, 242.45180096574862 -80.35011908409292, 242.45180096574862 -80.0374727063338, 241.87107808918395 -80.0374727063338, 241.87107808918395 -79.72482632857468, 241.2903552126193 -79.72482632857468, 241.2903552126193 -79.41217995081557, 240.4192708977723 -79.41217995081557, 240.4192708977723 -79.09953357305645, 239.83854802120763 -79.09953357305645, 239.83854802120763 -78.78688719529734, 238.96746370636063 -78.78688719529734, 238.96746370636063 -78.47424081753822, 238.0963793915136 -78.47424081753822, 238.0963793915136 -78.16159443977911, 237.2252950766666 -78.16159443977911, 237.2252950766666 -77.84894806201999, 236.35421076181962 -77.84894806201999, 236.35421076181962 -77.53630168426088, 235.48312644697262 -77.53630168426088, 235.48312644697262 -77.22365530650175, 234.3216806938433 -77.22365530650175, 234.3216806938433 -76.91100892874263, 233.16023494071393 -76.91100892874263, 233.16023494071393 -76.59836255098352, 231.9987891875846 -76.59836255098352, 231.9987891875846 -76.2857161732244, 230.54698199617295 -76.2857161732244, 230.54698199617295 -75.97306979546529, 229.38553624304362 -75.97306979546529, 229.38553624304362 -75.66042341770617, 227.93372905163193 -75.66042341770617, 227.93372905163193 -75.34777703994706, 226.48192186022027 -75.34777703994706, 226.48192186022027 -75.03513066218794, 225.0301146688086 -75.03513066218794, 225.0301146688086 -74.72248428442882, 223.57830747739695 -74.72248428442882, 223.57830747739695 -74.40983790666971, 221.83613884770293 -74.40983790666971, 221.83613884770293 -74.09719152891059, 220.09397021800893 -74.09719152891059, 220.09397021800893 -73.78454515115148, 217.48071727346792 -73.78454515115148, 217.48071727346792 -74.09719152891059, 211.67348850782125 -74.09719152891059, 211.67348850782125 -74.40983790666971, 204.99517542732758 -74.40983790666971, 204.99517542732758 -74.72248428442882, 198.60722378511625 -74.72248428442882, 198.60722378511625 -74.40983790666971, 196.86505515542223 -74.40983790666971, 196.86505515542223 -74.72248428442882, 195.7036094022929 -74.72248428442882, 195.7036094022929 -75.03513066218794, 194.8325250874459 -75.03513066218794, 194.8325250874459 -75.34777703994706, 193.67107933431657 -75.34777703994706, 193.67107933431657 -75.66042341770617, 192.79999501946958 -75.66042341770617, 192.79999501946958 -75.97306979546529, 191.63854926634022 -75.97306979546529, 191.63854926634022 -76.2857161732244, 190.76746495149322 -76.2857161732244, 190.76746495149322 -76.59836255098352, 189.6060191983639 -76.59836255098352, 189.6060191983639 -76.91100892874263, 188.7349348835169 -76.91100892874263, 188.7349348835169 -77.22365530650175, 187.57348913038757 -77.22365530650175, 187.57348913038757 -77.53630168426088, 186.70240481554055 -77.53630168426088, 186.70240481554055 -77.84894806201999, 185.54095906241122 -77.84894806201999, 185.54095906241122 -78.16159443977911, 184.3795133092819 -78.16159443977911, 184.3795133092819 -78.47424081753822, 183.5084289944349 -78.47424081753822, 183.5084289944349 -78.78688719529734, 182.34698324130557 -78.78688719529734, 182.34698324130557 -79.09953357305645, 181.47589892645854 -79.09953357305645, 181.47589892645854 -79.41217995081557, 180.60481461161154 -79.41217995081557, 180.60481461161154 -79.72482632857468, 179.44336885848222 -79.72482632857468, 179.44336885848222 -80.0374727063338, 178.57228454363522 -80.0374727063338, 178.57228454363522 -80.35011908409292, 177.99156166707056 -80.35011908409292, 177.99156166707056 -80.66276546185203, 177.12047735222356 -80.66276546185203, 177.12047735222356 -80.97541183961116, 176.53975447565887 -80.97541183961116, 176.53975447565887 -81.28805821737026, 175.66867016081187 -81.28805821737026, 175.66867016081187 -81.60070459512939, 175.0879472842472 -81.60070459512939, 175.0879472842472 -81.9133509728885, 174.50722440768254 -81.9133509728885, 174.50722440768254 -82.22599735064762, 173.05541721627088 -82.22599735064762, 173.05541721627088 -82.53864372840673, 171.31324858657686 -82.53864372840673, 171.31324858657686 -82.85129010616585, 169.8614413951652 -82.85129010616585, 169.8614413951652 -83.16393648392497, 168.1192727654712 -83.16393648392497, 168.1192727654712 -83.47658286168408, 166.3771041357772 -83.47658286168408, 166.3771041357772 -83.7892292394432, 164.6349355060832 -83.7892292394432, 164.6349355060832 -84.10187561720231, 162.60240543810687 -84.10187561720231, 162.60240543810687 -84.41452199496143, 160.86023680841285 -84.41452199496143, 160.86023680841285 -84.72716837272054, 159.11806817871886 -84.72716837272054, 159.11806817871886 -85.03981475047966, 157.37589954902487 -85.03981475047966, 157.37589954902487 -85.35246112823879, 155.05300804276618 -85.35246112823879, 155.05300804276618 -85.6651075059979, 153.02047797478986 -85.6651075059979, 153.02047797478986 -85.97775388375702, 150.9879479068135 -85.97775388375702, 150.9879479068135 -86.29040026151613, 148.95541783883718 -86.29040026151613, 148.95541783883718 -86.60304663927525, 147.21324920914319 -86.60304663927525, 147.21324920914319 -86.91569301703436, 145.18071914116683 -86.91569301703436, 145.18071914116683 -87.22833939479348, 142.85782763490818 -87.22833939479348, 142.85782763490818 -87.5409857725526, 140.24457469036716 -87.5409857725526, 140.24457469036716 -87.85363215031171, 136.1795145544145 -87.85363215031171, 136.1795145544145 -88.16627852807083, 128.92047859735615 -88.16627852807083, 128.92047859735615 -87.85363215031171, 126.88794852937983 -87.85363215031171, 126.88794852937983 -87.5409857725526, 125.14577989968582 -87.5409857725526, 125.14577989968582 -87.22833939479348, 123.69397270827415 -87.22833939479348, 123.69397270827415 -86.91569301703436, 121.95180407858015 -86.91569301703436, 121.95180407858015 -86.60304663927525, 120.49999688716848 -86.60304663927525, 120.49999688716848 -86.29040026151613, 119.0481896957568 -86.29040026151613, 119.0481896957568 -85.97775388375702, 117.59638250434514 -85.97775388375702, 117.59638250434514 -85.6651075059979, 112.9505994918278 -85.6651075059979, 112.9505994918278 -85.35246112823879, 109.4662622324398 -85.35246112823879, 109.4662622324398 -85.03981475047966, 106.8530092878988 -85.03981475047966, 106.8530092878988 -84.72716837272054, 103.65903346679312 -84.72716837272054, 103.65903346679312 -85.03981475047966, 97.85180470114645 -85.03981475047966, 97.85180470114645 -84.72716837272054, 94.07710600347612 -84.72716837272054, 94.07710600347612 -85.03981475047966, 90.88313018237044 -85.03981475047966, 90.88313018237044 -85.35246112823879, 88.26987723782943 -85.35246112823879, 88.26987723782943 -85.6651075059979, 85.65662429328843 -85.6651075059979, 85.65662429328843 -85.97775388375702, 82.46264847218276 -85.97775388375702, 82.46264847218276 -86.29040026151613, 77.52650402138309 -86.29040026151613, 77.52650402138309 -86.60304663927525, 74.33252820027742 -86.60304663927525, 74.33252820027742 -86.91569301703436, 72.59035957058342 -86.91569301703436), + (4.355421574235005 -87.22833939479348, 4.065060135952671 -87.22833939479348, 4.065060135952671 -87.5409857725526, 3.4843372593880044 -87.5409857725526, 3.4843372593880044 -87.85363215031171, 3.1939758211056706 -87.85363215031171, 3.1939758211056706 -88.16627852807083, 2.9036143828233367 -88.16627852807083, 2.9036143828233367 -88.47892490582994, 2.6132529445410033 -88.47892490582994, 2.6132529445410033 -88.79157128358906, 2.3228915062586695 -88.79157128358906, 2.3228915062586695 -89.10421766134817, 2.0325300679763356 -89.10421766134817, 2.0325300679763356 -89.4168640391073, 1.4518071914116684 -89.4168640391073, 1.4518071914116684 -89.7295104168664, 1.1614457531293347 -89.7295104168664, 1.1614457531293347 -90.04215679462553, 0.8710843148470011 -90.04215679462553, 0.8710843148470011 -90.35480317238465, 0.5807228765646674 -90.35480317238465, 0.5807228765646674 -90.66744955014376, 0.2903614382823337 -90.66744955014376, 0.2903614382823337 -90.98009592790288, 0 -90.98009592790288))MULTILINESTRING ((297.3301128011097 -73.15925239563325, 297.03975136282736 -73.15925239563325, 297.03975136282736 -73.47189877339235, 295.87830560969803 -73.47189877339235, 295.87830560969803 -73.78454515115148, 295.00722129485104 -73.78454515115148, 295.00722129485104 -74.09719152891059, 293.8457755417217 -74.09719152891059, 293.8457755417217 -74.40983790666971, 292.9746912268747 -74.40983790666971, 292.9746912268747 -74.72248428442882, 291.8132454737453 -74.72248428442882, 291.8132454737453 -75.03513066218794, 290.94216115889833 -75.03513066218794, 290.94216115889833 -75.34777703994706, 289.780715405769 -75.34777703994706, 289.780715405769 -75.66042341770617, 288.909631090922 -75.66042341770617, 288.909631090922 -75.97306979546529, 287.7481853377927 -75.97306979546529, 287.7481853377927 -76.2857161732244, 283.97348664012236 -76.2857161732244, 283.97348664012236 -76.59836255098352, 280.198787942452 -76.59836255098352, 280.198787942452 -76.91100892874263, 277.585534997911 -76.91100892874263, 277.585534997911 -77.22365530650175, 275.5530049299347 -77.22365530650175, 275.5530049299347 -76.91100892874263, 274.39155917680534 -76.91100892874263, 274.39155917680534 -76.59836255098352, 273.230113423676 -76.59836255098352, 273.230113423676 -76.2857161732244, 271.77830623226436 -76.2857161732244, 271.77830623226436 -75.97306979546529, 270.32649904085264 -75.97306979546529, 270.32649904085264 -75.66042341770617, 268.874691849441 -75.66042341770617, 268.874691849441 -75.34777703994706, 267.4228846580293 -75.34777703994706, 267.4228846580293 -75.03513066218794, 265.6807160283353 -75.03513066218794, 265.6807160283353 -74.72248428442882, 264.22890883692367 -74.72248428442882, 264.22890883692367 -74.40983790666971, 262.777101645512 -74.40983790666971, 262.777101645512 -74.09719152891059, 261.3252944541003 -74.09719152891059, 261.3252944541003 -73.78454515115148, 259.8734872626886 -73.78454515115148, 259.8734872626886 -73.47189877339235, 258.42168007127697 -73.47189877339235, 258.42168007127697 -73.15925239563325, 256.9698728798653 -73.15925239563325, 256.9698728798653 -72.84660601787412, 255.51806568845365 -72.84660601787412, 255.51806568845365 -72.533959640115, 254.06625849704199 -72.533959640115, 254.06625849704199 -72.22131326235589, 245.35541534857197 -72.22131326235589, 245.35541534857197 -71.90866688459677, 242.74216240403095 -71.90866688459677, 242.74216240403095 -71.59602050683766, 240.99999377433696 -71.59602050683766, 240.99999377433696 -71.28337412907854, 239.25782514464296 -71.28337412907854, 239.25782514464296 -70.97072775131943, 237.2252950766666 -70.97072775131943, 237.2252950766666 -70.65808137356031, 235.1927650086903 -70.65808137356031, 235.1927650086903 -70.3454349958012, 233.4505963789963 -70.3454349958012, 233.4505963789963 -70.03278861804208, 231.41806631101994 -70.03278861804208, 231.41806631101994 -69.72014224028295, 229.96625911960828 -69.72014224028295, 229.96625911960828 -69.40749586252385, 228.51445192819662 -69.40749586252385, 228.51445192819662 -69.09484948476472, 227.06264473678493 -69.09484948476472, 227.06264473678493 -68.78220310700561, 225.61083754537327 -68.78220310700561, 225.61083754537327 -68.46955672924649, 224.1590303539616 -68.46955672924649, 224.1590303539616 -68.15691035148738, 222.70722316254992 -68.15691035148738, 222.70722316254992 -67.84426397372826, 220.96505453285593 -67.84426397372826, 220.96505453285593 -67.53161759596915, 218.9325244648796 -67.53161759596915, 218.9325244648796 -67.21897121821003, 216.02891008205626 -67.21897121821003, 216.02891008205626 -66.9063248404509, 210.2216813164096 -66.9063248404509, 210.2216813164096 -66.5936784626918, 208.18915124843326 -66.5936784626918, 208.18915124843326 -66.9063248404509, 198.89758522339858 -66.9063248404509, 198.89758522339858 -66.5936784626918, 196.28433227885756 -66.5936784626918, 196.28433227885756 -66.9063248404509, 195.12288652572823 -66.9063248404509, 195.12288652572823 -67.21897121821003, 193.67107933431657 -67.21897121821003, 193.67107933431657 -67.53161759596915, 192.50963358118724 -67.53161759596915, 192.50963358118724 -67.84426397372826, 191.3481878280579 -67.84426397372826, 191.3481878280579 -68.15691035148738, 190.18674207492856 -68.15691035148738, 190.18674207492856 -68.46955672924649, 189.31565776008156 -68.46955672924649, 189.31565776008156 -68.78220310700561, 188.15421200695224 -68.78220310700561, 188.15421200695224 -69.09484948476472, 186.99276625382288 -69.09484948476472, 186.99276625382288 -69.40749586252385, 185.83132050069355 -69.40749586252385, 185.83132050069355 -69.72014224028295, 184.96023618584655 -69.72014224028295, 184.96023618584655 -70.03278861804208, 184.08915187099956 -70.03278861804208, 184.08915187099956 -70.3454349958012, 183.21806755615256 -70.3454349958012, 183.21806755615256 -70.65808137356031, 182.34698324130557 -70.65808137356031, 182.34698324130557 -70.97072775131943, 181.47589892645854 -70.97072775131943, 181.47589892645854 -71.28337412907854, 180.60481461161154 -71.28337412907854, 180.60481461161154 -71.59602050683766, 179.44336885848222 -71.59602050683766, 179.44336885848222 -71.90866688459677, 178.57228454363522 -71.90866688459677, 178.57228454363522 -72.22131326235589, 177.70120022878822 -72.22131326235589, 177.70120022878822 -72.533959640115, 176.8301159139412 -72.533959640115, 176.8301159139412 -72.84660601787412, 175.9590315990942 -72.84660601787412, 175.9590315990942 -73.15925239563325, 175.0879472842472 -73.15925239563325, 175.0879472842472 -73.47189877339235, 174.2168629694002 -73.47189877339235, 174.2168629694002 -73.78454515115148, 171.89397146314155 -73.78454515115148, 171.89397146314155 -74.09719152891059, 169.57107995688287 -74.09719152891059, 169.57107995688287 -74.40983790666971, 166.95782701234188 -74.40983790666971, 166.95782701234188 -74.72248428442882, 164.34457406780086 -74.72248428442882, 164.34457406780086 -75.03513066218794, 161.73132112325987 -75.03513066218794, 161.73132112325987 -75.34777703994706, 158.82770674043653 -75.34777703994706, 158.82770674043653 -75.66042341770617, 155.3433694810485 -75.66042341770617, 155.3433694810485 -75.97306979546529, 151.5686707833782 -75.97306979546529, 151.5686707833782 -76.2857161732244, 147.79397208570785 -76.2857161732244, 147.79397208570785 -76.59836255098352, 142.85782763490818 -76.59836255098352, 142.85782763490818 -76.91100892874263, 135.59879167784982 -76.91100892874263, 135.59879167784982 -76.59836255098352, 131.53373154189717 -76.59836255098352, 131.53373154189717 -76.2857161732244, 129.21084003563848 -76.2857161732244, 129.21084003563848 -75.97306979546529, 127.17830996766216 -75.97306979546529, 127.17830996766216 -75.66042341770617, 125.72650277625048 -75.66042341770617, 125.72650277625048 -75.34777703994706, 124.27469558483881 -75.34777703994706, 124.27469558483881 -75.03513066218794, 122.82288839342715 -75.03513066218794, 122.82288839342715 -74.72248428442882, 121.37108120201547 -74.72248428442882, 121.37108120201547 -74.40983790666971, 119.91927401060381 -74.40983790666971, 119.91927401060381 -74.09719152891059, 118.46746681919214 -74.09719152891059, 118.46746681919214 -73.78454515115148, 116.4349367512158 -73.78454515115148, 116.4349367512158 -73.47189877339235, 112.66023805354547 -73.47189877339235, 112.66023805354547 -73.15925239563325, 110.04698510900447 -73.15925239563325, 110.04698510900447 -72.84660601787412, 107.7240936027458 -72.84660601787412, 107.7240936027458 -72.533959640115, 98.72288901599346 -72.533959640115, 98.72288901599346 -72.22131326235589, 93.20602168862911 -72.22131326235589, 93.20602168862911 -72.533959640115, 89.14096155267644 -72.533959640115, 89.14096155267644 -72.84660601787412, 86.23734716985311 -72.84660601787412, 86.23734716985311 -73.15925239563325, 83.91445566359444 -73.15925239563325, 83.91445566359444 -73.47189877339235, 74.91325107684209 -73.47189877339235, 74.91325107684209 -73.78454515115148, 72.59035957058342 -73.78454515115148), + (72.29999813230108 -73.78454515115148, 70.55782950260709 -73.78454515115148, 70.55782950260709 -73.47189877339235, 67.65421511978374 -73.47189877339235, 67.65421511978374 -73.15925239563325, 64.75060073696041 -73.15925239563325, 64.75060073696041 -72.84660601787412, 62.427709230701744 -72.84660601787412, 62.427709230701744 -72.533959640115, 60.10481772444307 -72.533959640115, 60.10481772444307 -72.22131326235589, 58.94337197131374 -72.22131326235589, 58.94337197131374 -71.90866688459677, 57.49156477990207 -71.90866688459677, 57.49156477990207 -71.59602050683766, 56.330119026772735 -71.59602050683766, 56.330119026772735 -71.28337412907854, 55.1686732736434 -71.28337412907854, 55.1686732736434 -70.97072775131943, 54.007227520514064 -70.97072775131943, 54.007227520514064 -70.65808137356031, 53.13614320566706 -70.65808137356031, 53.13614320566706 -70.3454349958012, 51.97469745253773 -70.3454349958012, 51.97469745253773 -70.03278861804208, 51.10361313769073 -70.03278861804208, 51.10361313769073 -69.72014224028295, 50.232528822843726 -69.72014224028295, 50.232528822843726 -69.40749586252385, 49.07108306971439 -69.40749586252385, 49.07108306971439 -69.09484948476472, 47.61927587830272 -69.09484948476472, 47.61927587830272 -68.78220310700561, 46.45783012517339 -68.78220310700561, 46.45783012517339 -68.46955672924649, 45.00602293376172 -68.46955672924649, 45.00602293376172 -68.15691035148738, 43.55421574235005 -68.15691035148738, 43.55421574235005 -67.84426397372826, 42.39276998922072 -67.84426397372826, 42.39276998922072 -67.53161759596915, 41.23132423609138 -67.53161759596915, 41.23132423609138 -67.21897121821003, 40.06987848296205 -67.21897121821003, 40.06987848296205 -66.9063248404509, 38.61807129155038 -66.9063248404509, 38.61807129155038 -66.5936784626918, 37.16626410013871 -66.5936784626918, 37.16626410013871 -66.28103208493268, 35.42409547044471 -66.28103208493268, 35.42409547044471 -65.96838570717357, 33.39156540246837 -65.96838570717357, 33.39156540246837 -65.65573932941444, 31.359035334492038 -65.65573932941444, 31.359035334492038 -65.34309295165534, 28.745782389951035 -65.34309295165534, 28.745782389951035 -65.03044657389621, 25.551806568845365 -65.03044657389621, 25.551806568845365 -65.34309295165534, 24.099999377433697 -65.34309295165534, 24.099999377433697 -65.65573932941444, 22.648192186022026 -65.65573932941444, 22.648192186022026 -65.96838570717357, 21.486746432892694 -65.96838570717357, 21.486746432892694 -66.28103208493268, 20.61566211804569 -66.28103208493268, 20.61566211804569 -66.5936784626918, 19.74457780319869 -66.5936784626918), + (4.355421574235005 -68.46955672924649, 4.065060135952671 -68.46955672924649, 4.065060135952671 -68.78220310700561, 3.4843372593880044 -68.78220310700561, 3.4843372593880044 -69.09484948476472, 2.9036143828233367 -69.09484948476472, 2.9036143828233367 -69.40749586252385, 2.3228915062586695 -69.40749586252385, 2.3228915062586695 -69.72014224028295, 1.7421686296940022 -69.72014224028295, 1.7421686296940022 -70.03278861804208, 0.8710843148470011 -70.03278861804208, 0.8710843148470011 -70.3454349958012, 0.2903614382823337 -70.3454349958012, 0.2903614382823337 -70.65808137356031, 0 -70.65808137356031))MULTILINESTRING ((297.3301128011097 -70.03278861804208, 297.03975136282736 -70.03278861804208, 297.03975136282736 -70.3454349958012, 295.87830560969803 -70.3454349958012, 295.87830560969803 -70.65808137356031, 295.00722129485104 -70.65808137356031, 295.00722129485104 -70.97072775131943, 293.8457755417217 -70.97072775131943, 293.8457755417217 -71.28337412907854, 292.9746912268747 -71.28337412907854, 292.9746912268747 -71.59602050683766, 291.8132454737453 -71.59602050683766, 291.8132454737453 -71.90866688459677, 290.94216115889833 -71.90866688459677, 290.94216115889833 -72.22131326235589, 289.780715405769 -72.22131326235589, 289.780715405769 -72.533959640115, 288.909631090922 -72.533959640115, 288.909631090922 -72.84660601787412, 288.038546776075 -72.84660601787412, 288.038546776075 -73.15925239563325, 283.3927637635577 -73.15925239563325, 283.3927637635577 -73.47189877339235, 279.03734218932266 -73.47189877339235, 279.03734218932266 -73.78454515115148, 275.26264349165234 -73.78454515115148, 275.26264349165234 -73.47189877339235, 273.8108363002407 -73.47189877339235, 273.8108363002407 -73.15925239563325, 272.64939054711135 -73.15925239563325, 272.64939054711135 -72.84660601787412, 271.19758335569963 -72.84660601787412, 271.19758335569963 -72.533959640115, 269.745776164288 -72.533959640115, 269.745776164288 -72.22131326235589, 268.2939689728763 -72.22131326235589, 268.2939689728763 -71.90866688459677, 266.5518003431823 -71.90866688459677, 266.5518003431823 -71.59602050683766, 264.80963171348833 -71.59602050683766, 264.80963171348833 -71.28337412907854, 263.35782452207667 -71.28337412907854, 263.35782452207667 -70.97072775131943, 261.6156558923827 -70.97072775131943, 261.6156558923827 -70.65808137356031, 260.16384870097096 -70.65808137356031, 260.16384870097096 -70.3454349958012, 258.42168007127697 -70.3454349958012, 258.42168007127697 -70.03278861804208, 256.9698728798653 -70.03278861804208, 256.9698728798653 -69.72014224028295, 255.2277042501713 -69.72014224028295, 255.2277042501713 -69.40749586252385, 252.6144513056303 -69.40749586252385, 252.6144513056303 -69.09484948476472, 246.80722253998363 -69.09484948476472, 246.80722253998363 -68.78220310700561, 243.61324671887797 -68.78220310700561, 243.61324671887797 -68.46955672924649, 240.99999377433696 -68.46955672924649, 240.99999377433696 -68.15691035148738, 238.6771022680783 -68.15691035148738, 238.6771022680783 -67.84426397372826, 236.35421076181962 -67.84426397372826, 236.35421076181962 -67.53161759596915, 234.03131925556096 -67.53161759596915, 234.03131925556096 -67.21897121821003, 231.70842774930227 -67.21897121821003, 231.70842774930227 -66.9063248404509, 229.96625911960828 -66.9063248404509, 229.96625911960828 -66.5936784626918, 228.80481336647895 -66.5936784626918, 228.80481336647895 -66.28103208493268, 227.35300617506726 -66.28103208493268, 227.35300617506726 -65.96838570717357, 225.9011989836556 -65.96838570717357, 225.9011989836556 -65.65573932941444, 224.44939179224394 -65.65573932941444, 224.44939179224394 -65.34309295165534, 222.99758460083228 -65.34309295165534, 222.99758460083228 -65.03044657389621, 221.25541597113826 -65.03044657389621, 221.25541597113826 -64.71780019613709, 219.8036087797266 -64.71780019613709, 219.8036087797266 -64.40515381837798, 217.48071727346792 -64.40515381837798, 217.48071727346792 -64.09250744061886, 214.86746432892693 -64.09250744061886, 214.86746432892693 -63.77986106285975, 210.51204275469192 -63.77986106285975, 210.51204275469192 -63.46721468510063, 207.60842837186857 -63.46721468510063, 207.60842837186857 -63.77986106285975, 200.34939241481024 -63.77986106285975, 200.34939241481024 -63.46721468510063, 197.15541659370456 -63.46721468510063, 197.15541659370456 -63.15456830734151, 196.86505515542223 -63.15456830734151, 196.86505515542223 -63.46721468510063, 195.7036094022929 -63.46721468510063, 195.7036094022929 -63.77986106285975, 194.25180221088124 -63.77986106285975, 194.25180221088124 -64.09250744061886, 193.0903564577519 -64.09250744061886, 193.0903564577519 -64.40515381837798, 191.92891070462255 -64.40515381837798, 191.92891070462255 -64.71780019613709, 190.76746495149322 -64.71780019613709, 190.76746495149322 -65.03044657389621, 189.6060191983639 -65.03044657389621, 189.6060191983639 -65.34309295165534, 188.44457344523457 -65.34309295165534, 188.44457344523457 -65.65573932941444, 187.28312769210524 -65.65573932941444, 187.28312769210524 -65.96838570717357, 186.12168193897588 -65.96838570717357, 186.12168193897588 -66.28103208493268, 185.2505976241289 -66.28103208493268, 185.2505976241289 -66.5936784626918, 184.3795133092819 -66.5936784626918, 184.3795133092819 -66.9063248404509, 183.5084289944349 -66.9063248404509, 183.5084289944349 -67.21897121821003, 182.34698324130557 -67.21897121821003, 182.34698324130557 -67.53161759596915, 181.47589892645854 -67.53161759596915, 181.47589892645854 -67.84426397372826, 180.60481461161154 -67.84426397372826, 180.60481461161154 -68.15691035148738, 179.73373029676455 -68.15691035148738, 179.73373029676455 -68.46955672924649, 178.57228454363522 -68.46955672924649, 178.57228454363522 -68.78220310700561, 177.70120022878822 -68.78220310700561, 177.70120022878822 -69.09484948476472, 176.8301159139412 -69.09484948476472, 176.8301159139412 -69.40749586252385, 175.66867016081187 -69.40749586252385, 175.66867016081187 -69.72014224028295, 174.79758584596487 -69.72014224028295, 174.79758584596487 -70.03278861804208, 173.05541721627088 -70.03278861804208, 173.05541721627088 -70.3454349958012, 170.44216427172987 -70.3454349958012, 170.44216427172987 -70.65808137356031, 167.53854988890654 -70.65808137356031, 167.53854988890654 -70.97072775131943, 164.6349355060832 -70.97072775131943, 164.6349355060832 -71.28337412907854, 161.4409596849775 -71.28337412907854, 161.4409596849775 -71.59602050683766, 157.6662609873072 -71.59602050683766, 157.6662609873072 -71.90866688459677, 153.02047797478986 -71.90866688459677, 153.02047797478986 -72.22131326235589, 148.08433352399018 -72.22131326235589, 148.08433352399018 -72.533959640115, 135.01806880128515 -72.533959640115, 135.01806880128515 -72.22131326235589, 131.8240929801795 -72.22131326235589, 131.8240929801795 -71.90866688459677, 129.79156291220315 -71.90866688459677, 129.79156291220315 -71.59602050683766, 127.75903284422682 -71.59602050683766, 127.75903284422682 -71.28337412907854, 126.30722565281515 -71.28337412907854, 126.30722565281515 -70.97072775131943, 124.85541846140349 -70.97072775131943, 124.85541846140349 -70.65808137356031, 123.40361126999181 -70.65808137356031, 123.40361126999181 -70.3454349958012, 121.95180407858015 -70.3454349958012, 121.95180407858015 -70.03278861804208, 120.49999688716848 -70.03278861804208, 120.49999688716848 -69.72014224028295, 119.33855113403915 -69.72014224028295, 119.33855113403915 -69.40749586252385, 117.88674394262748 -69.40749586252385, 117.88674394262748 -69.09484948476472, 114.98312955980414 -69.09484948476472, 114.98312955980414 -68.78220310700561, 111.78915373869847 -68.78220310700561, 111.78915373869847 -68.46955672924649, 109.4662622324398 -68.46955672924649, 109.4662622324398 -68.15691035148738, 107.14337072618113 -68.15691035148738, 107.14337072618113 -67.84426397372826, 99.30361189255812 -67.84426397372826, 99.30361189255812 -67.53161759596915, 92.62529881206444 -67.53161759596915, 92.62529881206444 -67.84426397372826, 88.85060011439411 -67.84426397372826, 88.85060011439411 -68.15691035148738, 85.94698573157078 -68.15691035148738, 85.94698573157078 -68.46955672924649, 83.6240942253121 -68.46955672924649, 83.6240942253121 -68.78220310700561, 74.62288963855976 -68.78220310700561, 74.62288963855976 -69.09484948476472, 72.59035957058342 -69.09484948476472), + (4.355421574235005 -61.27869004078681, 4.065060135952671 -61.27869004078681, 4.065060135952671 -61.591336418545936, 3.4843372593880044 -61.591336418545936, 3.4843372593880044 -61.90398279630505, 2.6132529445410033 -61.90398279630505, 2.6132529445410033 -62.21662917406417, 1.7421686296940022 -62.21662917406417, 1.7421686296940022 -62.52927555182328, 1.1614457531293347 -62.52927555182328, 1.1614457531293347 -62.8419219295824, 0.2903614382823337 -62.8419219295824, 0.2903614382823337 -63.15456830734151, 0 -63.15456830734151), + (72.29999813230108 -69.09484948476472, 70.55782950260709 -69.09484948476472, 70.55782950260709 -68.78220310700561, 67.65421511978374 -68.78220310700561, 67.65421511978374 -68.46955672924649, 65.04096217524274 -68.46955672924649, 65.04096217524274 -68.15691035148738, 62.427709230701744 -68.15691035148738, 62.427709230701744 -67.84426397372826, 60.395179162725405 -67.84426397372826, 60.395179162725405 -67.53161759596915, 58.94337197131374 -67.53161759596915, 58.94337197131374 -67.21897121821003, 57.7819262181844 -67.21897121821003, 57.7819262181844 -66.9063248404509, 56.62048046505507 -66.9063248404509, 56.62048046505507 -66.5936784626918, 55.45903471192573 -66.5936784626918, 55.45903471192573 -66.28103208493268, 54.297588958796396 -66.28103208493268, 54.297588958796396 -65.96838570717357, 53.4265046439494 -65.96838570717357, 53.4265046439494 -65.65573932941444, 52.265058890820065 -65.65573932941444, 52.265058890820065 -65.34309295165534, 51.39397457597306 -65.34309295165534, 51.39397457597306 -65.03044657389621, 50.52289026112606 -65.03044657389621, 50.52289026112606 -64.71780019613709, 49.942167384561394 -64.71780019613709, 49.942167384561394 -64.40515381837798, 48.78072163143206 -64.40515381837798, 48.78072163143206 -64.09250744061886, 47.32891444002039 -64.09250744061886, 47.32891444002039 -63.77986106285975, 45.87710724860872 -63.77986106285975, 45.87710724860872 -63.46721468510063, 44.71566149547939 -63.46721468510063, 44.71566149547939 -63.15456830734151, 43.26385430406772 -63.15456830734151, 43.26385430406772 -62.8419219295824, 42.102408550938385 -62.8419219295824, 42.102408550938385 -62.52927555182328, 40.94096279780905 -62.52927555182328, 40.94096279780905 -62.21662917406417, 39.779517044679714 -62.21662917406417, 39.779517044679714 -61.90398279630505, 38.61807129155038 -61.90398279630505, 38.61807129155038 -61.591336418545936, 37.16626410013871 -61.591336418545936, 37.16626410013871 -61.27869004078681, 35.42409547044471 -61.27869004078681, 35.42409547044471 -60.9660436630277, 33.681926840750705 -60.9660436630277, 33.681926840750705 -60.65339728526858, 31.939758211056706 -60.65339728526858, 31.939758211056706 -60.34075090750947, 29.616866704798035 -60.34075090750947, 29.616866704798035 -60.02810452975035, 27.293975198539368 -60.02810452975035, 27.293975198539368 -59.715458151991236, 26.7132523219747 -59.715458151991236, 26.7132523219747 -60.02810452975035, 24.39036081571603 -60.02810452975035, 24.39036081571603 -60.34075090750947, 22.93855362430436 -60.34075090750947, 22.93855362430436 -60.65339728526858, 21.486746432892694 -60.65339728526858, 21.486746432892694 -60.9660436630277, 20.61566211804569 -60.9660436630277, 20.61566211804569 -61.27869004078681, 19.74457780319869 -61.27869004078681))MULTILINESTRING ((4.355421574235005 -10.629976843809958, 1.1614457531293347 -10.629976843809958, 1.1614457531293347 -10.942623221569075, 0 -10.942623221569075), + (4.355421574235005 -49.08548130818128, 4.065060135952671 -49.08548130818128, 4.065060135952671 -49.398127685940395, 2.9036143828233367 -49.398127685940395, 2.9036143828233367 -49.71077406369951, 1.4518071914116684 -49.71077406369951, 1.4518071914116684 -50.023420441458626, 0 -50.023420441458626), + (72.29999813230108 -60.65339728526858, 69.68674518776008 -60.65339728526858, 69.68674518776008 -60.34075090750947, 67.07349224321908 -60.34075090750947, 67.07349224321908 -60.02810452975035, 64.46023929867808 -60.02810452975035, 64.46023929867808 -59.715458151991236, 61.84698635413707 -59.715458151991236, 61.84698635413707 -59.40281177423212, 60.10481772444307 -59.40281177423212, 60.10481772444307 -59.090165396473004, 58.94337197131374 -59.090165396473004, 58.94337197131374 -58.77751901871389, 57.7819262181844 -58.77751901871389, 57.7819262181844 -58.464872640954766, 56.9108419033374 -58.464872640954766, 56.9108419033374 -58.15222626319565, 55.74939615020807 -58.15222626319565, 55.74939615020807 -57.839579885436535, 54.87831183536107 -57.839579885436535, 54.87831183536107 -57.52693350767742, 54.007227520514064 -57.52693350767742, 54.007227520514064 -57.214287129918304, 53.13614320566706 -57.214287129918304, 53.13614320566706 -56.90164075215919, 52.265058890820065 -56.90164075215919, 52.265058890820065 -56.58899437440007, 51.68433601425539 -56.58899437440007, 51.68433601425539 -56.27634799664095, 50.8132516994084 -56.27634799664095, 50.8132516994084 -55.963701618881835, 49.942167384561394 -55.963701618881835, 49.942167384561394 -55.65105524112272, 49.36144450799673 -55.65105524112272, 49.36144450799673 -55.338408863363604, 47.909637316585055 -55.338408863363604, 47.909637316585055 -55.02576248560449, 46.74819156345572 -55.02576248560449, 46.74819156345572 -54.71311610784537, 45.58674581032639 -54.71311610784537, 45.58674581032639 -54.40046973008626, 44.425300057197056 -54.40046973008626, 44.425300057197056 -54.08782335232714, 43.26385430406772 -54.08782335232714, 43.26385430406772 -53.775176974568026, 42.102408550938385 -53.775176974568026, 42.102408550938385 -53.462530596808904, 40.94096279780905 -53.462530596808904, 40.94096279780905 -53.14988421904979, 40.06987848296205 -53.14988421904979, 40.06987848296205 -52.83723784129067, 38.90843272983271 -52.83723784129067, 38.90843272983271 -52.52459146353156, 37.746986976703376 -52.52459146353156, 37.746986976703376 -52.21194508577244, 36.29517978529171 -52.21194508577244, 36.29517978529171 -51.899298708013326, 35.13373403216237 -51.899298708013326, 35.13373403216237 -51.58665233025421, 33.39156540246837 -51.58665233025421, 33.39156540246837 -51.27400595249509, 31.939758211056706 -51.27400595249509, 31.939758211056706 -50.96135957473597, 30.197589581362703 -50.96135957473597, 30.197589581362703 -50.64871319697686, 28.165059513386367 -50.64871319697686, 28.165059513386367 -50.33606681921774, 24.39036081571603 -50.33606681921774, 24.39036081571603 -50.64871319697686, 22.648192186022026 -50.64871319697686, 22.648192186022026 -50.96135957473597, 21.19638499461036 -50.96135957473597, 21.19638499461036 -51.27400595249509, 20.034939241481023 -51.27400595249509, 20.034939241481023 -51.58665233025421, 19.74457780319869 -51.58665233025421), + (297.3301128011097 -64.09250744061886, 297.03975136282736 -64.09250744061886, 297.03975136282736 -64.40515381837798, 296.16866704798036 -64.40515381837798, 296.16866704798036 -64.71780019613709, 295.29758273313337 -64.71780019613709, 295.29758273313337 -65.03044657389621, 294.13613698000404 -65.03044657389621, 294.13613698000404 -65.34309295165534, 293.26505266515704 -65.34309295165534, 293.26505266515704 -65.65573932941444, 292.39396835031005 -65.65573932941444, 292.39396835031005 -65.96838570717357, 291.522884035463 -65.96838570717357, 291.522884035463 -66.28103208493268, 290.651799720616 -66.28103208493268, 290.651799720616 -66.5936784626918, 289.49035396748667 -66.5936784626918, 289.49035396748667 -66.9063248404509, 288.6192696526397 -66.9063248404509, 288.6192696526397 -67.21897121821003, 287.7481853377927 -67.21897121821003, 287.7481853377927 -67.53161759596915, 279.03734218932266 -67.53161759596915, 279.03734218932266 -67.84426397372826, 275.5530049299347 -67.84426397372826, 275.5530049299347 -67.53161759596915, 274.101197738523 -67.53161759596915, 274.101197738523 -67.21897121821003, 272.9397519853937 -67.21897121821003, 272.9397519853937 -66.9063248404509, 271.48794479398197 -66.9063248404509, 271.48794479398197 -66.5936784626918, 270.0361376025703 -66.5936784626918, 270.0361376025703 -66.28103208493268, 268.58433041115865 -66.28103208493268, 268.58433041115865 -65.96838570717357, 267.132523219747 -65.96838570717357, 267.132523219747 -65.65573932941444, 265.390354590053 -65.65573932941444, 265.390354590053 -65.34309295165534, 263.648185960359 -65.34309295165534, 263.648185960359 -65.03044657389621, 261.6156558923827 -65.03044657389621, 261.6156558923827 -64.71780019613709, 259.8734872626886 -64.71780019613709, 259.8734872626886 -64.40515381837798, 257.8409571947123 -64.40515381837798, 257.8409571947123 -64.09250744061886, 256.0987885650183 -64.09250744061886, 256.0987885650183 -63.77986106285975, 254.06625849704199 -63.77986106285975, 254.06625849704199 -63.46721468510063, 250.0011983610893 -63.46721468510063, 250.0011983610893 -63.15456830734151, 245.93613822513663 -63.15456830734151, 245.93613822513663 -62.8419219295824, 242.45180096574862 -62.8419219295824, 242.45180096574862 -62.52927555182328, 239.25782514464296 -62.52927555182328, 239.25782514464296 -62.21662917406417, 236.06384932353728 -62.21662917406417, 236.06384932353728 -61.90398279630505, 232.8698735024316 -61.90398279630505, 232.8698735024316 -61.591336418545936, 230.54698199617295 -61.591336418545936, 230.54698199617295 -61.27869004078681, 229.38553624304362 -61.27869004078681, 229.38553624304362 -60.9660436630277, 228.2240904899143 -60.9660436630277, 228.2240904899143 -60.65339728526858, 227.06264473678493 -60.65339728526858, 227.06264473678493 -60.34075090750947, 225.61083754537327 -60.34075090750947, 225.61083754537327 -60.02810452975035, 224.44939179224394 -60.02810452975035, 224.44939179224394 -59.715458151991236, 222.99758460083228 -59.715458151991236, 222.99758460083228 -59.40281177423212, 221.5457774094206 -59.40281177423212, 221.5457774094206 -59.090165396473004, 219.8036087797266 -59.090165396473004, 219.8036087797266 -58.77751901871389, 218.0614401500326 -58.77751901871389, 218.0614401500326 -58.464872640954766, 216.02891008205626 -58.464872640954766, 216.02891008205626 -58.15222626319565, 213.41565713751527 -58.15222626319565, 213.41565713751527 -57.839579885436535, 201.8011996062219 -57.839579885436535, 201.8011996062219 -57.52693350767742, 198.31686234683391 -57.52693350767742, 198.31686234683391 -57.214287129918304, 196.28433227885756 -57.214287129918304, 196.28433227885756 -57.52693350767742, 194.8325250874459 -57.52693350767742, 194.8325250874459 -57.839579885436535, 193.67107933431657 -57.839579885436535, 193.67107933431657 -58.15222626319565, 192.21927214290488 -58.15222626319565, 192.21927214290488 -58.464872640954766, 191.05782638977556 -58.464872640954766, 191.05782638977556 -58.77751901871389, 189.6060191983639 -58.77751901871389, 189.6060191983639 -59.090165396473004, 188.44457344523457 -59.090165396473004, 188.44457344523457 -59.40281177423212, 187.28312769210524 -59.40281177423212, 187.28312769210524 -59.715458151991236, 186.12168193897588 -59.715458151991236, 186.12168193897588 -60.02810452975035, 184.96023618584655 -60.02810452975035, 184.96023618584655 -60.34075090750947, 184.08915187099956 -60.34075090750947, 184.08915187099956 -60.65339728526858, 183.21806755615256 -60.65339728526858, 183.21806755615256 -60.9660436630277, 182.05662180302323 -60.9660436630277, 182.05662180302323 -61.27869004078681, 181.1855374881762 -61.27869004078681, 181.1855374881762 -61.591336418545936, 180.02409173504688 -61.591336418545936, 180.02409173504688 -61.90398279630505, 179.15300742019988 -61.90398279630505, 179.15300742019988 -62.21662917406417, 177.99156166707056 -62.21662917406417, 177.99156166707056 -62.52927555182328, 176.8301159139412 -62.52927555182328, 176.8301159139412 -62.8419219295824, 175.9590315990942 -62.8419219295824, 175.9590315990942 -63.15456830734151, 174.79758584596487 -63.15456830734151, 174.79758584596487 -63.46721468510063, 172.76505577798855 -63.46721468510063, 172.76505577798855 -63.77986106285975, 169.28071851860054 -63.77986106285975, 169.28071851860054 -64.09250744061886, 165.5060198209302 -64.09250744061886, 165.5060198209302 -64.40515381837798, 161.15059824669518 -64.40515381837798, 161.15059824669518 -64.71780019613709, 155.3433694810485 -64.71780019613709, 155.3433694810485 -65.03044657389621, 146.05180345601383 -65.03044657389621, 146.05180345601383 -65.34309295165534, 141.11565900521418 -65.34309295165534, 141.11565900521418 -65.03044657389621, 136.1795145544145 -65.03044657389621, 136.1795145544145 -64.71780019613709, 133.5662616098735 -64.71780019613709, 133.5662616098735 -64.40515381837798, 131.53373154189717 -64.40515381837798, 131.53373154189717 -64.09250744061886, 129.50120147392082 -64.09250744061886, 129.50120147392082 -63.77986106285975, 128.04939428250916 -63.77986106285975, 128.04939428250916 -63.46721468510063, 126.59758709109748 -63.46721468510063, 126.59758709109748 -63.15456830734151, 125.14577989968582 -63.15456830734151, 125.14577989968582 -62.8419219295824, 123.98433414655648 -62.8419219295824, 123.98433414655648 -62.52927555182328, 122.82288839342715 -62.52927555182328, 122.82288839342715 -62.21662917406417, 121.6614426402978 -62.21662917406417, 121.6614426402978 -61.90398279630505, 120.49999688716848 -61.90398279630505, 120.49999688716848 -61.591336418545936, 119.33855113403915 -61.591336418545936, 119.33855113403915 -61.27869004078681, 118.17710538090981 -61.27869004078681, 118.17710538090981 -60.9660436630277, 115.5638524363688 -60.9660436630277, 115.5638524363688 -60.65339728526858, 112.66023805354547 -60.65339728526858, 112.66023805354547 -60.34075090750947, 110.3373465472868 -60.34075090750947, 110.3373465472868 -60.02810452975035, 108.30481647931046 -60.02810452975035, 108.30481647931046 -59.715458151991236, 106.8530092878988 -59.715458151991236, 106.8530092878988 -59.40281177423212, 100.46505764568745 -59.40281177423212, 100.46505764568745 -59.090165396473004, 91.46385305893511 -59.090165396473004, 91.46385305893511 -59.40281177423212, 88.26987723782943 -59.40281177423212, 88.26987723782943 -59.715458151991236, 85.94698573157078 -59.715458151991236, 85.94698573157078 -60.02810452975035, 84.20481710187677 -60.02810452975035, 84.20481710187677 -60.34075090750947, 76.07469682997143 -60.34075090750947, 76.07469682997143 -60.65339728526858, 72.59035957058342 -60.65339728526858), + (58.362649094749074 0, 58.362649094749074 -0.3126463777591164, 58.653010533031406 -0.3126463777591164, 58.653010533031406 -0.6252927555182328, 59.23373340959607 -0.6252927555182328, 59.23373340959607 -0.9379391332773492, 59.5240948478784 -0.9379391332773492, 59.5240948478784 -1.2505855110364656, 59.81445628616074 -1.2505855110364656, 59.81445628616074 -1.563231888795582, 60.10481772444307 -1.563231888795582, 60.10481772444307 -2.8138173998320477, 59.81445628616074 -2.8138173998320477, 59.81445628616074 -3.126463777591164, 59.5240948478784 -3.126463777591164, 59.5240948478784 -3.4391101553502805, 58.94337197131374 -3.4391101553502805, 58.94337197131374 -3.751756533109397, 58.362649094749074 -3.751756533109397, 58.362649094749074 -4.064402910868513, 57.49156477990207 -4.064402910868513, 57.49156477990207 -4.37704928862763, 56.330119026772735 -4.37704928862763, 56.330119026772735 -4.689695666386746, 54.87831183536107 -4.689695666386746, 54.87831183536107 -5.002342044145863, 53.13614320566706 -5.002342044145863, 53.13614320566706 -5.314988421904979, 51.39397457597306 -5.314988421904979, 51.39397457597306 -5.627634799664095, 49.36144450799673 -5.627634799664095, 49.36144450799673 -5.940281177423212, 47.32891444002039 -5.940281177423212, 47.32891444002039 -6.252927555182328, 45.29638437204405 -6.252927555182328, 45.29638437204405 -6.565573932941445, 42.97349286578539 -6.565573932941445, 42.97349286578539 -6.878220310700561, 40.65060135952672 -6.878220310700561, 40.65060135952672 -7.1908666884596775, 38.037348414985715 -7.1908666884596775, 38.037348414985715 -7.503513066218794, 35.42409547044471 -7.503513066218794, 35.42409547044471 -7.81615944397791, 32.52048108762137 -7.81615944397791, 32.52048108762137 -8.128805821737027, 29.616866704798035 -8.128805821737027, 29.616866704798035 -8.441452199496144, 26.422890883692364 -8.441452199496144, 26.422890883692364 -8.75409857725526, 23.80963793915136 -8.75409857725526, 23.80963793915136 -9.066744955014375, 21.486746432892694 -9.066744955014375, 21.486746432892694 -9.379391332773492, 19.74457780319869 -9.379391332773492))MULTILINESTRING ((297.3301128011097 -52.83723784129067, 296.4590284862627 -52.83723784129067, 296.4590284862627 -53.14988421904979, 295.5879441714157 -53.14988421904979, 295.5879441714157 -53.462530596808904, 294.7168598565687 -53.462530596808904, 294.7168598565687 -53.775176974568026, 293.8457755417217 -53.775176974568026, 293.8457755417217 -54.08782335232714, 292.9746912268747 -54.08782335232714, 292.9746912268747 -54.40046973008626, 292.10360691202766 -54.40046973008626, 292.10360691202766 -54.71311610784537, 291.522884035463 -54.71311610784537, 291.522884035463 -55.02576248560449, 290.651799720616 -55.02576248560449, 290.651799720616 -55.338408863363604, 289.780715405769 -55.338408863363604, 289.780715405769 -55.65105524112272, 289.19999252920434 -55.65105524112272, 289.19999252920434 -55.963701618881835, 288.32890821435734 -55.963701618881835, 288.32890821435734 -56.27634799664095, 275.843366368217 -56.27634799664095, 275.843366368217 -55.963701618881835, 274.6819206150877 -55.963701618881835, 274.6819206150877 -55.65105524112272, 273.52047486195835 -55.65105524112272, 273.52047486195835 -55.338408863363604, 272.359029108829 -55.338408863363604, 272.359029108829 -55.02576248560449, 271.19758335569963 -55.02576248560449, 271.19758335569963 -54.71311610784537, 270.0361376025703 -54.71311610784537, 270.0361376025703 -54.40046973008626, 268.874691849441 -54.40046973008626, 268.874691849441 -54.08782335232714, 267.71324609631165 -54.08782335232714, 267.71324609631165 -53.775176974568026, 266.5518003431823 -53.775176974568026, 266.5518003431823 -53.462530596808904, 265.09999315177066 -53.462530596808904, 265.09999315177066 -53.14988421904979, 262.4867402072297 -53.14988421904979, 262.4867402072297 -52.83723784129067, 259.8734872626886 -52.83723784129067, 259.8734872626886 -52.52459146353156, 257.55059575642997 -52.52459146353156, 257.55059575642997 -52.21194508577244, 254.93734281188898 -52.21194508577244, 254.93734281188898 -51.899298708013326, 250.8722826759363 -51.899298708013326, 250.8722826759363 -51.58665233025421, 245.93613822513663 -51.58665233025421, 245.93613822513663 -51.27400595249509, 241.2903552126193 -51.27400595249509, 241.2903552126193 -50.96135957473597, 238.0963793915136 -50.96135957473597, 238.0963793915136 -50.64871319697686, 234.90240357040796 -50.64871319697686, 234.90240357040796 -50.33606681921774, 231.9987891875846 -50.33606681921774, 231.9987891875846 -50.023420441458626, 230.54698199617295 -50.023420441458626, 230.54698199617295 -49.71077406369951, 229.67589768132595 -49.71077406369951, 229.67589768132595 -49.398127685940395, 228.51445192819662 -49.398127685940395, 228.51445192819662 -49.08548130818128, 227.6433676133496 -49.08548130818128, 227.6433676133496 -48.772834930422164, 226.7722832985026 -48.772834930422164, 226.7722832985026 -48.46018855266304, 225.61083754537327 -48.46018855266304, 225.61083754537327 -48.147542174903926, 224.73975323052628 -48.147542174903926, 224.73975323052628 -47.83489579714481, 223.57830747739695 -47.83489579714481, 223.57830747739695 -47.522249419385695, 222.4168617242676 -47.522249419385695, 222.4168617242676 -47.20960304162658, 221.25541597113826 -47.20960304162658, 221.25541597113826 -46.89695666386746, 220.09397021800893 -46.89695666386746, 220.09397021800893 -46.58431028610835, 218.35180158831494 -46.58431028610835, 218.35180158831494 -46.271663908349225, 216.02891008205626 -46.271663908349225, 216.02891008205626 -45.95901753059011, 213.41565713751527 -45.95901753059011, 213.41565713751527 -45.646371152830994, 209.64095843984492 -45.646371152830994, 209.64095843984492 -45.33372477507188, 201.51083816793957 -45.33372477507188, 201.51083816793957 -45.02107839731276, 198.60722378511625 -45.02107839731276, 198.60722378511625 -44.70843201955365, 195.99397084057523 -44.70843201955365, 195.99397084057523 -45.02107839731276, 194.54216364916357 -45.02107839731276, 194.54216364916357 -45.33372477507188, 193.0903564577519 -45.33372477507188, 193.0903564577519 -45.646371152830994, 191.63854926634022 -45.646371152830994, 191.63854926634022 -45.95901753059011, 190.18674207492856 -45.95901753059011, 190.18674207492856 -46.271663908349225, 189.02529632179923 -46.271663908349225, 189.02529632179923 -46.58431028610835, 187.57348913038757 -46.58431028610835, 187.57348913038757 -46.89695666386746, 186.12168193897588 -46.89695666386746, 186.12168193897588 -47.20960304162658, 184.96023618584655 -47.20960304162658, 184.96023618584655 -47.522249419385695, 183.79879043271723 -47.522249419385695, 183.79879043271723 -47.83489579714481, 182.34698324130557 -47.83489579714481, 182.34698324130557 -48.147542174903926, 181.1855374881762 -48.147542174903926, 181.1855374881762 -48.46018855266304, 180.02409173504688 -48.46018855266304, 180.02409173504688 -48.772834930422164, 178.86264598191755 -48.772834930422164, 178.86264598191755 -49.08548130818128, 177.70120022878822 -49.08548130818128, 177.70120022878822 -49.398127685940395, 176.53975447565887 -49.398127685940395, 176.53975447565887 -49.71077406369951, 175.37830872252954 -49.71077406369951, 175.37830872252954 -50.023420441458626, 174.2168629694002 -50.023420441458626, 174.2168629694002 -50.33606681921774, 168.1192727654712 -50.33606681921774, 168.1192727654712 -50.64871319697686, 161.4409596849775 -50.64871319697686, 161.4409596849775 -50.96135957473597, 144.0192733880375 -50.96135957473597, 144.0192733880375 -50.64871319697686, 139.37349037552016 -50.64871319697686, 139.37349037552016 -50.33606681921774, 137.0505988692615 -50.33606681921774, 137.0505988692615 -50.023420441458626, 135.30843023956749 -50.023420441458626, 135.30843023956749 -49.71077406369951, 133.5662616098735 -49.71077406369951, 133.5662616098735 -49.398127685940395, 132.11445441846183 -49.398127685940395, 132.11445441846183 -49.08548130818128, 130.9530086653325 -49.08548130818128, 130.9530086653325 -48.772834930422164, 129.79156291220315 -48.772834930422164, 129.79156291220315 -48.46018855266304, 128.63011715907382 -48.46018855266304, 128.63011715907382 -48.147542174903926, 127.46867140594449 -48.147542174903926, 127.46867140594449 -47.83489579714481, 126.59758709109748 -47.83489579714481, 126.59758709109748 -47.522249419385695, 125.72650277625048 -47.522249419385695, 125.72650277625048 -47.20960304162658, 124.56505702312116 -47.20960304162658, 124.56505702312116 -46.89695666386746, 123.69397270827415 -46.89695666386746, 123.69397270827415 -46.58431028610835, 122.82288839342715 -46.58431028610835, 122.82288839342715 -46.271663908349225, 121.95180407858015 -46.271663908349225, 121.95180407858015 -45.95901753059011, 121.08071976373314 -45.95901753059011, 121.08071976373314 -45.646371152830994, 120.20963544888615 -45.646371152830994, 120.20963544888615 -45.33372477507188, 119.33855113403915 -45.33372477507188, 119.33855113403915 -45.02107839731276, 118.75782825747447 -45.02107839731276, 118.75782825747447 -44.70843201955365, 117.88674394262748 -44.70843201955365, 117.88674394262748 -44.39578564179453, 115.5638524363688 -44.39578564179453, 115.5638524363688 -44.08313926403542, 113.24096093011013 -44.08313926403542, 113.24096093011013 -43.7704928862763, 111.49879230041614 -43.7704928862763, 111.49879230041614 -43.45784650851718, 110.04698510900447 -43.45784650851718, 110.04698510900447 -43.14520013075806, 108.59517791759279 -43.14520013075806, 108.59517791759279 -42.83255375299895, 107.43373216446346 -42.83255375299895, 107.43373216446346 -42.51990737523983, 106.27228641133412 -42.51990737523983, 106.27228641133412 -42.20726099748072, 102.20722627538146 -42.20726099748072, 102.20722627538146 -41.8946146197216, 97.85180470114645 -41.8946146197216, 97.85180470114645 -41.581968241962485, 91.46385305893511 -41.581968241962485, 91.46385305893511 -41.8946146197216, 88.56023867611178 -41.8946146197216, 88.56023867611178 -42.20726099748072, 86.52770860813544 -42.20726099748072, 86.52770860813544 -42.51990737523983, 85.07590141672377 -42.51990737523983, 85.07590141672377 -42.83255375299895, 83.6240942253121 -42.83255375299895, 83.6240942253121 -43.14520013075806, 75.20361251512442 -43.14520013075806, 75.20361251512442 -43.45784650851718, 72.59035957058342 -43.45784650851718), + (204.99517542732758 0, 204.99517542732758 -0.6252927555182328, 205.2855368656099 -0.6252927555182328, 205.2855368656099 -0.9379391332773492, 205.57589830389225 -0.9379391332773492, 205.57589830389225 -1.2505855110364656, 205.86625974217458 -1.2505855110364656, 205.86625974217458 -2.188524644313815, 206.1566211804569 -2.188524644313815, 206.1566211804569 -2.5011710220729313, 205.86625974217458 -2.5011710220729313, 205.86625974217458 -3.126463777591164, 205.57589830389225 -3.126463777591164, 205.57589830389225 -3.4391101553502805, 205.2855368656099 -3.4391101553502805, 205.2855368656099 -3.751756533109397, 204.99517542732758 -3.751756533109397, 204.99517542732758 -4.064402910868513, 204.41445255076292 -4.064402910868513, 204.41445255076292 -4.37704928862763, 203.54336823591592 -4.37704928862763, 203.54336823591592 -4.689695666386746, 202.67228392106892 -4.689695666386746, 202.67228392106892 -5.002342044145863, 201.8011996062219 -5.002342044145863, 201.8011996062219 -5.314988421904979, 200.63975385309257 -5.314988421904979, 200.63975385309257 -5.627634799664095, 199.47830809996324 -5.627634799664095, 199.47830809996324 -5.940281177423212, 197.73613947026925 -5.940281177423212, 197.73613947026925 -6.252927555182328, 196.5746937171399 -6.252927555182328, 196.5746937171399 -6.565573932941445, 195.12288652572823 -6.565573932941445, 195.12288652572823 -6.878220310700561, 193.9614407725989 -6.878220310700561, 193.9614407725989 -7.1908666884596775, 192.21927214290488 -7.1908666884596775, 192.21927214290488 -7.503513066218794, 190.76746495149322 -7.503513066218794, 190.76746495149322 -7.81615944397791, 189.02529632179923 -7.81615944397791, 189.02529632179923 -8.128805821737027, 186.99276625382288 -8.128805821737027, 186.99276625382288 -8.441452199496144, 185.2505976241289 -8.441452199496144, 185.2505976241289 -8.75409857725526, 183.5084289944349 -8.75409857725526, 183.5084289944349 -9.066744955014375, 181.76626036474087 -9.066744955014375, 181.76626036474087 -9.379391332773492, 180.02409173504688 -9.379391332773492, 180.02409173504688 -9.69203771053261, 177.99156166707056 -9.69203771053261, 177.99156166707056 -10.004684088291725, 175.66867016081187 -10.004684088291725, 175.66867016081187 -10.31733046605084, 172.76505577798855 -10.31733046605084, 172.76505577798855 -10.629976843809958, 169.28071851860054 -10.629976843809958, 169.28071851860054 -10.942623221569075, 165.5060198209302 -10.942623221569075, 165.5060198209302 -11.25526959932819, 160.2795139318482 -11.25526959932819, 160.2795139318482 -11.567915977087306, 153.60120085135452 -11.567915977087306, 153.60120085135452 -11.880562354846424, 148.08433352399018 -11.880562354846424, 148.08433352399018 -12.193208732605541, 142.85782763490818 -12.193208732605541, 142.85782763490818 -12.505855110364656, 137.63132174582617 -12.505855110364656, 137.63132174582617 -12.818501488123772, 132.11445441846183 -12.818501488123772, 132.11445441846183 -13.13114786588289, 127.17830996766216 -13.13114786588289, 127.17830996766216 -13.443794243642007, 122.24216551686249 -13.443794243642007, 122.24216551686249 -13.756440621401122, 117.30602106606281 -13.756440621401122, 117.30602106606281 -14.069086999160238, 113.24096093011013 -14.069086999160238, 113.24096093011013 -14.381733376919355, 108.59517791759279 -14.381733376919355, 108.59517791759279 -14.694379754678472, 104.2397563433578 -14.694379754678472, 104.2397563433578 -15.007026132437588, 99.88433476912279 -15.007026132437588, 99.88433476912279 -15.319672510196703, 95.81927463317011 -15.319672510196703, 95.81927463317011 -15.63231888795582, 91.75421449721745 -15.63231888795582, 91.75421449721745 -15.944965265714938, 87.68915436126477 -15.944965265714938, 87.68915436126477 -16.257611643474053, 83.6240942253121 -16.257611643474053, 83.6240942253121 -16.57025802123317, 78.97831121279476 -16.57025802123317, 78.97831121279476 -16.882904398992288, 74.04216676199509 -16.882904398992288, 74.04216676199509 -17.195550776751404, 72.59035957058342 -17.195550776751404), + (4.355421574235005 -23.44847833193373, 3.774698697670338 -23.44847833193373, 3.774698697670338 -23.761124709692847, 2.9036143828233367 -23.761124709692847, 2.9036143828233367 -24.073771087451963, 2.0325300679763356 -24.073771087451963, 2.0325300679763356 -24.386417465211082, 1.4518071914116684 -24.386417465211082, 1.4518071914116684 -24.699063842970197, 1.1614457531293347 -24.699063842970197, 1.1614457531293347 -25.011710220729313, 0.8710843148470011 -25.011710220729313, 0.8710843148470011 -25.637002976247544, 1.1614457531293347 -25.637002976247544, 1.1614457531293347 -25.949649354006663, 1.7421686296940022 -25.949649354006663, 1.7421686296940022 -26.26229573176578, 2.3228915062586695 -26.26229573176578, 2.3228915062586695 -26.574942109524894, 3.774698697670338 -26.574942109524894, 3.774698697670338 -26.887588487284013, 4.355421574235005 -26.887588487284013), + (72.29999813230108 -17.195550776751404, 69.10602231119542 -17.195550776751404, 69.10602231119542 -17.50819715451052, 64.46023929867808 -17.50819715451052, 64.46023929867808 -17.820843532269635, 60.10481772444307 -17.820843532269635, 60.10481772444307 -18.13348991002875, 56.330119026772735 -18.13348991002875, 56.330119026772735 -18.44613628778787, 52.265058890820065 -18.44613628778787, 52.265058890820065 -18.758782665546985, 48.199998754867394 -18.758782665546985, 48.199998754867394 -19.0714290433061, 45.29638437204405 -19.0714290433061, 45.29638437204405 -19.38407542106522, 42.102408550938385 -19.38407542106522, 42.102408550938385 -19.696721798824335, 39.19879416811505 -19.696721798824335, 39.19879416811505 -20.00936817658345, 36.004818347009376 -20.00936817658345, 36.004818347009376 -20.322014554342566, 32.81084252590371 -20.322014554342566, 32.81084252590371 -20.63466093210168, 29.616866704798035 -20.63466093210168, 29.616866704798035 -20.9473073098608, 26.7132523219747 -20.9473073098608, 26.7132523219747 -21.259953687619916, 24.680722253998365 -21.259953687619916, 24.680722253998365 -21.57260006537903, 22.93855362430436 -21.57260006537903, 22.93855362430436 -21.88524644313815, 21.486746432892694 -21.88524644313815, 21.486746432892694 -22.197892820897266, 19.74457780319869 -22.197892820897266), + (72.29999813230108 -43.45784650851718, 70.26746806432475 -43.45784650851718, 70.26746806432475 -43.14520013075806, 68.23493799634842 -43.14520013075806, 68.23493799634842 -42.83255375299895, 66.20240792837208 -42.83255375299895, 66.20240792837208 -42.51990737523983, 64.46023929867808 -42.51990737523983, 64.46023929867808 -42.20726099748072, 62.718070668984076 -42.20726099748072, 62.718070668984076 -41.8946146197216, 60.97590203929008 -41.8946146197216, 60.97590203929008 -41.581968241962485, 60.10481772444307 -41.581968241962485, 60.10481772444307 -41.26932186420336, 59.23373340959607 -41.26932186420336, 59.23373340959607 -40.95667548644425, 58.362649094749074 -40.95667548644425, 58.362649094749074 -40.64402910868513, 57.7819262181844 -40.64402910868513, 57.7819262181844 -40.331382730926016, 56.9108419033374 -40.331382730926016, 56.9108419033374 -40.0187363531669, 56.330119026772735 -40.0187363531669, 56.330119026772735 -39.706089975407785, 55.45903471192573 -39.706089975407785, 55.45903471192573 -39.39344359764867, 54.87831183536107 -39.39344359764867, 54.87831183536107 -39.080797219889554, 54.297588958796396 -39.080797219889554, 54.297588958796396 -38.76815084213044, 53.4265046439494 -38.76815084213044, 53.4265046439494 -38.455504464371316, 52.84578176738473 -38.455504464371316, 52.84578176738473 -38.1428580866122, 52.265058890820065 -38.1428580866122, 52.265058890820065 -37.830211708853085, 51.68433601425539 -37.830211708853085, 51.68433601425539 -37.51756533109397, 51.10361313769073 -37.51756533109397, 51.10361313769073 -37.204918953334854, 50.52289026112606 -37.204918953334854, 50.52289026112606 -36.89227257557574, 49.942167384561394 -36.89227257557574, 49.942167384561394 -36.57962619781662, 49.07108306971439 -36.57962619781662, 49.07108306971439 -36.2669798200575, 48.199998754867394 -36.2669798200575, 48.199998754867394 -35.954333442298385, 47.32891444002039 -35.954333442298385, 47.32891444002039 -35.64168706453927, 46.167468686891056 -35.64168706453927, 46.167468686891056 -35.329040686780154, 45.29638437204405 -35.329040686780154, 45.29638437204405 -35.01639430902104, 44.425300057197056 -35.01639430902104, 44.425300057197056 -34.70374793126192, 43.26385430406772 -34.70374793126192, 43.26385430406772 -34.39110155350281, 42.39276998922072 -34.39110155350281, 42.39276998922072 -34.07845517574369, 41.521685674373714 -34.07845517574369, 41.521685674373714 -33.765808797984576, 40.65060135952672 -33.765808797984576, 40.65060135952672 -33.45316242022545, 39.48915560639738 -33.45316242022545, 39.48915560639738 -33.14051604246634, 38.61807129155038 -33.14051604246634, 38.61807129155038 -32.82786966470722, 37.746986976703376 -32.82786966470722, 37.746986976703376 -32.51522328694811, 36.58554122357405 -32.51522328694811, 36.58554122357405 -32.20257690918899, 35.13373403216237 -32.20257690918899, 35.13373403216237 -31.889930531429876, 33.972288279033044 -31.889930531429876, 33.972288279033044 -31.577284153670757, 32.52048108762137 -31.577284153670757, 32.52048108762137 -31.26463777591164, 31.068673896209702 -31.26463777591164, 31.068673896209702 -30.951991398152526, 29.616866704798035 -30.951991398152526, 29.616866704798035 -30.639345020393407, 27.874698075104035 -30.639345020393407, 27.874698075104035 -30.32669864263429, 25.842168007127697 -30.32669864263429, 25.842168007127697 -30.014052264875176, 19.74457780319869 -30.014052264875176))MULTILINESTRING ((297.3301128011097 -18.758782665546985, 296.749389924545 -18.758782665546985, 296.749389924545 -19.0714290433061, 296.16866704798036 -19.0714290433061, 296.16866704798036 -19.38407542106522, 295.5879441714157 -19.38407542106522, 295.5879441714157 -19.696721798824335, 295.00722129485104 -19.696721798824335, 295.00722129485104 -20.00936817658345, 294.42649841828637 -20.00936817658345, 294.42649841828637 -20.322014554342566, 293.8457755417217 -20.322014554342566, 293.8457755417217 -20.63466093210168, 293.26505266515704 -20.63466093210168, 293.26505266515704 -20.9473073098608, 292.6843297885924 -20.9473073098608, 292.6843297885924 -21.259953687619916, 292.10360691202766 -21.259953687619916, 292.10360691202766 -21.57260006537903, 291.522884035463 -21.57260006537903, 291.522884035463 -21.88524644313815, 290.94216115889833 -21.88524644313815, 290.94216115889833 -22.197892820897266, 290.07107684405133 -22.197892820897266, 290.07107684405133 -22.51053919865638, 289.49035396748667 -22.51053919865638, 289.49035396748667 -22.823185576415497, 288.6192696526397 -22.823185576415497, 288.6192696526397 -23.135831954174613, 287.7481853377927 -23.135831954174613, 287.7481853377927 -23.44847833193373, 287.167462461228 -23.44847833193373, 287.167462461228 -23.761124709692847, 286.58673958466335 -23.761124709692847, 286.58673958466335 -24.073771087451963, 286.0060167080987 -24.073771087451963, 286.0060167080987 -24.386417465211082, 285.425293831534 -24.386417465211082, 285.425293831534 -24.699063842970197, 284.84457095496936 -24.699063842970197, 284.84457095496936 -25.011710220729313, 284.2638480784047 -25.011710220729313, 284.2638480784047 -25.32435659848843, 283.68312520184 -25.32435659848843, 283.68312520184 -25.637002976247544, 283.3927637635577 -25.637002976247544, 283.3927637635577 -25.949649354006663, 282.81204088699303 -25.949649354006663, 282.81204088699303 -26.26229573176578, 282.23131801042837 -26.26229573176578, 282.23131801042837 -26.574942109524894, 281.65059513386365 -26.574942109524894, 281.65059513386365 -26.887588487284013, 281.3602336955813 -26.887588487284013, 281.3602336955813 -27.20023486504313, 280.77951081901665 -27.20023486504313, 280.77951081901665 -27.512881242802244, 280.198787942452 -27.512881242802244, 280.198787942452 -27.82552762056136, 279.90842650416965 -27.82552762056136, 279.90842650416965 -28.138173998320475, 279.327703627605 -28.138173998320475, 279.327703627605 -28.450820376079594, 278.7469807510403 -28.450820376079594, 278.7469807510403 -28.76346675383871, 278.456619312758 -28.76346675383871, 278.456619312758 -29.076113131597825, 277.87589643619333 -29.076113131597825, 277.87589643619333 -29.388759509356944, 277.29517355962867 -29.388759509356944, 277.29517355962867 -29.70140588711606, 277.00481212134633 -29.70140588711606, 277.00481212134633 -30.014052264875176, 276.42408924478167 -30.014052264875176, 276.42408924478167 -30.32669864263429, 276.13372780649934 -30.32669864263429, 276.13372780649934 -30.639345020393407, 275.843366368217 -30.639345020393407, 275.843366368217 -30.951991398152526, 275.5530049299347 -30.951991398152526, 275.5530049299347 -31.26463777591164, 275.26264349165234 -31.26463777591164, 275.26264349165234 -31.577284153670757, 274.97228205337 -31.577284153670757, 274.97228205337 -31.889930531429876, 274.6819206150877 -31.889930531429876, 274.6819206150877 -32.20257690918899, 274.39155917680534 -32.20257690918899, 274.39155917680534 -32.82786966470722, 274.101197738523 -32.82786966470722, 274.101197738523 -35.329040686780154, 274.39155917680534 -35.329040686780154, 274.39155917680534 -36.2669798200575, 274.6819206150877 -36.2669798200575, 274.6819206150877 -36.57962619781662, 274.97228205337 -36.57962619781662, 274.97228205337 -37.204918953334854, 275.26264349165234 -37.204918953334854, 275.26264349165234 -37.51756533109397, 275.5530049299347 -37.51756533109397, 275.5530049299347 -37.830211708853085, 275.843366368217 -37.830211708853085, 275.843366368217 -38.1428580866122, 276.13372780649934 -38.1428580866122, 276.13372780649934 -38.455504464371316, 277.00481212134633 -38.455504464371316, 277.00481212134633 -38.76815084213044, 278.16625787447566 -38.76815084213044, 278.16625787447566 -39.080797219889554, 279.6180650658873 -39.080797219889554, 279.6180650658873 -39.39344359764867, 280.4891493807343 -39.39344359764867, 280.4891493807343 -39.706089975407785, 281.65059513386365 -39.706089975407785, 281.65059513386365 -40.0187363531669, 282.81204088699303 -40.0187363531669, 282.81204088699303 -40.331382730926016, 283.68312520184 -40.331382730926016, 283.68312520184 -40.64402910868513, 284.84457095496936 -40.64402910868513, 284.84457095496936 -40.95667548644425, 286.296378146381 -40.95667548644425, 286.296378146381 -41.26932186420336, 287.45782389951034 -41.26932186420336, 287.45782389951034 -41.581968241962485, 287.7481853377927 -41.581968241962485, 287.7481853377927 -41.26932186420336, 288.32890821435734 -41.26932186420336, 288.32890821435734 -40.95667548644425, 288.909631090922 -40.95667548644425, 288.909631090922 -40.64402910868513, 289.19999252920434 -40.64402910868513, 289.19999252920434 -40.331382730926016, 289.780715405769 -40.331382730926016, 289.780715405769 -40.0187363531669, 290.36143828233367 -40.0187363531669, 290.36143828233367 -39.706089975407785, 290.94216115889833 -39.706089975407785, 290.94216115889833 -39.39344359764867, 291.522884035463 -39.39344359764867, 291.522884035463 -39.080797219889554, 292.10360691202766 -39.080797219889554, 292.10360691202766 -38.76815084213044, 292.6843297885924 -38.76815084213044, 292.6843297885924 -38.455504464371316, 293.26505266515704 -38.455504464371316, 293.26505266515704 -38.1428580866122, 293.8457755417217 -38.1428580866122, 293.8457755417217 -37.830211708853085, 294.42649841828637 -37.830211708853085, 294.42649841828637 -37.51756533109397, 295.29758273313337 -37.51756533109397, 295.29758273313337 -37.204918953334854, 295.87830560969803 -37.204918953334854, 295.87830560969803 -36.89227257557574, 296.749389924545 -36.89227257557574, 296.749389924545 -36.57962619781662, 297.3301128011097 -36.57962619781662))MULTILINESTRING ((72.29999813230108 -100.67213363843548, 68.81566087291309 -100.67213363843548, 68.81566087291309 -100.35948726067637, 64.16987786039574 -100.35948726067637, 64.16987786039574 -100.04684088291725, 60.97590203929008 -100.04684088291725, 60.97590203929008 -99.73419450515813, 58.653010533031406 -99.73419450515813, 58.653010533031406 -99.42154812739902, 56.9108419033374 -99.42154812739902, 56.9108419033374 -99.1089017496399, 55.45903471192573 -99.1089017496399, 55.45903471192573 -98.79625537188079, 54.007227520514064 -98.79625537188079, 54.007227520514064 -98.48360899412167, 52.84578176738473 -98.48360899412167, 52.84578176738473 -98.17096261636256, 51.68433601425539 -98.17096261636256, 51.68433601425539 -97.85831623860344, 50.52289026112606 -97.85831623860344, 50.52289026112606 -97.54566986084433, 49.65180594627906 -97.54566986084433, 49.65180594627906 -97.2330234830852, 49.07108306971439 -97.2330234830852, 49.07108306971439 -96.92037710532608, 48.490360193149726 -96.92037710532608, 48.490360193149726 -96.60773072756697, 47.61927587830272 -96.60773072756697, 47.61927587830272 -96.29508434980785, 47.03855300173806 -96.29508434980785, 47.03855300173806 -95.98243797204874, 46.45783012517339 -95.98243797204874, 46.45783012517339 -95.66979159428962, 45.87710724860872 -95.66979159428962, 45.87710724860872 -95.35714521653051, 45.29638437204405 -95.35714521653051, 45.29638437204405 -95.04449883877139, 45.00602293376172 -95.04449883877139, 45.00602293376172 -94.73185246101227, 44.425300057197056 -94.73185246101227, 44.425300057197056 -94.41920608325316, 43.844577180632385 -94.41920608325316, 43.844577180632385 -94.10655970549404, 43.26385430406772 -94.10655970549404, 43.26385430406772 -93.79391332773493, 42.68313142750305 -93.79391332773493, 42.68313142750305 -93.4812669499758, 42.102408550938385 -93.4812669499758, 42.102408550938385 -93.1686205722167, 41.521685674373714 -93.1686205722167, 41.521685674373714 -92.85597419445757, 40.94096279780905 -92.85597419445757, 40.94096279780905 -92.54332781669845, 40.36023992124438 -92.54332781669845, 40.36023992124438 -92.23068143893934, 40.06987848296205 -92.23068143893934, 40.06987848296205 -91.91803506118022, 39.48915560639738 -91.91803506118022, 39.48915560639738 -91.60538868342111, 38.90843272983271 -91.60538868342111, 38.90843272983271 -91.29274230566199, 38.32770985326805 -91.29274230566199, 38.32770985326805 -90.98009592790288, 37.16626410013871 -90.98009592790288, 37.16626410013871 -90.66744955014376, 35.714456908727044 -90.66744955014376, 35.714456908727044 -90.35480317238465, 34.26264971731538 -90.35480317238465, 34.26264971731538 -90.04215679462553, 32.52048108762137 -90.04215679462553, 32.52048108762137 -89.7295104168664, 30.48795101964504 -89.7295104168664, 30.48795101964504 -89.4168640391073, 28.165059513386367 -89.4168640391073, 28.165059513386367 -89.10421766134817, 26.422890883692364 -89.10421766134817, 26.422890883692364 -89.4168640391073, 25.26144513056303 -89.4168640391073, 25.26144513056303 -89.7295104168664, 24.39036081571603 -89.7295104168664, 24.39036081571603 -90.04215679462553, 23.228915062586694 -90.04215679462553, 23.228915062586694 -90.35480317238465, 22.357830747739694 -90.35480317238465, 22.357830747739694 -90.66744955014376, 21.19638499461036 -90.66744955014376, 21.19638499461036 -90.98009592790288, 20.32530067976336 -90.98009592790288, 20.32530067976336 -91.29274230566199, 19.74457780319869 -91.29274230566199), + (47.61927587830272 -150.69555407989412, 47.61927587830272 -150.382907702135, 47.32891444002039 -150.382907702135, 47.32891444002039 -149.75761494661677, 47.03855300173806 -149.75761494661677, 47.03855300173806 -149.13232219109852, 46.74819156345572 -149.13232219109852, 46.74819156345572 -148.5070294355803, 46.45783012517339 -148.5070294355803, 46.45783012517339 -147.88173668006206, 46.167468686891056 -147.88173668006206, 46.167468686891056 -147.56909030230295, 45.87710724860872 -147.56909030230295, 45.87710724860872 -146.9437975467847, 45.58674581032639 -146.9437975467847, 45.58674581032639 -146.6311511690256, 45.29638437204405 -146.6311511690256, 45.29638437204405 -146.3185047912665, 45.00602293376172 -146.3185047912665, 45.00602293376172 -145.69321203574825, 44.71566149547939 -145.69321203574825, 44.71566149547939 -145.38056565798914, 44.425300057197056 -145.38056565798914, 44.425300057197056 -145.06791928023, 44.13493861891472 -145.06791928023, 44.13493861891472 -144.7552729024709, 43.844577180632385 -144.7552729024709, 43.844577180632385 -144.44262652471178, 43.55421574235005 -144.44262652471178, 43.55421574235005 -144.12998014695268, 43.26385430406772 -144.12998014695268, 43.26385430406772 -143.81733376919354, 42.68313142750305 -143.81733376919354, 42.68313142750305 -143.50468739143443, 42.39276998922072 -143.50468739143443, 42.39276998922072 -143.19204101367532, 41.81204711265605 -143.19204101367532, 41.81204711265605 -142.8793946359162, 41.521685674373714 -142.8793946359162, 41.521685674373714 -142.56674825815708, 40.94096279780905 -142.56674825815708, 40.94096279780905 -142.25410188039797, 40.06987848296205 -142.25410188039797, 40.06987848296205 -141.94145550263886, 39.48915560639738 -141.94145550263886, 39.48915560639738 -141.62880912487972, 38.61807129155038 -141.62880912487972, 38.61807129155038 -141.31616274712061, 38.32770985326805 -141.31616274712061, 38.32770985326805 -141.62880912487972, 38.037348414985715 -141.62880912487972, 38.037348414985715 -142.56674825815708, 37.746986976703376 -142.56674825815708, 37.746986976703376 -143.81733376919354, 37.456625538421044 -143.81733376919354, 37.456625538421044 -145.06791928023, 37.16626410013871 -145.06791928023, 37.16626410013871 -146.6311511690256, 36.87590266185638 -146.6311511690256, 36.87590266185638 -147.88173668006206, 36.58554122357405 -147.88173668006206, 36.58554122357405 -149.75761494661677, 36.29517978529171 -149.75761494661677, 36.29517978529171 -151.32084683541234, 36.004818347009376 -151.32084683541234, 36.004818347009376 -152.88407872420794), + (297.3301128011097 -85.35246112823879, 296.16866704798036 -85.35246112823879, 296.16866704798036 -85.6651075059979, 295.00722129485104 -85.6651075059979, 295.00722129485104 -85.97775388375702, 293.5554141034394 -85.97775388375702, 293.5554141034394 -86.29040026151613, 292.39396835031005 -86.29040026151613, 292.39396835031005 -86.60304663927525, 291.23252259718066 -86.60304663927525, 291.23252259718066 -86.91569301703436, 289.780715405769 -86.91569301703436, 289.780715405769 -87.22833939479348, 288.32890821435734 -87.22833939479348, 288.32890821435734 -87.5409857725526, 286.8771010229457 -87.5409857725526, 286.8771010229457 -87.85363215031171, 284.84457095496936 -87.85363215031171, 284.84457095496936 -88.16627852807083, 283.10240232527536 -88.16627852807083, 283.10240232527536 -88.47892490582994, 281.3602336955813 -88.47892490582994, 281.3602336955813 -88.79157128358906, 279.90842650416965 -88.79157128358906, 279.90842650416965 -89.10421766134817, 278.456619312758 -89.10421766134817, 278.456619312758 -89.4168640391073, 277.29517355962867 -89.4168640391073, 277.29517355962867 -89.7295104168664, 275.5530049299347 -89.7295104168664, 275.5530049299347 -89.4168640391073, 274.39155917680534 -89.4168640391073, 274.39155917680534 -89.10421766134817, 273.230113423676 -89.10421766134817, 273.230113423676 -88.79157128358906, 272.0686676705467 -88.79157128358906, 272.0686676705467 -88.47892490582994, 270.9072219174173 -88.47892490582994, 270.9072219174173 -88.16627852807083, 269.45541472600564 -88.16627852807083, 269.45541472600564 -87.85363215031171, 268.003607534594 -87.85363215031171, 268.003607534594 -87.5409857725526, 266.5518003431823 -87.5409857725526, 266.5518003431823 -87.22833939479348, 265.09999315177066 -87.22833939479348, 265.09999315177066 -86.91569301703436, 263.93854739864133 -86.91569301703436, 263.93854739864133 -86.60304663927525, 262.777101645512 -86.60304663927525, 262.777101645512 -86.29040026151613, 261.906017330665 -86.29040026151613, 261.906017330665 -85.97775388375702, 260.7445715775356 -85.97775388375702, 260.7445715775356 -85.6651075059979, 259.8734872626886 -85.6651075059979, 259.8734872626886 -85.35246112823879, 258.7120415095593 -85.35246112823879, 258.7120415095593 -85.03981475047966, 257.8409571947123 -85.03981475047966, 257.8409571947123 -84.72716837272054, 256.679511441583 -84.72716837272054, 256.679511441583 -84.41452199496143, 255.80842712673598 -84.41452199496143, 255.80842712673598 -84.10187561720231, 254.64698137360665 -84.10187561720231, 254.64698137360665 -83.7892292394432, 253.19517418219496 -83.7892292394432, 253.19517418219496 -84.10187561720231, 252.32408986734796 -84.10187561720231, 252.32408986734796 -84.41452199496143, 251.7433669907833 -84.41452199496143, 251.7433669907833 -84.72716837272054, 251.16264411421864 -84.72716837272054, 251.16264411421864 -85.03981475047966, 250.29155979937164 -85.03981475047966, 250.29155979937164 -85.35246112823879, 249.71083692280698 -85.35246112823879, 249.71083692280698 -85.6651075059979, 248.83975260795998 -85.6651075059979, 248.83975260795998 -85.97775388375702, 247.67830685483062 -85.97775388375702, 247.67830685483062 -86.29040026151613, 246.22649966341896 -86.29040026151613, 246.22649966341896 -86.60304663927525, 243.3228852805956 -86.60304663927525, 243.3228852805956 -86.29040026151613, 242.16143952746629 -86.29040026151613, 242.16143952746629 -85.97775388375702, 241.87107808918395 -85.97775388375702, 241.87107808918395 -85.6651075059979, 241.58071665090162 -85.6651075059979, 241.58071665090162 -85.35246112823879, 240.99999377433696 -85.35246112823879, 240.99999377433696 -85.03981475047966, 240.70963233605463 -85.03981475047966, 240.70963233605463 -84.72716837272054, 240.12890945948996 -84.72716837272054, 240.12890945948996 -84.41452199496143, 239.83854802120763 -84.41452199496143, 239.83854802120763 -84.10187561720231, 239.25782514464296 -84.10187561720231, 239.25782514464296 -83.7892292394432, 238.6771022680783 -83.7892292394432, 238.6771022680783 -83.47658286168408, 238.38674082979597 -83.47658286168408, 238.38674082979597 -83.16393648392497, 237.80601795323128 -83.16393648392497, 237.80601795323128 -82.85129010616585, 237.2252950766666 -82.85129010616585, 237.2252950766666 -82.53864372840673, 236.64457220010195 -82.53864372840673, 236.64457220010195 -82.22599735064762, 236.06384932353728 -82.22599735064762, 236.06384932353728 -81.9133509728885, 235.1927650086903 -81.9133509728885, 235.1927650086903 -81.60070459512939, 234.61204213212562 -81.60070459512939, 234.61204213212562 -81.28805821737026, 233.74095781727863 -81.28805821737026, 233.74095781727863 -80.97541183961116, 232.8698735024316 -80.97541183961116, 232.8698735024316 -80.66276546185203, 231.9987891875846 -80.66276546185203, 231.9987891875846 -80.35011908409292, 231.1277048727376 -80.35011908409292, 231.1277048727376 -80.0374727063338, 229.96625911960828 -80.0374727063338, 229.96625911960828 -79.72482632857468, 228.80481336647895 -79.72482632857468, 228.80481336647895 -79.41217995081557, 227.35300617506726 -79.41217995081557, 227.35300617506726 -79.09953357305645, 226.19156042193794 -79.09953357305645, 226.19156042193794 -78.78688719529734, 224.73975323052628 -78.78688719529734, 224.73975323052628 -78.47424081753822, 223.28794603911462 -78.47424081753822, 223.28794603911462 -78.16159443977911, 221.5457774094206 -78.16159443977911, 221.5457774094206 -77.84894806201999, 220.09397021800893 -77.84894806201999, 220.09397021800893 -77.53630168426088, 219.51324734144427 -77.53630168426088, 219.51324734144427 -77.84894806201999, 218.64216302659727 -77.84894806201999, 218.64216302659727 -78.16159443977911, 217.77107871175025 -78.16159443977911, 217.77107871175025 -78.47424081753822, 217.19035583518558 -78.47424081753822, 217.19035583518558 -78.78688719529734, 216.89999439690325 -78.78688719529734, 216.89999439690325 -79.09953357305645, 216.3192715203386 -79.09953357305645, 216.3192715203386 -79.41217995081557, 216.02891008205626 -79.41217995081557, 216.02891008205626 -79.72482632857468, 215.4481872054916 -79.72482632857468, 215.4481872054916 -80.0374727063338, 215.15782576720926 -80.0374727063338), + (4.355421574235005 -101.92271914947194, 4.065060135952671 -101.92271914947194, 4.065060135952671 -102.23536552723107, 3.774698697670338 -102.23536552723107, 3.774698697670338 -102.8606582827493, 3.4843372593880044 -102.8606582827493, 3.4843372593880044 -103.17330466050842, 3.1939758211056706 -103.17330466050842, 3.1939758211056706 -103.48595103826753, 2.9036143828233367 -103.48595103826753, 2.9036143828233367 -104.11124379378576, 2.6132529445410033 -104.11124379378576, 2.6132529445410033 -104.42389017154488, 2.3228915062586695 -104.42389017154488, 2.3228915062586695 -104.73653654930399, 2.0325300679763356 -104.73653654930399, 2.0325300679763356 -105.36182930482224, 1.7421686296940022 -105.36182930482224, 1.7421686296940022 -105.67447568258135, 1.4518071914116684 -105.67447568258135, 1.4518071914116684 -105.98712206034047, 1.1614457531293347 -105.98712206034047, 1.1614457531293347 -106.6124148158587, 0.8710843148470011 -106.6124148158587, 0.8710843148470011 -106.92506119361781, 0.5807228765646674 -106.92506119361781, 0.5807228765646674 -107.55035394913605, 0.2903614382823337 -107.55035394913605, 0.2903614382823337 -107.86300032689516, 0 -107.86300032689516), + (193.38071789603424 -82.22599735064762, 192.21927214290488 -82.22599735064762, 192.21927214290488 -82.53864372840673, 191.05782638977556 -82.53864372840673, 191.05782638977556 -82.85129010616585, 189.6060191983639 -82.85129010616585, 189.6060191983639 -83.16393648392497, 188.15421200695224 -83.16393648392497, 188.15421200695224 -83.47658286168408, 186.70240481554055 -83.47658286168408, 186.70240481554055 -83.7892292394432, 184.96023618584655 -83.7892292394432, 184.96023618584655 -84.10187561720231, 182.92770611787023 -84.10187561720231, 182.92770611787023 -84.41452199496143, 181.47589892645854 -84.41452199496143, 181.47589892645854 -84.72716837272054, 180.3144531733292 -84.72716837272054, 180.3144531733292 -85.03981475047966, 179.15300742019988 -85.03981475047966, 179.15300742019988 -85.35246112823879, 178.2819231053529 -85.35246112823879, 178.2819231053529 -85.6651075059979, 177.70120022878822 -85.6651075059979, 177.70120022878822 -85.97775388375702, 177.12047735222356 -85.97775388375702, 177.12047735222356 -86.29040026151613, 176.53975447565887 -86.29040026151613, 176.53975447565887 -86.60304663927525, 175.9590315990942 -86.60304663927525, 175.9590315990942 -86.91569301703436, 175.37830872252954 -86.91569301703436, 175.37830872252954 -87.22833939479348, 174.79758584596487 -87.22833939479348, 174.79758584596487 -87.5409857725526, 173.92650153111788 -87.5409857725526, 173.92650153111788 -87.85363215031171, 172.47469433970622 -87.85363215031171, 172.47469433970622 -88.16627852807083, 171.31324858657686 -88.16627852807083, 171.31324858657686 -88.47892490582994, 170.15180283344753 -88.47892490582994, 170.15180283344753 -88.79157128358906, 168.69999564203587 -88.79157128358906, 168.69999564203587 -89.10421766134817, 167.53854988890654 -89.10421766134817, 167.53854988890654 -89.4168640391073, 166.08674269749486 -89.4168640391073, 166.08674269749486 -89.7295104168664, 164.6349355060832 -89.7295104168664, 164.6349355060832 -90.04215679462553, 163.18312831467154 -90.04215679462553, 163.18312831467154 -90.35480317238465, 162.0216825615422 -90.35480317238465, 162.0216825615422 -90.66744955014376, 160.56987537013052 -90.66744955014376, 160.56987537013052 -90.98009592790288, 159.4084296170012 -90.98009592790288, 159.4084296170012 -91.29274230566199, 157.95662242558953 -91.29274230566199, 157.95662242558953 -91.60538868342111, 156.50481523417787 -91.60538868342111, 156.50481523417787 -91.91803506118022, 155.05300804276618 -91.91803506118022, 155.05300804276618 -92.23068143893934, 153.3108394130722 -92.23068143893934, 153.3108394130722 -92.54332781669845, 151.5686707833782 -92.54332781669845, 151.5686707833782 -92.85597419445757, 150.40722503024884 -92.85597419445757, 150.40722503024884 -93.1686205722167, 149.2457792771195 -93.1686205722167, 149.2457792771195 -93.4812669499758, 148.08433352399018 -93.4812669499758, 148.08433352399018 -93.79391332773493, 146.92288777086085 -93.79391332773493, 146.92288777086085 -94.10655970549404, 145.7614420177315 -94.10655970549404, 145.7614420177315 -94.41920608325316, 144.30963482631984 -94.41920608325316, 144.30963482631984 -94.73185246101227, 143.1481890731905 -94.73185246101227, 143.1481890731905 -95.04449883877139, 141.69638188177885 -95.04449883877139, 141.69638188177885 -95.35714521653051, 140.24457469036716 -95.35714521653051, 140.24457469036716 -95.66979159428962, 138.7927674989555 -95.66979159428962, 138.7927674989555 -95.98243797204874, 137.34096030754384 -95.98243797204874, 137.34096030754384 -96.29508434980785, 135.59879167784982 -96.29508434980785, 135.59879167784982 -96.60773072756697, 133.85662304815583 -96.60773072756697, 133.85662304815583 -96.92037710532608, 132.11445441846183 -96.92037710532608, 132.11445441846183 -97.2330234830852, 129.50120147392082 -97.2330234830852, 129.50120147392082 -97.54566986084433, 128.04939428250916 -97.54566986084433, 128.04939428250916 -97.2330234830852, 125.72650277625048 -97.2330234830852, 125.72650277625048 -96.92037710532608, 123.69397270827415 -96.92037710532608, 123.69397270827415 -96.60773072756697, 121.95180407858015 -96.60773072756697, 121.95180407858015 -96.29508434980785, 120.20963544888615 -96.29508434980785, 120.20963544888615 -95.98243797204874, 118.46746681919214 -95.98243797204874, 118.46746681919214 -95.66979159428962, 110.62770798556913 -95.66979159428962, 110.62770798556913 -95.35714521653051, 106.56264784961647 -95.35714521653051, 106.56264784961647 -95.04449883877139, 105.98192497305179 -95.04449883877139, 105.98192497305179 -95.35714521653051, 101.6265033988168 -95.35714521653051, 101.6265033988168 -95.66979159428962, 95.81927463317011 -95.66979159428962, 95.81927463317011 -95.35714521653051, 94.65782888004078 -95.35714521653051, 94.65782888004078 -95.66979159428962, 93.20602168862911 -95.66979159428962, 93.20602168862911 -95.98243797204874, 91.46385305893511 -95.98243797204874, 91.46385305893511 -96.29508434980785, 90.01204586752344 -96.29508434980785, 90.01204586752344 -96.60773072756697, 88.26987723782943 -96.60773072756697, 88.26987723782943 -96.92037710532608, 86.52770860813544 -96.92037710532608, 86.52770860813544 -97.2330234830852, 85.07590141672377 -97.2330234830852, 85.07590141672377 -97.54566986084433, 83.33373278702977 -97.54566986084433, 83.33373278702977 -97.85831623860344, 81.59156415733577 -97.85831623860344, 81.59156415733577 -98.17096261636256, 79.84939552764176 -98.17096261636256, 79.84939552764176 -98.48360899412167, 78.68794977451243 -98.48360899412167, 78.68794977451243 -98.79625537188079, 77.23614258310076 -98.79625537188079, 77.23614258310076 -99.1089017496399, 76.07469682997143 -99.1089017496399, 76.07469682997143 -99.42154812739902, 75.20361251512442 -99.42154812739902, 75.20361251512442 -99.73419450515813, 74.33252820027742 -99.73419450515813, 74.33252820027742 -100.04684088291725, 73.46144388543043 -100.04684088291725, 73.46144388543043 -100.35948726067637, 72.59035957058342 -100.35948726067637), + (112.0795151769808 -211.3489513651627, 112.0795151769808 -209.16042672084887, 111.78915373869847 -209.16042672084887, 111.78915373869847 -206.34660932101684, 111.49879230041614 -206.34660932101684, 111.49879230041614 -203.8454382989439, 111.2084308621338 -203.8454382989439, 111.2084308621338 -201.65691365463007, 110.91806942385146 -201.65691365463007, 110.91806942385146 -199.7810353880754, 110.62770798556913 -199.7810353880754, 110.62770798556913 -197.9051571215207, 110.3373465472868 -197.9051571215207, 110.3373465472868 -196.34192523272512, 110.04698510900447 -196.34192523272512, 110.04698510900447 -194.77869334392952, 109.75662367072213 -194.77869334392952, 109.75662367072213 -193.21546145513395, 109.4662622324398 -193.21546145513395, 109.4662622324398 -191.96487594409749, 109.17590079415747 -191.96487594409749, 109.17590079415747 -190.71429043306102, 108.88553935587512 -190.71429043306102, 108.88553935587512 -189.46370492202453, 108.59517791759279 -189.46370492202453, 108.59517791759279 -188.5257657887472, 108.30481647931046 -188.5257657887472, 108.30481647931046 -187.27518027771072, 108.01445504102813 -187.27518027771072, 108.01445504102813 -186.3372411444334, 107.7240936027458 -186.3372411444334, 107.7240936027458 -185.39930201115604, 107.43373216446346 -185.39930201115604, 107.43373216446346 -184.46136287787868, 107.14337072618113 -184.46136287787868, 107.14337072618113 -183.52342374460133, 106.8530092878988 -183.52342374460133, 106.8530092878988 -182.8981309890831, 106.56264784961647 -182.8981309890831, 106.56264784961647 -181.96019185580576, 106.27228641133412 -181.96019185580576, 106.27228641133412 -181.64754547804662, 101.33614196053446 -181.64754547804662, 101.33614196053446 -181.33489910028752, 99.59397333084046 -181.33489910028752, 99.59397333084046 -181.0222527225284, 98.72288901599346 -181.0222527225284, 98.72288901599346 -180.7096063447693, 98.14216613942878 -180.7096063447693, 98.14216613942878 -180.39695996701016, 97.56144326286412 -180.39695996701016, 97.56144326286412 -180.08431358925105, 97.27108182458178 -180.08431358925105, 97.27108182458178 -179.77166721149194, 96.69035894801712 -179.77166721149194, 96.69035894801712 -179.4590208337328, 96.39999750973479 -179.4590208337328, 96.39999750973479 -179.1463744559737, 96.10963607145244 -179.1463744559737, 96.10963607145244 -178.8337280782146, 95.81927463317011 -178.8337280782146, 95.81927463317011 -178.20843532269635, 95.52891319488778 -178.20843532269635, 95.52891319488778 -177.89578894493724, 95.23855175660545 -177.89578894493724, 95.23855175660545 -177.58314256717813, 94.94819031832311 -177.58314256717813, 94.94819031832311 -176.95784981165988, 94.65782888004078 -176.95784981165988, 94.65782888004078 -176.33255705614167, 94.36746744175845 -176.33255705614167, 94.36746744175845 -175.70726430062342, 94.07710600347612 -175.70726430062342, 94.07710600347612 -175.0819715451052, 93.78674456519379 -175.0819715451052, 93.78674456519379 -174.76932516734607, 93.49638312691144 -174.76932516734607, 93.49638312691144 -174.14403241182785, 93.20602168862911 -174.14403241182785, 93.20602168862911 -173.5187396563096, 92.91566025034678 -173.5187396563096, 92.91566025034678 -172.8934469007914, 92.62529881206444 -172.8934469007914, 92.62529881206444 -172.26815414527314, 92.33493737378211 -172.26815414527314, 92.33493737378211 -171.6428613897549, 92.04457593549978 -171.6428613897549, 92.04457593549978 -171.3302150119958, 91.75421449721745 -171.3302150119958, 91.75421449721745 -170.70492225647757, 91.46385305893511 -170.70492225647757, 91.46385305893511 -170.07962950095933, 91.17349162065278 -170.07962950095933, 91.17349162065278 -169.45433674544108, 90.88313018237044 -169.45433674544108, 90.88313018237044 -169.14169036768197, 90.5927687440881 -169.14169036768197, 90.5927687440881 -168.51639761216376, 90.30240730580577 -168.51639761216376, 90.30240730580577 -167.8911048566455, 90.01204586752344 -167.8911048566455, 90.01204586752344 -167.26581210112727, 89.72168442924111 -167.26581210112727, 89.72168442924111 -166.95316572336816, 89.43132299095878 -166.95316572336816, 89.43132299095878 -166.32787296784994, 89.14096155267644 -166.32787296784994, 89.14096155267644 -165.7025802123317, 88.85060011439411 -165.7025802123317, 88.85060011439411 -165.07728745681345, 88.56023867611178 -165.07728745681345, 88.56023867611178 -164.76464107905434, 88.26987723782943 -164.76464107905434, 88.26987723782943 -164.13934832353613, 87.9795157995471 -164.13934832353613, 87.9795157995471 -163.51405556801788, 87.68915436126477 -163.51405556801788, 87.68915436126477 -163.20140919025877, 87.39879292298244 -163.20140919025877, 87.39879292298244 -162.57611643474053, 87.1084314847001 -162.57611643474053, 87.1084314847001 -161.9508236792223, 86.81807004641777 -161.9508236792223, 86.81807004641777 -161.63817730146317, 86.52770860813544 -161.63817730146317, 86.52770860813544 -161.01288454594496, 86.23734716985311 -161.01288454594496, 86.23734716985311 -160.70023816818585, 85.94698573157078 -160.70023816818585, 85.94698573157078 -160.0749454126676, 85.65662429328843 -160.0749454126676, 85.65662429328843 -159.44965265714936, 85.3662628550061 -159.44965265714936, 85.3662628550061 -159.13700627939025, 85.07590141672377 -159.13700627939025, 85.07590141672377 -158.51171352387203, 84.78553997844143 -158.51171352387203, 84.78553997844143 -158.1990671461129, 84.4951785401591 -158.1990671461129, 84.4951785401591 -157.57377439059468, 84.20481710187677 -157.57377439059468, 84.20481710187677 -157.26112801283554, 83.91445566359444 -157.26112801283554, 83.91445566359444 -156.63583525731732, 83.6240942253121 -156.63583525731732, 83.6240942253121 -156.32318887955822, 83.33373278702977 -156.32318887955822, 83.33373278702977 -156.01054250179908, 83.04337134874743 -156.01054250179908, 83.04337134874743 -155.69789612403997, 82.46264847218276 -155.69789612403997, 82.46264847218276 -155.38524974628086, 82.17228703390043 -155.38524974628086, 82.17228703390043 -155.07260336852175, 81.59156415733577 -155.07260336852175, 81.59156415733577 -154.75995699076262, 81.30120271905344 -154.75995699076262, 81.30120271905344 -154.4473106130035, 81.0108412807711 -154.4473106130035, 81.0108412807711 -154.1346642352444, 80.43011840420642 -154.1346642352444, 80.43011840420642 -153.82201785748526, 80.1397569659241 -153.82201785748526, 80.1397569659241 -153.50937147972616, 79.55903408935943 -153.50937147972616, 79.55903408935943 -153.19672510196705, 79.2686726510771 -153.19672510196705, 79.2686726510771 -152.88407872420794, 78.68794977451243 -152.88407872420794, 78.68794977451243 -152.5714323464488, 78.10722689794775 -152.5714323464488, 78.10722689794775 -152.2587859686897, 77.81686545966542 -152.2587859686897, 77.81686545966542 -151.94613959093058, 77.23614258310076 -151.94613959093058, 77.23614258310076 -151.63349321317145, 76.94578114481843 -151.63349321317145, 76.94578114481843 -151.32084683541234, 76.36505826825376 -151.32084683541234, 76.36505826825376 -151.00820045765323, 75.7843353916891 -151.00820045765323, 75.7843353916891 -150.69555407989412, 75.49397395340675 -150.69555407989412, 75.49397395340675 -150.382907702135, 74.91325107684209 -150.382907702135, 74.91325107684209 -150.07026132437588, 74.62288963855976 -150.07026132437588, 74.62288963855976 -149.75761494661677, 74.04216676199509 -149.75761494661677, 74.04216676199509 -149.44496856885763, 73.46144388543043 -149.44496856885763, 73.46144388543043 -149.13232219109852, 73.1710824471481 -149.13232219109852, 73.1710824471481 -148.81967581333942, 72.59035957058342 -148.81967581333942), + (198.02650090855158 -81.9133509728885, 197.73613947026925 -81.9133509728885, 197.73613947026925 -81.60070459512939, 197.44577803198692 -81.60070459512939, 197.44577803198692 -81.28805821737026, 197.15541659370456 -81.28805821737026, 197.15541659370456 -80.97541183961116, 196.28433227885756 -80.97541183961116, 196.28433227885756 -81.28805821737026, 195.41324796401057 -81.28805821737026, 195.41324796401057 -81.60070459512939), + (72.29999813230108 -148.19438305782117, 72.00963669401875 -148.19438305782117, 72.00963669401875 -147.88173668006206, 71.71927525573642 -147.88173668006206, 71.71927525573642 -147.56909030230295, 71.42891381745409 -147.56909030230295, 71.42891381745409 -147.25644392454382, 71.13855237917176 -147.25644392454382, 71.13855237917176 -146.9437975467847, 70.84819094088942 -146.9437975467847, 70.84819094088942 -146.6311511690256, 70.55782950260709 -146.6311511690256, 70.55782950260709 -146.3185047912665, 70.26746806432475 -146.3185047912665, 70.26746806432475 -146.00585841350735, 69.97710662604241 -146.00585841350735, 69.97710662604241 -145.69321203574825, 69.68674518776008 -145.69321203574825, 69.68674518776008 -145.38056565798914, 69.39638374947775 -145.38056565798914, 69.39638374947775 -145.06791928023, 69.10602231119542 -145.06791928023, 69.10602231119542 -144.7552729024709, 68.81566087291309 -144.7552729024709, 68.81566087291309 -144.12998014695268, 68.52529943463075 -144.12998014695268, 68.52529943463075 -143.81733376919354, 68.23493799634842 -143.81733376919354, 68.23493799634842 -143.50468739143443, 67.94457655806609 -143.50468739143443, 67.94457655806609 -143.19204101367532, 67.65421511978374 -143.19204101367532, 67.65421511978374 -142.8793946359162, 67.36385368150141 -142.8793946359162, 67.36385368150141 -142.56674825815708, 67.07349224321908 -142.56674825815708, 67.07349224321908 -142.25410188039797, 66.78313080493675 -142.25410188039797, 66.78313080493675 -141.94145550263886, 66.49276936665441 -141.94145550263886, 66.49276936665441 -141.31616274712061, 66.20240792837208 -141.31616274712061, 66.20240792837208 -141.0035163693615, 65.91204649008975 -141.0035163693615, 65.91204649008975 -140.6908699916024, 65.62168505180742 -140.6908699916024, 65.62168505180742 -140.37822361384326, 65.33132361352507 -140.37822361384326, 65.33132361352507 -140.06557723608415, 65.04096217524274 -140.06557723608415, 65.04096217524274 -139.75293085832504, 64.75060073696041 -139.75293085832504, 64.75060073696041 -139.4402844805659, 64.46023929867808 -139.4402844805659, 64.46023929867808 -138.8149917250477, 64.16987786039574 -138.8149917250477, 64.16987786039574 -138.50234534728858, 63.87951642211341 -138.50234534728858, 63.87951642211341 -138.18969896952945, 63.58915498383108 -138.18969896952945, 63.58915498383108 -137.87705259177034, 63.29879354554874 -137.87705259177034, 63.29879354554874 -137.56440621401123, 63.00843210726641 -137.56440621401123, 63.00843210726641 -137.2517598362521, 62.718070668984076 -137.2517598362521, 62.718070668984076 -136.93911345849298, 62.427709230701744 -136.93911345849298, 62.427709230701744 -136.62646708073387, 62.137347792419405 -136.62646708073387, 62.137347792419405 -136.00117432521563, 61.84698635413707 -136.00117432521563, 61.84698635413707 -135.68852794745652, 61.55662491585474 -135.68852794745652, 61.55662491585474 -135.3758815696974, 61.26626347757241 -135.3758815696974, 61.26626347757241 -135.0632351919383, 60.97590203929008 -135.0632351919383, 60.97590203929008 -134.75058881417917, 60.10481772444307 -134.75058881417917, 60.10481772444307 -134.43794243642006, 58.653010533031406 -134.43794243642006, 58.653010533031406 -134.12529605866095, 57.20120334161974 -134.12529605866095, 57.20120334161974 -134.43794243642006, 55.74939615020807 -134.43794243642006, 55.74939615020807 -134.75058881417917, 55.1686732736434 -134.75058881417917, 55.1686732736434 -135.0632351919383, 54.587950397078735 -135.0632351919383, 54.587950397078735 -135.3758815696974, 54.297588958796396 -135.3758815696974, 54.297588958796396 -135.68852794745652, 54.007227520514064 -135.68852794745652, 54.007227520514064 -136.00117432521563, 53.71686608223173 -136.00117432521563, 53.71686608223173 -136.31382070297477, 53.4265046439494 -136.31382070297477, 53.4265046439494 -136.62646708073387, 53.13614320566706 -136.62646708073387, 53.13614320566706 -136.93911345849298, 52.84578176738473 -136.93911345849298, 52.84578176738473 -137.56440621401123, 52.5554203291024 -137.56440621401123, 52.5554203291024 -138.18969896952945, 52.265058890820065 -138.18969896952945, 52.265058890820065 -138.8149917250477, 51.97469745253773 -138.8149917250477, 51.97469745253773 -139.4402844805659, 51.68433601425539 -139.4402844805659, 51.68433601425539 -140.37822361384326, 51.39397457597306 -140.37822361384326, 51.39397457597306 -141.31616274712061, 51.10361313769073 -141.31616274712061, 51.10361313769073 -142.56674825815708, 50.8132516994084 -142.56674825815708, 50.8132516994084 -144.12998014695268, 50.52289026112606 -144.12998014695268, 50.52289026112606 -146.3185047912665, 50.232528822843726 -146.3185047912665, 50.232528822843726 -148.81967581333942, 49.942167384561394 -148.81967581333942, 49.942167384561394 -151.00820045765323), + (95.23855175660545 -236.04801520813288, 95.23855175660545 -227.29391663087762, 94.94819031832311 -227.29391663087762, 94.94819031832311 -215.1007078982721, 94.65782888004078 -215.1007078982721, 94.65782888004078 -220.10304994241795, 94.36746744175845 -220.10304994241795, 94.36746744175845 -225.1053919865638, 94.07710600347612 -225.1053919865638, 94.07710600347612 -229.79508765295057, 93.78674456519379 -229.79508765295057, 93.78674456519379 -231.67096591950525))MULTILINESTRING ((4.355421574235005 -38.76815084213044, 2.3228915062586695 -38.76815084213044, 2.3228915062586695 -39.080797219889554, 0 -39.080797219889554), + (130.08192435048548 0, 130.08192435048548 -0.3126463777591164, 130.66264722705014 -0.3126463777591164, 130.66264722705014 -0.6252927555182328, 130.9530086653325 -0.6252927555182328, 130.9530086653325 -0.9379391332773492, 131.24337010361484 -0.9379391332773492, 131.24337010361484 -1.2505855110364656, 131.53373154189717 -1.2505855110364656, 131.53373154189717 -1.563231888795582, 131.8240929801795 -1.563231888795582, 131.8240929801795 -2.8138173998320477, 131.53373154189717 -2.8138173998320477, 131.53373154189717 -3.126463777591164, 131.24337010361484 -3.126463777591164, 131.24337010361484 -3.4391101553502805, 130.9530086653325 -3.4391101553502805, 130.9530086653325 -3.751756533109397, 130.08192435048548 -3.751756533109397, 130.08192435048548 -4.064402910868513, 129.21084003563848 -4.064402910868513, 129.21084003563848 -4.37704928862763, 128.3397557207915 -4.37704928862763, 128.3397557207915 -4.689695666386746, 127.17830996766216 -4.689695666386746, 127.17830996766216 -5.002342044145863, 125.72650277625048 -5.002342044145863, 125.72650277625048 -5.314988421904979, 123.98433414655648 -5.314988421904979, 123.98433414655648 -5.627634799664095, 121.95180407858015 -5.627634799664095, 121.95180407858015 -5.940281177423212, 119.62891257232148 -5.940281177423212, 119.62891257232148 -6.252927555182328, 117.30602106606281 -6.252927555182328, 117.30602106606281 -6.565573932941445, 114.98312955980414 -6.565573932941445, 114.98312955980414 -6.878220310700561, 112.66023805354547 -6.878220310700561, 112.66023805354547 -7.1908666884596775, 109.75662367072213 -7.1908666884596775, 109.75662367072213 -7.503513066218794, 106.8530092878988 -7.503513066218794, 106.8530092878988 -7.81615944397791, 104.2397563433578 -7.81615944397791, 104.2397563433578 -8.128805821737027, 101.6265033988168 -8.128805821737027, 101.6265033988168 -8.441452199496144, 98.72288901599346 -8.441452199496144, 98.72288901599346 -8.75409857725526, 95.81927463317011 -8.75409857725526, 95.81927463317011 -9.066744955014375, 93.20602168862911 -9.066744955014375, 93.20602168862911 -9.379391332773492, 90.30240730580577 -9.379391332773492, 90.30240730580577 -9.69203771053261, 87.39879292298244 -9.69203771053261, 87.39879292298244 -10.004684088291725, 84.4951785401591 -10.004684088291725, 84.4951785401591 -10.31733046605084, 81.0108412807711 -10.31733046605084, 81.0108412807711 -10.629976843809958, 77.23614258310076 -10.629976843809958, 77.23614258310076 -10.942623221569075, 73.46144388543043 -10.942623221569075, 73.46144388543043 -11.25526959932819, 72.59035957058342 -11.25526959932819), + (72.29999813230108 -11.25526959932819, 69.10602231119542 -11.25526959932819, 69.10602231119542 -11.567915977087306, 64.46023929867808 -11.567915977087306, 64.46023929867808 -11.880562354846424, 59.5240948478784 -11.880562354846424, 59.5240948478784 -12.193208732605541, 54.87831183536107 -12.193208732605541, 54.87831183536107 -12.505855110364656, 49.36144450799673 -12.505855110364656, 49.36144450799673 -12.818501488123772, 45.00602293376172 -12.818501488123772, 45.00602293376172 -13.13114786588289, 40.65060135952672 -13.13114786588289, 40.65060135952672 -13.443794243642007, 36.004818347009376 -13.443794243642007, 36.004818347009376 -13.756440621401122, 31.359035334492038 -13.756440621401122, 31.359035334492038 -14.069086999160238, 26.422890883692364 -14.069086999160238, 26.422890883692364 -14.381733376919355, 23.228915062586694 -14.381733376919355, 23.228915062586694 -14.694379754678472, 20.32530067976336 -14.694379754678472, 20.32530067976336 -15.007026132437588, 19.74457780319869 -15.007026132437588), + (4.355421574235005 -15.319672510196703, 4.065060135952671 -15.319672510196703, 4.065060135952671 -15.63231888795582, 0 -15.63231888795582), + (297.3301128011097 -58.464872640954766, 297.03975136282736 -58.464872640954766, 297.03975136282736 -58.77751901871389, 296.16866704798036 -58.77751901871389, 296.16866704798036 -59.090165396473004, 295.29758273313337 -59.090165396473004, 295.29758273313337 -59.40281177423212, 294.42649841828637 -59.40281177423212, 294.42649841828637 -59.715458151991236, 293.5554141034394 -59.715458151991236, 293.5554141034394 -60.02810452975035, 292.6843297885924 -60.02810452975035, 292.6843297885924 -60.34075090750947, 291.8132454737453 -60.34075090750947, 291.8132454737453 -60.65339728526858, 290.94216115889833 -60.65339728526858, 290.94216115889833 -60.9660436630277, 290.07107684405133 -60.9660436630277, 290.07107684405133 -61.27869004078681, 289.19999252920434 -61.27869004078681, 289.19999252920434 -61.591336418545936, 288.32890821435734 -61.591336418545936, 288.32890821435734 -61.90398279630505, 278.456619312758 -61.90398279630505, 278.456619312758 -62.21662917406417, 275.843366368217 -62.21662917406417, 275.843366368217 -61.90398279630505, 274.6819206150877 -61.90398279630505, 274.6819206150877 -61.591336418545936, 273.52047486195835 -61.591336418545936, 273.52047486195835 -61.27869004078681, 272.0686676705467 -61.27869004078681, 272.0686676705467 -60.9660436630277, 270.9072219174173 -60.9660436630277, 270.9072219174173 -60.65339728526858, 269.45541472600564 -60.65339728526858, 269.45541472600564 -60.34075090750947, 268.003607534594 -60.34075090750947, 268.003607534594 -60.02810452975035, 266.5518003431823 -60.02810452975035, 266.5518003431823 -59.715458151991236, 265.09999315177066 -59.715458151991236, 265.09999315177066 -59.40281177423212, 263.06746308379434 -59.40281177423212, 263.06746308379434 -59.090165396473004, 260.7445715775356 -59.090165396473004, 260.7445715775356 -58.77751901871389, 258.42168007127697 -58.77751901871389, 258.42168007127697 -58.464872640954766, 256.38915000330064 -58.464872640954766, 256.38915000330064 -58.15222626319565, 254.06625849704199 -58.15222626319565, 254.06625849704199 -57.839579885436535, 250.29155979937164 -57.839579885436535, 250.29155979937164 -57.52693350767742, 245.93613822513663 -57.52693350767742, 245.93613822513663 -57.214287129918304, 241.87107808918395 -57.214287129918304, 241.87107808918395 -56.90164075215919, 238.0963793915136 -56.90164075215919, 238.0963793915136 -56.58899437440007, 234.90240357040796 -56.58899437440007, 234.90240357040796 -56.27634799664095, 231.70842774930227 -56.27634799664095, 231.70842774930227 -55.963701618881835, 230.2566205578906 -55.963701618881835, 230.2566205578906 -55.65105524112272, 229.09517480476129 -55.65105524112272, 229.09517480476129 -55.338408863363604, 227.93372905163193 -55.338408863363604, 227.93372905163193 -55.02576248560449, 226.7722832985026 -55.02576248560449, 226.7722832985026 -54.71311610784537, 225.61083754537327 -54.71311610784537, 225.61083754537327 -54.40046973008626, 224.44939179224394 -54.40046973008626, 224.44939179224394 -54.08782335232714, 223.28794603911462 -54.08782335232714, 223.28794603911462 -53.775176974568026, 221.83613884770293 -53.775176974568026, 221.83613884770293 -53.462530596808904, 220.38433165629127 -53.462530596808904, 220.38433165629127 -53.14988421904979, 218.9325244648796 -53.14988421904979, 218.9325244648796 -52.83723784129067, 217.19035583518558 -52.83723784129067, 217.19035583518558 -52.52459146353156, 214.86746432892693 -52.52459146353156, 214.86746432892693 -52.21194508577244, 211.67348850782125 -52.21194508577244, 211.67348850782125 -51.899298708013326, 201.8011996062219 -51.899298708013326, 201.8011996062219 -51.58665233025421, 198.60722378511625 -51.58665233025421, 198.60722378511625 -51.27400595249509, 195.99397084057523 -51.27400595249509, 195.99397084057523 -51.58665233025421, 194.54216364916357 -51.58665233025421, 194.54216364916357 -51.899298708013326, 193.0903564577519 -51.899298708013326, 193.0903564577519 -52.21194508577244, 191.63854926634022 -52.21194508577244, 191.63854926634022 -52.52459146353156, 190.4771035132109 -52.52459146353156, 190.4771035132109 -52.83723784129067, 189.02529632179923 -52.83723784129067, 189.02529632179923 -53.14988421904979, 187.8638505686699 -53.14988421904979, 187.8638505686699 -53.462530596808904, 186.41204337725821 -53.462530596808904, 186.41204337725821 -53.775176974568026, 185.2505976241289 -53.775176974568026, 185.2505976241289 -54.08782335232714, 184.3795133092819 -54.08782335232714, 184.3795133092819 -54.40046973008626, 183.21806755615256 -54.40046973008626, 183.21806755615256 -54.71311610784537, 182.05662180302323 -54.71311610784537, 182.05662180302323 -55.02576248560449, 180.89517604989388 -55.02576248560449, 180.89517604989388 -55.338408863363604, 179.73373029676455 -55.338408863363604, 179.73373029676455 -55.65105524112272, 178.86264598191755 -55.65105524112272, 178.86264598191755 -55.963701618881835, 177.70120022878822 -55.963701618881835, 177.70120022878822 -56.27634799664095, 176.53975447565887 -56.27634799664095, 176.53975447565887 -56.58899437440007, 175.37830872252954 -56.58899437440007, 175.37830872252954 -56.90164075215919, 174.2168629694002 -56.90164075215919, 174.2168629694002 -57.214287129918304, 169.8614413951652 -57.214287129918304, 169.8614413951652 -57.52693350767742, 165.21565838264786 -57.52693350767742, 165.21565838264786 -57.839579885436535, 158.82770674043653 -57.839579885436535, 158.82770674043653 -58.15222626319565, 139.08312893723783 -58.15222626319565, 139.08312893723783 -57.839579885436535, 136.1795145544145 -57.839579885436535, 136.1795145544145 -57.52693350767742, 134.14698448643816 -57.52693350767742, 134.14698448643816 -57.214287129918304, 132.11445441846183 -57.214287129918304, 132.11445441846183 -56.90164075215919, 130.66264722705014 -56.90164075215919, 130.66264722705014 -56.58899437440007, 129.21084003563848 -56.58899437440007, 129.21084003563848 -56.27634799664095, 128.04939428250916 -56.27634799664095, 128.04939428250916 -55.963701618881835, 126.59758709109748 -55.963701618881835, 126.59758709109748 -55.65105524112272, 125.43614133796815 -55.65105524112272, 125.43614133796815 -55.338408863363604, 124.56505702312116 -55.338408863363604, 124.56505702312116 -55.02576248560449, 123.40361126999181 -55.02576248560449, 123.40361126999181 -54.71311610784537, 122.24216551686249 -54.71311610784537, 122.24216551686249 -54.40046973008626, 121.37108120201547 -54.40046973008626, 121.37108120201547 -54.08782335232714, 120.20963544888615 -54.08782335232714, 120.20963544888615 -53.775176974568026, 119.33855113403915 -53.775176974568026, 119.33855113403915 -53.462530596808904, 118.17710538090981 -53.462530596808904, 118.17710538090981 -53.14988421904979, 116.4349367512158 -53.14988421904979, 116.4349367512158 -52.83723784129067, 113.8216838066748 -52.83723784129067, 113.8216838066748 -52.52459146353156, 111.49879230041614 -52.52459146353156, 111.49879230041614 -52.21194508577244, 109.75662367072213 -52.21194508577244, 109.75662367072213 -51.899298708013326, 108.01445504102813 -51.899298708013326, 108.01445504102813 -51.58665233025421, 106.8530092878988 -51.58665233025421, 106.8530092878988 -51.27400595249509, 102.78794915194612 -51.27400595249509, 102.78794915194612 -50.96135957473597, 96.69035894801712 -50.96135957473597, 96.69035894801712 -50.64871319697686, 93.20602168862911 -50.64871319697686, 93.20602168862911 -50.96135957473597, 89.72168442924111 -50.96135957473597, 89.72168442924111 -51.27400595249509, 87.39879292298244 -51.27400595249509, 87.39879292298244 -51.58665233025421, 85.3662628550061 -51.58665233025421, 85.3662628550061 -51.899298708013326, 83.91445566359444 -51.899298708013326, 83.91445566359444 -52.21194508577244, 76.07469682997143 -52.21194508577244, 76.07469682997143 -52.52459146353156, 72.59035957058342 -52.52459146353156), + (72.29999813230108 -52.52459146353156, 69.68674518776008 -52.52459146353156, 69.68674518776008 -52.21194508577244, 67.36385368150141 -52.21194508577244, 67.36385368150141 -51.899298708013326, 65.04096217524274 -51.899298708013326, 65.04096217524274 -51.58665233025421, 62.718070668984076 -51.58665233025421, 62.718070668984076 -51.27400595249509, 60.68554060100774 -51.27400595249509, 60.68554060100774 -50.96135957473597, 59.5240948478784 -50.96135957473597, 59.5240948478784 -50.64871319697686, 58.653010533031406 -50.64871319697686, 58.653010533031406 -50.33606681921774, 57.7819262181844 -50.33606681921774, 57.7819262181844 -50.023420441458626, 56.9108419033374 -50.023420441458626, 56.9108419033374 -49.71077406369951, 56.0397575884904 -49.71077406369951, 56.0397575884904 -49.398127685940395, 55.1686732736434 -49.398127685940395, 55.1686732736434 -49.08548130818128, 54.297588958796396 -49.08548130818128, 54.297588958796396 -48.772834930422164, 53.71686608223173 -48.772834930422164, 53.71686608223173 -48.46018855266304, 52.84578176738473 -48.46018855266304, 52.84578176738473 -48.147542174903926, 52.265058890820065 -48.147542174903926, 52.265058890820065 -47.83489579714481, 51.39397457597306 -47.83489579714481, 51.39397457597306 -47.522249419385695, 50.8132516994084 -47.522249419385695, 50.8132516994084 -47.20960304162658, 50.232528822843726 -47.20960304162658, 50.232528822843726 -46.89695666386746, 49.36144450799673 -46.89695666386746, 49.36144450799673 -46.58431028610835, 48.490360193149726 -46.58431028610835, 48.490360193149726 -46.271663908349225, 47.32891444002039 -46.271663908349225, 47.32891444002039 -45.95901753059011, 46.167468686891056 -45.95901753059011, 46.167468686891056 -45.646371152830994, 45.00602293376172 -45.646371152830994, 45.00602293376172 -45.33372477507188, 44.13493861891472 -45.33372477507188, 44.13493861891472 -45.02107839731276, 42.97349286578539 -45.02107839731276, 42.97349286578539 -44.70843201955365, 42.102408550938385 -44.70843201955365, 42.102408550938385 -44.39578564179453, 40.94096279780905 -44.39578564179453, 40.94096279780905 -44.08313926403542, 40.06987848296205 -44.08313926403542, 40.06987848296205 -43.7704928862763, 38.90843272983271 -43.7704928862763, 38.90843272983271 -43.45784650851718, 38.037348414985715 -43.45784650851718, 38.037348414985715 -43.14520013075806, 36.87590266185638 -43.14520013075806, 36.87590266185638 -42.83255375299895, 35.42409547044471 -42.83255375299895, 35.42409547044471 -42.51990737523983, 34.26264971731538 -42.51990737523983, 34.26264971731538 -42.20726099748072, 32.81084252590371 -42.20726099748072, 32.81084252590371 -41.8946146197216, 31.068673896209702 -41.8946146197216, 31.068673896209702 -41.581968241962485, 29.616866704798035 -41.581968241962485, 29.616866704798035 -41.26932186420336, 27.5843366368217 -41.26932186420336, 27.5843366368217 -40.95667548644425, 23.51927650086903 -40.95667548644425, 23.51927650086903 -41.26932186420336, 21.19638499461036 -41.26932186420336, 21.19638499461036 -41.581968241962485, 20.034939241481023 -41.581968241962485, 20.034939241481023 -41.8946146197216, 19.74457780319869 -41.8946146197216))MULTILINESTRING ((297.3301128011097 -76.59836255098352, 297.03975136282736 -76.59836255098352, 297.03975136282736 -76.91100892874263, 295.87830560969803 -76.91100892874263, 295.87830560969803 -77.22365530650175, 295.00722129485104 -77.22365530650175, 295.00722129485104 -77.53630168426088, 293.8457755417217 -77.53630168426088, 293.8457755417217 -77.84894806201999, 292.9746912268747 -77.84894806201999, 292.9746912268747 -78.16159443977911, 291.8132454737453 -78.16159443977911, 291.8132454737453 -78.47424081753822, 290.94216115889833 -78.47424081753822, 290.94216115889833 -78.78688719529734, 289.780715405769 -78.78688719529734, 289.780715405769 -79.09953357305645, 288.6192696526397 -79.09953357305645, 288.6192696526397 -79.41217995081557, 287.45782389951034 -79.41217995081557, 287.45782389951034 -79.72482632857468, 284.2638480784047 -79.72482632857468, 284.2638480784047 -80.0374727063338, 281.069872257299 -80.0374727063338, 281.069872257299 -80.35011908409292, 278.7469807510403 -80.35011908409292, 278.7469807510403 -80.66276546185203, 277.00481212134633 -80.66276546185203, 277.00481212134633 -80.97541183961116, 276.13372780649934 -80.97541183961116, 276.13372780649934 -80.66276546185203, 274.6819206150877 -80.66276546185203, 274.6819206150877 -80.35011908409292, 273.52047486195835 -80.35011908409292, 273.52047486195835 -80.0374727063338, 272.359029108829 -80.0374727063338, 272.359029108829 -79.72482632857468, 270.9072219174173 -79.72482632857468, 270.9072219174173 -79.41217995081557, 269.45541472600564 -79.41217995081557, 269.45541472600564 -79.09953357305645, 268.003607534594 -79.09953357305645, 268.003607534594 -78.78688719529734, 266.5518003431823 -78.78688719529734, 266.5518003431823 -78.47424081753822, 264.80963171348833 -78.47424081753822, 264.80963171348833 -78.16159443977911, 263.648185960359 -78.16159443977911, 263.648185960359 -77.84894806201999, 262.4867402072297 -77.84894806201999, 262.4867402072297 -77.53630168426088, 261.03493301581796 -77.53630168426088, 261.03493301581796 -77.22365530650175, 259.8734872626886 -77.22365530650175, 259.8734872626886 -76.91100892874263, 258.7120415095593 -76.91100892874263, 258.7120415095593 -76.59836255098352, 257.26023431814764 -76.59836255098352, 257.26023431814764 -76.2857161732244, 256.0987885650183 -76.2857161732244, 256.0987885650183 -75.97306979546529, 254.64698137360665 -75.97306979546529, 254.64698137360665 -75.66042341770617, 251.45300555250097 -75.66042341770617, 251.45300555250097 -75.97306979546529, 245.35541534857197 -75.97306979546529, 245.35541534857197 -75.66042341770617, 242.74216240403095 -75.66042341770617, 242.74216240403095 -75.34777703994706, 241.58071665090162 -75.34777703994706, 241.58071665090162 -75.03513066218794, 240.4192708977723 -75.03513066218794, 240.4192708977723 -74.72248428442882, 239.25782514464296 -74.72248428442882, 239.25782514464296 -74.40983790666971, 237.80601795323128 -74.40983790666971, 237.80601795323128 -74.09719152891059, 236.35421076181962 -74.09719152891059, 236.35421076181962 -73.78454515115148, 234.90240357040796 -73.78454515115148, 234.90240357040796 -73.47189877339235, 233.4505963789963 -73.47189877339235, 233.4505963789963 -73.15925239563325, 231.70842774930227 -73.15925239563325, 231.70842774930227 -72.84660601787412, 230.2566205578906 -72.84660601787412, 230.2566205578906 -72.533959640115, 228.80481336647895 -72.533959640115, 228.80481336647895 -72.22131326235589, 227.6433676133496 -72.22131326235589, 227.6433676133496 -71.90866688459677, 226.19156042193794 -71.90866688459677, 226.19156042193794 -71.59602050683766, 224.44939179224394 -71.59602050683766, 224.44939179224394 -71.28337412907854, 222.99758460083228 -71.28337412907854, 222.99758460083228 -70.97072775131943, 221.25541597113826 -70.97072775131943, 221.25541597113826 -70.65808137356031, 219.22288590316194 -70.65808137356031, 219.22288590316194 -70.3454349958012, 197.15541659370456 -70.3454349958012, 197.15541659370456 -70.03278861804208, 196.86505515542223 -70.03278861804208, 196.86505515542223 -70.3454349958012, 195.7036094022929 -70.3454349958012, 195.7036094022929 -70.65808137356031, 194.54216364916357 -70.65808137356031, 194.54216364916357 -70.97072775131943, 193.38071789603424 -70.97072775131943, 193.38071789603424 -71.28337412907854, 192.21927214290488 -71.28337412907854, 192.21927214290488 -71.59602050683766, 191.3481878280579 -71.59602050683766, 191.3481878280579 -71.90866688459677, 190.18674207492856 -71.90866688459677, 190.18674207492856 -72.22131326235589, 189.02529632179923 -72.22131326235589, 189.02529632179923 -72.533959640115, 188.15421200695224 -72.533959640115, 188.15421200695224 -72.84660601787412, 186.99276625382288 -72.84660601787412, 186.99276625382288 -73.15925239563325, 186.12168193897588 -73.15925239563325, 186.12168193897588 -73.47189877339235, 184.96023618584655 -73.47189877339235, 184.96023618584655 -73.78454515115148, 184.08915187099956 -73.78454515115148, 184.08915187099956 -74.09719152891059, 183.21806755615256 -74.09719152891059, 183.21806755615256 -74.40983790666971, 182.34698324130557 -74.40983790666971, 182.34698324130557 -74.72248428442882, 181.47589892645854 -74.72248428442882, 181.47589892645854 -75.03513066218794, 180.60481461161154 -75.03513066218794, 180.60481461161154 -75.34777703994706, 179.73373029676455 -75.34777703994706, 179.73373029676455 -75.66042341770617, 178.86264598191755 -75.66042341770617, 178.86264598191755 -75.97306979546529, 177.99156166707056 -75.97306979546529, 177.99156166707056 -76.2857161732244, 177.12047735222356 -76.2857161732244, 177.12047735222356 -76.59836255098352, 176.24939303737654 -76.59836255098352, 176.24939303737654 -76.91100892874263, 175.66867016081187 -76.91100892874263, 175.66867016081187 -77.22365530650175, 174.79758584596487 -77.22365530650175, 174.79758584596487 -77.53630168426088, 173.34577865455321 -77.53630168426088, 173.34577865455321 -77.84894806201999, 171.6036100248592 -77.84894806201999, 171.6036100248592 -78.16159443977911, 169.57107995688287 -78.16159443977911, 169.57107995688287 -78.47424081753822, 167.53854988890654 -78.47424081753822, 167.53854988890654 -78.78688719529734, 165.5060198209302 -78.78688719529734, 165.5060198209302 -79.09953357305645, 163.18312831467154 -79.09953357305645, 163.18312831467154 -79.41217995081557, 160.86023680841285 -79.41217995081557, 160.86023680841285 -79.72482632857468, 158.5373453021542 -79.72482632857468, 158.5373453021542 -80.0374727063338, 155.92409235761318 -80.0374727063338, 155.92409235761318 -80.35011908409292, 153.02047797478986 -80.35011908409292, 153.02047797478986 -80.66276546185203, 150.1168635919665 -80.66276546185203, 150.1168635919665 -80.97541183961116, 147.50361064742552 -80.97541183961116, 147.50361064742552 -81.28805821737026, 144.30963482631984 -81.28805821737026, 144.30963482631984 -81.60070459512939, 140.24457469036716 -81.60070459512939, 140.24457469036716 -81.9133509728885, 133.5662616098735 -81.9133509728885, 133.5662616098735 -81.60070459512939, 129.50120147392082 -81.60070459512939, 129.50120147392082 -81.28805821737026, 127.46867140594449 -81.28805821737026, 127.46867140594449 -80.97541183961116, 125.72650277625048 -80.97541183961116, 125.72650277625048 -80.66276546185203, 124.27469558483881 -80.66276546185203, 124.27469558483881 -80.35011908409292, 122.82288839342715 -80.35011908409292, 122.82288839342715 -80.0374727063338, 121.37108120201547 -80.0374727063338, 121.37108120201547 -79.72482632857468, 119.91927401060381 -79.72482632857468, 119.91927401060381 -79.41217995081557, 118.46746681919214 -79.41217995081557, 118.46746681919214 -79.09953357305645, 116.14457531293347 -79.09953357305645, 116.14457531293347 -78.78688719529734, 112.36987661526314 -78.78688719529734, 112.36987661526314 -78.47424081753822, 109.4662622324398 -78.47424081753822, 109.4662622324398 -78.16159443977911, 107.14337072618113 -78.16159443977911, 107.14337072618113 -77.84894806201999, 91.75421449721745 -77.84894806201999, 91.75421449721745 -78.16159443977911, 88.26987723782943 -78.16159443977911, 88.26987723782943 -78.47424081753822, 85.65662429328843 -78.47424081753822, 85.65662429328843 -78.78688719529734, 80.43011840420642 -78.78688719529734, 80.43011840420642 -79.09953357305645, 74.62288963855976 -79.09953357305645, 74.62288963855976 -79.41217995081557, 72.59035957058342 -79.41217995081557), + (4.355421574235005 -76.91100892874263, 3.774698697670338 -76.91100892874263, 3.774698697670338 -77.22365530650175, 3.4843372593880044 -77.22365530650175, 3.4843372593880044 -77.53630168426088, 2.9036143828233367 -77.53630168426088, 2.9036143828233367 -77.84894806201999, 2.3228915062586695 -77.84894806201999, 2.3228915062586695 -78.16159443977911, 2.0325300679763356 -78.16159443977911, 2.0325300679763356 -78.47424081753822, 1.4518071914116684 -78.47424081753822, 1.4518071914116684 -78.78688719529734, 1.1614457531293347 -78.78688719529734, 1.1614457531293347 -79.09953357305645, 0.5807228765646674 -79.09953357305645, 0.5807228765646674 -79.41217995081557, 0.2903614382823337 -79.41217995081557, 0.2903614382823337 -79.72482632857468, 0 -79.72482632857468), + (72.29999813230108 -79.41217995081557, 70.26746806432475 -79.41217995081557, 70.26746806432475 -79.09953357305645, 67.65421511978374 -79.09953357305645, 67.65421511978374 -78.78688719529734, 65.04096217524274 -78.78688719529734, 65.04096217524274 -78.47424081753822, 62.427709230701744 -78.47424081753822, 62.427709230701744 -78.16159443977911, 60.395179162725405 -78.16159443977911, 60.395179162725405 -77.84894806201999, 58.94337197131374 -77.84894806201999, 58.94337197131374 -77.53630168426088, 57.7819262181844 -77.53630168426088, 57.7819262181844 -77.22365530650175, 56.330119026772735 -77.22365530650175, 56.330119026772735 -76.91100892874263, 55.1686732736434 -76.91100892874263, 55.1686732736434 -76.59836255098352, 54.007227520514064 -76.59836255098352, 54.007227520514064 -76.2857161732244, 53.13614320566706 -76.2857161732244, 53.13614320566706 -75.97306979546529, 51.97469745253773 -75.97306979546529, 51.97469745253773 -75.66042341770617, 51.10361313769073 -75.66042341770617, 51.10361313769073 -75.34777703994706, 50.232528822843726 -75.34777703994706, 50.232528822843726 -75.03513066218794, 49.07108306971439 -75.03513066218794, 49.07108306971439 -74.72248428442882, 47.61927587830272 -74.72248428442882, 47.61927587830272 -74.40983790666971, 46.45783012517339 -74.40983790666971, 46.45783012517339 -74.09719152891059, 45.00602293376172 -74.09719152891059, 45.00602293376172 -73.78454515115148, 43.55421574235005 -73.78454515115148, 43.55421574235005 -73.47189877339235, 42.39276998922072 -73.47189877339235, 42.39276998922072 -73.15925239563325, 41.23132423609138 -73.15925239563325, 41.23132423609138 -72.84660601787412, 40.06987848296205 -72.84660601787412, 40.06987848296205 -72.533959640115, 38.90843272983271 -72.533959640115, 38.90843272983271 -72.22131326235589, 37.16626410013871 -72.22131326235589, 37.16626410013871 -71.90866688459677, 35.13373403216237 -71.90866688459677, 35.13373403216237 -71.59602050683766, 33.10120396418604 -71.59602050683766, 33.10120396418604 -71.28337412907854, 30.48795101964504 -71.28337412907854, 30.48795101964504 -70.97072775131943, 25.26144513056303 -70.97072775131943, 25.26144513056303 -71.28337412907854, 23.80963793915136 -71.28337412907854, 23.80963793915136 -71.59602050683766, 22.648192186022026 -71.59602050683766, 22.648192186022026 -71.90866688459677, 21.777107871175026 -71.90866688459677, 21.777107871175026 -72.22131326235589, 20.61566211804569 -72.22131326235589, 20.61566211804569 -72.533959640115, 19.74457780319869 -72.533959640115))MULTILINESTRING ((297.3301128011097 -98.17096261636256, 295.00722129485104 -98.17096261636256, 295.00722129485104 -98.48360899412167, 290.07107684405133 -98.48360899412167, 290.07107684405133 -98.79625537188079, 287.167462461228 -98.79625537188079, 287.167462461228 -99.1089017496399, 286.0060167080987 -99.1089017496399, 286.0060167080987 -99.42154812739902, 284.84457095496936 -99.42154812739902, 284.84457095496936 -99.73419450515813, 283.97348664012236 -99.73419450515813, 283.97348664012236 -100.04684088291725, 282.81204088699303 -100.04684088291725, 282.81204088699303 -100.35948726067637, 281.940956572146 -100.35948726067637, 281.940956572146 -100.67213363843548, 281.069872257299 -100.67213363843548, 281.069872257299 -100.9847800161946, 280.198787942452 -100.9847800161946, 280.198787942452 -101.29742639395371, 279.327703627605 -101.29742639395371, 279.327703627605 -101.61007277171284, 278.456619312758 -101.61007277171284, 278.456619312758 -101.92271914947194, 277.87589643619333 -101.92271914947194, 277.87589643619333 -102.23536552723107, 277.00481212134633 -102.23536552723107, 277.00481212134633 -102.54801190499018, 275.5530049299347 -102.54801190499018, 275.5530049299347 -102.23536552723107, 274.39155917680534 -102.23536552723107, 274.39155917680534 -101.92271914947194, 272.9397519853937 -101.92271914947194, 272.9397519853937 -101.61007277171284, 271.77830623226436 -101.61007277171284, 271.77830623226436 -101.29742639395371, 270.32649904085264 -101.29742639395371, 270.32649904085264 -100.9847800161946, 268.874691849441 -100.9847800161946, 268.874691849441 -100.67213363843548, 267.4228846580293 -100.67213363843548, 267.4228846580293 -100.35948726067637, 265.6807160283353 -100.35948726067637, 265.6807160283353 -100.04684088291725, 264.22890883692367 -100.04684088291725, 264.22890883692367 -99.73419450515813, 263.35782452207667 -99.73419450515813, 263.35782452207667 -99.42154812739902, 262.4867402072297 -99.42154812739902, 262.4867402072297 -99.1089017496399, 261.6156558923827 -99.1089017496399, 261.6156558923827 -98.79625537188079, 260.7445715775356 -98.79625537188079, 260.7445715775356 -98.48360899412167, 259.8734872626886 -98.48360899412167, 259.8734872626886 -98.17096261636256, 259.00240294784163 -98.17096261636256, 259.00240294784163 -97.85831623860344, 258.13131863299463 -97.85831623860344, 258.13131863299463 -97.54566986084433, 257.26023431814764 -97.54566986084433, 257.26023431814764 -97.2330234830852, 256.38915000330064 -97.2330234830852, 256.38915000330064 -96.92037710532608, 255.80842712673598 -96.92037710532608, 255.80842712673598 -96.60773072756697, 254.93734281188898 -96.60773072756697, 254.93734281188898 -96.29508434980785, 254.06625849704199 -96.29508434980785, 254.06625849704199 -95.98243797204874, 253.4855356204773 -95.98243797204874, 253.4855356204773 -96.60773072756697, 253.19517418219496 -96.60773072756697, 253.19517418219496 -96.92037710532608, 252.90481274391263 -96.92037710532608, 252.90481274391263 -97.54566986084433, 252.6144513056303 -97.54566986084433, 252.6144513056303 -97.85831623860344, 252.32408986734796 -97.85831623860344, 252.32408986734796 -98.48360899412167, 252.03372842906563 -98.48360899412167, 252.03372842906563 -98.79625537188079, 251.7433669907833 -98.79625537188079, 251.7433669907833 -99.42154812739902, 251.45300555250097 -99.42154812739902, 251.45300555250097 -100.04684088291725, 251.16264411421864 -100.04684088291725, 251.16264411421864 -100.35948726067637, 250.8722826759363 -100.35948726067637, 250.8722826759363 -100.9847800161946, 250.58192123765397 -100.9847800161946, 250.58192123765397 -101.61007277171284, 250.29155979937164 -101.61007277171284, 250.29155979937164 -102.23536552723107, 250.0011983610893 -102.23536552723107, 250.0011983610893 -102.54801190499018, 249.71083692280698 -102.54801190499018, 249.71083692280698 -103.17330466050842, 249.42047548452464 -103.17330466050842, 249.42047548452464 -103.79859741602665, 249.1301140462423 -103.79859741602665, 249.1301140462423 -104.42389017154488, 248.83975260795998 -104.42389017154488, 248.83975260795998 -105.04918292706311, 248.54939116967762 -105.04918292706311, 248.54939116967762 -105.67447568258135, 248.2590297313953 -105.67447568258135, 248.2590297313953 -105.98712206034047, 247.96866829311296 -105.98712206034047, 247.96866829311296 -106.6124148158587, 247.67830685483062 -106.6124148158587, 247.67830685483062 -107.23770757137693, 247.3879454165483 -107.23770757137693, 247.3879454165483 -107.86300032689516, 247.09758397826596 -107.86300032689516, 247.09758397826596 -108.48829308241339, 246.80722253998363 -108.48829308241339, 246.80722253998363 -109.11358583793162, 246.5168611017013 -109.11358583793162, 246.5168611017013 -109.73887859344985, 246.22649966341896 -109.73887859344985, 246.22649966341896 -110.3641713489681, 245.93613822513663 -110.3641713489681, 245.93613822513663 -110.98946410448633, 245.6457767868543 -110.98946410448633), + (186.12168193897588 -106.92506119361781, 185.83132050069355 -106.92506119361781, 185.83132050069355 -106.6124148158587, 185.54095906241122 -106.6124148158587, 185.54095906241122 -105.98712206034047, 185.2505976241289 -105.98712206034047, 185.2505976241289 -105.67447568258135, 184.96023618584655 -105.67447568258135, 184.96023618584655 -105.04918292706311, 184.66987474756422 -105.04918292706311, 184.66987474756422 -104.73653654930399, 184.3795133092819 -104.73653654930399, 184.3795133092819 -104.42389017154488, 184.08915187099956 -104.42389017154488, 184.08915187099956 -104.11124379378576, 183.79879043271723 -104.11124379378576, 183.79879043271723 -103.79859741602665, 183.5084289944349 -103.79859741602665, 183.5084289944349 -103.48595103826753, 183.21806755615256 -103.48595103826753, 183.21806755615256 -103.17330466050842, 182.92770611787023 -103.17330466050842, 182.92770611787023 -102.8606582827493, 182.34698324130557 -102.8606582827493, 182.34698324130557 -102.54801190499018, 181.47589892645854 -102.54801190499018, 181.47589892645854 -102.23536552723107, 178.2819231053529 -102.23536552723107, 178.2819231053529 -102.54801190499018, 177.99156166707056 -102.54801190499018, 177.99156166707056 -102.8606582827493, 177.70120022878822 -102.8606582827493, 177.70120022878822 -103.17330466050842, 177.12047735222356 -103.17330466050842, 177.12047735222356 -103.48595103826753, 176.8301159139412 -103.48595103826753, 176.8301159139412 -103.79859741602665, 176.53975447565887 -103.79859741602665, 176.53975447565887 -104.11124379378576, 175.9590315990942 -104.11124379378576, 175.9590315990942 -104.42389017154488, 175.66867016081187 -104.42389017154488, 175.66867016081187 -104.73653654930399, 175.37830872252954 -104.73653654930399, 175.37830872252954 -105.04918292706311, 174.79758584596487 -105.04918292706311, 174.79758584596487 -105.36182930482224, 174.50722440768254 -105.36182930482224, 174.50722440768254 -105.67447568258135, 174.2168629694002 -105.67447568258135, 174.2168629694002 -105.98712206034047, 173.63614009283555 -105.98712206034047, 173.63614009283555 -106.29976843809958, 173.05541721627088 -106.29976843809958, 173.05541721627088 -106.6124148158587, 172.47469433970622 -106.6124148158587, 172.47469433970622 -106.92506119361781, 171.89397146314155 -106.92506119361781, 171.89397146314155 -107.23770757137693, 171.6036100248592 -107.23770757137693, 171.6036100248592 -107.55035394913605, 171.02288714829453 -107.55035394913605, 171.02288714829453 -107.86300032689516, 170.44216427172987 -107.86300032689516, 170.44216427172987 -108.17564670465428, 170.15180283344753 -108.17564670465428, 170.15180283344753 -108.48829308241339, 169.57107995688287 -108.48829308241339, 169.57107995688287 -108.80093946017251, 168.9903570803182 -108.80093946017251, 168.9903570803182 -109.11358583793162, 168.69999564203587 -109.11358583793162, 168.69999564203587 -109.42623221569075, 168.1192727654712 -109.42623221569075, 168.1192727654712 -109.73887859344985, 167.53854988890654 -109.73887859344985, 167.53854988890654 -110.05152497120898, 167.2481884506242 -110.05152497120898, 167.2481884506242 -110.3641713489681, 166.66746557405955 -110.3641713489681, 166.66746557405955 -110.67681772672721, 166.3771041357772 -110.67681772672721, 166.3771041357772 -110.98946410448633, 165.79638125921252 -110.98946410448633, 165.79638125921252 -111.30211048224544, 165.5060198209302 -111.30211048224544, 165.5060198209302 -111.61475686000456, 164.92529694436553 -111.61475686000456, 164.92529694436553 -111.92740323776367, 164.6349355060832 -111.92740323776367, 164.6349355060832 -112.24004961552279, 164.05421262951853 -112.24004961552279, 164.05421262951853 -112.5526959932819, 163.7638511912362 -112.5526959932819, 163.7638511912362 -112.86534237104102, 163.18312831467154 -112.86534237104102, 163.18312831467154 -113.17798874880015, 162.8927668763892 -113.17798874880015, 162.8927668763892 -113.49063512655925, 162.60240543810687 -113.49063512655925, 162.60240543810687 -113.80328150431838, 162.31204399982454 -113.80328150431838, 162.31204399982454 -114.11592788207749, 162.0216825615422 -114.11592788207749, 162.0216825615422 -114.42857425983661, 161.4409596849775 -114.42857425983661, 161.4409596849775 -114.74122063759572, 161.15059824669518 -114.74122063759572, 161.15059824669518 -115.05386701535484, 160.86023680841285 -115.05386701535484, 160.86023680841285 -115.36651339311396, 160.56987537013052 -115.36651339311396, 160.56987537013052 -115.67915977087307, 160.2795139318482 -115.67915977087307, 160.2795139318482 -115.9918061486322, 159.98915249356585 -115.9918061486322, 159.98915249356585 -116.3044525263913, 159.69879105528352 -116.3044525263913, 159.69879105528352 -116.61709890415042, 159.4084296170012 -116.61709890415042, 159.4084296170012 -116.92974528190953, 159.11806817871886 -116.92974528190953, 159.11806817871886 -117.24239165966866, 158.82770674043653 -117.24239165966866, 158.82770674043653 -117.55503803742778, 158.5373453021542 -117.55503803742778, 158.5373453021542 -118.18033079294601, 158.24698386387186 -118.18033079294601, 158.24698386387186 -118.49297717070512, 157.95662242558953 -118.49297717070512, 157.95662242558953 -118.80562354846424, 157.6662609873072 -118.80562354846424, 157.6662609873072 -119.11826992622335, 157.37589954902487 -119.11826992622335, 157.37589954902487 -119.43091630398247, 157.08553811074253 -119.43091630398247, 157.08553811074253 -120.0562090595007, 156.7951766724602 -120.0562090595007, 156.7951766724602 -120.36885543725982, 156.50481523417787 -120.36885543725982, 156.50481523417787 -120.99414819277806, 156.2144537958955 -120.99414819277806, 156.2144537958955 -121.30679457053716, 155.92409235761318 -121.30679457053716, 155.92409235761318 -121.9320873260554, 155.63373091933084 -121.9320873260554, 155.63373091933084 -122.55738008157363, 155.3433694810485 -122.55738008157363, 155.3433694810485 -123.18267283709187, 155.05300804276618 -123.18267283709187, 155.05300804276618 -123.8079655926101, 154.76264660448385 -123.8079655926101, 154.76264660448385 -124.74590472588744, 154.47228516620152 -124.74590472588744, 154.47228516620152 -125.6838438591648, 154.18192372791918 -125.6838438591648, 154.18192372791918 -126.93442937020126, 153.89156228963685 -126.93442937020126, 153.89156228963685 -129.43560039227418, 153.60120085135452 -129.43560039227418, 153.60120085135452 -134.12529605866095, 153.89156228963685 -134.12529605866095, 153.89156228963685 -139.4402844805659, 154.18192372791918 -139.4402844805659, 154.18192372791918 -141.0035163693615), + (239.5481865829253 -103.48595103826753, 239.5481865829253 -103.17330466050842, 239.25782514464296 -103.17330466050842, 239.25782514464296 -102.54801190499018, 238.96746370636063 -102.54801190499018, 238.96746370636063 -101.92271914947194, 238.6771022680783 -101.92271914947194, 238.6771022680783 -101.29742639395371, 238.38674082979597 -101.29742639395371, 238.38674082979597 -100.67213363843548, 238.0963793915136 -100.67213363843548, 238.0963793915136 -100.04684088291725, 237.80601795323128 -100.04684088291725, 237.80601795323128 -99.42154812739902, 237.51565651494894 -99.42154812739902, 237.51565651494894 -98.79625537188079, 237.2252950766666 -98.79625537188079, 237.2252950766666 -98.48360899412167, 236.93493363838428 -98.48360899412167, 236.93493363838428 -97.85831623860344, 236.64457220010195 -97.85831623860344, 236.64457220010195 -97.54566986084433, 236.35421076181962 -97.54566986084433, 236.35421076181962 -96.92037710532608, 236.06384932353728 -96.92037710532608, 236.06384932353728 -96.60773072756697, 235.77348788525495 -96.60773072756697, 235.77348788525495 -96.29508434980785, 235.48312644697262 -96.29508434980785, 235.48312644697262 -95.66979159428962, 235.1927650086903 -95.66979159428962, 235.1927650086903 -95.35714521653051, 234.90240357040796 -95.35714521653051, 234.90240357040796 -95.04449883877139, 234.61204213212562 -95.04449883877139, 234.61204213212562 -94.73185246101227, 234.3216806938433 -94.73185246101227, 234.3216806938433 -94.41920608325316, 234.03131925556096 -94.41920608325316, 234.03131925556096 -94.10655970549404, 233.74095781727863 -94.10655970549404, 233.74095781727863 -93.79391332773493, 233.4505963789963 -93.79391332773493, 233.4505963789963 -93.4812669499758, 233.16023494071393 -93.4812669499758, 233.16023494071393 -93.1686205722167, 232.8698735024316 -93.1686205722167, 232.8698735024316 -92.85597419445757, 232.57951206414927 -92.85597419445757, 232.57951206414927 -92.54332781669845, 232.28915062586694 -92.54332781669845, 232.28915062586694 -92.23068143893934, 231.9987891875846 -92.23068143893934, 231.9987891875846 -91.91803506118022, 231.70842774930227 -91.91803506118022, 231.70842774930227 -91.60538868342111, 231.41806631101994 -91.60538868342111, 231.41806631101994 -91.29274230566199, 230.54698199617295 -91.29274230566199, 230.54698199617295 -90.98009592790288, 229.38553624304362 -90.98009592790288, 229.38553624304362 -90.66744955014376, 228.51445192819662 -90.66744955014376, 228.51445192819662 -90.35480317238465, 227.35300617506726 -90.35480317238465, 227.35300617506726 -90.04215679462553, 226.48192186022027 -90.04215679462553, 226.48192186022027 -89.7295104168664, 225.32047610709094 -89.7295104168664, 225.32047610709094 -89.4168640391073, 224.1590303539616 -89.4168640391073, 224.1590303539616 -89.10421766134817, 222.99758460083228 -89.10421766134817, 222.99758460083228 -88.79157128358906, 221.83613884770293 -88.79157128358906, 221.83613884770293 -88.47892490582994, 220.6746930945736 -88.47892490582994, 220.6746930945736 -88.16627852807083, 219.51324734144427 -88.16627852807083, 219.51324734144427 -88.79157128358906, 219.22288590316194 -88.79157128358906, 219.22288590316194 -89.4168640391073, 218.9325244648796 -89.4168640391073, 218.9325244648796 -90.04215679462553, 218.64216302659727 -90.04215679462553, 218.64216302659727 -90.66744955014376, 218.35180158831494 -90.66744955014376, 218.35180158831494 -91.29274230566199))MULTILINESTRING ((280.4891493807343 -146.6311511690256, 280.4891493807343 -144.12998014695268, 280.198787942452 -144.12998014695268, 280.198787942452 -142.56674825815708, 279.90842650416965 -142.56674825815708, 279.90842650416965 -141.31616274712061, 279.6180650658873 -141.31616274712061, 279.6180650658873 -140.37822361384326, 279.327703627605 -140.37822361384326, 279.327703627605 -139.4402844805659, 279.03734218932266 -139.4402844805659, 279.03734218932266 -138.50234534728858, 278.7469807510403 -138.50234534728858, 278.7469807510403 -137.87705259177034, 278.456619312758 -137.87705259177034, 278.456619312758 -137.56440621401123, 278.16625787447566 -137.56440621401123, 278.16625787447566 -136.93911345849298, 277.87589643619333 -136.93911345849298, 277.87589643619333 -136.62646708073387, 277.585534997911 -136.62646708073387, 277.585534997911 -136.00117432521563, 277.29517355962867 -136.00117432521563, 277.29517355962867 -135.68852794745652, 277.00481212134633 -135.68852794745652, 277.00481212134633 -135.3758815696974, 276.714450683064 -135.3758815696974, 276.714450683064 -135.0632351919383, 276.13372780649934 -135.0632351919383, 276.13372780649934 -135.3758815696974, 275.843366368217 -135.3758815696974, 275.843366368217 -136.00117432521563, 275.5530049299347 -136.00117432521563, 275.5530049299347 -136.62646708073387, 275.26264349165234 -136.62646708073387, 275.26264349165234 -137.2517598362521, 274.97228205337 -137.2517598362521, 274.97228205337 -137.87705259177034, 274.6819206150877 -137.87705259177034, 274.6819206150877 -138.8149917250477, 274.39155917680534 -138.8149917250477, 274.39155917680534 -139.4402844805659, 274.101197738523 -139.4402844805659, 274.101197738523 -140.37822361384326, 273.8108363002407 -140.37822361384326, 273.8108363002407 -141.31616274712061, 273.52047486195835 -141.31616274712061, 273.52047486195835 -142.56674825815708, 273.230113423676 -142.56674825815708, 273.230113423676 -144.12998014695268, 272.9397519853937 -144.12998014695268, 272.9397519853937 -145.69321203574825, 272.64939054711135 -145.69321203574825, 272.64939054711135 -147.88173668006206, 272.359029108829 -147.88173668006206, 272.359029108829 -156.32318887955822))MULTILINESTRING ((286.296378146381 0, 286.296378146381 -1.563231888795582, 286.58673958466335 -1.563231888795582, 286.58673958466335 -2.8138173998320477, 286.296378146381 -2.8138173998320477, 286.296378146381 -4.064402910868513, 286.0060167080987 -4.064402910868513, 286.0060167080987 -4.689695666386746, 285.71565526981635 -4.689695666386746, 285.71565526981635 -5.314988421904979, 285.425293831534 -5.314988421904979, 285.425293831534 -5.627634799664095, 285.1349323932517 -5.627634799664095, 285.1349323932517 -5.940281177423212, 284.84457095496936 -5.940281177423212, 284.84457095496936 -6.252927555182328, 284.554209516687 -6.252927555182328, 284.554209516687 -6.565573932941445, 284.2638480784047 -6.565573932941445, 284.2638480784047 -6.878220310700561, 283.97348664012236 -6.878220310700561, 283.97348664012236 -7.1908666884596775, 283.68312520184 -7.1908666884596775, 283.68312520184 -7.503513066218794, 283.3927637635577 -7.503513066218794, 283.3927637635577 -7.81615944397791, 282.81204088699303 -7.81615944397791, 282.81204088699303 -8.128805821737027, 282.5216794487107 -8.128805821737027, 282.5216794487107 -8.441452199496144, 281.940956572146 -8.441452199496144, 281.940956572146 -8.75409857725526, 281.65059513386365 -8.75409857725526, 281.65059513386365 -9.066744955014375, 281.069872257299 -9.066744955014375, 281.069872257299 -9.379391332773492, 280.4891493807343 -9.379391332773492, 280.4891493807343 -9.69203771053261, 279.90842650416965 -9.69203771053261, 279.90842650416965 -10.004684088291725, 279.6180650658873 -10.004684088291725, 279.6180650658873 -10.31733046605084, 279.03734218932266 -10.31733046605084, 279.03734218932266 -10.629976843809958, 278.456619312758 -10.629976843809958, 278.456619312758 -10.942623221569075, 277.87589643619333 -10.942623221569075, 277.87589643619333 -11.25526959932819, 277.29517355962867 -11.25526959932819, 277.29517355962867 -11.567915977087306, 276.714450683064 -11.567915977087306, 276.714450683064 -11.880562354846424, 275.5530049299347 -11.880562354846424, 275.5530049299347 -12.193208732605541, 274.101197738523 -12.193208732605541, 274.101197738523 -12.505855110364656, 272.64939054711135 -12.505855110364656, 272.64939054711135 -12.818501488123772, 271.19758335569963 -12.818501488123772, 271.19758335569963 -13.13114786588289, 269.745776164288 -13.13114786588289, 269.745776164288 -13.443794243642007, 268.2939689728763 -13.443794243642007, 268.2939689728763 -13.756440621401122, 266.84216178146465 -13.756440621401122, 266.84216178146465 -14.069086999160238, 265.6807160283353 -14.069086999160238, 265.6807160283353 -14.381733376919355, 262.777101645512 -14.381733376919355, 262.777101645512 -14.694379754678472, 259.00240294784163 -14.694379754678472, 259.00240294784163 -15.007026132437588, 256.0987885650183 -15.007026132437588, 256.0987885650183 -15.319672510196703, 253.4855356204773 -15.319672510196703, 253.4855356204773 -15.63231888795582, 250.8722826759363 -15.63231888795582, 250.8722826759363 -15.944965265714938, 248.54939116967762 -15.944965265714938, 248.54939116967762 -16.257611643474053, 245.93613822513663 -16.257611643474053, 245.93613822513663 -16.57025802123317, 243.3228852805956 -16.57025802123317, 243.3228852805956 -16.882904398992288, 241.58071665090162 -16.882904398992288, 241.58071665090162 -17.195550776751404, 239.83854802120763 -17.195550776751404, 239.83854802120763 -17.50819715451052, 238.38674082979597 -17.50819715451052, 238.38674082979597 -17.820843532269635, 236.93493363838428 -17.820843532269635, 236.93493363838428 -18.13348991002875, 235.48312644697262 -18.13348991002875, 235.48312644697262 -18.44613628778787, 233.74095781727863 -18.44613628778787, 233.74095781727863 -18.758782665546985, 232.28915062586694 -18.758782665546985, 232.28915062586694 -19.0714290433061, 230.2566205578906 -19.0714290433061, 230.2566205578906 -19.38407542106522, 223.86866891567928 -19.38407542106522, 223.86866891567928 -19.696721798824335, 213.99638001407993 -19.696721798824335, 213.99638001407993 -19.38407542106522, 207.0277054953039 -19.38407542106522, 207.0277054953039 -19.0714290433061, 203.54336823591592 -19.0714290433061, 203.54336823591592 -18.758782665546985, 199.47830809996324 -18.758782665546985, 199.47830809996324 -18.44613628778787, 184.08915187099956 -18.44613628778787, 184.08915187099956 -18.758782665546985, 177.4108387905059 -18.758782665546985, 177.4108387905059 -19.0714290433061, 171.6036100248592 -19.0714290433061, 171.6036100248592 -19.38407542106522, 166.3771041357772 -19.38407542106522, 166.3771041357772 -19.696721798824335, 158.5373453021542 -19.696721798824335, 158.5373453021542 -20.00936817658345, 140.24457469036716 -20.00936817658345, 140.24457469036716 -20.322014554342566, 135.01806880128515 -20.322014554342566, 135.01806880128515 -20.63466093210168, 130.3722857887678 -20.63466093210168, 130.3722857887678 -20.9473073098608, 127.75903284422682 -20.9473073098608, 127.75903284422682 -21.259953687619916, 126.01686421453282 -21.259953687619916, 126.01686421453282 -21.57260006537903, 123.98433414655648 -21.57260006537903, 123.98433414655648 -21.88524644313815, 122.24216551686249 -21.88524644313815, 122.24216551686249 -22.197892820897266, 120.49999688716848 -22.197892820897266, 120.49999688716848 -22.51053919865638, 119.0481896957568 -22.51053919865638, 119.0481896957568 -22.823185576415497, 117.59638250434514 -22.823185576415497, 117.59638250434514 -23.135831954174613, 115.85421387465114 -23.135831954174613, 115.85421387465114 -23.44847833193373, 114.40240668323948 -23.44847833193373, 114.40240668323948 -23.761124709692847, 112.9505994918278 -23.761124709692847, 112.9505994918278 -24.073771087451963, 112.0795151769808 -24.073771087451963, 112.0795151769808 -24.386417465211082, 110.91806942385146 -24.386417465211082, 110.91806942385146 -24.699063842970197, 110.3373465472868 -24.699063842970197, 110.3373465472868 -25.011710220729313, 109.4662622324398 -25.011710220729313, 109.4662622324398 -25.32435659848843, 109.17590079415747 -25.32435659848843, 109.17590079415747 -25.637002976247544, 108.59517791759279 -25.637002976247544, 108.59517791759279 -25.949649354006663, 108.30481647931046 -25.949649354006663, 108.30481647931046 -26.574942109524894, 108.01445504102813 -26.574942109524894, 108.01445504102813 -27.20023486504313, 108.30481647931046 -27.20023486504313, 108.30481647931046 -27.82552762056136, 108.59517791759279 -27.82552762056136, 108.59517791759279 -28.138173998320475, 108.88553935587512 -28.138173998320475, 108.88553935587512 -28.450820376079594, 109.17590079415747 -28.450820376079594, 109.17590079415747 -28.76346675383871, 109.75662367072213 -28.76346675383871, 109.75662367072213 -29.076113131597825, 110.3373465472868 -29.076113131597825, 110.3373465472868 -29.388759509356944, 110.62770798556913 -29.388759509356944, 110.62770798556913 -29.70140588711606, 111.49879230041614 -29.70140588711606, 111.49879230041614 -30.014052264875176, 112.0795151769808 -30.014052264875176, 112.0795151769808 -30.32669864263429, 112.9505994918278 -30.32669864263429, 112.9505994918278 -30.639345020393407, 113.53132236839247 -30.639345020393407, 113.53132236839247 -30.951991398152526, 114.69276812152181 -30.951991398152526, 114.69276812152181 -31.26463777591164, 115.5638524363688 -31.26463777591164, 115.5638524363688 -31.577284153670757, 117.01565962778048 -31.577284153670757, 117.01565962778048 -31.889930531429876, 117.88674394262748 -31.889930531429876, 117.88674394262748 -32.20257690918899, 118.46746681919214 -32.20257690918899, 118.46746681919214 -32.51522328694811, 119.0481896957568 -32.51522328694811, 119.0481896957568 -32.82786966470722, 119.62891257232148 -32.82786966470722, 119.62891257232148 -33.14051604246634, 119.91927401060381 -33.14051604246634, 119.91927401060381 -33.45316242022545, 120.49999688716848 -33.45316242022545, 120.49999688716848 -33.765808797984576, 121.08071976373314 -33.765808797984576, 121.08071976373314 -34.07845517574369, 121.6614426402978 -34.07845517574369, 121.6614426402978 -34.39110155350281, 122.24216551686249 -34.39110155350281, 122.24216551686249 -34.70374793126192, 122.82288839342715 -34.70374793126192, 122.82288839342715 -35.01639430902104, 123.40361126999181 -35.01639430902104, 123.40361126999181 -35.329040686780154, 123.98433414655648 -35.329040686780154, 123.98433414655648 -35.64168706453927, 124.56505702312116 -35.64168706453927, 124.56505702312116 -35.954333442298385, 125.14577989968582 -35.954333442298385, 125.14577989968582 -36.2669798200575, 126.01686421453282 -36.2669798200575, 126.01686421453282 -36.57962619781662, 126.59758709109748 -36.57962619781662, 126.59758709109748 -36.89227257557574, 127.17830996766216 -36.89227257557574, 127.17830996766216 -37.204918953334854, 127.75903284422682 -37.204918953334854, 127.75903284422682 -37.51756533109397, 128.3397557207915 -37.51756533109397, 128.3397557207915 -37.830211708853085, 129.21084003563848 -37.830211708853085, 129.21084003563848 -38.1428580866122, 130.08192435048548 -38.1428580866122, 130.08192435048548 -38.455504464371316, 130.9530086653325 -38.455504464371316, 130.9530086653325 -38.76815084213044, 131.8240929801795 -38.76815084213044, 131.8240929801795 -39.080797219889554, 132.6951772950265 -39.080797219889554, 132.6951772950265 -39.39344359764867, 133.5662616098735 -39.39344359764867, 133.5662616098735 -39.706089975407785, 134.72770736300282 -39.706089975407785, 134.72770736300282 -40.0187363531669, 135.88915311613218 -40.0187363531669, 135.88915311613218 -40.331382730926016, 137.34096030754384 -40.331382730926016, 137.34096030754384 -40.64402910868513, 138.50240606067317 -40.64402910868513, 138.50240606067317 -40.95667548644425, 140.24457469036716 -40.95667548644425, 140.24457469036716 -41.26932186420336, 144.59999626460217 -41.26932186420336, 144.59999626460217 -41.581968241962485, 156.50481523417787 -41.581968241962485, 156.50481523417787 -41.8946146197216, 164.6349355060832 -41.8946146197216, 164.6349355060832 -41.581968241962485, 174.50722440768254 -41.581968241962485, 174.50722440768254 -41.26932186420336, 175.37830872252954 -41.26932186420336, 175.37830872252954 -40.95667548644425, 176.53975447565887 -40.95667548644425, 176.53975447565887 -40.64402910868513, 177.70120022878822 -40.64402910868513, 177.70120022878822 -40.331382730926016, 178.57228454363522 -40.331382730926016, 178.57228454363522 -40.0187363531669, 180.02409173504688 -40.0187363531669, 180.02409173504688 -39.706089975407785, 181.1855374881762 -39.706089975407785, 181.1855374881762 -39.39344359764867, 182.34698324130557 -39.39344359764867, 182.34698324130557 -39.080797219889554, 183.79879043271723 -39.080797219889554, 183.79879043271723 -38.76815084213044, 185.2505976241289 -38.76815084213044, 185.2505976241289 -38.455504464371316, 186.70240481554055 -38.455504464371316, 186.70240481554055 -38.1428580866122, 187.8638505686699 -38.1428580866122, 187.8638505686699 -37.830211708853085, 189.02529632179923 -37.830211708853085, 189.02529632179923 -37.51756533109397, 190.18674207492856 -37.51756533109397, 190.18674207492856 -37.204918953334854, 191.63854926634022 -37.204918953334854, 191.63854926634022 -36.89227257557574, 192.79999501946958 -36.89227257557574, 192.79999501946958 -36.57962619781662, 193.9614407725989 -36.57962619781662, 193.9614407725989 -36.2669798200575, 195.12288652572823 -36.2669798200575, 195.12288652572823 -35.954333442298385, 196.28433227885756 -35.954333442298385, 196.28433227885756 -35.64168706453927, 198.60722378511625 -35.64168706453927, 198.60722378511625 -35.954333442298385, 201.8011996062219 -35.954333442298385, 201.8011996062219 -36.2669798200575, 210.2216813164096 -36.2669798200575, 210.2216813164096 -36.57962619781662, 213.99638001407993 -36.57962619781662, 213.99638001407993 -36.89227257557574, 217.48071727346792 -36.89227257557574, 217.48071727346792 -37.204918953334854, 219.8036087797266 -37.204918953334854, 219.8036087797266 -37.51756533109397, 220.6746930945736 -37.51756533109397, 220.6746930945736 -37.830211708853085, 221.5457774094206 -37.830211708853085, 221.5457774094206 -38.1428580866122, 222.4168617242676 -38.1428580866122, 222.4168617242676 -38.455504464371316, 222.99758460083228 -38.455504464371316, 222.99758460083228 -38.76815084213044, 223.86866891567928 -38.76815084213044, 223.86866891567928 -39.080797219889554, 224.73975323052628 -39.080797219889554, 224.73975323052628 -39.39344359764867, 225.32047610709094 -39.39344359764867, 225.32047610709094 -39.706089975407785, 225.9011989836556 -39.706089975407785, 225.9011989836556 -40.0187363531669, 226.7722832985026 -40.0187363531669, 226.7722832985026 -40.331382730926016, 227.35300617506726 -40.331382730926016, 227.35300617506726 -40.64402910868513, 227.93372905163193 -40.64402910868513, 227.93372905163193 -40.95667548644425, 228.80481336647895 -40.95667548644425, 228.80481336647895 -41.26932186420336, 229.38553624304362 -41.26932186420336, 229.38553624304362 -41.581968241962485, 229.96625911960828 -41.581968241962485, 229.96625911960828 -41.8946146197216, 230.54698199617295 -41.8946146197216, 230.54698199617295 -42.20726099748072, 231.41806631101994 -42.20726099748072, 231.41806631101994 -42.51990737523983, 233.4505963789963 -42.51990737523983, 233.4505963789963 -42.83255375299895, 235.48312644697262 -42.83255375299895, 235.48312644697262 -43.14520013075806, 237.51565651494894 -43.14520013075806, 237.51565651494894 -43.45784650851718, 239.5481865829253 -43.45784650851718, 239.5481865829253 -43.7704928862763, 241.87107808918395 -43.7704928862763, 241.87107808918395 -44.08313926403542, 247.3879454165483 -44.08313926403542, 247.3879454165483 -44.39578564179453, 254.64698137360665 -44.39578564179453, 254.64698137360665 -44.70843201955365, 257.26023431814764 -44.70843201955365, 257.26023431814764 -45.02107839731276, 259.8734872626886 -45.02107839731276, 259.8734872626886 -45.33372477507188, 262.777101645512 -45.33372477507188, 262.777101645512 -45.646371152830994, 265.390354590053 -45.646371152830994, 265.390354590053 -45.95901753059011, 266.2614389049 -45.95901753059011, 266.2614389049 -46.271663908349225, 267.132523219747 -46.271663908349225, 267.132523219747 -46.58431028610835, 268.2939689728763 -46.58431028610835, 268.2939689728763 -46.89695666386746, 269.1650532877233 -46.89695666386746, 269.1650532877233 -47.20960304162658, 270.0361376025703 -47.20960304162658, 270.0361376025703 -47.522249419385695, 270.9072219174173 -47.522249419385695, 270.9072219174173 -47.83489579714481, 271.77830623226436 -47.83489579714481, 271.77830623226436 -48.147542174903926, 272.9397519853937 -48.147542174903926, 272.9397519853937 -48.46018855266304, 273.8108363002407 -48.46018855266304, 273.8108363002407 -48.772834930422164, 274.6819206150877 -48.772834930422164, 274.6819206150877 -49.08548130818128, 275.5530049299347 -49.08548130818128, 275.5530049299347 -49.398127685940395, 276.42408924478167 -49.398127685940395, 276.42408924478167 -49.71077406369951, 277.00481212134633 -49.71077406369951, 277.00481212134633 -49.398127685940395, 279.6180650658873 -49.398127685940395, 279.6180650658873 -49.71077406369951, 284.2638480784047 -49.71077406369951, 284.2638480784047 -50.023420441458626, 288.32890821435734 -50.023420441458626, 288.32890821435734 -49.71077406369951, 288.909631090922 -49.71077406369951, 288.909631090922 -49.398127685940395, 289.49035396748667 -49.398127685940395, 289.49035396748667 -49.08548130818128, 290.36143828233367 -49.08548130818128, 290.36143828233367 -48.772834930422164, 290.94216115889833 -48.772834930422164, 290.94216115889833 -48.46018855266304, 291.8132454737453 -48.46018855266304, 291.8132454737453 -48.147542174903926, 292.39396835031005 -48.147542174903926, 292.39396835031005 -47.83489579714481, 293.26505266515704 -47.83489579714481, 293.26505266515704 -47.522249419385695, 293.8457755417217 -47.522249419385695, 293.8457755417217 -47.20960304162658, 294.7168598565687 -47.20960304162658, 294.7168598565687 -46.89695666386746, 295.5879441714157 -46.89695666386746, 295.5879441714157 -46.58431028610835, 296.4590284862627 -46.58431028610835, 296.4590284862627 -46.271663908349225, 297.3301128011097 -46.271663908349225)) \ No newline at end of file diff -r f99d8f92a640 -r 755dd2fa4a0a gnv-artifacts/src/test/ressources/lang/artifactMessages.properties --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv-artifacts/src/test/ressources/lang/artifactMessages.properties Fri Sep 28 12:13:53 2012 +0200 @@ -0,0 +1,25 @@ +fis_marnet = Marnet +fis_imis = IMIS +fis_staun = STAUN +fis_modeldata = Modeldata +fis_delphin = Delphin +fis_thermosalinograph = Thermosalinograph +fis_chemusurvey = Chemusurvey + +timeSeries= Timeseries +verticalProfile = Verticalprofile +horizontalProfile = Horizontalprofile +featureid = Object +mesh_coordinate = Coordinate Value (x y) +mesh_point = Meshpoint +measurementid = Measurement depth +parameterid = Parameter +minvalue = Minvalue +maxvalue = Maxvalue +dateid = Measurement date +vehicleid = Ship +cruiseid = Cruise +trackid = Track +surveyid = Survey Info +axisid = Axis +depthid = Depth \ No newline at end of file diff -r f99d8f92a640 -r 755dd2fa4a0a gnv-artifacts/src/test/ressources/lang/artifactMessages_de_DE.properties --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv-artifacts/src/test/ressources/lang/artifactMessages_de_DE.properties Fri Sep 28 12:13:53 2012 +0200 @@ -0,0 +1,25 @@ +fis_marnet = Marnet +fis_imis = IMIS +fis_staun = STAUN +fis_modeldata = Modelldaten +fis_delphin = Delphin +fis_thermosalinograph = Thermosalinograph +fis_chemusurvey = Chemusurvey + +timeSeries= Zeitserie +verticalProfile = Vertikalprofil +horizontalProfile = Horizontalprofil +featureid = ObjeKt +mesh_coordinate = Koordinaten Wert (x y) +mesh_point = Messpunkt +measurementid = Messtiefe +parameterid = Parameter +minvalue = Minimalwert +maxvalue = Maximalwert +dateid = Messdatum +vehicleid = Schiff +cruiseid = Reise +trackid = Track +surveyid = Messinformation +axisid = Achse +depthid = Tiefe diff -r f99d8f92a640 -r 755dd2fa4a0a gnv-artifacts/src/test/ressources/timeseries/timeseries_describe.xml --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv-artifacts/src/test/ressources/timeseries/timeseries_describe.xml Fri Sep 28 12:13:53 2012 +0200 @@ -0,0 +1,8 @@ + + + + + + true + diff -r f99d8f92a640 -r 755dd2fa4a0a gnv-artifacts/src/test/ressources/timeseries/timeseries_step_01_advance.xml --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv-artifacts/src/test/ressources/timeseries/timeseries_step_01_advance.xml Fri Sep 28 12:13:53 2012 +0200 @@ -0,0 +1,8 @@ + + + + + + + diff -r f99d8f92a640 -r 755dd2fa4a0a gnv-artifacts/src/test/ressources/timeseries/timeseries_step_01_feed.xml --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv-artifacts/src/test/ressources/timeseries/timeseries_step_01_feed.xml Fri Sep 28 12:13:53 2012 +0200 @@ -0,0 +1,10 @@ + + + + + + + + + \ No newline at end of file diff -r f99d8f92a640 -r 755dd2fa4a0a gnv-artifacts/src/test/ressources/timeseries/timeseries_step_02_advance.xml --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv-artifacts/src/test/ressources/timeseries/timeseries_step_02_advance.xml Fri Sep 28 12:13:53 2012 +0200 @@ -0,0 +1,8 @@ + + + + + + + diff -r f99d8f92a640 -r 755dd2fa4a0a gnv-artifacts/src/test/ressources/timeseries/timeseries_step_02_feed.xml --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv-artifacts/src/test/ressources/timeseries/timeseries_step_02_feed.xml Fri Sep 28 12:13:53 2012 +0200 @@ -0,0 +1,10 @@ + + + + + + + + + \ No newline at end of file diff -r f99d8f92a640 -r 755dd2fa4a0a gnv-artifacts/src/test/ressources/timeseries/timeseries_step_03_advance.xml --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv-artifacts/src/test/ressources/timeseries/timeseries_step_03_advance.xml Fri Sep 28 12:13:53 2012 +0200 @@ -0,0 +1,8 @@ + + + + + + + diff -r f99d8f92a640 -r 755dd2fa4a0a gnv-artifacts/src/test/ressources/timeseries/timeseries_step_03_feed.xml --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv-artifacts/src/test/ressources/timeseries/timeseries_step_03_feed.xml Fri Sep 28 12:13:53 2012 +0200 @@ -0,0 +1,10 @@ + + + + + + + + + \ No newline at end of file diff -r f99d8f92a640 -r 755dd2fa4a0a gnv-artifacts/src/test/ressources/timeseries/timeseries_step_04_advance.xml --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv-artifacts/src/test/ressources/timeseries/timeseries_step_04_advance.xml Fri Sep 28 12:13:53 2012 +0200 @@ -0,0 +1,8 @@ + + + + + + + diff -r f99d8f92a640 -r 755dd2fa4a0a gnv-artifacts/src/test/ressources/timeseries/timeseries_step_04_feed.xml --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv-artifacts/src/test/ressources/timeseries/timeseries_step_04_feed.xml Fri Sep 28 12:13:53 2012 +0200 @@ -0,0 +1,10 @@ + + + + + + + + + \ No newline at end of file diff -r f99d8f92a640 -r 755dd2fa4a0a gnv-artifacts/src/test/ressources/timeseries/timeseries_step_05_advance.xml --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv-artifacts/src/test/ressources/timeseries/timeseries_step_05_advance.xml Fri Sep 28 12:13:53 2012 +0200 @@ -0,0 +1,8 @@ + + + + + + + diff -r f99d8f92a640 -r 755dd2fa4a0a gnv-artifacts/src/test/ressources/timeseries/timeseries_step_05_feed.xml --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv-artifacts/src/test/ressources/timeseries/timeseries_step_05_feed.xml Fri Sep 28 12:13:53 2012 +0200 @@ -0,0 +1,10 @@ + + + + + + + + + \ No newline at end of file diff -r f99d8f92a640 -r 755dd2fa4a0a gnv-artifacts/src/test/ressources/timeseries/timeseries_step_06_advance.xml --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv-artifacts/src/test/ressources/timeseries/timeseries_step_06_advance.xml Fri Sep 28 12:13:53 2012 +0200 @@ -0,0 +1,8 @@ + + + + + + + diff -r f99d8f92a640 -r 755dd2fa4a0a gnv-artifacts/src/test/ressources/timeseries/timeseries_step_06_feed.xml --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv-artifacts/src/test/ressources/timeseries/timeseries_step_06_feed.xml Fri Sep 28 12:13:53 2012 +0200 @@ -0,0 +1,11 @@ + + + + + + + + + + \ No newline at end of file diff -r f99d8f92a640 -r 755dd2fa4a0a gnv-artifacts/src/test/ressources/timeseries/timeseries_step_06_out_chart.xml --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv-artifacts/src/test/ressources/timeseries/timeseries_step_06_out_chart.xml Fri Sep 28 12:13:53 2012 +0200 @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff -r f99d8f92a640 -r 755dd2fa4a0a gnv-artifacts/src/test/ressources/timeseries/timeseries_step_06_out_csv.xml --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv-artifacts/src/test/ressources/timeseries/timeseries_step_06_out_csv.xml Fri Sep 28 12:13:53 2012 +0200 @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff -r f99d8f92a640 -r 755dd2fa4a0a gnv-artifacts/src/test/ressources/timeseries/timeseries_step_06_out_odv.xml --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv-artifacts/src/test/ressources/timeseries/timeseries_step_06_out_odv.xml Fri Sep 28 12:13:53 2012 +0200 @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff -r f99d8f92a640 -r 755dd2fa4a0a gnv-artifacts/src/test/ressources/timeseries/timeseries_step_06_out_statistics.xml --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv-artifacts/src/test/ressources/timeseries/timeseries_step_06_out_statistics.xml Fri Sep 28 12:13:53 2012 +0200 @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff -r f99d8f92a640 -r 755dd2fa4a0a gnv-artifacts/src/test/ressources/timeseries_mesh/timeseries_describe.xml --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv-artifacts/src/test/ressources/timeseries_mesh/timeseries_describe.xml Fri Sep 28 12:13:53 2012 +0200 @@ -0,0 +1,7 @@ + + + + + + true + \ No newline at end of file diff -r f99d8f92a640 -r 755dd2fa4a0a gnv-artifacts/src/test/ressources/timeseries_mesh/timeseries_step_01_advance.xml --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv-artifacts/src/test/ressources/timeseries_mesh/timeseries_step_01_advance.xml Fri Sep 28 12:13:53 2012 +0200 @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff -r f99d8f92a640 -r 755dd2fa4a0a gnv-artifacts/src/test/ressources/timeseries_mesh/timeseries_step_01_feed.xml --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv-artifacts/src/test/ressources/timeseries_mesh/timeseries_step_01_feed.xml Fri Sep 28 12:13:53 2012 +0200 @@ -0,0 +1,9 @@ + + + + + + + + + \ No newline at end of file diff -r f99d8f92a640 -r 755dd2fa4a0a gnv-artifacts/src/test/ressources/timeseries_mesh/timeseries_step_02_advance.xml --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv-artifacts/src/test/ressources/timeseries_mesh/timeseries_step_02_advance.xml Fri Sep 28 12:13:53 2012 +0200 @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff -r f99d8f92a640 -r 755dd2fa4a0a gnv-artifacts/src/test/ressources/timeseries_mesh/timeseries_step_02_feed.xml --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv-artifacts/src/test/ressources/timeseries_mesh/timeseries_step_02_feed.xml Fri Sep 28 12:13:53 2012 +0200 @@ -0,0 +1,9 @@ + + + + + + + + + \ No newline at end of file diff -r f99d8f92a640 -r 755dd2fa4a0a gnv-artifacts/src/test/ressources/timeseries_mesh/timeseries_step_03_advance.xml --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv-artifacts/src/test/ressources/timeseries_mesh/timeseries_step_03_advance.xml Fri Sep 28 12:13:53 2012 +0200 @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff -r f99d8f92a640 -r 755dd2fa4a0a gnv-artifacts/src/test/ressources/timeseries_mesh/timeseries_step_03_feed.xml --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv-artifacts/src/test/ressources/timeseries_mesh/timeseries_step_03_feed.xml Fri Sep 28 12:13:53 2012 +0200 @@ -0,0 +1,9 @@ + + + + + + + + + \ No newline at end of file diff -r f99d8f92a640 -r 755dd2fa4a0a gnv-artifacts/src/test/ressources/timeseries_mesh/timeseries_step_04_advance.xml --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv-artifacts/src/test/ressources/timeseries_mesh/timeseries_step_04_advance.xml Fri Sep 28 12:13:53 2012 +0200 @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff -r f99d8f92a640 -r 755dd2fa4a0a gnv-artifacts/src/test/ressources/timeseries_mesh/timeseries_step_04_feed.xml --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv-artifacts/src/test/ressources/timeseries_mesh/timeseries_step_04_feed.xml Fri Sep 28 12:13:53 2012 +0200 @@ -0,0 +1,9 @@ + + + + + + + + + \ No newline at end of file diff -r f99d8f92a640 -r 755dd2fa4a0a gnv-artifacts/src/test/ressources/timeseries_mesh/timeseries_step_05_advance.xml --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv-artifacts/src/test/ressources/timeseries_mesh/timeseries_step_05_advance.xml Fri Sep 28 12:13:53 2012 +0200 @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff -r f99d8f92a640 -r 755dd2fa4a0a gnv-artifacts/src/test/ressources/timeseries_mesh/timeseries_step_05_feed.xml --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv-artifacts/src/test/ressources/timeseries_mesh/timeseries_step_05_feed.xml Fri Sep 28 12:13:53 2012 +0200 @@ -0,0 +1,9 @@ + + + + + + + + + \ No newline at end of file diff -r f99d8f92a640 -r 755dd2fa4a0a gnv-artifacts/src/test/ressources/timeseries_mesh/timeseries_step_06_advance.xml --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv-artifacts/src/test/ressources/timeseries_mesh/timeseries_step_06_advance.xml Fri Sep 28 12:13:53 2012 +0200 @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff -r f99d8f92a640 -r 755dd2fa4a0a gnv-artifacts/src/test/ressources/timeseries_mesh/timeseries_step_06_feed.xml --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv-artifacts/src/test/ressources/timeseries_mesh/timeseries_step_06_feed.xml Fri Sep 28 12:13:53 2012 +0200 @@ -0,0 +1,10 @@ + + + + + + + + + + \ No newline at end of file diff -r f99d8f92a640 -r 755dd2fa4a0a gnv-artifacts/src/test/ressources/timeseries_mesh/timeseries_step_07_advance.xml --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv-artifacts/src/test/ressources/timeseries_mesh/timeseries_step_07_advance.xml Fri Sep 28 12:13:53 2012 +0200 @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff -r f99d8f92a640 -r 755dd2fa4a0a gnv-artifacts/src/test/ressources/timeseries_mesh/timeseries_step_07_feed.xml --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv-artifacts/src/test/ressources/timeseries_mesh/timeseries_step_07_feed.xml Fri Sep 28 12:13:53 2012 +0200 @@ -0,0 +1,10 @@ + + + + + + + + + + \ No newline at end of file diff -r f99d8f92a640 -r 755dd2fa4a0a gnv-artifacts/src/test/ressources/timeseries_mesh/timeseries_step_08_advance.xml --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv-artifacts/src/test/ressources/timeseries_mesh/timeseries_step_08_advance.xml Fri Sep 28 12:13:53 2012 +0200 @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff -r f99d8f92a640 -r 755dd2fa4a0a gnv-artifacts/src/test/ressources/timeseries_mesh/timeseries_step_08_feed.xml --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv-artifacts/src/test/ressources/timeseries_mesh/timeseries_step_08_feed.xml Fri Sep 28 12:13:53 2012 +0200 @@ -0,0 +1,10 @@ + + + + + + + + + + \ No newline at end of file diff -r f99d8f92a640 -r 755dd2fa4a0a gnv-artifacts/src/test/ressources/timeseries_mesh/timeseries_step_08_out_chart.xml --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv-artifacts/src/test/ressources/timeseries_mesh/timeseries_step_08_out_chart.xml Fri Sep 28 12:13:53 2012 +0200 @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff -r f99d8f92a640 -r 755dd2fa4a0a gnv-artifacts/src/test/ressources/timeseries_mesh/timeseries_step_08_out_csv.xml --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv-artifacts/src/test/ressources/timeseries_mesh/timeseries_step_08_out_csv.xml Fri Sep 28 12:13:53 2012 +0200 @@ -0,0 +1,10 @@ + + + + + + + + + + diff -r f99d8f92a640 -r 755dd2fa4a0a gnv-artifacts/src/test/ressources/timeseries_mesh/timeseries_step_08_out_odv.xml --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv-artifacts/src/test/ressources/timeseries_mesh/timeseries_step_08_out_odv.xml Fri Sep 28 12:13:53 2012 +0200 @@ -0,0 +1,11 @@ + + + + + + + + + + + \ No newline at end of file diff -r f99d8f92a640 -r 755dd2fa4a0a gnv-artifacts/src/test/ressources/timeseries_mesh/timeseries_step_08_out_statistics.xml --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv-artifacts/src/test/ressources/timeseries_mesh/timeseries_step_08_out_statistics.xml Fri Sep 28 12:13:53 2012 +0200 @@ -0,0 +1,10 @@ + + + + + + + + + + \ No newline at end of file diff -r f99d8f92a640 -r 755dd2fa4a0a gnv-artifacts/src/test/ressources/verticalcrosssection_mesh/verticalcrosssection_describe.xml --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv-artifacts/src/test/ressources/verticalcrosssection_mesh/verticalcrosssection_describe.xml Fri Sep 28 12:13:53 2012 +0200 @@ -0,0 +1,7 @@ + + + + + + true + \ No newline at end of file diff -r f99d8f92a640 -r 755dd2fa4a0a gnv-artifacts/src/test/ressources/verticalcrosssection_mesh/verticalcrosssection_step_01_advance.xml --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv-artifacts/src/test/ressources/verticalcrosssection_mesh/verticalcrosssection_step_01_advance.xml Fri Sep 28 12:13:53 2012 +0200 @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff -r f99d8f92a640 -r 755dd2fa4a0a gnv-artifacts/src/test/ressources/verticalcrosssection_mesh/verticalcrosssection_step_01_feed.xml --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv-artifacts/src/test/ressources/verticalcrosssection_mesh/verticalcrosssection_step_01_feed.xml Fri Sep 28 12:13:53 2012 +0200 @@ -0,0 +1,9 @@ + + + + + + + + + \ No newline at end of file diff -r f99d8f92a640 -r 755dd2fa4a0a gnv-artifacts/src/test/ressources/verticalcrosssection_mesh/verticalcrosssection_step_02_advance.xml --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv-artifacts/src/test/ressources/verticalcrosssection_mesh/verticalcrosssection_step_02_advance.xml Fri Sep 28 12:13:53 2012 +0200 @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff -r f99d8f92a640 -r 755dd2fa4a0a gnv-artifacts/src/test/ressources/verticalcrosssection_mesh/verticalcrosssection_step_02_feed.xml --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv-artifacts/src/test/ressources/verticalcrosssection_mesh/verticalcrosssection_step_02_feed.xml Fri Sep 28 12:13:53 2012 +0200 @@ -0,0 +1,9 @@ + + + + + + + + + \ No newline at end of file diff -r f99d8f92a640 -r 755dd2fa4a0a gnv-artifacts/src/test/ressources/verticalcrosssection_mesh/verticalcrosssection_step_03_advance.xml --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv-artifacts/src/test/ressources/verticalcrosssection_mesh/verticalcrosssection_step_03_advance.xml Fri Sep 28 12:13:53 2012 +0200 @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff -r f99d8f92a640 -r 755dd2fa4a0a gnv-artifacts/src/test/ressources/verticalcrosssection_mesh/verticalcrosssection_step_03_feed.xml --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv-artifacts/src/test/ressources/verticalcrosssection_mesh/verticalcrosssection_step_03_feed.xml Fri Sep 28 12:13:53 2012 +0200 @@ -0,0 +1,9 @@ + + + + + + + + + \ No newline at end of file diff -r f99d8f92a640 -r 755dd2fa4a0a gnv-artifacts/src/test/ressources/verticalcrosssection_mesh/verticalcrosssection_step_04_advance.xml --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv-artifacts/src/test/ressources/verticalcrosssection_mesh/verticalcrosssection_step_04_advance.xml Fri Sep 28 12:13:53 2012 +0200 @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff -r f99d8f92a640 -r 755dd2fa4a0a gnv-artifacts/src/test/ressources/verticalcrosssection_mesh/verticalcrosssection_step_04_feed.xml --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv-artifacts/src/test/ressources/verticalcrosssection_mesh/verticalcrosssection_step_04_feed.xml Fri Sep 28 12:13:53 2012 +0200 @@ -0,0 +1,9 @@ + + + + + + + + + \ No newline at end of file diff -r f99d8f92a640 -r 755dd2fa4a0a gnv-artifacts/src/test/ressources/verticalcrosssection_mesh/verticalcrosssection_step_05_advance.xml --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv-artifacts/src/test/ressources/verticalcrosssection_mesh/verticalcrosssection_step_05_advance.xml Fri Sep 28 12:13:53 2012 +0200 @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff -r f99d8f92a640 -r 755dd2fa4a0a gnv-artifacts/src/test/ressources/verticalcrosssection_mesh/verticalcrosssection_step_05_feed.xml --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv-artifacts/src/test/ressources/verticalcrosssection_mesh/verticalcrosssection_step_05_feed.xml Fri Sep 28 12:13:53 2012 +0200 @@ -0,0 +1,9 @@ + + + + + + + + + \ No newline at end of file diff -r f99d8f92a640 -r 755dd2fa4a0a gnv-artifacts/src/test/ressources/verticalcrosssection_mesh/verticalcrosssection_step_06_advance.xml --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv-artifacts/src/test/ressources/verticalcrosssection_mesh/verticalcrosssection_step_06_advance.xml Fri Sep 28 12:13:53 2012 +0200 @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff -r f99d8f92a640 -r 755dd2fa4a0a gnv-artifacts/src/test/ressources/verticalcrosssection_mesh/verticalcrosssection_step_06_feed.xml --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv-artifacts/src/test/ressources/verticalcrosssection_mesh/verticalcrosssection_step_06_feed.xml Fri Sep 28 12:13:53 2012 +0200 @@ -0,0 +1,9 @@ + + + + + + + + + \ No newline at end of file diff -r f99d8f92a640 -r 755dd2fa4a0a gnv-artifacts/src/test/ressources/verticalcrosssection_mesh/verticalcrosssection_step_07_advance.xml --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv-artifacts/src/test/ressources/verticalcrosssection_mesh/verticalcrosssection_step_07_advance.xml Fri Sep 28 12:13:53 2012 +0200 @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff -r f99d8f92a640 -r 755dd2fa4a0a gnv-artifacts/src/test/ressources/verticalcrosssection_mesh/verticalcrosssection_step_07_feed.xml --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv-artifacts/src/test/ressources/verticalcrosssection_mesh/verticalcrosssection_step_07_feed.xml Fri Sep 28 12:13:53 2012 +0200 @@ -0,0 +1,9 @@ + + + + + + + + + \ No newline at end of file diff -r f99d8f92a640 -r 755dd2fa4a0a gnv-artifacts/src/test/ressources/verticalcrosssection_mesh/verticalcrosssection_step_07_out_chart.xml --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv-artifacts/src/test/ressources/verticalcrosssection_mesh/verticalcrosssection_step_07_out_chart.xml Fri Sep 28 12:13:53 2012 +0200 @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff -r f99d8f92a640 -r 755dd2fa4a0a gnv-artifacts/src/test/ressources/verticalcrosssection_mesh/verticalcrosssection_step_07_out_csv.xml --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv-artifacts/src/test/ressources/verticalcrosssection_mesh/verticalcrosssection_step_07_out_csv.xml Fri Sep 28 12:13:53 2012 +0200 @@ -0,0 +1,10 @@ + + + + + + + + + + \ No newline at end of file diff -r f99d8f92a640 -r 755dd2fa4a0a gnv-artifacts/src/test/ressources/verticalcrosssection_mesh/verticalcrosssection_step_07_out_odv.xml --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv-artifacts/src/test/ressources/verticalcrosssection_mesh/verticalcrosssection_step_07_out_odv.xml Fri Sep 28 12:13:53 2012 +0200 @@ -0,0 +1,10 @@ + + + + + + + + + + \ No newline at end of file diff -r f99d8f92a640 -r 755dd2fa4a0a gnv-artifacts/src/test/ressources/verticalprofile/verticalprofile_describe.xml --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv-artifacts/src/test/ressources/verticalprofile/verticalprofile_describe.xml Fri Sep 28 12:13:53 2012 +0200 @@ -0,0 +1,7 @@ + + + + + + true + \ No newline at end of file diff -r f99d8f92a640 -r 755dd2fa4a0a gnv-artifacts/src/test/ressources/verticalprofile/verticalprofile_step_01_advance.xml --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv-artifacts/src/test/ressources/verticalprofile/verticalprofile_step_01_advance.xml Fri Sep 28 12:13:53 2012 +0200 @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff -r f99d8f92a640 -r 755dd2fa4a0a gnv-artifacts/src/test/ressources/verticalprofile/verticalprofile_step_01_feed.xml --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv-artifacts/src/test/ressources/verticalprofile/verticalprofile_step_01_feed.xml Fri Sep 28 12:13:53 2012 +0200 @@ -0,0 +1,9 @@ + + + + + + + + + \ No newline at end of file diff -r f99d8f92a640 -r 755dd2fa4a0a gnv-artifacts/src/test/ressources/verticalprofile/verticalprofile_step_02_advance.xml --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv-artifacts/src/test/ressources/verticalprofile/verticalprofile_step_02_advance.xml Fri Sep 28 12:13:53 2012 +0200 @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff -r f99d8f92a640 -r 755dd2fa4a0a gnv-artifacts/src/test/ressources/verticalprofile/verticalprofile_step_02_feed.xml --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv-artifacts/src/test/ressources/verticalprofile/verticalprofile_step_02_feed.xml Fri Sep 28 12:13:53 2012 +0200 @@ -0,0 +1,9 @@ + + + + + + + + + \ No newline at end of file diff -r f99d8f92a640 -r 755dd2fa4a0a gnv-artifacts/src/test/ressources/verticalprofile/verticalprofile_step_03_advance.xml --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv-artifacts/src/test/ressources/verticalprofile/verticalprofile_step_03_advance.xml Fri Sep 28 12:13:53 2012 +0200 @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff -r f99d8f92a640 -r 755dd2fa4a0a gnv-artifacts/src/test/ressources/verticalprofile/verticalprofile_step_03_feed.xml --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv-artifacts/src/test/ressources/verticalprofile/verticalprofile_step_03_feed.xml Fri Sep 28 12:13:53 2012 +0200 @@ -0,0 +1,9 @@ + + + + + + + + + \ No newline at end of file diff -r f99d8f92a640 -r 755dd2fa4a0a gnv-artifacts/src/test/ressources/verticalprofile/verticalprofile_step_04_advance.xml --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv-artifacts/src/test/ressources/verticalprofile/verticalprofile_step_04_advance.xml Fri Sep 28 12:13:53 2012 +0200 @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff -r f99d8f92a640 -r 755dd2fa4a0a gnv-artifacts/src/test/ressources/verticalprofile/verticalprofile_step_04_feed.xml --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv-artifacts/src/test/ressources/verticalprofile/verticalprofile_step_04_feed.xml Fri Sep 28 12:13:53 2012 +0200 @@ -0,0 +1,10 @@ + + + + + + + + + + \ No newline at end of file diff -r f99d8f92a640 -r 755dd2fa4a0a gnv-artifacts/src/test/ressources/verticalprofile/verticalprofile_step_05_advance.xml --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv-artifacts/src/test/ressources/verticalprofile/verticalprofile_step_05_advance.xml Fri Sep 28 12:13:53 2012 +0200 @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff -r f99d8f92a640 -r 755dd2fa4a0a gnv-artifacts/src/test/ressources/verticalprofile/verticalprofile_step_05_feed.xml --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv-artifacts/src/test/ressources/verticalprofile/verticalprofile_step_05_feed.xml Fri Sep 28 12:13:53 2012 +0200 @@ -0,0 +1,9 @@ + + + + + + + + + \ No newline at end of file diff -r f99d8f92a640 -r 755dd2fa4a0a gnv-artifacts/src/test/ressources/verticalprofile/verticalprofile_step_06_advance.xml --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv-artifacts/src/test/ressources/verticalprofile/verticalprofile_step_06_advance.xml Fri Sep 28 12:13:53 2012 +0200 @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff -r f99d8f92a640 -r 755dd2fa4a0a gnv-artifacts/src/test/ressources/verticalprofile/verticalprofile_step_06_feed.xml --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv-artifacts/src/test/ressources/verticalprofile/verticalprofile_step_06_feed.xml Fri Sep 28 12:13:53 2012 +0200 @@ -0,0 +1,9 @@ + + + + + + + + + \ No newline at end of file diff -r f99d8f92a640 -r 755dd2fa4a0a gnv-artifacts/src/test/ressources/verticalprofile/verticalprofile_step_07_advance.xml --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv-artifacts/src/test/ressources/verticalprofile/verticalprofile_step_07_advance.xml Fri Sep 28 12:13:53 2012 +0200 @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff -r f99d8f92a640 -r 755dd2fa4a0a gnv-artifacts/src/test/ressources/verticalprofile/verticalprofile_step_07_feed.xml --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv-artifacts/src/test/ressources/verticalprofile/verticalprofile_step_07_feed.xml Fri Sep 28 12:13:53 2012 +0200 @@ -0,0 +1,10 @@ + + + + + + + + + + \ No newline at end of file diff -r f99d8f92a640 -r 755dd2fa4a0a gnv-artifacts/src/test/ressources/verticalprofile/verticalprofile_step_07_out_chart.xml --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv-artifacts/src/test/ressources/verticalprofile/verticalprofile_step_07_out_chart.xml Fri Sep 28 12:13:53 2012 +0200 @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff -r f99d8f92a640 -r 755dd2fa4a0a gnv-artifacts/src/test/ressources/verticalprofile/verticalprofile_step_07_out_csv.xml --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv-artifacts/src/test/ressources/verticalprofile/verticalprofile_step_07_out_csv.xml Fri Sep 28 12:13:53 2012 +0200 @@ -0,0 +1,10 @@ + + + + + + + + + + diff -r f99d8f92a640 -r 755dd2fa4a0a gnv-artifacts/src/test/ressources/verticalprofile/verticalprofile_step_07_out_odv.xml --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv-artifacts/src/test/ressources/verticalprofile/verticalprofile_step_07_out_odv.xml Fri Sep 28 12:13:53 2012 +0200 @@ -0,0 +1,10 @@ + + + + + + + + + + \ No newline at end of file diff -r f99d8f92a640 -r 755dd2fa4a0a gnv-artifacts/src/test/ressources/verticalprofile/verticalprofile_step_07_out_statistics.xml --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv-artifacts/src/test/ressources/verticalprofile/verticalprofile_step_07_out_statistics.xml Fri Sep 28 12:13:53 2012 +0200 @@ -0,0 +1,10 @@ + + + + + + + + + + \ No newline at end of file diff -r f99d8f92a640 -r 755dd2fa4a0a gnv-artifacts/src/test/ressources/verticalprofile_instantaneouspoint/verticalprofile_describe.xml --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv-artifacts/src/test/ressources/verticalprofile_instantaneouspoint/verticalprofile_describe.xml Fri Sep 28 12:13:53 2012 +0200 @@ -0,0 +1,7 @@ + + + + + + true + \ No newline at end of file diff -r f99d8f92a640 -r 755dd2fa4a0a gnv-artifacts/src/test/ressources/verticalprofile_instantaneouspoint/verticalprofile_step_01_advance.xml --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv-artifacts/src/test/ressources/verticalprofile_instantaneouspoint/verticalprofile_step_01_advance.xml Fri Sep 28 12:13:53 2012 +0200 @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff -r f99d8f92a640 -r 755dd2fa4a0a gnv-artifacts/src/test/ressources/verticalprofile_instantaneouspoint/verticalprofile_step_01_feed.xml --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv-artifacts/src/test/ressources/verticalprofile_instantaneouspoint/verticalprofile_step_01_feed.xml Fri Sep 28 12:13:53 2012 +0200 @@ -0,0 +1,9 @@ + + + + + + + + + \ No newline at end of file diff -r f99d8f92a640 -r 755dd2fa4a0a gnv-artifacts/src/test/ressources/verticalprofile_instantaneouspoint/verticalprofile_step_02_advance.xml --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv-artifacts/src/test/ressources/verticalprofile_instantaneouspoint/verticalprofile_step_02_advance.xml Fri Sep 28 12:13:53 2012 +0200 @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff -r f99d8f92a640 -r 755dd2fa4a0a gnv-artifacts/src/test/ressources/verticalprofile_instantaneouspoint/verticalprofile_step_02_feed.xml --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv-artifacts/src/test/ressources/verticalprofile_instantaneouspoint/verticalprofile_step_02_feed.xml Fri Sep 28 12:13:53 2012 +0200 @@ -0,0 +1,9 @@ + + + + + + + + + \ No newline at end of file diff -r f99d8f92a640 -r 755dd2fa4a0a gnv-artifacts/src/test/ressources/verticalprofile_instantaneouspoint/verticalprofile_step_03_advance.xml --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv-artifacts/src/test/ressources/verticalprofile_instantaneouspoint/verticalprofile_step_03_advance.xml Fri Sep 28 12:13:53 2012 +0200 @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff -r f99d8f92a640 -r 755dd2fa4a0a gnv-artifacts/src/test/ressources/verticalprofile_instantaneouspoint/verticalprofile_step_03_feed.xml --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv-artifacts/src/test/ressources/verticalprofile_instantaneouspoint/verticalprofile_step_03_feed.xml Fri Sep 28 12:13:53 2012 +0200 @@ -0,0 +1,9 @@ + + + + + + + + + \ No newline at end of file diff -r f99d8f92a640 -r 755dd2fa4a0a gnv-artifacts/src/test/ressources/verticalprofile_instantaneouspoint/verticalprofile_step_04_advance.xml --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv-artifacts/src/test/ressources/verticalprofile_instantaneouspoint/verticalprofile_step_04_advance.xml Fri Sep 28 12:13:53 2012 +0200 @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff -r f99d8f92a640 -r 755dd2fa4a0a gnv-artifacts/src/test/ressources/verticalprofile_instantaneouspoint/verticalprofile_step_04_feed.xml --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv-artifacts/src/test/ressources/verticalprofile_instantaneouspoint/verticalprofile_step_04_feed.xml Fri Sep 28 12:13:53 2012 +0200 @@ -0,0 +1,10 @@ + + + + + + + + + + \ No newline at end of file diff -r f99d8f92a640 -r 755dd2fa4a0a gnv-artifacts/src/test/ressources/verticalprofile_instantaneouspoint/verticalprofile_step_05_advance.xml --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv-artifacts/src/test/ressources/verticalprofile_instantaneouspoint/verticalprofile_step_05_advance.xml Fri Sep 28 12:13:53 2012 +0200 @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff -r f99d8f92a640 -r 755dd2fa4a0a gnv-artifacts/src/test/ressources/verticalprofile_instantaneouspoint/verticalprofile_step_05_feed.xml --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv-artifacts/src/test/ressources/verticalprofile_instantaneouspoint/verticalprofile_step_05_feed.xml Fri Sep 28 12:13:53 2012 +0200 @@ -0,0 +1,10 @@ + + + + + + + + + + \ No newline at end of file diff -r f99d8f92a640 -r 755dd2fa4a0a gnv-artifacts/src/test/ressources/verticalprofile_instantaneouspoint/verticalprofile_step_05_out_chart.xml --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv-artifacts/src/test/ressources/verticalprofile_instantaneouspoint/verticalprofile_step_05_out_chart.xml Fri Sep 28 12:13:53 2012 +0200 @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff -r f99d8f92a640 -r 755dd2fa4a0a gnv-artifacts/src/test/ressources/verticalprofile_instantaneouspoint/verticalprofile_step_05_out_csv.xml --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv-artifacts/src/test/ressources/verticalprofile_instantaneouspoint/verticalprofile_step_05_out_csv.xml Fri Sep 28 12:13:53 2012 +0200 @@ -0,0 +1,2 @@ + + diff -r f99d8f92a640 -r 755dd2fa4a0a gnv-artifacts/src/test/ressources/verticalprofile_instantaneouspoint/verticalprofile_step_05_out_odv.xml --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv-artifacts/src/test/ressources/verticalprofile_instantaneouspoint/verticalprofile_step_05_out_odv.xml Fri Sep 28 12:13:53 2012 +0200 @@ -0,0 +1,10 @@ + + + + + + + + + + \ No newline at end of file diff -r f99d8f92a640 -r 755dd2fa4a0a gnv-artifacts/src/test/ressources/verticalprofile_instantaneouspoint/verticalprofile_step_05_out_statistics.xml --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv-artifacts/src/test/ressources/verticalprofile_instantaneouspoint/verticalprofile_step_05_out_statistics.xml Fri Sep 28 12:13:53 2012 +0200 @@ -0,0 +1,10 @@ + + + + + + + + + + \ No newline at end of file diff -r f99d8f92a640 -r 755dd2fa4a0a gnv-artifacts/src/test/ressources/verticalprofile_mesh/verticalprofile_describe.xml --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv-artifacts/src/test/ressources/verticalprofile_mesh/verticalprofile_describe.xml Fri Sep 28 12:13:53 2012 +0200 @@ -0,0 +1,7 @@ + + + + + + true + \ No newline at end of file diff -r f99d8f92a640 -r 755dd2fa4a0a gnv-artifacts/src/test/ressources/verticalprofile_mesh/verticalprofile_step_01_advance.xml --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv-artifacts/src/test/ressources/verticalprofile_mesh/verticalprofile_step_01_advance.xml Fri Sep 28 12:13:53 2012 +0200 @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff -r f99d8f92a640 -r 755dd2fa4a0a gnv-artifacts/src/test/ressources/verticalprofile_mesh/verticalprofile_step_01_feed.xml --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv-artifacts/src/test/ressources/verticalprofile_mesh/verticalprofile_step_01_feed.xml Fri Sep 28 12:13:53 2012 +0200 @@ -0,0 +1,9 @@ + + + + + + + + + \ No newline at end of file diff -r f99d8f92a640 -r 755dd2fa4a0a gnv-artifacts/src/test/ressources/verticalprofile_mesh/verticalprofile_step_02_advance.xml --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv-artifacts/src/test/ressources/verticalprofile_mesh/verticalprofile_step_02_advance.xml Fri Sep 28 12:13:53 2012 +0200 @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff -r f99d8f92a640 -r 755dd2fa4a0a gnv-artifacts/src/test/ressources/verticalprofile_mesh/verticalprofile_step_02_feed.xml --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv-artifacts/src/test/ressources/verticalprofile_mesh/verticalprofile_step_02_feed.xml Fri Sep 28 12:13:53 2012 +0200 @@ -0,0 +1,9 @@ + + + + + + + + + \ No newline at end of file diff -r f99d8f92a640 -r 755dd2fa4a0a gnv-artifacts/src/test/ressources/verticalprofile_mesh/verticalprofile_step_03_advance.xml --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv-artifacts/src/test/ressources/verticalprofile_mesh/verticalprofile_step_03_advance.xml Fri Sep 28 12:13:53 2012 +0200 @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff -r f99d8f92a640 -r 755dd2fa4a0a gnv-artifacts/src/test/ressources/verticalprofile_mesh/verticalprofile_step_03_feed.xml --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv-artifacts/src/test/ressources/verticalprofile_mesh/verticalprofile_step_03_feed.xml Fri Sep 28 12:13:53 2012 +0200 @@ -0,0 +1,9 @@ + + + + + + + + + \ No newline at end of file diff -r f99d8f92a640 -r 755dd2fa4a0a gnv-artifacts/src/test/ressources/verticalprofile_mesh/verticalprofile_step_04_advance.xml --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv-artifacts/src/test/ressources/verticalprofile_mesh/verticalprofile_step_04_advance.xml Fri Sep 28 12:13:53 2012 +0200 @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff -r f99d8f92a640 -r 755dd2fa4a0a gnv-artifacts/src/test/ressources/verticalprofile_mesh/verticalprofile_step_04_feed.xml --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv-artifacts/src/test/ressources/verticalprofile_mesh/verticalprofile_step_04_feed.xml Fri Sep 28 12:13:53 2012 +0200 @@ -0,0 +1,9 @@ + + + + + + + + + \ No newline at end of file diff -r f99d8f92a640 -r 755dd2fa4a0a gnv-artifacts/src/test/ressources/verticalprofile_mesh/verticalprofile_step_05_advance.xml --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv-artifacts/src/test/ressources/verticalprofile_mesh/verticalprofile_step_05_advance.xml Fri Sep 28 12:13:53 2012 +0200 @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff -r f99d8f92a640 -r 755dd2fa4a0a gnv-artifacts/src/test/ressources/verticalprofile_mesh/verticalprofile_step_05_feed.xml --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv-artifacts/src/test/ressources/verticalprofile_mesh/verticalprofile_step_05_feed.xml Fri Sep 28 12:13:53 2012 +0200 @@ -0,0 +1,9 @@ + + + + + + + + + \ No newline at end of file diff -r f99d8f92a640 -r 755dd2fa4a0a gnv-artifacts/src/test/ressources/verticalprofile_mesh/verticalprofile_step_06_advance.xml --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv-artifacts/src/test/ressources/verticalprofile_mesh/verticalprofile_step_06_advance.xml Fri Sep 28 12:13:53 2012 +0200 @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff -r f99d8f92a640 -r 755dd2fa4a0a gnv-artifacts/src/test/ressources/verticalprofile_mesh/verticalprofile_step_06_feed.xml --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv-artifacts/src/test/ressources/verticalprofile_mesh/verticalprofile_step_06_feed.xml Fri Sep 28 12:13:53 2012 +0200 @@ -0,0 +1,9 @@ + + + + + + + + + \ No newline at end of file diff -r f99d8f92a640 -r 755dd2fa4a0a gnv-artifacts/src/test/ressources/verticalprofile_mesh/verticalprofile_step_07_advance.xml --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv-artifacts/src/test/ressources/verticalprofile_mesh/verticalprofile_step_07_advance.xml Fri Sep 28 12:13:53 2012 +0200 @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff -r f99d8f92a640 -r 755dd2fa4a0a gnv-artifacts/src/test/ressources/verticalprofile_mesh/verticalprofile_step_07_feed.xml --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv-artifacts/src/test/ressources/verticalprofile_mesh/verticalprofile_step_07_feed.xml Fri Sep 28 12:13:53 2012 +0200 @@ -0,0 +1,9 @@ + + + + + + + + + \ No newline at end of file diff -r f99d8f92a640 -r 755dd2fa4a0a gnv-artifacts/src/test/ressources/verticalprofile_mesh/verticalprofile_step_08_advance.xml --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv-artifacts/src/test/ressources/verticalprofile_mesh/verticalprofile_step_08_advance.xml Fri Sep 28 12:13:53 2012 +0200 @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff -r f99d8f92a640 -r 755dd2fa4a0a gnv-artifacts/src/test/ressources/verticalprofile_mesh/verticalprofile_step_08_feed.xml --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv-artifacts/src/test/ressources/verticalprofile_mesh/verticalprofile_step_08_feed.xml Fri Sep 28 12:13:53 2012 +0200 @@ -0,0 +1,9 @@ + + + + + + + + + \ No newline at end of file diff -r f99d8f92a640 -r 755dd2fa4a0a gnv-artifacts/src/test/ressources/verticalprofile_mesh/verticalprofile_step_09_advance.xml --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv-artifacts/src/test/ressources/verticalprofile_mesh/verticalprofile_step_09_advance.xml Fri Sep 28 12:13:53 2012 +0200 @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff -r f99d8f92a640 -r 755dd2fa4a0a gnv-artifacts/src/test/ressources/verticalprofile_mesh/verticalprofile_step_09_feed.xml --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv-artifacts/src/test/ressources/verticalprofile_mesh/verticalprofile_step_09_feed.xml Fri Sep 28 12:13:53 2012 +0200 @@ -0,0 +1,10 @@ + + + + + + + + + + \ No newline at end of file diff -r f99d8f92a640 -r 755dd2fa4a0a gnv-artifacts/src/test/ressources/verticalprofile_mesh/verticalprofile_step_10_advance.xml --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv-artifacts/src/test/ressources/verticalprofile_mesh/verticalprofile_step_10_advance.xml Fri Sep 28 12:13:53 2012 +0200 @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff -r f99d8f92a640 -r 755dd2fa4a0a gnv-artifacts/src/test/ressources/verticalprofile_mesh/verticalprofile_step_10_feed.xml --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv-artifacts/src/test/ressources/verticalprofile_mesh/verticalprofile_step_10_feed.xml Fri Sep 28 12:13:53 2012 +0200 @@ -0,0 +1,9 @@ + + + + + + + + + \ No newline at end of file diff -r f99d8f92a640 -r 755dd2fa4a0a gnv-artifacts/src/test/ressources/verticalprofile_mesh/verticalprofile_step_11_advance.xml --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv-artifacts/src/test/ressources/verticalprofile_mesh/verticalprofile_step_11_advance.xml Fri Sep 28 12:13:53 2012 +0200 @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff -r f99d8f92a640 -r 755dd2fa4a0a gnv-artifacts/src/test/ressources/verticalprofile_mesh/verticalprofile_step_11_feed.xml --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv-artifacts/src/test/ressources/verticalprofile_mesh/verticalprofile_step_11_feed.xml Fri Sep 28 12:13:53 2012 +0200 @@ -0,0 +1,10 @@ + + + + + + + + + + \ No newline at end of file diff -r f99d8f92a640 -r 755dd2fa4a0a gnv-artifacts/src/test/ressources/verticalprofile_mesh/verticalprofile_step_11_out_chart.xml --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv-artifacts/src/test/ressources/verticalprofile_mesh/verticalprofile_step_11_out_chart.xml Fri Sep 28 12:13:53 2012 +0200 @@ -0,0 +1,13 @@ + + + + + /> + + + + + + + + diff -r f99d8f92a640 -r 755dd2fa4a0a gnv-artifacts/src/test/ressources/verticalprofile_mesh/verticalprofile_step_11_out_csv.xml --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv-artifacts/src/test/ressources/verticalprofile_mesh/verticalprofile_step_11_out_csv.xml Fri Sep 28 12:13:53 2012 +0200 @@ -0,0 +1,10 @@ + + + + + + + + + + diff -r f99d8f92a640 -r 755dd2fa4a0a gnv-artifacts/src/test/ressources/verticalprofile_mesh/verticalprofile_step_11_out_odv.xml --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv-artifacts/src/test/ressources/verticalprofile_mesh/verticalprofile_step_11_out_odv.xml Fri Sep 28 12:13:53 2012 +0200 @@ -0,0 +1,10 @@ + + + + + + + + + + \ No newline at end of file diff -r f99d8f92a640 -r 755dd2fa4a0a gnv-artifacts/src/test/ressources/verticalprofile_mesh/verticalprofile_step_11_out_statistics.xml --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv-artifacts/src/test/ressources/verticalprofile_mesh/verticalprofile_step_11_out_statistics.xml Fri Sep 28 12:13:53 2012 +0200 @@ -0,0 +1,10 @@ + + + + + + + + + + \ No newline at end of file diff -r f99d8f92a640 -r 755dd2fa4a0a gnv/ChangeLog --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv/ChangeLog Fri Sep 28 12:13:53 2012 +0200 @@ -0,0 +1,1611 @@ +2010-03-08 Ingo Weinzierl + + * src/main/java/de/intevation/gnv/artifactdatabase/client/DefaultArtifactDatabaseClient.java: + Adjusted xpath expression to find exception nodes in xml documents again. + The prefix 'art:' has been missing. + +2010-03-08 Ingo Weinzierl + + Issue187 + + * src/main/java/de/intevation/gnv/action/DoExportAction.java: Exports with + target 'img' will get a file extension that corresponds to their + mime-type. There was no code path for 'img' before, which caused the + problem, that 'img'-exports had a '.txt'-file extension. + +2010-03-06 Sascha L. Teichmann + + * src/main/java/de/intevation/gnv/action/DoExportAction.java: + Removed duplicated imports. + +2010-03-05 Ingo Weinzierl + + Issue190 + + * src/main/java/de/intevation/gnv/action/CreateHistogramAction.java, + src/main/java/de/intevation/gnv/action/CreateChartAction.java: Reset + diagram options. Switching between chart and histogram caused some 'null' + values in text fields. After resetting these options, we don't have these + problems anymore - text fields will be filled with default values in this + case. + + * src/main/webapp/WEB-INF/jsp/includes/display_diagramm_adons_inc.jsp: + Removed useless file. + +2010-03-05 Tim Englich + + * src/main/webapp/WEB-INF/config/templates/describe-ui.xsl: + ISSUE 181: Removed duplicate Drawaing of the Lengendvalue of Groupelements + for choosing different heights for several Parameters + +2010-03-05 Ingo Weinzierl + + * src/main/java/de/intevation/gnv/artifactdatabase/client/ArtifactDatabaseClient.java, + src/main/java/de/intevation/gnv/artifactdatabase/client/DefaultArtifactDatabaseClient.java: + 'publishWMS' returns a whole document which contains meta information used + for mapfile generation - not just a string. These information contain + MapServer URL and the path to its mapfile. + + * src/main/java/de/intevation/gnv/action/WMSAction.java: Fetch MapServer + settings from resulting document after wms-publishing to display these + values in gui. + + * src/main/java/de/intevation/gnv/util/XMLUtils.java: Converted class + methods into static methods to use them without initializing an object of + XMLUtils. + + * src/main/webapp/WEB-INF/jsp/wmslayout.jsp: Show MapServer and layer + information in gui and use MapServer settings to feed OpenLayers client. + + * src/main/webapp/styles/default.css: Added some classes to adjust style of + information table (wms service, layer name) and map area. + + * src/main/resources/applicationMessages.properties, + src/main/resources/applicationMessages_en.properties: Added column labels + for displaying MapServer information. + +2010-03-04 Ingo Weinzierl + + * src/main/webapp/WEB-INF/jsp/index.jsp, + src/main/webapp/WEB-INF/jsp/wmslayout.jsp: Removed map-div from index.jsp + and moved it to wmslayout. So, we don't have an empty div with grey border + in our application if there is no map currently existing. Load images from + MapServer as 'image/png'. + + * src/main/webapp/styles/default.css: Adjusted style for customizing + map-div. + +2010-03-02 Ingo Weinzierl + + * src/main/java/de/intevation/gnv/artifactdatabase/client/ArtifactDatabaseClient.java, + src/main/java/de/intevation/gnv/artifactdatabase/client/DefaultArtifactDatabaseClient.java: + Added export mode to 'out'-xml document. + + * src/main/java/de/intevation/gnv/action/DoOutputAction.java, + src/main/java/de/intevation/gnv/action/DoExportAction.java: Call + 'doOutput' for triggering an output like chart, histogram, csv or odv with + a new parameter export mode which contains the export format (img, pdf, + svg). + + * src/main/webapp/WEB-INF/jsp/includes/display_histogram_options_inc.jsp, + src/main/webapp/WEB-INF/jsp/includes/display_diagramm_options_inc.jsp, + src/main/webapp/WEB-INF/jsp/includes/display_histogram_inc.jsp, + src/main/webapp/WEB-INF/jsp/includes/display_diagramm_inc.jsp, + src/main/webapp/WEB-INF/jsp/includes/display_export_inc.jsp: Added export + mode to HTTP-Get requests. + +2010-03-02 Ingo Weinzierl + + * src/main/webapp/WEB-INF/config/templates/describe-ui-static.xsl: + Implemented a One-Step-Back-History. The user is able to step back to + the last state and to the state for choosing the fis. + +2010-03-02 Ingo Weinzierl + + Issue184 + + * src/main/webapp/WEB-INF/jsp/index.jsp: Display chart per default, when + reaching a final state, which doesn't need any further user input. + +2010-03-01 Ingo Weinzierl + + Issue183 + + * src/main/java/de/intevation/gnv/action/PreviousArtifactStepAction.java: + Take care on exceptions and render an error message if an exception + occured. + +2010-03-01 Ingo Weinzierl + + * src/main/java/de/intevation/gnv/action/DoExportAction.java: Removed little + copy-paste mistake while setting file-extension for exports. + +2010-03-01 Ingo Weinzierl + + * src/main/java/de/intevation/gnv/action/DoExportAction.java: Set + file-extension according to mime type for histogram exports. + +2010-02-26 Ingo Weinzierl + + * src/main/webapp/WEB-INF/config/templates/describe-ui.xsl: Render a matrix + for measurement selection. + + * src/main/webapp/styles/default.css: Added new css class to adjust the + matrix' column headers. + +2010-02-25 Ingo Weinzierl + + Issue178 + + * src/main/java/de/intevation/gnv/action/DoExportAction.java: Added a code + path for export actions, where no export mode is given. + +2010-02-24 Ingo Weinzierl + + * src/main/java/de/intevation/gnv/action/ChangeOptionsAction.java: Added + user selected type of bin setting (number of bins, bin width) to diagram + options and request object which are used to create links for chart + images. + + * src/main/java/de/intevation/gnv/action/DoOutputAction.java: Added user + selected type of bin setting to InputParameters which are used to create + xml documents for 'out' target. + + * src/main/webapp/WEB-INF/jsp/includes/display_histogram_options_inc.jsp, + src/main/webapp/WEB-INF/jsp/includes/display_histogram_inc.jsp: Added + checkboxes to select the field to adjust bins in histogram charts (bin + width or number of bins). When selecting a checkbox, the other box becomes + disabled. + + * src/main/webapp/WEB-INF/jsp/mainlayout.jsp: JavaScript function to toggle + checkboxes. + +2010-02-24 Ingo Weinzierl + + * src/main/webapp/WEB-INF/jsp/includes/display_histogram_inc.jsp: Append + user inserted parameter from histogram options (width, height, bin width, + number of bins) to http request when fetching the histogram image. + +2010-02-23 Ingo Weinzierl + + * src/main/java/de/intevation/gnv/artifactdatabase/objects/DefaultOutputMode.java, + src/main/java/de/intevation/gnv/artifactdatabase/objects/OutputMode.java: + New method returning export modes. + + * src/main/java/de/intevation/gnv/artifactdatabase/objects/DefaultExportMode.java, + src/main/java/de/intevation/gnv/artifactdatabase/objects/ExportMode.java: + Object storing information about mime-type, description and name of an + export mode. + + * src/main/java/de/intevation/gnv/artifactdatabase/client/DefaultArtifactDatabaseClient.java: + Parse export modes from describe document and put them into OutputMode + objects. + + * src/main/java/de/intevation/gnv/action/ChangeOptionsAction.java: Now, this + action is able to adjust histogram parameter as well. + + * src/main/java/de/intevation/gnv/action/DoExportAction.java: An export is + triggered regarding a new parameter 'mode' which value can be 'pdf', + 'svg' or 'img'. Before, we just took care on 'target' parameter. + + * src/main/resources/applicationMessages.properties, + src/main/resources/applicationMessages_en.properties: Transformed draw + button into an update button. + + * src/main/webapp/images/arrow_refresh.png: Icon for update button. (source: + famfamfam) + + * src/main/webapp/WEB-INF/jsp/includes/display_histogram_options_inc.jsp, + src/main/webapp/WEB-INF/jsp/includes/display_diagramm_options_inc.jsp, + src/main/webapp/WEB-INF/jsp/includes/display_export_inc.jsp: Moved + exports from action panel into options panel. Actions (chart, histogram, + etc) are devided from exports (png, pdf, svg). + +2010-02-23 Ingo Weinzierl + + * src/main/webapp/WEB-INF/config/struts-config.xml: Foward to wmslayout.jsp + instead of mainlayout.jsp if the user selected wms target. + + * src/main/webapp/WEB-INF/jsp/wmslayout.jsp: New page for rendering a wms + client (OpenLayers). JavaScript loading take place in this page. If the + user select the wms target, a forward to this page will be done. + + TODO: Include OpenLayers library from local filesystem instead of loading + it from openlayers.org! + + * src/main/webapp/WEB-INF/jsp/mainlayout.jsp: Removed OpenLayers JavaScript + library and function to initialize OpenLayers. This reduces traffic while + parameterization. + +2010-02-23 Ingo Weinzierl + + * src/main/java/de/intevation/gnv/action/CreateChartAction.java: Class to + trigger chart rendering. + + * src/main/java/de/intevation/gnv/action/ChangeOptionsAction.java: Changed + request parameter from 'diagram' (deprecated) to 'chart'. + + * src/main/resources/applicationMessages.properties, + src/main/resources/applicationMessages_en.properties: Added title and + labels for histogram options. + + * src/main/webapp/images/chart_curve.png: Chart icon (source: famfamfam) + + * src/main/webapp/WEB-INF/config/struts-config.xml: Added new action to + trigger chart rendering analog to histogram action. + + * src/main/webapp/WEB-INF/jsp/index.jsp: Render chart option panel only if + the user already selected charts. + + * src/main/webapp/WEB-INF/jsp/includes/display_histogram_options_inc.jsp, + src/main/webapp/WEB-INF/jsp/includes/display_histogram_inc.jsp, + src/main/webapp/WEB-INF/jsp/includes/display_diagramm_inc.jsp: Show + diagram/chart options panel only if the user chose one of them. Placed + these option panels beneath the action panel. + + * src/main/webapp/WEB-INF/jsp/includes/display_export_inc.jsp: Added new + icon for chart rendering. + + * src/main/webapp/WEB-INF/jsp/mainlayout.jsp: Removed js debug output. + +2010-02-22 Ingo Weinzierl + + * src/main/webapp/WEB-INF/config/struts-config.xml: New action 'WMSAction'. + It triggers the generation of shapefiles and mapfile and sets an internal + flag to intialize an OpenLayers map. + + * src/main/java/de/intevation/gnv/action/WMSAction.java: Action which + triggers the creation of shapefiles and mapfile. An internal flag is set + to initialize an OpenLayers map with the layer even published. + + * src/main/java/de/intevation/gnv/artifactdatabase/client/DefaultArtifactDatabaseClient.java, + src/main/java/de/intevation/gnv/artifactdatabase/client/ArtifactDatabaseClient.java: + Added a new method to send a request to the artifact server and start + shapefile and mapfile creation. + + * src/main/webapp/WEB-INF/jsp/mainlayout.jsp: Added javascript functions to + read url parameters and initialize OpenLayers. + + * src/main/webapp/WEB-INF/jsp/includes/display_export_inc.jsp: Call 'wms.do' + after clicking WMS button which triggers WMSAction. + + * src/main/webapp/WEB-INF/jsp/index.jsp: Added a div-container for rendering + an OpenLayers map. + + * src/main/webapp/styles/default.css: New class for styling map + div-container. + + * src/main/java/de/intevation/gnv/util/XMLUtils.java: Made method static to + be able to use it without creating an object of this class. + + +2010-02-15 Ingo Weinzierl + + * src/main/webapp/WEB-INF/config/struts-config.xml: Added an action + 'histogram' to render histograms. + + * src/main/java/de/intevation/gnv/action/CreateHistogramAction.java: Added a + new action for rendering histograms. + + * src/main/webapp/WEB-INF/jsp/includes/display_export_inc.jsp: Display an + icon for histograms if this output mode is present for this artifact. + + * src/main/webapp/images/chart_bar.png: Icon for histograms from famfamfam + iconset. + + * src/main/webapp/WEB-INF/jsp/includes/display_histogram_inc.jsp: JSP for + rendering histograms. + + * src/main/webapp/styles/default.css: Added a style class for adapting + histogram div. + + * src/main/webapp/WEB-INF/jsp/index.jsp: Include display_histogram_inc if + histogram action have been chosen by user. + + * src/main/resources/applicationMessages_en.properties, + src/main/resources/applicationMessages.properties: Button label and + alternative image text for histograms. + + * src/main/java/de/intevation/gnv/action/ChangeOptionsAction.java: Removed + comment lines at the beginning of the file. These empty comment lines + would cause trouble later, when inserting GPL text automatically with a + script. + +2010-02-12 Ingo Weinzierl + + * src/main/webapp/WEB-INF/config/templates/describe-ui-static.xsl: Render an + icon to trigger a step-back in history for each state. + + * src/main/webapp/WEB-INF/config/struts-config.xml: Added missing forwards + used for stepping back to former states. + +2010-02-12 Tim Englich + + * src/main/webapp/WEB-INF/jsp/includes/display_mapviewercall_inc.jsp: + Added further XML-Nodes for simulating the MapViewer-Call more detailed. + +2010-02-12 Tim Englich + + * src/main/webapp/WEB-INF/config/struts-config.xml: + Added new Action for Calling the Page with the Form for simmulating + the MapViewer-Interface-request. + Using the URL + http://localhost:8080/gnv/mvcall.do + you will retrieve the Formular with the MapViewer-Interface-Request-body + + * src/main/webapp/WEB-INF/jsp/header.jsp: + Added an Switch that will manage that the GUI with the Form of the + MapViewer-Interface-Document only will be displaied if it is requested. + + * src/main/java/de/intevation/gnv/action/mapviewer/ShowMapViewerCallBodyAction.java (execute): + Added new Action for handling the Request that should show the Form + for insterting the MapViewer-Interface-Document. + +2010-02-12 Tim Englich + + * src/main/java/de/intevation/gnv/artifactdatabase/client/DefaultArtifactDatabaseClient.java: + Modified the Create-Artifact-Request-Body that a Geometry will be put into + the Parameter if one is given e.g. using the MapViewer-Interface request. + +2010-02-09 Tim Englich + + * src/test/ressources/externalinterfacecall_curl.xml, + src/test/ressources/samplecall.txt: + Added Sampledata and a sample how to call the MapViewer-Interface using CURL. + +2010-02-09 Tim Englich + + * src/main/webapp/styles/default.css: + Added some stylinginformation for the Textarea for the XML-Document. + * src/main/webapp/WEB-INF/jsp/includes/display_mapviewercall_inc.jsp: + Integrated an Textarea so that is possible to manipulate the XML-Document + which simulates the MapViewer-Interface-Body. + +2010-02-09 Tim Englich + + * src/main/java/de/intevation/gnv/action/mapviewer/MapViewerCallAction.java (execute): + Removed trailing and leading Whitespaces from the Parametervalue which + contains the XML-Document to avoid XML-Parsingerrors. + +2010-02-09 Tim Englich + + * src/main/java/de/intevation/gnv/artifactdatabase/client/DefaultArtifactDatabaseClient.java (createMetaDataRequestBody): + Fixed a NPE. Now it is possible to put an Mapservice without an Layer into + the Request-Document of am Mapviewer-Interface-Call. + +2010-02-05 Ingo Weinzierl + + Issue170 + + * pom.xml: Changed log4j version to 1.2.14 (later version causes errors and + breaks maven build process). + +2010-02-02 Tim Englich + + * src/main/webapp/WEB-INF/jsp/header.jsp: + Added temporally Include of includes/display_mapviewercall_inc.jsp for the + Simulation of the MapViewer-Interface-Request. + + * src/main/webapp/WEB-INF/jsp/includes/display_mapviewercall_inc.jsp: + Added new Includefile with the Formular which includes the Data for the + Simulation of the MapViewer-Interface-Request. + +2010-02-01 Tim Englich + + * src/main/webapp/WEB-INF/config/struts-config.xml: + Added am Action for handling the MapViewer-Interface. + if /gnv/extcall.do is called the processing of the defined + Information will be done and the GUI will be displayed. + + * src/main/java/de/intevation/gnv/artifactdatabase/objects/ParametrizedArtifactFactory.java: + Implementation of the interface ParametrizedArtifactObject fro the + representation of ArtifactFactories which has further Information. + + * src/main/java/de/intevation/gnv/artifactdatabase/objects/ParametrizedArtifactObject.java (addParameters): + Added new Interfacedefinition ParametrizedArtifactObjects for representing those + ArtifactObjects which includes further Informations. E.g. for creating an + new Artifact. + + * src/main/java/de/intevation/gnv/artifactdatabase/objects/ArtifactFactory.java (equals): + Override equals-method to get ap proper comparisons of the kinds of objects. + + * src/main/java/de/intevation/gnv/artifactdatabase/client/DefaultArtifactDatabaseClient.java (getArtifactFactoryMetaInformation): + Added Method to retrieve Metainformations form the ArtifactDatabases. + Also added the possibility to send further Informations (e.g: Parameters) + in the Request-body of an Create-Artifact-Call. + + * src/main/java/de/intevation/gnv/artifactdatabase/client/ArtifactDatabaseClient.java (getArtifactFactoryMetaInformation): + Added Method to retrieve Metainformations form the ArtifactDatabases. + + * src/main/java/de/intevation/gnv/action/mapviewer/MapViewerCallAction.java (execute): + Added further Businesslogic to the Action which will handle the MapViewer- + InterfaceCall. Now the retrieved Informations will be sent to the + ArtifactDatabase an the retrieved Informations will be used to reduce + the displayed "Fachinformationssysteme". And also will be used to + send these Informations (e.g: Parameters) during the creation of an + new Artifact. + +2010-01-27 Hans Plum + + RELEASE 0.3 + + * Changes, NEWS, ChangeLog: Summerized activities + +2010-01-27 Ingo Weinzierl + + * src/main/webapp/WEB-INF/config/templates/describe-ui.xsl: Added a + workarround to avoid input failures caused by multi select boxes with only + one entry. They look like text input fields and don't force the user to + select a row. In this case, the single entry is selected automatically. + +2010-01-25 Ingo Weinzierl + + * src/main/webapp/styles/default.css: Added a class for dynamic tables + - enabled input fields - to adjust font size of input fields. + + * src/main/webapp/WEB-INF/config/templates/describe-ui.xsl: Removed + local-name() method, inserted a table for 'group' items (like input fields + of dates) and resized the height of multi select boxes - max 5 items or + less. + + * src/main/webapp/WEB-INF/jsp/index.jsp: Removed a typo which made the html + output invalid. + +2010-01-22 Ingo Weinzierl + + * src/main/webapp/WEB-INF/jsp/includes/display_export_inc.jsp: Add width, + height and the boolean value to adjust the visibility of points in charts + to the pdf and svg export links. + +2010-01-22 Ingo Weinzierl + + * src/main/resources/applicationMessages.properties, + src/main/resources/applicationMessages_en.properties: Added legend for + summary box. + + * src/main/webapp/styles/default.css: Adapted some css classes regarding the + position of boxes and removed background image in fieldsets. + + * src/main/webapp/WEB-INF/config/templates/describe-ui-static.xsl: Removed + useless div container (div container is now outside the xsl sheet). + + * src/main/webapp/WEB-INF/jsp/index.jsp: Moved former parameter into a + fieldset and added a label to this fieldset. + +2010-01-22 Ingo Weinzierl + + * src/main/java/de/intevation/gnv/action/ShowStatisticAction.java: This + action 'calculates' the statistic and shows the result in the gui. + + * src/main/webapp/WEB-INF/config/struts-config.xml: Added controller and + forwards. + + * src/main/webapp/images/statistics.png: Statistic icon. FIXME: Give a Source here! + + * src/main/webapp/WEB-INF/jsp/index.jsp, + src/main/webapp/WEB-INF/jsp/includes/display_diagramm_statistics_inc.jsp, + src/main/webapp/WEB-INF/jsp/includes/display_diagramm_inc.jsp, + src/main/webapp/WEB-INF/jsp/includes/display_export_inc.jsp: Added symbol + in action box to show the statistic. + + * src/main/webapp/styles/default.css: Adjusted some parameter for a proper + placement of the statistic box. + + * src/main/resources/applicationMessages.properties, + src/main/resources/applicationMessages_en.properties: Added label for + statistic icon. + +2010-01-22 Ingo Weinzierl + + * src/main/java/de/intevation/gnv/action/DescribeUIAction.java: New action. + The only task of this action is to parse the describe document and create + static and dynamic user interface out of it. + + * src/main/java/de/intevation/gnv/action/ChangeOptionsAction.java, + src/main/java/de/intevation/gnv/action/DoOutputAction.java, + src/main/java/de/intevation/gnv/action/PreviousArtifactStepAction.java, + src/main/java/de/intevation/gnv/action/FetchArtifactFactoriesAction.java, + src/main/java/de/intevation/gnv/action/NextArtifactStepAction.java, + src/main/java/de/intevation/gnv/action/ArtifactDatabaseActionBase.java: + Removed xsl transformation. Classes which needs xsl transformation inherit + from DescribeUIAction which does the transformation. Now, it is much + easier to write new actions, because they do not need to parse the + describe document and create static and dynamic user interfaces. + + Removed some useless imports. + +2010-01-22 Ingo Weinzierl + + * src/main/webapp/WEB-INF/jsp/index.jsp, + src/main/webapp/WEB-INF/jsp/header.jsp, + src/main/webapp/WEB-INF/jsp/includes/display_export_inc.jsp, + src/main/webapp/WEB-INF/jsp/includes/display_diagramm_options_inc.jsp, + src/main/webapp/WEB-INF/jsp/includes/display_diagramm_inc.jsp, + src/main/webapp/WEB-INF/jsp/includes/display_diagramm_adons_inc.jsp, + src/main/webapp/WEB-INF/jsp/mainlayout.jsp: + - Improved the design and the usibility concept ("Bedienkonzept"). + Removed the useless "draw" button after reaching the last state which + has some output modes. + - Render chart options - if chart creation is possible for this state - and show + export actions. + - Moved chart options and export actions to the left side beneath the + static and dynamic panals for parameterization. + - Removed some warnings and errors regaring html conformance. + + * src/main/webapp/styles/default.css: Made some necessary adjustments + regarding the movement of chart option and action boxes. + + * src/main/resources/applicationMessages.properties, + src/main/resources/applicationMessages_en.properties: Added label for + action box. + + * src/main/java/de/intevation/gnv/action/ArtifactDatabaseActionBase.java: + Removed pathes of xsl sheets from code and put them to a central place. + + * src/main/java/de/intevation/gnv/action/ChangeOptionsAction.java: Added + urls to xsl transformer for step-back links and create a dynamic ui only + if there is content for it - avoid creation of empty boxes. + + * src/main/java/de/intevation/gnv/action/NextArtifactStepAction.java: Write + dynamic ui only if there is content. Some code formatting done. + + * src/main/webapp/images/back_button.png: Button to step back to a previous + state. + + * src/main/webapp/WEB-INF/config/struts-config.xml: Added forwards to fis + selection and previous states. + + * src/main/webapp/WEB-INF/config/templates/describe-ui-static.xsl: Enabled + link to step back to fis selection. + +2010-01-20 Ingo Weinzierl + + Issue149 + + * src/main/java/de/intevation/gnv/action/ChangeOptionsAction.java: Show + chart if there are output modes existing for this state. Set internal + value of checkboxes to 'true' if they are selected. + + TODO: We should check if there is an output mode named 'chart' before + rendering a chart. + +2010-01-20 Ingo Weinzierl + + * src/main/resources/applicationMessages.properties, + src/main/resources/applicationMessages_en.properties: Added label for + char option 'draw data points'. + +2010-01-20 Ingo Weinzierl + + * src/main/webapp/styles/default.css, + src/main/webapp/WEB-INF/config/templates/describe-ui-static.xsl: Adapted + style of static ui to bsh style. Improved indentation. + +2010-01-19 Ingo Weinzierl + + * src/main/webapp/WEB-INF/config/templates/describe-ui-static.xsl, + src/main/webapp/WEB-INF/jsp/index.jsp: Commented links to step back in + history out and always render a fis select box (reason for this is the + next release and a too buggy 'step-back-history'). + +2010-01-19 Tim Englich + + * src/test/ressources/externalinterfacecall.xml: + Added an Request-Document which contains an Call which might be + send from the MapViewer to the GNV. + + * src/test/java/de/intevation/gnv/action/mapviewer/parser/ExternalCallParserTestCase.java: + Added TestCase for testing the functionality of the XMLExternalCallParser-Implementation. + +2010-01-19 Tim Englich + * src/main/java/de/intevation/gnv/artifactdatabase/objects/map/DefaultMapService.java: + DefaultImplementation of the Interface MapService. + + * src/main/java/de/intevation/gnv/artifactdatabase/objects/map/MapService.java : + Added a new Interfacespecification for representing an MapService retrieved + by an MapViewer-Call + + * src/main/java/de/intevation/gnv/artifactdatabase/objects/map/DefaultLayer.java: + DefaultImplementation of the Interface Layer. + + * src/main/java/de/intevation/gnv/artifactdatabase/objects/map/Layer.java: + Added a new Interfacespecification for representing an Layer retrieved + by an MapViewer-Call + + * src/main/java/de/intevation/gnv/artifactdatabase/client/DefaultArtifactDatabaseClient.java + (getArtifactFactoryMetaInformation), src/main/java/de/intevation/gnv/artifactdatabase/client/ArtifactDatabaseClient.java + (getArtifactFactoryMetaInformation): + Added new Method for retrieving Metainformation for the ArtifactFactories using + the Data which is parsed using the ExternalCallParser. + + * src/main/java/de/intevation/gnv/action/mapviewer/parser/ExternalCallParserException.java (ExternalCallParserException): + New ExceptionClass which is used to specify Exception which occurs during parsing + an ExternalCallParser. + + * src/main/java/de/intevation/gnv/action/mapviewer/parser/XMLExternalCallParser.java : + Added an Implementation of the Inteface ExternalCallParser which is able to parse + an XML-Document. + + * src/main/java/de/intevation/gnv/action/mapviewer/parser/ExternalCallParser.java : + Added a new Interface which provides the required Methods for parsing an + Request from the MapViewer an provide the parsed Data. + + * src/main/java/de/intevation/gnv/action/mapviewer/MapViewerCallAction.java: + Added new Action which provied the reauired logic for Implementing the + Interface to the MapViewer. + +2010-01-18 Ingo Weinzierl + + * src/main/webapp/WEB-INF/config/struts-config.xml: Added a new controller + which causes a return to the point, where the user can choose a fis. + + * src/main/java/de/intevation/gnv/action/SelectFisAction.java: Controller to + reset the SessionModel and to jump back to fis selection. + + * src/main/java/de/intevation/gnv/action/SelectArtifactFactoryAction.java, + src/main/java/de/intevation/gnv/action/NextArtifactStepAction.java: Made + the link to return to the fis select box available in XSL. + + * src/main/webapp/WEB-INF/config/templates/describe-ui-static.xsl: Check the + 'fis' attribute is contained in select1 nodes and create a link in this + case. + +2010-01-18 Ingo Weinzierl + + * src/main/java/de/intevation/gnv/action/SelectArtifactFactoryAction.java: + Render the static part of the gui as well - not just the dynamic part. + + * src/main/webapp/WEB-INF/jsp/index.js: Do not include the fis combo box if + the describe document contains a static part, which means that the user + already selected a fis. + + * src/main/webapp/styles/default.css: Added 20px space at the top of the + static table. Otherwise the table hides the links to load and save + projects. + +2010-01-17 Sascha L. Teichmann + + * src/main/webapp/WEB-INF/jsp/mainlayout.jsp: Simpler + demo WKT polygon. + +2010-01-17 Sascha L. Teichmann + + * src/main/webapp/WEB-INF/jsp/includes/display_diagramm_inc.jsp: + Only render chart addons when we have a chart. + + * src/main/java/de/intevation/gnv/action/DoExportAction.java: + Set right file extensions if we have WMS or ZIP export. + +2010-01-17 Sascha L. Teichmann + + * src/main/webapp/WEB-INF/jsp/includes/display_diagramm_inc.jsp: + Add links to download zip files and WMS layers if they are + available. + + * src/main/resources/applicationMessages.properties, + src/main/resources/applicationMessages_en.properties: + Added i10n for new download link types. + + * src/main/webapp/images/svg.png: New. Gimp rendered PNG + of official SVG logo. Creative Commons license. + + * src/main/webapp/images/pdf.png: New. Crystal pdf icon. + LGPLv2 license. + + * src/main/webapp/images/disk.png, src/main/webapp/images/map_go.png: + famfamfam icons for disk and map. Creative Commons license. + +2010-01-15 Sascha L. Teichmann + + * src/main/java/de/intevation/gnv/action/PreviousArtifactStepAction.java, + src/main/java/de/intevation/gnv/util/XSLTransformer.java: + Cleanup imports. + +2010-01-14 Ingo Weinzierl + + * src/main/java/de/intevation/gnv/action/NextArtifactStepAction.java: + Fixed a bug which caused that the user was not able to draw charts + anymore. Query the 'output' node of the describe document and render a + 'draw'-button if existing. If 'output' is not existing, render a 'select' + button to step forward to the next step. + +2010-01-13 Ingo Weinzierl + + * src/main/java/de/intevation/gnv/artifactdatabase/client/ArtifactDatabaseClient.java, + src/main/java/de/intevation/gnv/artifactdatabase/client/DefaultArtifactDatabaseClient.java: + Added 'doAdvance' method to be able to advance only - without feed or + describe. We need this method to step back to previous states. Advance was + bundled with feed and describe, before. + + * src/main/java/de/intevation/gnv/action/sessionmodel/SessionModelFactory.java: + Some code refactoring. + + * src/main/java/de/intevation/gnv/util/XSLTransformer.java, + src/main/java/de/intevation/gnv/action/NextArtifactStepAction.java: Set + parameter of xsl transformer which contains the url to step back to a + previous state. This parameter is used in xsl sheet to render a + link into the user interface. + + * src/main/java/de/intevation/gnv/action/PreviousArtifactStepAction.java: + New controller to step back to a previous state. + + * src/main/webapp/WEB-INF/config/struts-config.xml: Added a new action which + calls PreviousArtifactStepAction to step back to previous states. + + * src/main/webapp/WEB-INF/config/templates/describe-ui-static.xsl: + Refactored gui rendering. The static part of the parameter list is + rendered in a table with three columns (icon to step back, parameter name, + selected value). The target state to step back to is contained as + attribute 'art:state' in 'xform:select', 'xfom:select1' and 'xform:group' + nodes. + + * src/main/webapp/styles/default.css: Added a style class to adapt the first + column of the static part's table. + +2009-01-13 Sascha L. Teichmann + + * src/main/webapp/WEB-INF/jsp/mainlayout.jsp: Shortened + fractions digits to four places to be displayable in static + ui description. + + * src/main/webapp/WEB-INF/config/templates/describe-ui.xsl: + Fixed target id of text input field. + +2009-01-13 Sascha L. Teichmann + + * src/main/webapp/WEB-INF/jsp/mainlayout.jsp, + src/main/webapp/WEB-INF/config/templates/describe-ui.xsl: + Added demo wkt polygon to test the "Horizontalschitt". + Remove this when we have the GIS interface. + +2010-01-09 Ingo Weinzierl + + * src/main/java/de/intevation/gnv/artifactdatabase/client/DefaultArtifactDatabaseClient.java: + Use XMLUtils.ElementCreator to create new elements for xml documents. + +2010-01-08 Tim Englich + + * src/main/java/de/intevation/gnv/action/SelectArtifactFactoryAction.java (execute), + src/main/java/de/intevation/gnv/action/DoOutputAction.java (execute): + Removed Encodingerrors from listed Files. All Files are now UTF-8 compliant. + +2010-01-05 Ingo Weinzierl + + * src/main/java/de/intevation/gnv/util/ArtifactNamespaceContext.java: + NamespaceContext class used by gnv artifacts. + + * src/main/java/de/intevation/gnv/util/XMLUtils.java: Added + ArtifactNamespaceContext as default namespace context while creating + XPath objects. + + * src/main/webapp/WEB-INF/config/templates/describe-ui-static.xsl: Removed + local-name() methods. + + * src/main/java/de/intevation/gnv/artifactdatabase/client/DefaultArtifactDatabaseClient.java, + src/main/java/de/intevation/gnv/action/ChangeOptionsAction.java, + src/main/java/de/intevation/gnv/action/NextArtifactStepAction.java: Adjust + xpathes regarding namespace changes. + +2010-01-05 Ingo Weinzierl + + * src/main/webapp/WEB-INF/config/templates/describe-ui-static.xsl: Removed + for-each statements and replaced them with templates. + +2010-01-04 Ingo Weinzierl + + * src/main/webapp/styles/default.css: Added new classes for displaying + parameters and values in left panel. + + * src/main/webapp/WEB-INF/config/templates/describe-ui-static.xsl: Static + nodes will be rendered as text instead of disabled xforms. + +2009-12-17 Sascha L. Teichmann + + RELEASE 0.3 + + * Changes, NEWS, ChangeLog: Summerized activities + +2009-12-17 Sascha L. Teichmann + + * src/main/resources/applicationMessages.properties: + s/Modeldaten/Modelldaten/ + +2009-12-17 Sascha L. Teichmann + + * src/main/webapp/WEB-INF/config/templates/describe-ui.xsl, + src/main/webapp/WEB-INF/jsp/mainlayout.jsp: Added demo wkt linestrings + via xslt and javascript. + +2009-12-17 Hans Plum + + Issue 129: Release 0.2: Verbesserung der �bersetzungen + + * src/main/resources/applicationMessages.properties: + Fixed i18n strings reported by experts + +2009-12-14 Tim Englich + + * src/main/webapp/WEB-INF/jsp/includes/display_diagramm_options_inc.jsp: + Added switch between boolean and other Values to determin wether a checkbox + is required or an text-field should be used. + * src/main/java/de/intevation/gnv/action/ChangeOptionsAction.java (execute): + Added parsing of boolean-Option-Values to provide this Feature. + +2009-12-14 Hans Plum + + Issue109: Tomcat: Konfiguration des Kontexts enth�lt Redundanz + + * src/main/webapp/META-INF/context.xml: + Removed obsolete configuration attributes. + +2009-12-09 Sascha L. Teichmann + + * src/main/resources/applicationMessages.properties: Fixed some + spelling problems. + +2009-12-01 Tim Englich + + * src/main/java/de/intevation/gnv/action/NextArtifactStepAction.java (execute): + Removed feed Call before Chart- and Statisticsgeneration is called, because + it is not longer required by the Artifactdatabase. + + +2009-12-01 Ingo Weinzierl + + * src/main/webapp/WEB-INF/web.xml: Reverted changes in config from last + revision, which have been committed by mistake. + +2009-12-30 Ingo Weinzierl + + * src/main/java/de/intevation/gnv/action/DoExportAction.java: Add svg + extension to file when exporting charts to svg. + + * src/main/resources/applicationMessages.properties, + src/main/resources/applicationMessages_en.properties: Added label for svg + export link. + + * src/main/webapp/WEB-INF/jsp/includes/display_diagramm_inc.jsp: Added link + for svg export in html gui. + +2009-12-30 Ingo Weinzierl + + * src/main/webapp/WEB-INF/jsp/includes/display_diagramm_inc.jsp: Added + link for pdf export in html gui. + + * src/main/resources/applicationMessages.properties, + src/main/resources/applicationMessages_en.properties: Added label for pdf + export link. + + * src/main/java/de/intevation/gnv/action/DoExportAction.java: Added pdf + extension to file when exporting charts as pdf. + + NOTE: Update gnv-artifacts to rev381 which supports pdf export. + +2009-11-23 Tim Englich + + * src/main/resources/applicationMessages*.properties: + Added Properties which hold the Version-information of the + GNV which will be set by te Maven package-process. + * src/main/webapp/WEB-INF/config/struts-config.xml: + Added an Action which make the Version-Information accessible. + Now it is possible to get those Information using /version.do + * src/main/webapp/WEB-INF/jsp/version.jsp: + Added an Page where it is possible to get the Information about the current + Version of the GNV and the ArtifactDatabase + * pom.xml: + Added Plugin for creating the BildTime and BildVersion of the gnv. + Replace Tokens in the /src/main/ressources Files + +2009-11-20 Ingo Weinzierl + + * src/main/java/de/intevation/gnv/artifactdatabase/client/DefaultArtifactDatabaseClient.java: + Removed mistake from xml structure of the artifact protocol. Mime-type + node was 'out' instead of 'mime-type'. + +2009-11-13 Hans Plum + + RELEASE-0.2 + + * Changes, NEWS: + Summerized activities. + +2009-11-13 Hans Plum + + * ChangeLog: + Unified entries with references to issues. + +2009-11-13 Tim Englich + + * src/main/webapp/WEB-INF/web.xml: + Added Documentation of Configuration-Entries. + +2009-11-12 Tim Englich + + * src/main/webapp/styles/default.css: + Added CSS-Entry for the Exception Message Container and + put the div at a proper place. + * src/main/resources/applicationMessages*.properties: + Added localized Exception Messages. + * src/main/webapp/WEB-INF/jsp/header.jsp: + Added the localization of Exception Messages. + +2009-11-12 Tim Englich + + Issue 71: Error while Serialisation of Sessions + + * src/main/java/de/intevation/gnv/action/sessionmodel/SessionModel.java, + src/main/java/de/intevation/gnv/action/sessionmodel/DefaultSessionModel.java, + src/main/java/de/intevation/gnv/action/NextArtifactStepAction.java, + src/main/java/de/intevation/gnv/artifactdatabase/client/ArtifactDatabaseClient.java, + src/main/java/de/intevation/gnv/artifactdatabase/client/DefaultArtifactDatabaseClient.java: + Imports organized. + * src/main/java/de/intevation/gnv/artifactdatabase/objects/*.java: + Made all Interfaces Serailizable and add UID to all Objects issue71 + +2009-11-12 Tim Englich + + * src/main/webapp/WEB-INF/jsp/includes/display_diagramm_statistics_inc.jsp: + Implemented a better GUI-Structure for displaying the Statisticdata. + * src/main/java/de/intevation/gnv/artifactdatabase/objects/DefaultArtifactStatisticsSet.java, + src/main/java/de/intevation/gnv/artifactdatabase/objects/ArtifactStatisticsSet.java: + Added new Beanstructur for a better Representation of the Statistics which + is generated by the ArtifactDatabase. + * src/main/java/de/intevation/gnv/artifactdatabase/client/DefaultArtifactDatabaseClient.java (calculateStatistics): + Changed the parsing algorithm of the Document which is generated + by the ArtifactDatabase. + * src/main/java/de/intevation/gnv/artifactdatabase/client/ArtifactDatabaseClient.java (calculateStatistics): + Changed Return-Value to ArtifacStatisticsSet according to the new Structur of + Statistics that will be generated by the ArtifactDatabase. + * src/main/java/de/intevation/gnv/action/NextArtifactStepAction.java (execute): + Changed the Resultvalue from ArtifactStatisticValue to ArtifacStatisticsSet according + to API-Changes of the ArtifactDatabaseClient + +2009-11-11 Tim Englich + + Issue 80: Error handling when session got expired + + * src/main/java/de/intevation/gnv/action/NextArtifactStepAction.java (execute): + Catch NPE and tell the user that the Session has expired. issue80 + +2009-11-11 Tim Englich + + Issue 81: Input of coordinate values do not show up after update + + * src/main/webapp/WEB-INF/config/templates/describe-ui-static.xsl: + Remove
Tag after Input-Elements + * src/main/webapp/WEB-INF/config/templates/describe-ui.xsl: + Add an
-Tag after the generation of Select-Boxes to get + a better look and feel in the ui. issue81 + * src/main/webapp/WEB-INF/jsp/index.jsp: + Replace NonBreakingSpace-Strings from UI issue81 + +2009-11-11 Tim Englich + + Issue 81: Input of coordinate values do not show up after update + + * src/main/webapp/WEB-INF/config/templates/describe-ui-static.xsl: + BugFix: Text-Inputfields will now be diabaled in static-ui issue81 + +2009-11-06 Ingo Weinzierl + + * src/main/resources/applicationMessages.properties: Replaced german umlaut + witch ascii character. + +2009-11-06 Ingo Weinzierl + + * pom.xml: Changed Restlet repository from M3 to Snapshot. + +2009-11-06 Ingo Weinzierl + + * src/main/webapp/WEB-INF/jsp/includes/display_diagramm_inc.jsp: Added link + for exporting data in ODV format. + + * src/main/resources/applicationMessages.properties, + src/main/resources/applicationMessages_en.properties: Added label for + odv export and changed label of CSV export. + +2009-11-05 Tim Englich + + * src/main/java/de/intevation/gnv/artifactdatabase/client/ArtifactDatabaseClientFactory.java (ArtifactDatabaseClientFactory): + Removed some deprecatde TODO-Tasks. + * src/main/java/de/intevation/gnv/artifactdatabase/client/DefaultArtifactDatabaseClient.java (getCurrentStepDescription): + Changed the Describe-Call of an Artifact from get to post an add the Flag which + determines if the UI should be delivered to the client. + * src/main/java/de/intevation/gnv/artifactdatabase/client/ArtifactDatabaseClient.java (getCurrentStepDescription): + Added the possibility to put an Flag which determines if the UI should be delivered from + the artifact-database to the Metodsignature. + + * src/main/java/de/intevation/gnv/action/SelectArtifactFactoryAction.java (execute), + src/main/java/de/intevation/gnv/action/NextArtifactStepAction.java (execute), + src/main/java/de/intevation/gnv/action/ChangeOptionsAction.java (execute), + src/test/java/de/intevation/gnv/artifactdatabase/client/ArtifactDatabaseClientTestCase.java (testArtifactDatabaseClient): + Added the Flag if the UI should be delivered by the artifact-database to the Method-Call. + +2009-10-28 Tim Englich + + * src/main/resources/applicationMessages*.properties: + Added Ressources for two new FIS. Current Meter and Ice Station Reports + +2009-10-27 Tim Englich + + * src/main/resources/applicationMessages_en.properties: + Added Ressources for two new FIS. Seegangsarchiv and SEACAT + +2009-10-22 Tim Englich + + Issue 58: Behaviour by missing DB connection + + * src/main/java/de/intevation/gnv/action/NextArtifactStepAction.java (execute): + Bugfix NPE was thrown when an Exception occured in the Called ArtifactDatabase-Server issue58. + +2009-10-21 Tim Englich + + Issue 28: Client is not multi-instance enabled + + * src/main/webapp/META-INF/context.xml: + Added context.xml to permitt cookies to provide + Multisession-Usability for a single Client issue28 + * src/main/webapp/WEB-INF/jsp/includes/display_diagramm_options_inc.jsp: + Added URL-Rewrite to add the SessionID to the requested URL to get + the System work without cookies. issue28 + +2009-10-19 Tim Englich + + Issue 55: Unified input of coordinate input + + * src/main/webapp/WEB-INF/config/templates/describe-ui.xsl, + src/main/webapp/WEB-INF/config/templates/describe-ui-static.xsl: + Added uniform Visualization of Single Input-Elements in GUI. issue55 + +2009-10-19 Tim Englich + + Issue 51: Translations for diagram options to be improved + + * src/main/webapp/WEB-INF/jsp/includes/display_diagramm_options_inc.jsp, + src/main/resources/applicationMessages*.properties: + Integrated Ressouces for OutputOptions issue51 + +2009-10-19 Tim Englich + + Issue 35: Wrong data input forces GNV to start from beginning + + * src/main/java/de/intevation/gnv/action/NextArtifactStepAction.java (execute): + Now the UI will compelte be shown if the User has done an Mistake entering + values to input-fields eg. Coordinates or formatted Date-Strings. issue 35 + +2009-10-19 Tim Englich + + Issue 47: Improving translations in time series + + * src/main/resources/applicationMessages_en.properties: + Changed Lablevalues according to issue47 + * src/main/webapp/WEB-INF/config/templates/describe-ui.xsl: + Add the possibility to render XForms-Group-Lables as Legend-Entries of + one Step in the GUI + +2009-10-16 Tim Englich + + Issue 48: Improving translation of statistics panel + + * src/main/resources/applicationMessages_en.properties: + Conformation to the tanslation of the Statisticsdescriptors issue48 + +2009-10-16 Tim Englich + + Issue 49: Integration of FIS to Mesh + + * src/main/resources/applicationMessages_en.properties: + Adding the Names of the two new FIS to the Propertiesfiles issue49 + +2009-10-07 Sascha L. Teichmann + + RELEASE 0.1 + + * Changes, NEWS: Summarized changes. + +2009-10-06 Tim Englich + + * src/main/resources/applicationMessages.properties Edited: + Removed obsolet Entries + * src/main/resources/applicationMessages_en.properties Added: + Added the Support for english-Language + +2009-10-06 Tim Englich + + * src/main/java/de/intevation/gnv/artifactdatabase/client/DefaultArtifactDatabaseClient.java (doGetRequestInternal) Edited: + Read the Status-Code from the Response and throw an Exception + which Message will be visualized in the GUI. gnv/issue18 + +2009-10-08 Sascha L. Teichmann + + * Changelog -> ChangeLog: Moved to make eclipse happier. + +2009-10-08 Sascha L. Teichmann + + * Changelog: Unified changelog style. + +2009-10-08 Sascha L. Teichmann + + * pom.xml: Remove XMLBeans stuff, set filtered resources to UTF-8 + +2009-10-06 Tim Englich + + * src/main/webapp/index.jsp Added: + Added Index-Page for Global-Forward to Start-URL of the Project gnv/issue14 + * src/main/webapp/WEB-INF/config/struts-config.xml Edited: + Added Global Forward to determine the Start-URL of the Project. gnv/issue14 + +2009-10-06 Tim Englich + + * src/main/webapp/WEB-INF/jsp/header.jsp Edited: + Deaktivate Links save Project and load Project gnv/issue12 + +2009-10-05 Tim Englich + + * src/main/resources/applicationMessages.properties Edited: + Added some more FIS-Ressource. + +2009-10-02 Tim Englich + + * src/main/java/de/intevation/gnv/artifactdatabase/client/ArtifactDatabaseClientFactory.java (getArtifactDatabaseClient): + Putting the ClientLanguage into the getArtifactDatabaseClient-Signature. + * src/main/java/de/intevation/gnv/artifactdatabase/client/DefaultArtifactDatabaseClient.java (setLocale) Edited, + * src/main/java/de/intevation/gnv/artifactdatabase/client/ArtifactDatabaseClient.java (setLocale) Edited: + Added the Support of Setting the ClientLanguage to the ArtifactDatabaseClient + + * src/main/java/de/intevation/gnv/action/SelectArtifactFactoryAction.java (execute) Edited, + src/main/java/de/intevation/gnv/action/NextArtifactStepAction.java (execute) Edited, + src/main/java/de/intevation/gnv/action/FetchArtifactFactoriesAction.java (execute) Edited, + src/main/java/de/intevation/gnv/action/DoOutputAction.java (execute) Edited, + src/main/java/de/intevation/gnv/action/ChangeOptionsAction.java(execute) Edited: + Put the Locale of the Calling Client to the Communication with the ArtifactDatabase. + + * src/test/java/de/intevation/gnv/artifactdatabase/client/ArtifactDatabaseClientTestCase.java (testArtifactDatabaseClient) Edited: + Added DefaultLocale German to the ArtfactDataBaseClient call. + +2009-10-02 Tim Englich + + * src/main/webapp/WEB-INF/config/templates/describe-ui.xsl Edited, + * src/main/webapp/WEB-INF/config/templates/describe-ui-static.xsl Edited: + Switched Value for legend from ref-Attribute to Label-Element + * src/main/webapp/WEB-INF/jsp/includes/display_fis_inc.jsp Edited: + Added translation for FIS (ArtifactFactorynames) + * src/main/resources/applicationMessages.properties Edited: + Added Germannameds for FIS. + +2009-10-02 Tim Englich + + * src/**/*.java Edited: + Format Code to max 80 Chars per Row + +2009-10-02 Tim Englich + + * src/main/java/de/intevation/gnv/util/XSLTransformer.java CLEANUP , + src/main/java/de/intevation/gnv/util/XMLUtils.java CLEANUP , + src/main/java/de/intevation/gnv/servlet/GNVActionServlet.java CLEANUP , + src/main/java/de/intevation/gnv/artifactdatabase/objects/Artifact.java CLEANUP , + src/main/java/de/intevation/gnv/artifactdatabase/client/DefaultArtifactDatabaseClient.java CLEANUP , + src/main/java/de/intevation/gnv/artifactdatabase/client/ArtifactDatabaseClient.java CLEANUP , + src/main/java/de/intevation/gnv/action/SelectArtifactFactoryAction.java CLEANUP , + src/main/java/de/intevation/gnv/action/DoOutputAction.java CLEANUP: + Change non static accesses to static members using declaring type + Change indirect accesses to static members to direct accesses (accesses through subtypes) + Remove unused imports + Add missing '@Override' annotations + Add missing '@Deprecated' annotations + Remove unnecessary casts + +2009-10-02 Tim Englich + + * src/main/java/de/intevation/gnv/action/SelectArtifactFactoryAction.java (execute) Edited, + * src/main/java/de/intevation/gnv/action/NextArtifactStepAction.java (execute) Edited, + * src/main/java/de/intevation/gnv/action/FetchArtifactFactoriesAction.java (execute) Edited, + * src/main/java/de/intevation/gnv/action/DoOutputAction.java (execute) Edited, + * src/main/java/de/intevation/gnv/action/DoExportAction.java (execute) Edited, + * src/main/java/de/intevation/gnv/action/ChangeOptionsAction.java (execute) edited: + Added ExceptionHandling to this Actions + * src/main/java/de/intevation/gnv/action/ArtifactDatabaseActionBase.java (getExceptionForward) Edited: + Added Method for Resolving the ExceptionForward from the Mapping. + * src/main/webapp/WEB-INF/jsp/header.jsp Edited: + Read ExceptionMessage from RequestAttributes + +2009-09-28 Tim Englich + + * src/main/resources/applicationMessages.properties Edited: + Adding missing StatisticsDescription for Arithmetic Mean. + +2009-09-28 Tim Englich + + * src/main/java/de/intevation/gnv/artifactdatabase/objects/DefaultArtifactStatisticValue.java Added, + src/main/java/de/intevation/gnv/artifactdatabase/objects/ArtifactStatisticValue.java Added: + Added the Interface and the Defaultimplementation for the Representation of Statistic-Values. + * src/main/java/de/intevation/gnv/action/NextArtifactStepAction.java (execute) Edited: + Added the Busionesslogic for Calculation the Statistics to the Action. + * src/main/java/de/intevation/gnv/action/sessionmodel/DefaultSessionModel.java Edited, + src/main/java/de/intevation/gnv/action/sessionmodel/SessionModel.java Edited: + Added the Methods for setting and getting the statistics to the SessionModel + * src/main/java/de/intevation/gnv/artifactdatabase/client/ArtifactDatabaseClient.java (calculateStatistics) Edited, + src/main/java/de/intevation/gnv/artifactdatabase/client/DefaultArtifactDatabaseClient.java (calculateStatistics) Edited: + Added the Method for retrieving the Statistics from the current Artifcat. + * src/main/webapp/WEB-INF/jsp/includes/display_diagramm_statistics_inc.jsp Edited: + Put the Values of the Statitics into the View. + * src/main/webapp/styles/default.css Edited: + Changed CSS-for Statistics so that it would be displayed. + +2009-09-25 Tim Englich + + * src/main/webapp/WEB-INF/jsp/includes/display_diagramm_inc.jsp Edited: + Bug fixed in CSV_Export Link + +2009-09-25 Tim Englich + + * src/main/java/de/intevation/gnv/artifactdatabase/objects/Artifact.java Edited, + src/main/java/de/intevation/gnv/artifactdatabase/objects/ArtifactDescription.java Edietd: + Integrated some Method for accessing and Setting OutputModes to an ArtifactDescription. + + * src/main/java/de/intevation/gnv/artifactdatabase/objects/DefaultOutputParameter.java Edited, + src/main/java/de/intevation/gnv/artifactdatabase/objects/DefaultOutputMode.java Edited, + src/main/java/de/intevation/gnv/artifactdatabase/objects/OutputParameter.java Edited, + src/main/java/de/intevation/gnv/artifactdatabase/objects/OutputMode.java Edited: + Adding some Beans and their InterfaceDescription for the Representation of OutputModes + supported by an Artifact + + * src/main/java/de/intevation/gnv/artifactdatabase/client/DefaultArtifactDatabaseClient.java Edited: + Fetsching the OutputMode-Informations from the Describedocument and put them into a Collection + of OutputModes. + + * src/main/java/de/intevation/gnv/action/SelectArtifactFactoryAction.java Edited: + Restet SessionModel integrated. + + * src/main/java/de/intevation/gnv/action/NextArtifactStepAction.java Edited: + Cast for ArtifactDescription removed. + + * src/main/java/de/intevation/gnv/action/DoOutputAction.java Edited, + src/main/java/de/intevation/gnv/action/ChangeOptionsAction.java Edited: + Dynamical read of OutputParameter for Outputgeneration + + * src/main/java/de/intevation/gnv/action/sessionmodel/DefaultSessionModel.java Edited:, + src/main/java/de/intevation/gnv/action/sessionmodel/SessionModel.java Edited: + Added some Method for retrieving Diagrammoptions and reset the SessionModel + + * src/main/java/de/intevation/gnv/action/sessionmodel/DiagrammOptions.java Edited: + Dynamic Options Support Added + + * src/main/webapp/WEB-INF/jsp/includes/display_diagramm_options_inc.jsp Edited: + Dynamic Rendring of the Outputparameters of an ArtifactoutputType added. + Ath this Moment only The Outputparameter for Chart ist provided. + + * src/main/webapp/WEB-INF/jsp/includes/display_diagramm_inc.jsp Edited : + Integrated dynamic Setting of Diagramm-Parameter to the Link. + Also Read MimeType from the OPutputParameters of the Artifact. + +2009-09-25 Tim Englich + + * src/main/java/de/intevation/gnv/action/DoOutputAction.java Edited: + Some Refactoring work done. + Logging Integrated. Extract Method for setting Responseheader Informations. + + * src/main/java/de/intevation/gnv/action/DoExportAction.java Added: + Action for performing the Exports eg. CSV and Chart + * src/main/java/de/intevation/gnv/action/ChangeOptionsAction.java Added: + Action for do the Bussinesslogic for storing the Diagrammoptions that were + changed by the User. + * src/main/java/de/intevation/gnv/action/sessionmodel/DefaultSessionModel.java Edited, + * src/main/java/de/intevation/gnv/action/sessionmodel/SessionModel.java Edited: + Added Accessmethod for the Diagrammoptions. + + * src/main/java/de/intevation/gnv/action/sessionmodel/DiagrammOptions.java Added: + Bean for the Representation of Diagrammoptions + + * src/main/resources/applicationMessages.properties Edited: + Added som GUI Lables. + + * src/main/webapp/WEB-INF/jsp/includes/display_diagramm_inc.jsp Edited, + src/main/webapp/WEB-INF/jsp/includes/display_diagramm_statistics_inc.jsp Add, + src/main/webapp/WEB-INF/jsp/includes/display_diagramm_options_inc.jsp Add, + src/main/webapp/WEB-INF/jsp/includes/display_diagramm_adons_inc.jsp Add: + Added the GUI for the Statistics and Diagramoptions and tge Export. + + * src/main/webapp/WEB-INF/config/struts-config.xml Edited: + Added Actions for Performing Exports and Changing Diagramoptions. + +2009-09-24 Tim Englich + + * src/main/webapp/scripts/gnviewer.js Edited: + Removed unused Methods from File. + +2009-09-24 Tim Englich + + * src/main/webapp/WEB-INF/jsp/mainlayout.jsp Edited: + Obsolet Javascript References Removed + Added Javascript-Reference to the gnviewer.js File + * src/main/webapp/WEB-INF/jsp/index.jsp Edited: + Please Wait Dialog integrated if an Form will be submittend + +2009-09-24 Tim Englich + + * src/main/webapp/scripts/gnviewer.js Added: + Added Javascript-File from Old-Project Revision: 3101 + +2009-09-24 Tim Englich + + * src/main/java/de/intevation/gnv/artifactdatabase/client/DefaultArtifactDatabaseClient.java Edited: + Codecleanup + ExceptionReporthandling integrated + +2009-09-24 Tim Englich + + * src/main/webapp/WEB-INF/config/log4j.properties Added: + Standard Log4J-properties-File which will log all Informations to the Console. + * src/main/webapp/WEB-INF/web.xml Edited: + Added init-Parameter to tell the Application where the Log4J-propertiesfile ist located. + * src/main/java/de/intevation/gnv/servlet/GNVActionServlet.java (init) Edited: + Reading Logging-Properties from Propertiesfile. Path maust beconfigured in the web.xml File + + +2009-09-23 Tim Englich + + * src/main/webapp/WEB-INF/web.xml Edited: + Added Count of ArtifactDatabases and Database-URL to this File + * src/main/java/de/intevation/gnv/artifactdatabase/client/ArtifactDatabaseClient.java (ARTIFACTDATABASE_URL_ID) Edited: + Added Static Constants for identifing ArtifactDatabase URLS in PropertiesReader + * src/main/java/de/intevation/gnv/artifactdatabase/client/DefaultArtifactDatabaseClient.java (initialize) Edited: + Read ArtifactDatabase URLS from PropertiesReader + +2009-09-23 Tim Englich + + * src/main/java/de/intevation/gnv/action/NextArtifactStepAction.java (execute) Edited: + Removed Image-Element and put it into the jsp-Page + * src/main/webapp/WEB-INF/jsp/includes/display_diagramm_inc.jsp Edited: + Moved Image-Element from Classfile to this location. + URL will now be encoded for usage without cookies. + * src/main/webapp/WEB-INF/jsp/includes/display_fis_inc.jsp Edited, + src/main/webapp/WEB-INF/jsp/index.jsp Edited: + URL will now be encoded for usage without cookies. + +2009-09-23 Tim Englich + + * src/main/webapp/WEB-INF/config/templates/describe-ui.xsl Edited: + Selection on Input-UI-Data will be fetched from the UI and visualized + in the GUI. + * src/main/webapp/WEB-INF/config/templates/describe-ui-static.xsl Edited: + Single Text Input-Elements now will be surround with an div and an form Element + 2009-09-22 Tim Englich + + * src/main/java/de/intevation/gnv/util/XSLTransformer.java Edited: + Logging reduced for a better Performance. XML-Nodes should not be logged because their size could + cause Problems in Log4J and the ConsoleAppender of Eclipse + +2009-09-21 Tim Englich + + * src/main/java/de/intevation/gnv/artifactdatabase/client/DefaultArtifactDatabaseClient.java: + Remnoved logging of Resultdocuments becaus it slow down the Application. + * src/main/java/de/intevation/gnv/action/SelectArtifactFactoryAction.java (execute): + Added support of ArtifactFactory Reload if Session was lost. + * src/main/java/de/intevation/gnv/action/NextArtifactStepAction.java (execute): + Added Support of more than one Product. + +2009-09-17 Tim Englich + + * src/main/webapp/WEB-INF/config/templates/describe-ui.xsl: + Some Refactoring work done. + * src/main/webapp/WEB-INF/config/templates/describe-ui-static.xsl: + Added XSL-Template for Transforming the stazic UI + * src/main/webapp/WEB-INF/jsp/includes/display_fis_inc.jsp: + Refactored FIS Rendering to it's own Include-File + * src/main/webapp/WEB-INF/jsp/includes/display_diagramm_inc.jsp: + Refactored Diagramm Rendering to it's own Include-File + * src/main/webapp/WEB-INF/jsp/index.jsp: + Some Refactoring Work done. + * src/main/webapp/styles/default.css: + Some Changes in DIV-Formatting to get a propper Layout. + + * src/main/java/de/intevation/gnv/action/NextArtifactStepAction.java (NextArtifactStepAction): + Static UI integrated + +2009-09-17 Tim Englich + + * src/main/webapp/WEB-INF/jsp/includes/display_fis_inc.jsp: + Refactored FIS Rendering to it's own Include-File + * src/main/webapp/WEB-INF/jsp/includes/display_diagramm_inc.jsp: + Refactored Diagramm Rendering to it's own Include-File + * src/main/webapp/WEB-INF/jsp/index.jsp: + Some Refactoring Work done. + * src/main/webapp/styles/default.css: + Some Changes in DIV-Formatting to get a propper Layout. + + * src/main/java/de/intevation/gnv/action/NextArtifactStepAction.java (NextArtifactStepAction): + Static UI integrated + +2009-09-16 Tim Englich + + * src/main/java/de/intevation/gnv/action/NextArtifactStepAction.java (execute) Edited: + UI also Rendered when Chart is already visualized. + * src/main/webapp/WEB-INF/jsp/index.jsp: + Some Stylingfixes done. + * src/main/webapp/WEB-INF/config/templates/describe-ui.xsl: + Legend-Element for SelectEntries Integrated + +2009-09-16 Tim Englich + + * src/main/webapp/WEB-INF/jsp/mainlayout.jsp Edited, + src/main/webapp/WEB-INF/jsp/index.jsp Edited: + Integrate the new Pageinfrastructur into the Mainlayout + + * src/main/webapp/WEB-INF/config/struts-config.xml Edited: + Integrate message-resources into the Strutsconfiguration and change + the mainpage from index.jsp to mainlayout.jsp + +009-09-16 Tim Englich + + * src/main/webapp/WEB-INF/jsp/header.jsp Added, + src/main/webapp/WEB-INF/jsp/footer.jsp Added, + src/main/resources/applicationMessages.properties:Added, + src/main/webapp/WEB-INF/jsp/mainlayout.jsp Added, + src/main/webapp/styles/*, + src/main/webapp/scipts/*, + src/main/webapp/images/*: + Import of MainLayout, Styles, images and Scripts from old System Revision: 3101 Does not compile + +2009-09-16 Tim Englich + + * src/main/webapp/WEB-INF/config/struts-config.xml Edited, + src/main/webapp/WEB-INF/config/templates/describe-ui.xsl Edited, + src/main/java/de/intevation/gnv/artifactdatabase/client/DefaultArtifactDatabaseClient.java Edited, + src/main/java/de/intevation/gnv/artifactdatabase/client/ArtifactDatabaseClient.java (doOutput) (doFeed) Edited, + src/main/java/de/intevation/gnv/action/NextArtifactStepAction.java (execute) Edited, + src/main/java/de/intevation/gnv/action/DoOutputAction.java Added: + Chartoutput Added to the View + +2009-09-16 Tim Englich + + * src/test/java/de/intevation/gnv/artifactdatabase/client/ArtifactDatabaseClientTestCase.java Edited: + Added Transformerlogic to the Testcase + + * src/main/webapp/WEB-INF/jsp/index.jsp Edited: + Integrated the UI of the Artifact + + * src/main/webapp/WEB-INF/config/struts-config.xml Edited: + Added ActionHandling for managing the next Businesslogic to go to the next Step of an Artifact + + * src/main/webapp/WEB-INF/config/templates/describe-ui.xsl Edited: + Added Transformation-Rules for Input-Elements + + * src/main/java/de/intevation/gnv/artifactdatabase/objects/DefaultInputParameter.java Added, + src/main/java/de/intevation/gnv/artifactdatabase/objects/InputParameter.java Added: + Infrastructur for providing InputParametes as an Object + + * src/main/java/de/intevation/gnv/artifactdatabase/objects/Artifact.java Edited, + src/main/java/de/intevation/gnv/artifactdatabase/objects/ArtifactDescription.java (getInputParameter) (setInputParameter) Edited: + Add Methods for providing the reuired Input-Parametes of the current ArtifactDescription + + * src/main/java/de/intevation/gnv/artifactdatabase/client/DefaultArtifactDatabaseClient.java Edited, + src/main/java/de/intevation/gnv/artifactdatabase/client/ArtifactDatabaseClient.java (doNextStep) Edited: + Added doNextStep Method for doing all ControllerWork to move the Artifact into the next Step + + * src/main/java/de/intevation/gnv/action/NextArtifactStepAction.java Added: + Action for switching to the next Step of an Artifact + +2009-09-15 Tim Englich + + * src/test/java/de/intevation/gnv/util/XSLTransformerTestCase.java: + New Testcase for testing the usability of XSL-Transformations + * src/test/ressources/describe-ui-test.xml Added: + An Sample-Document for testing XSL-Transformations + * src/main/webapp/WEB-INF/jsp/index.jsp Edited: + Added the html-Fragment of the transformated Describe-Methode-response to the document. + * src/main/webapp/WEB-INF/config/templates/describe-ui.xsl Added: + XSL-Template for transforming an Xform-Element to a HTML-Select-Element + * src/main/java/de/intevation/gnv/util/XSLTransformer.java Added: + XSl-Transformer for doing XSL-Transformations of the ResultDocuments of + the ArtifactDatabase + * src/main/java/de/intevation/gnv/util/XMLUtils.java Edited: + Integrate a Method for writing an XML-Node to a String for debugging. + * src/main/java/de/intevation/gnv/artifactdatabase/client/DefaultArtifactDatabaseClient.java: + Some Unused imports removed an select the first Child of the ui Node. + * src/main/java/de/intevation/gnv/action/SelectArtifactFactoryAction.java (execute) Edited: + Integration of the Describe-Stuff for rendering an GUi + +2009-09-15 Tim Englich + + * src/test/java/de/intevation/gnv/artifactdatabase/client/ArtifactDatabaseClientTestCase.java (testArtifactDatabaseClient) Edited: + Added "Create Artifact" and "Describe Artifact" to the Testszenario. + +2009-09-14 Tim Englich + + * src/main/java/de/intevation/gnv/artifactdatabase/objects/ArtifactDescription.java, + src/main/java/de/intevation/gnv/artifactdatabase/objects/Artifact.java, + src/main/java/de/intevation/gnv/artifactdatabase/client/DefaultArtifactDatabaseClient.java, + src/main/java/de/intevation/gnv/artifactdatabase/client/ArtifactDatabaseClient.java, + src/main/java/de/intevation/gnv/action/SelectArtifactFactoryAction.java: + Support for Initial DescribeCall to ArtifactDatabase implemented + +2009-09-14 Tim Englich + + * src/main/webapp/WEB-INF/config/struts-config.xml: + Added two ActionMappings: + One for showing all FIS (ArtifactFactories) in an View. + The other for selceting one ArtifactFactory an visualizing the First Step of an Artifact. + * src/main/webapp/WEB-INF/jsp/index.jsp Edited: + Added an Combobox for selecting an FIS + * src/main/webapp/WEB-INF/web.xml: + Added the Servletmapping for the Struts Framework + * src/main/java/de/intevation/gnv/action/SelectArtifactFactoryAction.java Added, + src/main/java/de/intevation/gnv/action/FetchArtifactFactoriesAction.java Added, + src/main/java/de/intevation/gnv/action/ArtifactDatabaseActionBase.java Edited: + Some ActionHandler added for Handling the different Requests of the GNV. + FetchArtifactFactoriesAction: Will provides the Controllerlogic for Queriing all Reachable ArtifactFactories. + SelectArtifactFactoryAction will select one Specific ArtifactFactory and will create + an Instance in the ArtifactDatabase. + + * src/main/java/de/intevation/gnv/action/sessionmodel/DefaultSessionModel.java Added, + src/main/java/de/intevation/gnv/action/sessionmodel/SessionModelFactory.java Added, + src/main/java/de/intevation/gnv/action/sessionmodel/SessionModel.java Added: + Interface and Defaultimplementation of an Model which can store the Session-Specific Informations. + e.g. Reachable ArtifactFactories and the current Artifact which should be used. + +2009-09-14 Tim Englich + + * src/main/java/de/intevation/gnv/artifactdatabase/client/DefaultArtifactDatabaseClient.java Edited: + All Methods for doing the create-Request and reading the Result-Document implemented. + * src/main/java/de/intevation/gnv/artifactdatabase/client/ArtifactDatabaseClient.java (createNewArtifact) Edited: + Add Method for creating a new Artifact in the ArtifactDatabase + + * src/main/java/de/intevation/gnv/artifactdatabase/objects/Artifact.java (Artifact): + Added new Class for the Representation of an Artifact + * src/main/java/de/intevation/gnv/artifactdatabase/objects/ArtifactFactory.java (getHash) Edited, + * src/main/java/de/intevation/gnv/artifactdatabase/objects/ArtifactObject.java (getHash) Edited + getHash Method added. Now it will be possible to read the Hash of an Artifact send by the Artifactdatabase. + * src/main/java/de/intevation/gnv/propertiesreader/PropertiesReaderFactory.java (getInstance) Edited: + Bug Fixed. factory will now be instantiated. + * src/main/java/de/intevation/gnv/servlet/GNVActionServlet.java Edited, + Integration of temporal Basic Log4J Support. + +2009-09-11 Tim Englich + + * pom.xml: Further Dependencies and Plugins added + Deleted some utdated Files + +2009-09-11 Tim Englich + + * src/test/java/de/intevation/gnv/artifactdatabase/client/ArtifactDatabaseClientTestCase.java Added: + Testcase for querying Artifacfactorydescriptions from the ArtifactDatabase + +2009-09-11 Tim Englich + + * src/main/webapp/WEB-INF/jsp/index.jsp Added , + src/main/webapp/WEB-INF/config/struts-config.xml Added, + src/main/java/de/intevation/gnv/servlet/GNVActionServlet.java Added + src/main/java/de/intevation/gnv/action/ArtifactDatabaseActionBase.java Added: + Basic Struts-Infrastructur Added + +2009-09-11 Tim Englich + + * src/main/java/de/intevation/gnv/propertiesreader/ServletPropertiesReader.java Added, + src/main/java/de/intevation/gnv/propertiesreader/PropertiesReaderFactory.java Added, + src/main/java/de/intevation/gnv/propertiesreader/PropertiesReader.java Added, + src/main/java/de/intevation/gnv/propertiesreader/MapPropertiesReader.java Added: + Infrastructur for Reading Properties from a Map or SercletConfig an provide them + to the whole Application. + +2009-09-11 Tim Englich + + * src/main/java/de/intevation/gnv/artifactdatabase/objects/ArtifactObject.java Added, + src/main/java/de/intevation/gnv/artifactdatabase/objects/ArtifactFactory.java Added: + ObjectStructor for Representing delivered Objects from the ArtifactDatabase + + * src/main/java/de/intevation/gnv/artifactdatabase/client/exception/ArtifactDatabaseClientException.java Added, + src/main/java/de/intevation/gnv/artifactdatabase/client/DefaultArtifactDatabaseClient.java Added, + src/main/java/de/intevation/gnv/artifactdatabase/client/ArtifactDatabaseClientFactory.java Added, + src/main/java/de/intevation/gnv/artifactdatabase/client/ArtifactDatabaseClient.java Added: + Integrated Interface-Structure to handle the communication to the ArtifactDatabase + +2009-09-10 Tim Englich + + * .svnignore Added: Added Eclipse specific Files and Folders to the Ignorelist + +2009-09-10 Tim Englich + + * pom.xml: Created with maven and put the Moduledependencies into it + * Changes | Changelog | NEWS | README | TODO: Added + * src/**: Added to the Project diff -r f99d8f92a640 -r 755dd2fa4a0a gnv/Changes --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv/Changes Fri Sep 28 12:13:53 2012 +0200 @@ -0,0 +1,80 @@ +2010-01-27 RELEASE 0.4 + + New: + + * Improved internal handling of each selection state and + moved calculation step before rendering (instead of one step) + + * Internal Preparation of 1-step-back history: Split up in + static (Summary of parameters ) and dynamic section + (Selectable parameters) + + * Added support for Shapefile and WMS Handling if they are available + + * First implementation of MapViewer Interface + + * Improved structure of div-containers + + Fixed: + + * Width and height of diagramm made changeable for user (#149) + + +2009-12-17 RELEASE 0.3 + + New: + + * Support for WKT line strings in GUI in form of text fields. + * Added control for boolean values. + * Litte demo WKT line string via Javascrip to demonstrate + new WKT option. + * Drawing of diagrams is to be triggeres explicitly now. + * Added options to export diagrams as PDF and SVG. + * Little info about running version. + + Fixed: + + * Various i18n messages (Issue 129) + * Removed some redundancy from the Tomcat configuration (Issue 109) + * Some communication problems with the artifact database server. + +2009-11-13 RELEASE 0.2 + + New: + + * Enable client for multi-instances in the same browser by using + SessionIDs + + * Added support for all FIS + * Added support for skipping transition steps + * Added support for CSV and ODV formats via a common mechanism + * Updated to a newer version of RESTlet API + * Added first documentation for configuration + + +2009-10-07 RELEASE 0.1 + + New: + + * Initial Struts 1.x based Web-Client for the REST based + artifact database. + + * UI mainly inspired by the prototype from conterra. + + * It implements a runtime system for working with artifacts + by storing a client side proxy model in the session of + the servlet context. The workflow is completely controlled + by the artifact living in the artifact database. + + * The input forms are generated by XSL transformation from + the 'describe' output of the artifact. + + * Output is rendered as PNG, downloadable PNGs, CSV and + statistics all produced serverside in the artifact database. + + * i18n/i10n is done by Struts and broadcasted via REST to + the REST beased artifact database. Supported languages: + German and English + + * The connection to the REST server is configure in web.xml + default: http://localhost:8181 diff -r f99d8f92a640 -r 755dd2fa4a0a gnv/NEWS --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv/NEWS Fri Sep 28 12:13:53 2012 +0200 @@ -0,0 +1,62 @@ +2010-01-27 RELEASE 0.4 + + * Adapted GUI to new concept + * handling selected parameters in a central summary to make GUI + more compact + * Splitting date selections into 2 steps: yearly and + exact point of time + * Enabling Point-Rendering for rendering in diagrams + * arranging productspecific actions (Exports, Statistics) + in a central field in order to have direct access to end products + at one place + + * Added support for Shapefile Download + + * Added first mechanism for publishing as Cross-sections as WMS + + * Reworked HTML to be HTML standard compatible + + * Added some new icons + + * Integrated basic styling of BSH + + * Added WKT-Line and Polygon Input for (temporary testing only) + + +2009-12-17 RELEASE 0.3 + + * PDF and SVG export of diagrams. + * support for WKT line strings + * Fixed some internal communication problems. + + +2009-11-13 RELEASE 0.2 + + * Added support for all required FIS: + Marnet, IMIS, STAUN, Modelldaten, Eisklimatologie, Eismeldungen, SST, + Delphin, Thermosalinograph, Chemusurvey, GTS, CTD, XBT, SeaCat, + Seegangsarchiv, Strommesser (Req. TG_0020.001) + + * Added support for vertical profiles (Chapter 3.3.3.2.2) + + * Added support for horizontal profiles (Chapter 3.3.3.2.3); + part independent of MapViewer + + * Added a first support for ODV format (Req. TG_0040.005) + + * Enabling client for multi-instances (Req. 00_0000.007) + + * Adding of support of internal area filter (Req. TG_0020.012 b) + + * Added more support for internationalization (TG_0050.004) + + * Improved error handling with more user-friendly messages + + * Added required statistical support (Chapter 3.3.3.3.1) + + +2009-10-07 RELEASE 0.1 + + * Initial realease of the web client which is a lightweight + runtime system for artifacts. + diff -r f99d8f92a640 -r 755dd2fa4a0a gnv/pom.xml --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv/pom.xml Fri Sep 28 12:13:53 2012 +0200 @@ -0,0 +1,158 @@ + + 4.0.0 + de.intevation.bsh + gnv + war + 1.0-SNAPSHOT + gnv + http://maven.apache.org + + UTF-8 + + + + maven-restlet + Public online Restlet repository + http://maven.restlet.org + + + + + junit + junit + 3.8.1 + test + + + org.restlet + org.restlet + 2.0-SNAPSHOT + + + org.restlet + org.restlet.ext.xml + 2.0-SNAPSHOT + + + tomcat + servlet-api + 5.5.15 + provided + + + struts + struts-el + 1.2.9 + runtime + + + struts + struts + 1.2.9 + compile + + + log4j + log4j + 1.2.14 + + + + gnv + + + maven-compiler-plugin + + 1.5 + 1.5 + + + + maven-war-plugin + + + + ${basedir}/src/main/webapp + + images/ + WEB-INF/jsp/application/ + + + + + + + org.apache.maven.plugins + maven-jar-plugin + 2.2 + + + + de.intevation.artifactdatabase.App + + + + + + org.codehaus.mojo + exec-maven-plugin + 1.1 + + java + + -classpath + + de.intevation.artifactdatabase.App + + + + + + org.apache.maven.plugins + maven-eclipse-plugin + + true + true + 1.5 + + 1.2.3 + + + + + org.codehaus.mojo + buildnumber-maven-plugin + 1.0-beta-2 + + + initialize + + create + + + + + false + false + {0, date, yyyy-MM-dd HH:mm:ss} + {0,date,yyyy-MM-dd HH:mm:ss} + + timestamp + + + no_revision + + + + + + + + + src/main/resources + true + + + + diff -r f99d8f92a640 -r 755dd2fa4a0a gnv/src/main/java/de/intevation/gnv/action/ArtifactDatabaseActionBase.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv/src/main/java/de/intevation/gnv/action/ArtifactDatabaseActionBase.java Fri Sep 28 12:13:53 2012 +0200 @@ -0,0 +1,65 @@ +/** + * + */ +package de.intevation.gnv.action; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +import org.apache.log4j.Logger; + +import org.apache.struts.action.Action; +import org.apache.struts.action.ActionForm; +import org.apache.struts.action.ActionForward; +import org.apache.struts.action.ActionMapping; + +/** + * @author Tim Englich + * + */ +public class ArtifactDatabaseActionBase extends Action { + + protected final static String SUCCSESS_FORWARD_ID = "success"; + protected final static String EXCEPTION_FORWARD_ID = "success"; + + /** + * the logger, used to log exceptions and additonaly information + */ + private static Logger log = Logger + .getLogger(ArtifactDatabaseActionBase.class); + + /** + * Constructor + */ + public ArtifactDatabaseActionBase() { + super(); + } + + /** + * @see org.apache.struts.action.Action#execute(org.apache.struts.action.ActionMapping, + * org.apache.struts.action.ActionForm, + * javax.servlet.http.HttpServletRequest, + * javax.servlet.http.HttpServletResponse) + */ + @Override + public ActionForward execute(ActionMapping mapping, ActionForm form, + HttpServletRequest request, + HttpServletResponse response) throws Exception { + log.debug("ArtifactDatabaseActionBase.execute"); + + ActionForward forward = mapping.findForward(SUCCSESS_FORWARD_ID); + return forward; + } + + /** + * Returns the ExceptionForward for the ArtifactDatabaseActions + * + * @param mapping + * @return + */ + protected ActionForward getExceptionForward(ActionMapping mapping) { + log.debug("ArtifactDatabaseActionBase.getExceptionForward"); + ActionForward lForward = mapping.findForward(EXCEPTION_FORWARD_ID); + return lForward; + } +} diff -r f99d8f92a640 -r 755dd2fa4a0a gnv/src/main/java/de/intevation/gnv/action/ChangeOptionsAction.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv/src/main/java/de/intevation/gnv/action/ChangeOptionsAction.java Fri Sep 28 12:13:53 2012 +0200 @@ -0,0 +1,105 @@ +package de.intevation.gnv.action; + +import java.util.Collection; +import java.util.Iterator; +import java.util.Map; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +import org.apache.log4j.Logger; +import org.apache.struts.action.ActionForm; +import org.apache.struts.action.ActionForward; +import org.apache.struts.action.ActionMapping; + +import de.intevation.gnv.action.sessionmodel.DiagrammOptions; +import de.intevation.gnv.action.sessionmodel.SessionModel; +import de.intevation.gnv.action.sessionmodel.SessionModelFactory; +import de.intevation.gnv.artifactdatabase.objects.ArtifactDescription; +import de.intevation.gnv.artifactdatabase.objects.OutputMode; +import de.intevation.gnv.artifactdatabase.objects.OutputParameter; + +/** + * @author Tim Englich + * + */ +public class ChangeOptionsAction extends DescribeUIAction { + /** + * the logger, used to log exceptions and additonaly information + */ + private static Logger log = Logger.getLogger(ChangeOptionsAction.class); + + /** + * Constructor + */ + public ChangeOptionsAction() { + super(); + } + + @Override + public ActionForward execute(ActionMapping mapping, ActionForm form, + HttpServletRequest request, + HttpServletResponse response) throws Exception { + log.debug("NextArtifactStepAction.execute"); + try { + SessionModel sm = SessionModelFactory.getInstance() + .getSessionModel(request); + + ArtifactDescription ad = sm.getArtifactDescription(); + + String target = request.getParameter("target"); + OutputMode outputMode = sm.getOutputMode(target); + if (outputMode != null) { + + Collection op = outputMode + .getOutputParameters(); + if (op != null) { + Iterator it = op.iterator(); + DiagrammOptions diagrammOptions = new DiagrammOptions(); + while (it.hasNext()) { + OutputParameter parameter = it.next(); + String value = request.getParameter(parameter.getName()); + if (parameter.getType().equalsIgnoreCase("boolean")){ + if (value == null){ + value = "false"; + } + else { + value = "true"; + } + } + diagrammOptions.setValue(parameter.getName(),value); + + } + sm.setDiagrammOptions(diagrammOptions); + + // XXX Little workarround. We should implement a 'choice' type, + // if we need further choice elements! (iw) + String bintype = request.getParameter("bintype"); + if (bintype != null) { + diagrammOptions.setValue("bintype", bintype); + sm.setDiagrammOptions(diagrammOptions); + request.setAttribute("bintype", bintype); + } + } + } + + Map tmpOuts = ad.getOutputModes(); + if (tmpOuts == null || tmpOuts.isEmpty()) { + request.setAttribute("furthertargets", true); + } + else { + request.setAttribute(target, true); + } + + return super.execute(mapping, form, request, response); + } catch (Exception e) { + log.error(e, e); + request.setAttribute( + CommunicationKeys.REQUEST_EXCEPTION_MESSAGE_ID, e + .getMessage()); + return super.getExceptionForward(mapping); + } + } + +} +// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf-8 : diff -r f99d8f92a640 -r 755dd2fa4a0a gnv/src/main/java/de/intevation/gnv/action/CommunicationKeys.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv/src/main/java/de/intevation/gnv/action/CommunicationKeys.java Fri Sep 28 12:13:53 2012 +0200 @@ -0,0 +1,13 @@ +package de.intevation.gnv.action; + +/** + * + * @author Tim Englich + * + */ +public class CommunicationKeys { + /** + * The Key which should be used for accessing ExceptionMessages + */ + public final static String REQUEST_EXCEPTION_MESSAGE_ID = "request_exception_message"; +} diff -r f99d8f92a640 -r 755dd2fa4a0a gnv/src/main/java/de/intevation/gnv/action/CreateChartAction.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv/src/main/java/de/intevation/gnv/action/CreateChartAction.java Fri Sep 28 12:13:53 2012 +0200 @@ -0,0 +1,46 @@ +package de.intevation.gnv.action; + +import de.intevation.gnv.action.sessionmodel.SessionModel; +import de.intevation.gnv.action.sessionmodel.SessionModelFactory; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +import org.apache.log4j.Logger; + +import org.apache.struts.action.ActionForm; +import org.apache.struts.action.ActionForward; +import org.apache.struts.action.ActionMapping; + + +/** + * @author Ingo Weinzierl (ingo.weinzierl@intevation.de) + */ +public class CreateChartAction extends DescribeUIAction { + + private static Logger logger = Logger.getLogger(CreateChartAction.class); + + + public CreateChartAction() { + super(); + } + + + @Override + public ActionForward execute( + ActionMapping mapping, + ActionForm form, + HttpServletRequest request, + HttpServletResponse response) + throws Exception { + logger.debug("Create chart."); + + SessionModel sm = SessionModelFactory.getInstance().getSessionModel( + request); + sm.setDiagrammOptions(null); + request.setAttribute("chart", true); + + return super.execute(mapping, form, request, response); + } +} +// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf-8 : diff -r f99d8f92a640 -r 755dd2fa4a0a gnv/src/main/java/de/intevation/gnv/action/CreateHistogramAction.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv/src/main/java/de/intevation/gnv/action/CreateHistogramAction.java Fri Sep 28 12:13:53 2012 +0200 @@ -0,0 +1,46 @@ +package de.intevation.gnv.action; + +import de.intevation.gnv.action.sessionmodel.SessionModel; +import de.intevation.gnv.action.sessionmodel.SessionModelFactory; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +import org.apache.log4j.Logger; + +import org.apache.struts.action.ActionForm; +import org.apache.struts.action.ActionForward; +import org.apache.struts.action.ActionMapping; + + +/** + * @author Ingo Weinzierl (ingo.weinzierl@intevation.de) + */ +public class CreateHistogramAction extends DescribeUIAction { + + private static Logger logger = Logger.getLogger(CreateHistogramAction.class); + + + public CreateHistogramAction() { + super(); + } + + + @Override + public ActionForward execute( + ActionMapping mapping, + ActionForm form, + HttpServletRequest request, + HttpServletResponse response) + throws Exception { + logger.debug("Create histogram."); + + SessionModel sm = SessionModelFactory.getInstance().getSessionModel( + request); + sm.setDiagrammOptions(null); + request.setAttribute("histogram", true); + + return super.execute(mapping, form, request, response); + } +} +// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf-8 : diff -r f99d8f92a640 -r 755dd2fa4a0a gnv/src/main/java/de/intevation/gnv/action/DescribeUIAction.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv/src/main/java/de/intevation/gnv/action/DescribeUIAction.java Fri Sep 28 12:13:53 2012 +0200 @@ -0,0 +1,131 @@ +package de.intevation.gnv.action; + +import de.intevation.gnv.action.sessionmodel.SessionModel; +import de.intevation.gnv.action.sessionmodel.SessionModelFactory; + +import de.intevation.gnv.artifactdatabase.client.ArtifactDatabaseClient; +import de.intevation.gnv.artifactdatabase.client.ArtifactDatabaseClientFactory; + +import de.intevation.gnv.artifactdatabase.objects.ArtifactDescription; + +import de.intevation.gnv.util.ArtifactNamespaceContext; +import de.intevation.gnv.util.XMLUtils; +import de.intevation.gnv.util.XSLTransformer; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +import javax.xml.xpath.XPathConstants; + +import org.apache.log4j.Logger; + +import org.apache.struts.action.ActionForm; +import org.apache.struts.action.ActionForward; +import org.apache.struts.action.ActionMapping; + +import org.w3c.dom.Node; + +/** + * @author Ingo Weinzierl (ingo.weinzierl@intevation.de) + */ +public class DescribeUIAction extends ArtifactDatabaseActionBase { + + public static final String XPATH_DYNAMIC_UI = "art:dynamic"; + public static final String XPATH_STATIC_UI = "art:static"; + + public static final String XSL_SHEET_DYNAMIC = + "WEB-INF/config/templates/describe-ui.xsl"; + + public static final String XSL_SHEET_STATIC = + "WEB-INF/config/templates/describe-ui-static.xsl"; + + private static Logger logger = Logger.getLogger(DescribeUIAction.class); + + + public DescribeUIAction() { + super(); + } + + + @Override + public ActionForward execute( + ActionMapping mapping, + ActionForm form, + HttpServletRequest request, + HttpServletResponse response + ) throws Exception + { + logger.info("describe user interface"); + try { + // render describe document and create user interface + SessionModel sm = SessionModelFactory.getInstance().getSessionModel( + request); + + ArtifactDatabaseClient adc = ArtifactDatabaseClientFactory + .getInstance().getArtifactDatabaseClient(getLocale(request)); + + ArtifactDescription artifactDescription = + adc.getCurrentStepDescription( + sm.getSelectedArtifactFactory(), + sm.getCurrentArtifact(), + true); + + Node currentUI = artifactDescription.getCurrentUI(); + if (currentUI != null) { + XSLTransformer transformer = new XSLTransformer(); + + String url = response.encodeURL( + mapping.findForward("back").getPath()); + transformer.addParameter("back-url", url); + + String fisUrl = response.encodeURL( + mapping.findForward("selectfis").getPath()); + transformer.addParameter("selectfis", fisUrl); + + // fetch dynamic part from describe document and transform it + Node dynamicNode = (Node) XMLUtils.xpath( + currentUI, + XPATH_DYNAMIC_UI, + XPathConstants.NODE, + ArtifactNamespaceContext.INSTANCE + ); + + String ui = transformer.transform( + dynamicNode, + "UTF-8", + request.getRealPath(XSL_SHEET_DYNAMIC + )); + + if (ui != null && ui.length() > 1) + request.setAttribute("ui", ui); + + // fetch static part from describe document and transform it + Node staticNode = (Node) XMLUtils.xpath( + currentUI, + XPATH_STATIC_UI, + XPathConstants.NODE, + ArtifactNamespaceContext.INSTANCE + ); + + String staticUI = transformer.transform( + staticNode, + "UTF-8", + request.getRealPath(XSL_SHEET_STATIC)); + + if (staticUI != null && staticUI.length() > 1) + request.setAttribute("staticui", staticUI); + } + + return super.execute(mapping, form, request, response); + } + catch (Exception e) { + logger.error(e, e); + request.setAttribute( + CommunicationKeys.REQUEST_EXCEPTION_MESSAGE_ID, + e.getMessage()); + + return super.getExceptionForward(mapping); + } + } +} +// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf-8 : diff -r f99d8f92a640 -r 755dd2fa4a0a gnv/src/main/java/de/intevation/gnv/action/DoExportAction.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv/src/main/java/de/intevation/gnv/action/DoExportAction.java Fri Sep 28 12:13:53 2012 +0200 @@ -0,0 +1,217 @@ +/** + * + */ +package de.intevation.gnv.action; + +import de.intevation.gnv.action.sessionmodel.SessionModel; +import de.intevation.gnv.action.sessionmodel.SessionModelFactory; + +import de.intevation.gnv.artifactdatabase.client.ArtifactDatabaseClient; +import de.intevation.gnv.artifactdatabase.client.ArtifactDatabaseClientFactory; + +import de.intevation.gnv.artifactdatabase.objects.DefaultInputParameter; +import de.intevation.gnv.artifactdatabase.objects.ExportMode; +import de.intevation.gnv.artifactdatabase.objects.InputParameter; +import de.intevation.gnv.artifactdatabase.objects.OutputMode; +import de.intevation.gnv.artifactdatabase.objects.OutputParameter; + +import java.io.OutputStream; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.Iterator; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +import org.apache.log4j.Logger; + +import org.apache.struts.action.ActionForm; +import org.apache.struts.action.ActionForward; +import org.apache.struts.action.ActionMapping; + +/** + * @author Tim Englich + * + */ +public class DoExportAction extends ArtifactDatabaseActionBase { + + /** + * the logger, used to log exceptions and additonaly information + */ + private static Logger log = Logger.getLogger(DoExportAction.class); + + /** + * Constructor + */ + public DoExportAction() { + super(); + } + + /** + * @see de.intevation.gnv.action.ArtifactDatabaseActionBase#execute(org.apache.struts.action.ActionMapping, + * org.apache.struts.action.ActionForm, + * javax.servlet.http.HttpServletRequest, + * javax.servlet.http.HttpServletResponse) + */ + @Override + public ActionForward execute( + ActionMapping mapping, + ActionForm form, + HttpServletRequest request, + HttpServletResponse response) + throws Exception + { + try { + String target = request.getParameter("target"); + String mimeType = request.getParameter("mimetype"); + String mode = request.getParameter("mode"); + + log.debug("Target: " + target); + log.debug("MimeType: " + mimeType); + log.debug("ExportMode: " + mode); + + SessionModel sm = SessionModelFactory.getInstance() + .getSessionModel(request); + OutputMode outputMode = sm.getOutputMode(target); + if (outputMode != null) { + ExportMode exportMode = outputMode.getExportMode(mode); + + if (target.equals(mode) || (exportMode != null + && exportMode.getMimeType().equals(mimeType))) + { + Collection inputParameter = outputMode + .getOutputParameters(); + Collection ips = null; + if (inputParameter != null) { + ips = new ArrayList(inputParameter.size()); + Iterator it = inputParameter.iterator(); + while (it.hasNext()) { + String name = it.next().getName(); + String[] values = request.getParameterValues(name); + InputParameter ip = new DefaultInputParameter(name, + values); + ips.add(ip); + } + } + + ArtifactDatabaseClient adc = ArtifactDatabaseClientFactory + .getInstance() + .getArtifactDatabaseClient(getLocale(request)); + + this.setHeaders(mode, mimeType, response, request); + + OutputStream outputStream = response.getOutputStream(); + adc.doOutput( + sm.getSelectedArtifactFactory(), + sm.getCurrentArtifact(), + outputStream, + target, + mode, + mimeType, + ips); + + outputStream.flush(); + outputStream.close(); + } + else if (exportMode == null) { + Collection inputParameter = outputMode + .getOutputParameters(); + Collection ips = null; + if (inputParameter != null) { + ips = new ArrayList(inputParameter.size()); + Iterator it = inputParameter.iterator(); + while (it.hasNext()) { + String name = it.next().getName(); + String[] values = request.getParameterValues(name); + InputParameter ip = new DefaultInputParameter(name, + values); + ips.add(ip); + } + } + + ArtifactDatabaseClient adc = ArtifactDatabaseClientFactory + .getInstance() + .getArtifactDatabaseClient(getLocale(request)); + + this.setHeaders(target, mimeType, response, request); + + OutputStream outputStream = response.getOutputStream(); + adc.doOutput( + sm.getSelectedArtifactFactory(), + sm.getCurrentArtifact(), + outputStream, + target, + mode, + mimeType, + ips); + + outputStream.flush(); + outputStream.close(); + } + else { + if (outputMode == null) { + log.error("Outputmode is not supported."); + } + else if (!exportMode.getMimeType().equals(mimeType)) { + log.error("MimeType "+mimeType+" wis not supported."); + } + // TODO FIXME: Fehlerbehandlung + } + } + return super.execute(mapping, form, request, response); + } catch (Exception e) { + log.error(e, e); + request.setAttribute( + CommunicationKeys.REQUEST_EXCEPTION_MESSAGE_ID, e + .getMessage()); + return super.getExceptionForward(mapping); + } + } + + protected void setHeaders(String target, String mimeType, + HttpServletResponse response, + HttpServletRequest request) { + log.debug("DoExportAction.setHeaders"); + try { + response.setHeader("Content-Type", mimeType); + String fileName = "GNVEXPORT_" + System.currentTimeMillis() + "."; + + target = target.toLowerCase(); + log.debug("******************************************************"); + log.debug("TARGET: " + target); + log.debug("MIMETYPE: " + mimeType); + + if (target.equals("chart")) { + fileName = fileName + + mimeType.substring(mimeType.indexOf("/") + 1); + } + else if (target.equals("histogram")) { + fileName = fileName + + mimeType.substring(mimeType.indexOf("/") + 1); + } + else if (target.equals("img")) { + fileName = fileName + + mimeType.substring(mimeType.indexOf("/") + 1); + } + else if (target.equals("pdf")) { + fileName = fileName + "pdf"; + } else if (target.equals("svg")) { + fileName = fileName + "svg"; + } else if (target.equals("csv")) { + fileName = fileName + "csv"; + } else if (target.equals("zip")) { + fileName = fileName + "zip"; + } else if (target.equals("wms")) { + fileName = fileName + "xml"; + } else { + fileName = fileName + "txt"; + } + log.debug("FileName for Export: " + fileName); + response.setHeader("Content-Disposition", "attachment;filename=" + + fileName); + } catch (Exception e) { + log.error(e, e); + } + } +} diff -r f99d8f92a640 -r 755dd2fa4a0a gnv/src/main/java/de/intevation/gnv/action/DoOutputAction.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv/src/main/java/de/intevation/gnv/action/DoOutputAction.java Fri Sep 28 12:13:53 2012 +0200 @@ -0,0 +1,141 @@ +/** + * + */ +package de.intevation.gnv.action; + +import de.intevation.gnv.action.sessionmodel.SessionModel; +import de.intevation.gnv.action.sessionmodel.SessionModelFactory; + +import de.intevation.gnv.artifactdatabase.client.ArtifactDatabaseClient; +import de.intevation.gnv.artifactdatabase.client.ArtifactDatabaseClientFactory; + +import de.intevation.gnv.artifactdatabase.objects.DefaultInputParameter; +import de.intevation.gnv.artifactdatabase.objects.InputParameter; +import de.intevation.gnv.artifactdatabase.objects.OutputMode; +import de.intevation.gnv.artifactdatabase.objects.OutputParameter; + +import java.io.OutputStream; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.Iterator; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +import org.apache.log4j.Logger; + +import org.apache.struts.action.ActionForm; +import org.apache.struts.action.ActionForward; +import org.apache.struts.action.ActionMapping; + +/** + * @author Tim Englich + * + */ +public class DoOutputAction extends ArtifactDatabaseActionBase { + + /** + * the logger, used to log exceptions and additonaly information + */ + private static Logger log = Logger.getLogger(DoOutputAction.class); + + /** + * Constructor + */ + public DoOutputAction() { + super(); + } + + /** + * @see de.intevation.gnv.action.ArtifactDatabaseActionBase#execute(org.apache.struts.action.ActionMapping, + * org.apache.struts.action.ActionForm, + * javax.servlet.http.HttpServletRequest, + * javax.servlet.http.HttpServletResponse) + */ + @Override + public ActionForward execute(ActionMapping mapping, ActionForm form, + HttpServletRequest request, + HttpServletResponse response) throws Exception { + log.debug("DoOutputAction.execute"); + try { + String target = request.getParameter("target"); + String mimeType = request.getParameter("mimetype"); + String mode = request.getParameter("mode"); + + log.debug("Target: " + target); + log.debug("MimeType: " + mimeType); + log.debug("ExportMode: " + mode); + + // TODO Check if is propper; + + SessionModel sm = SessionModelFactory.getInstance() + .getSessionModel(request); + OutputMode outputMode = sm.getOutputMode(target); + if (outputMode != null && outputMode.getMimeType().equals(mimeType)) { + Collection inputParameter = outputMode + .getOutputParameters(); + Collection ips = null; + if (inputParameter != null) { + ips = new ArrayList(inputParameter.size()+1); + Iterator it = inputParameter.iterator(); + while (it.hasNext()) { + String name = it.next().getName(); + String[] values = request.getParameterValues(name); + InputParameter ip = new DefaultInputParameter(name, + values); + ips.add(ip); + } + + if (request.getParameter("bintype") != null) { + InputParameter ip = new DefaultInputParameter( + "bintype", request.getParameterValues("bintype")); + ips.add(ip); + } + } + + ArtifactDatabaseClient adc = ArtifactDatabaseClientFactory + .getInstance() + .getArtifactDatabaseClient(getLocale(request)); + + this.setHeaders(target, mimeType, response, request); + + OutputStream outputStream = response.getOutputStream(); + adc.doOutput( + sm.getSelectedArtifactFactory(), + sm.getCurrentArtifact(), + outputStream, + target, + mode, + mimeType, + ips); + + outputStream.flush(); + outputStream.close(); + } else { + if (outputMode == null) { + log.error("Outputmode is not supported."); + } else if (!outputMode.getMimeType().equals(mimeType)) { + log.error("MimeType " + mimeType + + " wis not supported."); + } + // TODO FIXME: Fehlerbehandlung + } + return super.execute(mapping, form, request, response); + } catch (Exception e) { + log.error(e, e); + request.setAttribute( + CommunicationKeys.REQUEST_EXCEPTION_MESSAGE_ID, e + .getMessage()); + return super.getExceptionForward(mapping); + } + } + + protected void setHeaders(String target, String mimeType, + HttpServletResponse response, + HttpServletRequest request) { + response.setHeader("Content-Type", mimeType); + } + +} +// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf-8 : diff -r f99d8f92a640 -r 755dd2fa4a0a gnv/src/main/java/de/intevation/gnv/action/FetchArtifactFactoriesAction.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv/src/main/java/de/intevation/gnv/action/FetchArtifactFactoriesAction.java Fri Sep 28 12:13:53 2012 +0200 @@ -0,0 +1,74 @@ +/** + * + */ +package de.intevation.gnv.action; + +import de.intevation.gnv.action.sessionmodel.SessionModel; +import de.intevation.gnv.action.sessionmodel.SessionModelFactory; + +import de.intevation.gnv.artifactdatabase.client.ArtifactDatabaseClientFactory; + +import de.intevation.gnv.artifactdatabase.objects.ArtifactObject; + +import java.util.Collection; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +import org.apache.log4j.Logger; + +import org.apache.struts.action.ActionForm; +import org.apache.struts.action.ActionForward; +import org.apache.struts.action.ActionMapping; + +/** + * @author Tim Englich + * @author Ingo Weinzierl (ingo.weinzierl@intevation.de) + * + */ +public class FetchArtifactFactoriesAction extends ArtifactDatabaseActionBase { + /** + * the logger, used to log exceptions and additonaly information + */ + private static Logger log = Logger + .getLogger(FetchArtifactFactoriesAction.class); + + public FetchArtifactFactoriesAction() { + super(); + } + + /** + * @see de.intevation.gnv.action.ArtifactDatabaseActionBase#execute(org.apache.struts.action.ActionMapping, + * org.apache.struts.action.ActionForm, + * javax.servlet.http.HttpServletRequest, + * javax.servlet.http.HttpServletResponse) + */ + @Override + public ActionForward execute(ActionMapping mapping, ActionForm form, + HttpServletRequest request, + HttpServletResponse response) throws Exception { + log.debug("ArtifactDatabaseActionBase.execute"); + try { + Collection artifactFactories = + ArtifactDatabaseClientFactory.getInstance() + .getArtifactDatabaseClient(getLocale(request)) + .getArtifactFactories(); + + SessionModel sm = SessionModelFactory.getInstance().getSessionModel( + request); + + sm.setArtifacteFactories(artifactFactories); + + return super.execute(mapping, form, request, response); + } + catch (Exception e) { + log.error(e, e); + request.setAttribute( + CommunicationKeys.REQUEST_EXCEPTION_MESSAGE_ID, + e.getMessage()); + + return super.getExceptionForward(mapping); + } + } +} +// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf-8 : diff -r f99d8f92a640 -r 755dd2fa4a0a gnv/src/main/java/de/intevation/gnv/action/NextArtifactStepAction.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv/src/main/java/de/intevation/gnv/action/NextArtifactStepAction.java Fri Sep 28 12:13:53 2012 +0200 @@ -0,0 +1,143 @@ +/** + * + */ +package de.intevation.gnv.action; +import de.intevation.gnv.action.sessionmodel.SessionModel; +import de.intevation.gnv.action.sessionmodel.SessionModelFactory; + +import de.intevation.gnv.artifactdatabase.client.ArtifactDatabaseClient; +import de.intevation.gnv.artifactdatabase.client.ArtifactDatabaseClientFactory; + +import de.intevation.gnv.artifactdatabase.objects.ArtifactDescription; +import de.intevation.gnv.artifactdatabase.objects.DefaultInputParameter; +import de.intevation.gnv.artifactdatabase.objects.InputParameter; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.Iterator; +import java.util.Map; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +import org.apache.log4j.Logger; + +import org.apache.struts.action.ActionForm; +import org.apache.struts.action.ActionForward; +import org.apache.struts.action.ActionMapping; + + +/** + * @author Tim Englich + * @author Ingo Weinzierl (ingo.weinzierl@intevation.de) + * + */ +public class NextArtifactStepAction extends DescribeUIAction { + + /** + * the logger, used to log exceptions and additonaly information + */ + private static Logger log = Logger + .getLogger(SelectArtifactFactoryAction.class); + + /** + * Constructor + */ + public NextArtifactStepAction() { + super(); + } + + /** + * @see de.intevation.gnv.action.ArtifactDatabaseActionBase#execute(org.apache.struts.action.ActionMapping, + * org.apache.struts.action.ActionForm, + * javax.servlet.http.HttpServletRequest, + * javax.servlet.http.HttpServletResponse) + */ + @Override + public ActionForward execute(ActionMapping mapping, ActionForm form, + HttpServletRequest request, + HttpServletResponse response) throws Exception { + log.debug("NextArtifactStepAction.execute"); + SessionModel sm = SessionModelFactory.getInstance() + .getSessionModel(request); + ArtifactDescription ad = sm.getArtifactDescription(); + if (ad != null){ + Collection inputParameter = ad.getInputParameter(); + Collection ips = null; + if (inputParameter != null) { + ips = new ArrayList(inputParameter.size()); + Iterator it = inputParameter.iterator(); + while (it.hasNext()) { + String name = it.next(); + String[] values = request.getParameterValues(name); + InputParameter ip = new DefaultInputParameter(name, values); + ips.add(ip); + } + } + ArtifactDatabaseClient adc = ArtifactDatabaseClientFactory + .getInstance() + .getArtifactDatabaseClient(getLocale(request)); + Map outs = ad.getOutputModes(); + if (outs == null || outs.isEmpty()) { + // TODO: Woher kommt der zu erreichende Status; + String target = null; + if (ad.getReachableStates().size() > 1) { + target = request.getParameter("product"); // TODO HACK for + // Propducts every + // other Step has + // currently only + // one reachable + // state. + } else { + target = ad.getReachableStates().iterator().next(); + } + + try { + adc.doNextStep( + sm.getSelectedArtifactFactory(), + sm.getCurrentArtifact(), + target, + ips + ); + } catch (Exception e) { + log.error(e, e); + request.setAttribute( + CommunicationKeys.REQUEST_EXCEPTION_MESSAGE_ID, e + .getMessage()); + } + + Map tmpOuts = ad.getOutputModes(); + request.setAttribute( + "furthertargets", + tmpOuts == null || tmpOuts.isEmpty() + ); + } else { + try{ + adc.getCurrentStepDescription( + sm.getSelectedArtifactFactory(), + sm.getCurrentArtifact(), + true + ); + + request.setAttribute("diagramm", true); + + } catch (Exception e) { + log.error(e, e); + request.setAttribute( + CommunicationKeys.REQUEST_EXCEPTION_MESSAGE_ID, + e.getMessage()); + } + + request.setAttribute("furthertargets", false); + } + }else{ + log.warn("SessionTimeout has occured"); + request.setAttribute(CommunicationKeys.REQUEST_EXCEPTION_MESSAGE_ID, + "SessionTimeout has occured"); + new FetchArtifactFactoriesAction().execute(mapping, form, request, response); + } + return super.execute(mapping, form, request, response); + } + +} +// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf-8 : diff -r f99d8f92a640 -r 755dd2fa4a0a gnv/src/main/java/de/intevation/gnv/action/PreviousArtifactStepAction.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv/src/main/java/de/intevation/gnv/action/PreviousArtifactStepAction.java Fri Sep 28 12:13:53 2012 +0200 @@ -0,0 +1,95 @@ +package de.intevation.gnv.action; + +import de.intevation.gnv.action.sessionmodel.SessionModel; +import de.intevation.gnv.action.sessionmodel.SessionModelFactory; + +import de.intevation.gnv.artifactdatabase.client.ArtifactDatabaseClient; +import de.intevation.gnv.artifactdatabase.client.ArtifactDatabaseClientFactory; + +import de.intevation.gnv.artifactdatabase.objects.ArtifactDescription; +import de.intevation.gnv.artifactdatabase.objects.ArtifactObject; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +import org.apache.log4j.Logger; + +import org.apache.struts.action.ActionForm; +import org.apache.struts.action.ActionForward; +import org.apache.struts.action.ActionMapping; + + +/** + * @author Ingo Weinzierl + * + */ +public class PreviousArtifactStepAction extends DescribeUIAction { + + + public static final String URL_STATE_KEY = "target"; + + private static Logger logger = + Logger.getLogger(PreviousArtifactStepAction.class); + + + public PreviousArtifactStepAction() { + super(); + } + + + @Override + public ActionForward execute( + ActionMapping mapping, + ActionForm form, + HttpServletRequest request, + HttpServletResponse response + ) throws Exception { + + String id = request.getSession().getId(); + + SessionModel session = SessionModelFactory.getInstance().getSessionModel( + request); + + ArtifactDescription ad = session.getArtifactDescription(); + if (ad == null) { + logger.warn("Session timed out."); + request.setAttribute( + CommunicationKeys.REQUEST_EXCEPTION_MESSAGE_ID, + "SessionTimeout has occured"); + new FetchArtifactFactoriesAction().execute( + mapping, form, request, response); + + return super.execute(mapping, form, request, response); + } + + // TODO check if target is reachable + + ArtifactDatabaseClientFactory f = + ArtifactDatabaseClientFactory.getInstance(); + ArtifactDatabaseClient client = + f.getArtifactDatabaseClient(getLocale(request)); + + ArtifactObject artifactFactory = session.getSelectedArtifactFactory(); + ArtifactObject currentArtifact = session.getCurrentArtifact(); + + String target = (String) request.getParameter(URL_STATE_KEY); + logger.debug("Step back to previous state: " + target); + + try { + client.doAdvance( + artifactFactory, + currentArtifact, + target + ); + } + catch (Exception e) { + logger.error(e, e); + request.setAttribute( + CommunicationKeys.REQUEST_EXCEPTION_MESSAGE_ID, + e.getMessage()); + } + + return super.execute(mapping, form, request, response); + } +} +// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf-8 : diff -r f99d8f92a640 -r 755dd2fa4a0a gnv/src/main/java/de/intevation/gnv/action/SelectArtifactFactoryAction.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv/src/main/java/de/intevation/gnv/action/SelectArtifactFactoryAction.java Fri Sep 28 12:13:53 2012 +0200 @@ -0,0 +1,126 @@ +/** + * + */ +package de.intevation.gnv.action; + +import java.util.Collection; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +import org.apache.log4j.Logger; +import org.apache.struts.action.ActionForm; +import org.apache.struts.action.ActionForward; +import org.apache.struts.action.ActionMapping; + +import org.w3c.dom.Node; + +import de.intevation.gnv.action.sessionmodel.SessionModel; +import de.intevation.gnv.action.sessionmodel.SessionModelFactory; +import de.intevation.gnv.artifactdatabase.client.ArtifactDatabaseClient; +import de.intevation.gnv.artifactdatabase.client.ArtifactDatabaseClientFactory; +import de.intevation.gnv.artifactdatabase.objects.ArtifactDescription; +import de.intevation.gnv.artifactdatabase.objects.ArtifactObject; +import de.intevation.gnv.util.XMLUtils; +import de.intevation.gnv.util.XSLTransformer; + +/** + * @author Tim Englich + * + */ +public class SelectArtifactFactoryAction extends ArtifactDatabaseActionBase { + /** + * the logger, used to log exceptions and additonaly information + */ + private static Logger log = Logger + .getLogger(SelectArtifactFactoryAction.class); + + /** + * @see de.intevation.gnv.action.ArtifactDatabaseActionBase#execute(org.apache.struts.action.ActionMapping, + * org.apache.struts.action.ActionForm, + * javax.servlet.http.HttpServletRequest, + * javax.servlet.http.HttpServletResponse) + */ + @Override + public ActionForward execute(ActionMapping mapping, ActionForm form, + HttpServletRequest request, + HttpServletResponse response) throws Exception { + log.debug("SelectArtifactFactoryAction.execute"); + String selectedArtifactFactoryID = request + .getParameter("artifactFactory"); + log.debug("Selected ArtifactFactory ==> " + selectedArtifactFactoryID); + + try { + SessionModel sm = SessionModelFactory.getInstance() + .getSessionModel(request); + Collection artifactFactories = sm + .getArtifactFactories(); + // Removes the Artifactspecific Attributes from the SessionModel- + sm.resetModel(); + if (artifactFactories == null || artifactFactories.isEmpty()) { + new FetchArtifactFactoriesAction().execute(mapping, form, + request, response); + + } + + sm.selectArtifactFactory(selectedArtifactFactoryID); + ArtifactObject af = sm.getSelectedArtifactFactory(); + ; + ArtifactDatabaseClient adc = ArtifactDatabaseClientFactory + .getInstance() + .getArtifactDatabaseClient(getLocale(request)); + ArtifactObject artifact = adc.createNewArtifact(af); + sm.setCurrentArtifact(artifact); + + ArtifactDescription artifactdescription = adc + .getCurrentStepDescription(af, artifact,true); + + String fisUrl = response.encodeURL( + mapping.findForward("selectfis").getPath()); + + XSLTransformer transformer = new XSLTransformer(); + transformer.addParameter("selectfis", fisUrl); + + Node dynamicUINode = new XMLUtils().getNodeXPath( + artifactdescription.getCurrentUI(), "art:dynamic" + ); + + if (dynamicUINode != null){ + String ui = transformer.transform( + dynamicUINode, + "UTF-8", + request.getRealPath("WEB-INF/config/templates/describe-ui.xsl")); + + request.setAttribute("ui", ui); + } + + Node staticUINode = new XMLUtils().getNodeXPath( + artifactdescription.getCurrentUI(), "art:static" + ); + + if (staticUINode != null) { + String staticUI = transformer.transform( + staticUINode, + "UTF-8", + request.getRealPath("WEB-INF/config/templates/describe-ui-static.xsl")); + request.setAttribute("staticui", staticUI); + } + + // return succsess + return super.execute(mapping, form, request, response); + } catch (Exception e) { + log.error(e, e); + request.setAttribute( + CommunicationKeys.REQUEST_EXCEPTION_MESSAGE_ID, e + .getMessage()); + return super.getExceptionForward(mapping); + } + } + + /** + * Constructor + */ + public SelectArtifactFactoryAction() { + } + +} diff -r f99d8f92a640 -r 755dd2fa4a0a gnv/src/main/java/de/intevation/gnv/action/SelectFisAction.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv/src/main/java/de/intevation/gnv/action/SelectFisAction.java Fri Sep 28 12:13:53 2012 +0200 @@ -0,0 +1,53 @@ +package de.intevation.gnv.action; + +import de.intevation.gnv.action.sessionmodel.SessionModel; +import de.intevation.gnv.action.sessionmodel.SessionModelFactory; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +import org.apache.log4j.Logger; + +import org.apache.struts.action.ActionForm; +import org.apache.struts.action.ActionForward; +import org.apache.struts.action.ActionMapping; + + +/** + * @author Ingo Weinzierl + */ +public class SelectFisAction extends ArtifactDatabaseActionBase { + + private static Logger logger = Logger.getLogger(SelectFisAction.class); + + @Override + public ActionForward execute( + ActionMapping mapping, + ActionForm form, + HttpServletRequest request, + HttpServletResponse response + ) { + logger.info("Goto fis selection."); + + try { + + SessionModelFactory fac = SessionModelFactory.getInstance(); + SessionModel sm = fac.getSessionModel(request); + + sm.resetModel(); + + return new FetchArtifactFactoriesAction().execute( + mapping, form, request, response); + } + catch (Exception e) { + logger.error(e, e); + + request.setAttribute( + CommunicationKeys.REQUEST_EXCEPTION_MESSAGE_ID, + e.getMessage()); + + return super.getExceptionForward(mapping); + } + } +} +// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf-8 : diff -r f99d8f92a640 -r 755dd2fa4a0a gnv/src/main/java/de/intevation/gnv/action/ShowStatisticAction.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv/src/main/java/de/intevation/gnv/action/ShowStatisticAction.java Fri Sep 28 12:13:53 2012 +0200 @@ -0,0 +1,62 @@ +package de.intevation.gnv.action; + +import java.util.Collection; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +import org.apache.log4j.Logger; +import org.apache.struts.action.ActionForm; +import org.apache.struts.action.ActionForward; +import org.apache.struts.action.ActionMapping; + +import de.intevation.gnv.action.sessionmodel.SessionModel; +import de.intevation.gnv.action.sessionmodel.SessionModelFactory; +import de.intevation.gnv.artifactdatabase.client.ArtifactDatabaseClient; +import de.intevation.gnv.artifactdatabase.client.ArtifactDatabaseClientFactory; +import de.intevation.gnv.artifactdatabase.objects.ArtifactStatisticsSet; + +/** + * @author Ingo Weinzierl (ingo.weinzierl@intevation.de) + */ +public class ShowStatisticAction extends DescribeUIAction { + + private static Logger logger = Logger.getLogger(ShowStatisticAction.class); + + + public ShowStatisticAction() { + super(); + } + + + @Override + public ActionForward execute( + ActionMapping mapping, + ActionForm form, + HttpServletRequest request, + HttpServletResponse response + ) throws Exception + { + logger.info("show statistic"); + SessionModel sm = SessionModelFactory.getInstance().getSessionModel( + request); + + ArtifactDatabaseClient adc = ArtifactDatabaseClientFactory.getInstance() + .getArtifactDatabaseClient(getLocale(request)); + + try{ + Collection statistics = + adc.calculateStatistics(sm.getSelectedArtifactFactory(), + sm.getCurrentArtifact()); + + sm.setStatistics(statistics); + + request.setAttribute("statistic", true); + } + catch (Exception e) { + logger.error(e, e); + } + + return super.execute(mapping, form, request, response); + } +} diff -r f99d8f92a640 -r 755dd2fa4a0a gnv/src/main/java/de/intevation/gnv/action/WMSAction.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv/src/main/java/de/intevation/gnv/action/WMSAction.java Fri Sep 28 12:13:53 2012 +0200 @@ -0,0 +1,83 @@ +package de.intevation.gnv.action; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +import org.apache.log4j.Logger; +import org.apache.struts.action.ActionForm; +import org.apache.struts.action.ActionForward; +import org.apache.struts.action.ActionMapping; + +import org.w3c.dom.Document; + +import de.intevation.gnv.action.sessionmodel.SessionModel; +import de.intevation.gnv.action.sessionmodel.SessionModelFactory; +import de.intevation.gnv.artifactdatabase.client.ArtifactDatabaseClient; +import de.intevation.gnv.artifactdatabase.client.ArtifactDatabaseClientFactory; +import de.intevation.gnv.artifactdatabase.objects.ArtifactObject; +import de.intevation.gnv.util.XMLUtils; + +/** + * @author Ingo Weinzierl (ingo.weinzierl@intevation.de) + */ +public class WMSAction extends DescribeUIAction { + + public static final String XPATH_MAPSERVER_PATH = + "/art:meta/art:mapserver/art:server/text()"; + + public static final String XPATH_MAPSERVER_MAPFILE = + "/art:meta/art:mapserver/art:map/text()"; + + /** + * the logger, used to log exceptions and additonaly information + */ + private static Logger logger = Logger.getLogger(WMSAction.class); + + /** + * Constructor + */ + public WMSAction() { + super(); + } + + @Override + public ActionForward execute(ActionMapping mapping, ActionForm form, + HttpServletRequest request, + HttpServletResponse response) throws Exception { + logger.debug("WMSAction.execute"); + try { + SessionModel sm = SessionModelFactory.getInstance().getSessionModel( + request); + ArtifactObject artifact = sm.getCurrentArtifact(); + + ArtifactDatabaseClientFactory factory = + ArtifactDatabaseClientFactory.getInstance(); + ArtifactDatabaseClient adc = factory.getArtifactDatabaseClient( + getLocale(request)); + ArtifactObject artifactfactory = sm.getSelectedArtifactFactory(); + + // do wms publishing + Document meta = adc.publishWMS(artifactfactory, artifact); + String mapserverPath = XMLUtils.getStringXPath( + meta, XPATH_MAPSERVER_PATH); + String mapfilePath = XMLUtils.getStringXPath( + meta, XPATH_MAPSERVER_MAPFILE); + + request.setAttribute("mapserver", mapserverPath); + request.setAttribute("mapfile", mapfilePath); + request.setAttribute("layer", artifact.getId()); + + return super.execute(mapping, form, request, response); + } + catch (Exception e) { + logger.error(e, e); + request.setAttribute( + CommunicationKeys.REQUEST_EXCEPTION_MESSAGE_ID, + e.getMessage()); + + return super.getExceptionForward(mapping); + } + } + +} +// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf-8 : diff -r f99d8f92a640 -r 755dd2fa4a0a gnv/src/main/java/de/intevation/gnv/action/mapviewer/MapViewerCallAction.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv/src/main/java/de/intevation/gnv/action/mapviewer/MapViewerCallAction.java Fri Sep 28 12:13:53 2012 +0200 @@ -0,0 +1,110 @@ +package de.intevation.gnv.action.mapviewer; + +import java.io.ByteArrayInputStream; +import java.io.InputStream; +import java.util.ArrayList; +import java.util.Collection; +import java.util.Iterator; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +import org.apache.log4j.Logger; +import org.apache.struts.action.ActionForm; +import org.apache.struts.action.ActionForward; +import org.apache.struts.action.ActionMapping; + +import de.intevation.gnv.action.ArtifactDatabaseActionBase; +import de.intevation.gnv.action.mapviewer.parser.ExternalCallParser; +import de.intevation.gnv.action.mapviewer.parser.XMLExternalCallParser; +import de.intevation.gnv.action.sessionmodel.SessionModel; +import de.intevation.gnv.action.sessionmodel.SessionModelFactory; +import de.intevation.gnv.artifactdatabase.client.ArtifactDatabaseClientFactory; +import de.intevation.gnv.artifactdatabase.objects.ArtifactObject; +import de.intevation.gnv.artifactdatabase.objects.map.MapService; + +/** + * + * @author Tim Englich + * + */ +public class MapViewerCallAction extends ArtifactDatabaseActionBase { + + /** + * the logger, used to log exceptions and additonaly information + */ + private static Logger log = Logger.getLogger(MapViewerCallAction.class); + + /** + * Constructor + */ + public MapViewerCallAction() { + super(); + } + + /** + * @see de.intevation.gnv.action.ArtifactDatabaseActionBase#execute(org.apache.struts.action.ActionMapping, org.apache.struts.action.ActionForm, javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse) + */ + @Override + public ActionForward execute(ActionMapping mapping, ActionForm form, + HttpServletRequest request, + HttpServletResponse response) throws Exception { + log.debug("MapViewerCallAction.execute"); + InputStream inputStream = null; + String documentvalue = request.getParameter("document"); + if (documentvalue != null){ + documentvalue = documentvalue.trim(); + inputStream = new ByteArrayInputStream(documentvalue.getBytes()); + }else{ + inputStream = request.getInputStream(); + } + + if (inputStream != null){ + try { + ExternalCallParser ecp = new XMLExternalCallParser(inputStream); + ecp.parse(); + String geometry = ecp.getGeometry(); + String srs = ecp.getSRS(); + Collection mapServices = ecp.getMapServices(); + + Collection availableFactories = + ArtifactDatabaseClientFactory + .getInstance() + .getArtifactDatabaseClient(getLocale(request)) + .getArtifactFactoryMetaInformation(mapServices, + geometry, + srs); + + Collection providedFactories = + ArtifactDatabaseClientFactory + .getInstance() + .getArtifactDatabaseClient(getLocale(request)) + .getArtifactFactories(); + + // Sort out which ArtifactFactories should not be used. + Collection usedFactories = + new ArrayList(availableFactories.size()); + + Iterator it = availableFactories.iterator(); + while (it.hasNext()){ + ArtifactObject ao = it.next(); + if (providedFactories.contains(ao)){ + usedFactories.add(ao); + } + } + + SessionModel sm = SessionModelFactory + .getInstance() + .getSessionModel(request); + sm.resetModel(); + sm.setArtifacteFactories(usedFactories); + } catch (Exception e) { + log.error(e,e); + } + }else{ + log.error("Kein Anfragedokument übergeben."); + } + return super.execute(mapping, form, request, response); + } + +} diff -r f99d8f92a640 -r 755dd2fa4a0a gnv/src/main/java/de/intevation/gnv/action/mapviewer/ShowMapViewerCallBodyAction.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv/src/main/java/de/intevation/gnv/action/mapviewer/ShowMapViewerCallBodyAction.java Fri Sep 28 12:13:53 2012 +0200 @@ -0,0 +1,46 @@ +/** + * + */ +package de.intevation.gnv.action.mapviewer; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +import org.apache.log4j.Logger; +import org.apache.struts.action.ActionForm; +import org.apache.struts.action.ActionForward; +import org.apache.struts.action.ActionMapping; + +import de.intevation.gnv.action.ArtifactDatabaseActionBase; + +/** + * @author Tim Englich + * + */ +public class ShowMapViewerCallBodyAction extends ArtifactDatabaseActionBase { + + /** + * the logger, used to log exceptions and additionally information + */ + private static Logger log = Logger + .getLogger(ShowMapViewerCallBodyAction.class); + + /** + * Constructor + */ + public ShowMapViewerCallBodyAction() { + super(); + } + + @Override + public ActionForward execute(ActionMapping mapping, ActionForm form, + HttpServletRequest request, + HttpServletResponse response) throws Exception { + log.debug("ShowMapViewerCallBodyAction.execute"); + request.setAttribute("MAPVIEWERCALL", new Boolean(true)); + return super.execute(mapping, form, request, response); + } + + + +} diff -r f99d8f92a640 -r 755dd2fa4a0a gnv/src/main/java/de/intevation/gnv/action/mapviewer/parser/ExternalCallParser.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv/src/main/java/de/intevation/gnv/action/mapviewer/parser/ExternalCallParser.java Fri Sep 28 12:13:53 2012 +0200 @@ -0,0 +1,24 @@ +/** + * + */ +package de.intevation.gnv.action.mapviewer.parser; + +import java.util.Collection; + +import de.intevation.gnv.artifactdatabase.objects.map.MapService; + +/** + * @author Tim Englich + * + */ +public interface ExternalCallParser { + + + String getGeometry(); + + String getSRS(); + + Collection getMapServices(); + + void parse() throws ExternalCallParserException; +} diff -r f99d8f92a640 -r 755dd2fa4a0a gnv/src/main/java/de/intevation/gnv/action/mapviewer/parser/ExternalCallParserException.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv/src/main/java/de/intevation/gnv/action/mapviewer/parser/ExternalCallParserException.java Fri Sep 28 12:13:53 2012 +0200 @@ -0,0 +1,47 @@ +/** + * + */ +package de.intevation.gnv.action.mapviewer.parser; +/** + * @author Tim Englich + * + */ +public class ExternalCallParserException extends Exception { + + /** + * The UID of this Class + */ + private static final long serialVersionUID = -4917914097058485262L; + + /** + * Constructor + */ + public ExternalCallParserException() { + } + + /** + * Constructor + * @param arg0 + */ + public ExternalCallParserException(String arg0) { + super(arg0); + } + + /** + * Constructor + * @param arg0 + */ + public ExternalCallParserException(Throwable arg0) { + super(arg0); + } + + /** + * Constructor + * @param arg0 + * @param arg1 + */ + public ExternalCallParserException(String arg0, Throwable arg1) { + super(arg0, arg1); + } + +} diff -r f99d8f92a640 -r 755dd2fa4a0a gnv/src/main/java/de/intevation/gnv/action/mapviewer/parser/XMLExternalCallParser.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv/src/main/java/de/intevation/gnv/action/mapviewer/parser/XMLExternalCallParser.java Fri Sep 28 12:13:53 2012 +0200 @@ -0,0 +1,155 @@ +/** + * + */ +package de.intevation.gnv.action.mapviewer.parser; + +import java.io.InputStream; +import java.util.ArrayList; +import java.util.Collection; + + +import org.apache.log4j.Logger; +import org.w3c.dom.Document; +import org.w3c.dom.Element; +import org.w3c.dom.NodeList; + +import de.intevation.gnv.artifactdatabase.objects.map.DefaultLayer; +import de.intevation.gnv.artifactdatabase.objects.map.DefaultMapService; +import de.intevation.gnv.artifactdatabase.objects.map.Layer; +import de.intevation.gnv.artifactdatabase.objects.map.MapService; +import de.intevation.gnv.util.XMLUtils; + +/** + * @author Tim Englich + * + */ +public class XMLExternalCallParser implements ExternalCallParser { + + /** + * the logger, used to log exceptions and additonaly information + */ + private static Logger log = Logger.getLogger(XMLExternalCallParser.class); + + private static String XPATH_GEOMETRY = "/gnviewer/location/data"; + private static String XPATH_SRS = "/gnviewer/location/srs"; + private static String XPATH_MAPSERVICES_NODESET = "/gnviewer/mapservices/mapservice"; + private static String XPATH_LAYER = "layer"; + private static String ATTRIBUTE_ID = "id"; + private static String ATTRIBUTE_NAME = "name"; + private static String ATTRIBUTE_TYPE = "type"; + private static String ATTRIBUTE_URL = "url"; + + private String geometry = null; + private String srs = null; + + private Collection mapServices = null; + + private InputStream inputStream = null; + + /** + * Constructor + */ + public XMLExternalCallParser(InputStream inputStream) { + this.inputStream = inputStream; + } + + /** + * @see de.intevation.gnv.action.mapviewer.parser.ExternalCallParser#getGeometry() + */ + public String getGeometry() { + return this.geometry; + } + + /** + * @see de.intevation.gnv.action.mapviewer.parser.ExternalCallParser#getMapServices() + */ + public Collection getMapServices() { + return this.mapServices; + } + + /** + * @see de.intevation.gnv.action.mapviewer.parser.ExternalCallParser#parse() + */ + public void parse() throws ExternalCallParserException { + if (inputStream != null){ + XMLUtils xmlUtils = new XMLUtils(); + Document document = xmlUtils.readDocument(this.inputStream); + if (document != null){ + + this.geometry = xmlUtils.getStringXPath(document, XPATH_GEOMETRY); + this.srs = xmlUtils.getStringXPath(document, XPATH_SRS); + NodeList mapservicesNodes = + xmlUtils.getNodeSetXPath(document, XPATH_MAPSERVICES_NODESET); + if (mapservicesNodes != null){ + this.mapServices = new ArrayList(mapservicesNodes.getLength()); + for (int i = 0; i < mapservicesNodes.getLength(); i++){ + Element mapserviceNode = (Element)mapservicesNodes.item(i); + String mapserviceID = mapserviceNode.getAttribute(ATTRIBUTE_ID); + String mapserviceType = mapserviceNode.getAttribute(ATTRIBUTE_TYPE); + String mapserviceUrl = mapserviceNode.getAttribute(ATTRIBUTE_URL); + NodeList layerNodes = xmlUtils.getNodeSetXPath(mapserviceNode, XPATH_LAYER); + Collection layer = null; + if (layerNodes != null && layerNodes.getLength() > 0){ + layer = new ArrayList(layerNodes.getLength()); + layer = this.extractLayer(layer, null, layerNodes); + }else{ + log.debug("No Layer given for this Mapservice"); + } + MapService mapService = + new DefaultMapService(mapserviceID, layer, + mapserviceType, mapserviceUrl); + this.mapServices.add(mapService); + } + + }else{ + String errMsg = "XML-Document does not contain any Mapservices which are required."; + log.error(errMsg); + throw new ExternalCallParserException(errMsg); + } + + }else{ + String errMsg = "XML-Document could not be read from InputStream."; + log.error(errMsg); + throw new ExternalCallParserException(errMsg); + } + }else{ + String errMsg = "No InputStream given for parsing the Call."; + log.error(errMsg); + throw new ExternalCallParserException(errMsg); + } + } + + /** + * This Method extracts all Layers and put them into the Collection. + * @param layer + * @param groupId + * @param layerNodes + * @return + */ + private Collection extractLayer(Collection layer, String groupId, NodeList layerNodes){ + XMLUtils xmlUtils = new XMLUtils(); + for (int i = 0; i < layerNodes.getLength(); i++){ + Element layerNode = (Element)layerNodes.item(i); + String id = layerNode.getAttribute(ATTRIBUTE_ID); + String name = layerNode.getAttribute(ATTRIBUTE_NAME); + NodeList localLayerNodes = xmlUtils.getNodeSetXPath(layerNode, XPATH_LAYER); + Layer tmpLayer = new DefaultLayer(id, name, + (localLayerNodes != null && + localLayerNodes.getLength() > 0), + groupId); + layer.add(tmpLayer); + if (localLayerNodes != null && localLayerNodes.getLength() > 0){ + layer = this.extractLayer(layer, id, localLayerNodes); + } + } + return layer; + } + + /** + * @see de.intevation.gnv.action.mapviewer.parser.ExternalCallParser#getSRS() + */ + public String getSRS() { + return this.srs; + } + +} diff -r f99d8f92a640 -r 755dd2fa4a0a gnv/src/main/java/de/intevation/gnv/action/sessionmodel/DefaultSessionModel.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv/src/main/java/de/intevation/gnv/action/sessionmodel/DefaultSessionModel.java Fri Sep 28 12:13:53 2012 +0200 @@ -0,0 +1,168 @@ +/** + * + */ +package de.intevation.gnv.action.sessionmodel; + +import java.util.Collection; +import java.util.Iterator; + +import org.apache.log4j.Logger; + +import de.intevation.gnv.artifactdatabase.objects.ArtifactDescription; +import de.intevation.gnv.artifactdatabase.objects.ArtifactObject; +import de.intevation.gnv.artifactdatabase.objects.ArtifactStatisticsSet; +import de.intevation.gnv.artifactdatabase.objects.OutputMode; + +/** + * @author Tim Englich + * + */ +public class DefaultSessionModel implements SessionModel { + + /** + * the logger, used to log exceptions and additonaly information + */ + private static Logger log = Logger.getLogger(DefaultSessionModel.class); + + /** + * The UID of this Class. + */ + private static final long serialVersionUID = 3431484439985158311L; + + private Collection artifactFactories = null; + + private ArtifactObject selectedArtifactFactory = null; + + private ArtifactObject currentArtifact = null; + + private DiagrammOptions diagrammOptions = null; + + private Collection statistics = null; + + /** + * Constructor + */ + public DefaultSessionModel() { + super(); + } + + /** + * @see de.intevation.gnv.action.sessionmodel.SessionModel#selectArtifactFactory(java.lang.String) + */ + public void selectArtifactFactory(String artiFactFactoryId) { + Collection artifactObjects = this + .getArtifactFactories(); + if (artifactObjects != null) { + Iterator unselect = artifactObjects.iterator(); + this.selectedArtifactFactory = null; + while (unselect.hasNext()) { + unselect.next().setSelected(false); + } + Iterator it = artifactObjects.iterator(); + while (it.hasNext()) { + ArtifactObject obj = it.next(); + if (obj.getId().equals(artiFactFactoryId)) { + obj.setSelected(true); + this.selectedArtifactFactory = obj; + break; + } + } + } + } + + /** + * @see de.intevation.gnv.action.sessionmodel.SessionModel#setArtifacteFactories(java.util.Collection) + */ + public void setArtifacteFactories( + Collection artifactFactories) { + this.artifactFactories = artifactFactories; + } + + /** + * @see de.intevation.gnv.action.sessionmodel.SessionModel#getAttributeFactories() + */ + public Collection getArtifactFactories() { + return this.artifactFactories; + } + + /** + * @see de.intevation.gnv.action.sessionmodel.SessionModel#getSelectedArtifactFactory() + */ + public ArtifactObject getSelectedArtifactFactory() { + return this.selectedArtifactFactory; + } + + /** + * @see de.intevation.gnv.action.sessionmodel.SessionModel#getCurrentArtifact() + */ + public ArtifactObject getCurrentArtifact() { + return this.currentArtifact; + } + + /** + * @see de.intevation.gnv.action.sessionmodel.SessionModel#setCurrentArtifact(de.intevation.gnv.artifactdatabase.objects.ArtifactObject) + */ + public void setCurrentArtifact(ArtifactObject artifact) { + this.currentArtifact = artifact; + } + + /** + * @see de.intevation.gnv.action.sessionmodel.SessionModel#getDiagrammOptions() + */ + public DiagrammOptions getDiagrammOptions() { + return this.diagrammOptions; + } + + /** + * @see de.intevation.gnv.action.sessionmodel.SessionModel#setDiagrammOptions(de.intevation.gnv.action.sessionmodel.DiagrammOptions) + */ + public void setDiagrammOptions(DiagrammOptions diagrammOptions) { + this.diagrammOptions = diagrammOptions; + } + + /** + * @see de.intevation.gnv.action.sessionmodel.SessionModel#getArtifactDescription() + */ + public ArtifactDescription getArtifactDescription() { + if (this.currentArtifact != null) { + return (ArtifactDescription) this.currentArtifact; + } + return null; + } + + /** + * @see de.intevation.gnv.action.sessionmodel.SessionModel#getOutputMode(java.lang.String) + */ + public OutputMode getOutputMode(String name) { + ArtifactDescription ad = this.getArtifactDescription(); + if (ad != null) { + if (ad.getOutputModes() != null) { + return ad.getOutputModes().get(name); + } + } + return null; + } + + /** + * @see de.intevation.gnv.action.sessionmodel.SessionModel#resetModel() + */ + public void resetModel() { + log.debug("DefaultSessionModel.resetModel"); + this.selectedArtifactFactory = null; + this.currentArtifact = null; + this.diagrammOptions = null; + this.statistics = null; + + } + + /**b + * @see de.intevation.gnv.action.sessionmodel.SessionModel#getStatistics() + */ + public Collection getStatistics() { + return this.statistics; + } + + public void setStatistics(Collection statistics) { + this.statistics = statistics; + } +} diff -r f99d8f92a640 -r 755dd2fa4a0a gnv/src/main/java/de/intevation/gnv/action/sessionmodel/DiagrammOptions.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv/src/main/java/de/intevation/gnv/action/sessionmodel/DiagrammOptions.java Fri Sep 28 12:13:53 2012 +0200 @@ -0,0 +1,38 @@ +/** + * + */ +package de.intevation.gnv.action.sessionmodel; + +import java.util.HashMap; +import java.util.Map; + +/** + * @author Tim Englich + * + */ +public class DiagrammOptions { + + private Map values = new HashMap(); + + /** + * Constructor + */ + public DiagrammOptions() { + super(); + } + + /** + * @return + */ + public String getValue(String key) { + return this.values.get(key); + } + + /** + * @param width + */ + public void setValue(String key, String value) { + this.values.put(key, value); + } + +} \ No newline at end of file diff -r f99d8f92a640 -r 755dd2fa4a0a gnv/src/main/java/de/intevation/gnv/action/sessionmodel/SessionModel.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv/src/main/java/de/intevation/gnv/action/sessionmodel/SessionModel.java Fri Sep 28 12:13:53 2012 +0200 @@ -0,0 +1,46 @@ +/** + * + */ +package de.intevation.gnv.action.sessionmodel; + +import java.io.Serializable; +import java.util.Collection; + +import de.intevation.gnv.artifactdatabase.objects.ArtifactDescription; +import de.intevation.gnv.artifactdatabase.objects.ArtifactObject; +import de.intevation.gnv.artifactdatabase.objects.ArtifactStatisticsSet; +import de.intevation.gnv.artifactdatabase.objects.OutputMode; + +/** + * @author Tim Englich + * + */ +public interface SessionModel extends Serializable { + + Collection getArtifactFactories(); + + void setArtifacteFactories(Collection artifactFactories); + + void selectArtifactFactory(String artiFactFactoryId); + + ArtifactObject getSelectedArtifactFactory(); + + ArtifactObject getCurrentArtifact(); + + void setCurrentArtifact(ArtifactObject artifact); + + void setDiagrammOptions(DiagrammOptions diagrammOptions); + + DiagrammOptions getDiagrammOptions(); + + OutputMode getOutputMode(String name); + + ArtifactDescription getArtifactDescription(); + + void resetModel(); + + void setStatistics(Collection statistics); + + Collection getStatistics(); + +} diff -r f99d8f92a640 -r 755dd2fa4a0a gnv/src/main/java/de/intevation/gnv/action/sessionmodel/SessionModelFactory.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv/src/main/java/de/intevation/gnv/action/sessionmodel/SessionModelFactory.java Fri Sep 28 12:13:53 2012 +0200 @@ -0,0 +1,66 @@ +/** + * + */ +package de.intevation.gnv.action.sessionmodel; + +import javax.servlet.http.HttpServletRequest; + +import org.apache.log4j.Logger; + +/** + * @author Tim Englich + * + */ +public class SessionModelFactory { + + public final static String SESSION_MODEL_ID = "de.intevation.gnv.action.sessionmodel.SessionModel.ID"; + /** + * the logger, used to log exceptions and additonaly information + */ + private static Logger log = Logger.getLogger(SessionModelFactory.class); + + /** + * The singleton Instance of this Factory. + */ + private static SessionModelFactory instance = null; + + /** + * Constructor + */ + private SessionModelFactory() { + super(); + } + + /** + * This Method provides an singleton Instance of this Class. + * + * @return an singleton Instance of this Class + */ + public synchronized static SessionModelFactory getInstance() { + if (instance == null) { + instance = new SessionModelFactory(); + } + return instance; + } + + /** + * Getting the ArtifactDatabaseClient + * + * @return the ArtifactDatabaseClient + */ + public SessionModel getSessionModel(HttpServletRequest request) { + synchronized (request) { + SessionModel sm = null; + Object obj = request.getSession().getAttribute(SESSION_MODEL_ID); + if (obj instanceof SessionModel) { + sm = (SessionModel) obj; + } else { + sm = new DefaultSessionModel(); + request.getSession().setAttribute(SESSION_MODEL_ID, sm); + } + + return sm; + } + } + +} diff -r f99d8f92a640 -r 755dd2fa4a0a gnv/src/main/java/de/intevation/gnv/artifactdatabase/client/ArtifactDatabaseClient.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv/src/main/java/de/intevation/gnv/artifactdatabase/client/ArtifactDatabaseClient.java Fri Sep 28 12:13:53 2012 +0200 @@ -0,0 +1,136 @@ +package de.intevation.gnv.artifactdatabase.client; + +import java.io.IOException; +import java.io.OutputStream; +import java.util.Collection; +import java.util.Locale; + +import org.w3c.dom.Document; + +import de.intevation.gnv.artifactdatabase.client.exception.ArtifactDatabaseClientException; +import de.intevation.gnv.artifactdatabase.objects.ArtifactDescription; +import de.intevation.gnv.artifactdatabase.objects.ArtifactObject; +import de.intevation.gnv.artifactdatabase.objects.ArtifactStatisticsSet; +import de.intevation.gnv.artifactdatabase.objects.InputParameter; +import de.intevation.gnv.artifactdatabase.objects.map.MapService; + +/** + * @author Tim Englich (tim.englich@intevation.de) + * @author Ingo Weinzierl (ingo.weinzierl@intevation.de) + */ +public interface ArtifactDatabaseClient { + + public final static String ARTIFACTDATABASE_COUNT_ID = "de.intevation.gnv.artifactdatabase.client.ArtifactDatabase.count"; + + public final static String ARTIFACTDATABASE_URL_ID = "de.intevation.gnv.artifactdatabase.client.ArtifactDatabase.url"; + + /** + * Return the Artifactfactories which can be resolved. + * + * @return the Artifactfactories which can be resolved. + * @throws ArtifactDatabaseClientException + */ + public Collection getArtifactFactories() + throws ArtifactDatabaseClientException; + + /** + * + * @param artifactFactory + * @return the new Artifact + * @throws ArtifactDatabaseClientException + */ + public ArtifactObject createNewArtifact(ArtifactObject artifactFactory) + throws ArtifactDatabaseClientException; + + /** + * + * @param currentArtifact + * @return the Current Artifact + * @throws ArtifactDatabaseClientException + */ + public ArtifactDescription getCurrentStepDescription( + ArtifactObject artifactFactory, + ArtifactObject currentArtifact, + boolean includeUI) + throws ArtifactDatabaseClientException; + + /** + * + * @param artifactFactory + * @param currentArtifact + * @param target + * @param inputParameter + * @return + * @throws ArtifactDatabaseClientException + */ + public ArtifactDescription doNextStep( + ArtifactObject artifactFactory, + ArtifactObject currentArtifact, + String target, + Collection inputParameter) + throws ArtifactDatabaseClientException; + + public void doAdvance( + ArtifactObject factory, + ArtifactObject artifact, + String target + ) throws IOException, ArtifactDatabaseClientException; + + /** + * @param artifactFactory + * @param currentArtifact + * @param inputParameter + * @return + * @throws ArtifactDatabaseClientException + */ + public void doFeed(ArtifactObject artifactFactory, + ArtifactObject currentArtifact, + Collection inputParameter) + throws ArtifactDatabaseClientException; + + /** + * + * @param artifactFactory + * @param currentArtifact + * @param stream + * @param targetName + * @param mimeType + * @throws ArtifactDatabaseClientException + */ + public void doOutput( + ArtifactObject artifactFactory, + ArtifactObject currentArtifact, + OutputStream stream, + String targetName, + String exportMode, + String mimeType, + Collection inputParameter) + throws ArtifactDatabaseClientException; + + /** + * @param factory + * @param artifact + * @return URL to wms service as string + */ + public Document publishWMS(ArtifactObject factory, ArtifactObject artifact); + + + /** + * @param artifactFactory + * @param currentArtifact + * @return + * @throws ArtifactDatabaseClientException + */ + public Collection calculateStatistics( + ArtifactObject artifactFactory, + ArtifactObject currentArtifact) + throws ArtifactDatabaseClientException; + + public void setLocale(Locale locale); + + public Collection getArtifactFactoryMetaInformation(Collection mapServices, + String geometry, + String srs) + throws ArtifactDatabaseClientException; + +} diff -r f99d8f92a640 -r 755dd2fa4a0a gnv/src/main/java/de/intevation/gnv/artifactdatabase/client/ArtifactDatabaseClientFactory.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv/src/main/java/de/intevation/gnv/artifactdatabase/client/ArtifactDatabaseClientFactory.java Fri Sep 28 12:13:53 2012 +0200 @@ -0,0 +1,58 @@ +/** + * + */ +package de.intevation.gnv.artifactdatabase.client; + +import org.apache.log4j.Logger; + +import java.util.Locale; + +/** + * @author Tim Englich + * + */ +public class ArtifactDatabaseClientFactory { + + /** + * the logger, used to log exceptions and additonaly information + */ + private static Logger log = Logger + .getLogger(ArtifactDatabaseClientFactory.class); + + /** + * The singleton Instance of this Factory. + */ + private static ArtifactDatabaseClientFactory instance = null; + + /** + * Constructor + */ + private ArtifactDatabaseClientFactory() { + super(); + } + + /** + * This Method provides an singleton Instance of this Class. + * + * @return an singleton Instance of this Class + */ + public static synchronized ArtifactDatabaseClientFactory getInstance() { + if (instance == null) { + instance = new ArtifactDatabaseClientFactory(); + } + return instance; + } + + /** + * Getting the ArtifactDatabaseClient + * @param locale teh Local that should be used for the Communication + * @return the ArtifactDatabaseClient + */ + public ArtifactDatabaseClient getArtifactDatabaseClient(Locale locale) { + DefaultArtifactDatabaseClient adc = new DefaultArtifactDatabaseClient(); + adc.setLocale(locale); + return adc; + + } + +} diff -r f99d8f92a640 -r 755dd2fa4a0a gnv/src/main/java/de/intevation/gnv/artifactdatabase/client/DefaultArtifactDatabaseClient.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv/src/main/java/de/intevation/gnv/artifactdatabase/client/DefaultArtifactDatabaseClient.java Fri Sep 28 12:13:53 2012 +0200 @@ -0,0 +1,949 @@ +/** + * + */ +package de.intevation.gnv.artifactdatabase.client; + +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import java.util.ArrayList; +import java.util.Collection; +import java.util.HashMap; +import java.util.Iterator; +import java.util.List; +import java.util.Locale; +import java.util.Map; + +import org.apache.log4j.Logger; +import org.restlet.Client; +import org.restlet.data.ClientInfo; +import org.restlet.data.Language; +import org.restlet.data.Method; +import org.restlet.data.Preference; +import org.restlet.data.Protocol; +import org.restlet.data.Request; +import org.restlet.data.Response; +import org.restlet.representation.Representation; +import org.restlet.representation.StringRepresentation; +import org.w3c.dom.Document; +import org.w3c.dom.Element; +import org.w3c.dom.Node; +import org.w3c.dom.NodeList; + +import de.intevation.gnv.artifactdatabase.client.exception.ArtifactDatabaseClientException; +import de.intevation.gnv.artifactdatabase.objects.Artifact; +import de.intevation.gnv.artifactdatabase.objects.ArtifactDescription; +import de.intevation.gnv.artifactdatabase.objects.ArtifactFactory; +import de.intevation.gnv.artifactdatabase.objects.ArtifactObject; +import de.intevation.gnv.artifactdatabase.objects.ArtifactStatisticsSet; +import de.intevation.gnv.artifactdatabase.objects.DefaultArtifactStatisticValue; +import de.intevation.gnv.artifactdatabase.objects.DefaultArtifactStatisticsSet; +import de.intevation.gnv.artifactdatabase.objects.DefaultExportMode; +import de.intevation.gnv.artifactdatabase.objects.DefaultOutputMode; +import de.intevation.gnv.artifactdatabase.objects.DefaultOutputParameter; +import de.intevation.gnv.artifactdatabase.objects.ExportMode; +import de.intevation.gnv.artifactdatabase.objects.InputParameter; +import de.intevation.gnv.artifactdatabase.objects.OutputMode; +import de.intevation.gnv.artifactdatabase.objects.OutputParameter; +import de.intevation.gnv.artifactdatabase.objects.ParametrizedArtifactFactory; +import de.intevation.gnv.artifactdatabase.objects.ParametrizedArtifactObject; +import de.intevation.gnv.artifactdatabase.objects.map.Layer; +import de.intevation.gnv.artifactdatabase.objects.map.MapService; +import de.intevation.gnv.propertiesreader.PropertiesReader; +import de.intevation.gnv.propertiesreader.PropertiesReaderFactory; +import de.intevation.gnv.util.XMLUtils; + +/** + * @author Tim Englich + * + */ +public class DefaultArtifactDatabaseClient implements ArtifactDatabaseClient { + /** + * The URI of the namespace of the artifacts. + */ + public final static String NAMESPACE_URI = "http://www.intevation.de/2009/artifacts"; + + /** + * The XML prefix for the artifacts namespace. + */ + public final static String NAMESPACE_PREFIX = "art"; + + /** + * the logger, used to log exceptions and additonaly information + */ + private static Logger log = Logger + .getLogger(DefaultArtifactDatabaseClient.class); + + /** + * The Databases which could be used + */ + private static Collection artifactDatabases = null; + + /** + * Is the Class initialized? + */ + private static boolean initialized = false; + + /** + * Request locale + */ + private Locale locale; + + + /** + * Constructor + */ + public DefaultArtifactDatabaseClient() { + + } + + /** + * @see de.intevation.gnv.artifactdatabase.client.ArtifactDatabaseClient#getArtifactFactories() + */ + public Collection getArtifactFactories() + throws ArtifactDatabaseClientException { + Collection resultValues = null; + if (!initialized) { + this.initialize(); + } + try { + log.debug("DefaultArtifactDatabaseClient.getArtifactFactories"); + Iterator it = artifactDatabases.iterator(); + while (it.hasNext()) { + String server = it.next(); + String url = server + "/factories"; + Document document = this.doGetRequest(url); + if (resultValues == null) { + resultValues = this.getArtifactFactories(document, server,null); + } else { + resultValues.addAll(this.getArtifactFactories(document, + server,null)); + } + } + } catch (IOException e) { + log.error(e, e); + throw new ArtifactDatabaseClientException(e); + } + return resultValues; + } + + private Collection getArtifactFactories(Document document, + String server, + String geometry) { + XMLUtils xmlUtils = new XMLUtils(); + NodeList artifactFactories = xmlUtils.getNodeSetXPath(document, + "/art:result/art:factories/art:factory"); + Collection resultValues = new ArrayList( + artifactFactories.getLength()); + if (artifactFactories != null) { + for (int i = 0; i < artifactFactories.getLength(); i++) { + Node artifactFactoryNode = artifactFactories.item(i); + String name = xmlUtils.getStringXPath(artifactFactoryNode, + "@art:name"); + String description = xmlUtils.getStringXPath( + artifactFactoryNode, "@art:description"); + + NodeList parameterNodeList = xmlUtils.getNodeSetXPath( + artifactFactoryNode, + "art:parameter"); + + if ((parameterNodeList != null && + parameterNodeList.getLength() > 0) || + geometry != null){ + Collection parameters = + new ArrayList(parameterNodeList.getLength()); + for (int j = 0; j < parameterNodeList.getLength(); j++){ + Element parameterNode = (Element)parameterNodeList.item(j); + parameters.add(parameterNode.getAttribute("id")); + } + ParametrizedArtifactObject pao = + new ParametrizedArtifactFactory(name, + description, + server); + pao.addParameters("parameter", parameters); + resultValues.add(pao); + if (geometry != null){ + Collection geometryList = new ArrayList(1); + geometryList.add(geometry); + pao.addParameters("geometry",geometryList); + } + }else{ + ArtifactObject artifactFactory = new ArtifactFactory(name, + description, + server); + resultValues.add(artifactFactory); + } + } + } + log.debug("Artifact Factories: " + resultValues.size()); + return resultValues; + } + + /** + * @throws IOException + */ + private Document doGetRequest(String requestUrl) throws IOException, + ArtifactDatabaseClientException { + return this.doGetRequest(requestUrl, null); + } + + /** + * @throws IOException + */ + private Document doGetRequest(String requestUrl, Document requestBody) + throws IOException, + ArtifactDatabaseClientException { + XMLUtils xmlUtils = new XMLUtils(); + Representation output = doGetRequestInternal(requestUrl, requestBody); + Document document = xmlUtils.readDocument(output.getStream()); + this.check4ExceptionReport(document); + return document; + } + + protected Request initialize(Request request) { + return initialize(request, locale); + } + + protected Request initialize(Request request, Locale locale) { + if (locale != null) { + ClientInfo clientInfo = request.getClientInfo(); + String lang = locale.getLanguage(); + Language language = new Language(lang); + List> acceptedLanguages = + new ArrayList>(2); + acceptedLanguages.add(new Preference(language, 1.0f)); + acceptedLanguages.add(new Preference(Language.ALL, 0.5f)); + clientInfo.setAcceptedLanguages(acceptedLanguages); + } + return request; + } + + /** + * @param requestUrl + * @param requestBody + * @return + */ + private Representation doGetRequestInternal(String requestUrl, + Document requestBody) throws IOException { + Client client = new Client(Protocol.HTTP); + Request request = initialize(new Request(Method.GET, requestUrl)); + if (requestBody != null) { + String documentBody = new XMLUtils() + .writeDocument2String(requestBody); + Representation representation = new StringRepresentation( + documentBody); + request.setEntity(representation); + } + Response response = client.handle(request); + if (response.getStatus().getCode() != 200){ + throw new IOException(response.getStatus().getDescription()); + } + Representation output = response.getEntity(); + return output; + } + + /** + * @throws IOException + */ + private InputStream doPostRequest(String requestUrl, Document requestBody) + throws IOException { + log.debug("##################################################"); + log.debug(new XMLUtils().writeDocument2String(requestBody)); + log.debug("##################################################"); + Client client = new Client(Protocol.HTTP); + Request request = initialize(new Request(Method.POST, requestUrl)); + String documentBody = new XMLUtils().writeDocument2String(requestBody); + Representation representation = new StringRepresentation(documentBody); + request.setEntity(representation); + Response response = client.handle(request); + if (response.getStatus().getCode() != 200){ + throw new IOException(response.getStatus().getDescription()); + } + Representation output = response.getEntity(); + return output.getStream(); + } + + private synchronized void initialize() { + if (!initialized) { + PropertiesReader pr = PropertiesReaderFactory.getInstance() + .getPropertiesReader(); + int count = Integer.parseInt(pr.getPropertieValue( + ARTIFACTDATABASE_COUNT_ID, "0")); + artifactDatabases = new ArrayList(count); + for (int i = 0; i < count; i++) { + artifactDatabases.add(pr.getPropertieValue( + ARTIFACTDATABASE_URL_ID + "." + (i + 1), "N/N")); + } + initialized = true; + } + + } + + /** + * @see de.intevation.gnv.artifactdatabase.client.ArtifactDatabaseClient#createNewArtifact(de.intevation.gnv.artifactdatabase.objects.ArtifactObject) + */ + public ArtifactObject createNewArtifact(ArtifactObject artifactFactory) + throws ArtifactDatabaseClientException { + + try { + Document request = this.createCreateRequestBody(artifactFactory); + Document result = doPostRequest(artifactFactory, request, "create"); + return this.getArtifact(result); + } catch (IOException e) { + log.error(e, e); + throw new ArtifactDatabaseClientException(e); + } + } + + private ArtifactObject getArtifact(Document document) { + XMLUtils xmlUtils = new XMLUtils(); + String uuid = xmlUtils.getStringXPath(document, "/art:result/art:uuid/@value"); + String hash = xmlUtils.getStringXPath(document, "/art:result/art:hash/@value"); + log.info("NEW Artifact: " + uuid + " / " + hash); + return new Artifact(uuid, hash); + } + + private Document createCreateRequestBody(ArtifactObject artifactFactory) { + Document document = new XMLUtils().newDocument(); + Node rootNode = this.createRootNode(document); + Element typeNode = this.createArtifactElement(document, "type"); + typeNode.setAttribute("name", "create"); + rootNode.appendChild(typeNode); + + Element factoryNode = this.createArtifactElement(document, "factory"); + factoryNode.setAttribute("name", artifactFactory.getId()); + rootNode.appendChild(factoryNode); + + if (artifactFactory instanceof ParametrizedArtifactObject){ + Map> parameterMap = + ((ParametrizedArtifactObject)artifactFactory).getParameters(); + if (parameterMap != null && !parameterMap.isEmpty() ){ + Iterator keyIt = parameterMap.keySet().iterator(); + while (keyIt.hasNext()){ + String key = keyIt.next(); + Iterator valueIt = parameterMap.get(key).iterator(); + while (valueIt.hasNext()){ + String value = valueIt.next(); + Element parameterNode = + this.createArtifactElement(document, "parameter"); + parameterNode.setAttribute("name", key); + parameterNode.setAttribute("value", value); + factoryNode.appendChild(parameterNode); + } + } + } + } + return document; + } + + private Element createRootNode(Document document) { + Element rootNode = this.createArtifactElement(document, "action"); + document.appendChild(rootNode); + return rootNode; + } + + /** + * @param document + * @return + */ + private Element createArtifactElement(Document document, String name) { + XMLUtils.ElementCreator creator = new XMLUtils.ElementCreator( + document, + NAMESPACE_URI, + NAMESPACE_PREFIX + ); + + return creator.create(name); + } + + /** + * @param artifactFactory + * @param xmlUtils + * @param request + * @throws IOException + */ + private Document doPostRequest(ArtifactObject artifactFactory, + Document request, String suburl) + throws IOException, + ArtifactDatabaseClientException { + XMLUtils xmlUtils = new XMLUtils(); + String url = ((ArtifactFactory) artifactFactory).getDataBaseUrl(); + InputStream is = this.doPostRequest(url + "/" + suburl, request); + Document result = xmlUtils.readDocument(is); + this.check4ExceptionReport(result); + return result; + } + + /** + * @see de.intevation.gnv.artifactdatabase.client.ArtifactDatabaseClient#getCurrentStepDescription(de.intevation.gnv.artifactdatabase.objects.ArtifactFactory, + * de.intevation.gnv.artifactdatabase.objects.ArtifactObject) + */ + public ArtifactDescription getCurrentStepDescription( + ArtifactObject artifactFactory, + ArtifactObject currentArtifact, + boolean includeUI) + throws ArtifactDatabaseClientException { + try { + String url = this.getArtifactUrl(artifactFactory, currentArtifact); + Document request = this.createDescribeRequestBody(currentArtifact, + includeUI); + InputStream describeResult = this.doPostRequest(url, request); + + return this.readDescription(new XMLUtils().readDocument(describeResult), + currentArtifact); + } catch (IOException e) { + log.error(e, e); + throw new ArtifactDatabaseClientException(e); + } + } + + + private Document createDescribeRequestBody(ArtifactObject currentArtifact, + boolean includeUI){ + + Document document = new XMLUtils().newDocument(); + Node rootNode = this.createRootNode(document); + + Element typeNode = this.createArtifactElement(document, "type"); + typeNode.setAttribute("name", "describe"); + rootNode.appendChild(typeNode); + + Element uuidNode = this.createArtifactElement(document, "uuid"); + uuidNode.setAttribute("value", currentArtifact.getId()); + rootNode.appendChild(uuidNode); + + Element hashNode = this.createArtifactElement(document, "hash"); + hashNode.setAttribute("value", currentArtifact.getHash()); + rootNode.appendChild(hashNode); + Element includeUINode = this.createArtifactElement(document, "include-ui"); + includeUINode.appendChild(document.createTextNode(""+includeUI)); + rootNode.appendChild(includeUINode); + return document; + } + + /** + * @param artifactFactory + * @param currentArtifact + * @return + */ + private String getArtifactUrl(ArtifactObject artifactFactory, + ArtifactObject currentArtifact) { + String url = ((ArtifactFactory) artifactFactory).getDataBaseUrl() + + "/artifact/" + currentArtifact.getId(); + return url; + } + + private ArtifactDescription readDescription(Document document, + ArtifactObject artifact) + throws ArtifactDatabaseClientException { + // Check if there was an Error or Exception reported from the + // ArtifactDatabase + this.check4ExceptionReport(document); + XMLUtils xmlUtils = new XMLUtils(); + if (artifact instanceof ArtifactDescription) { + ArtifactDescription ad = (ArtifactDescription) artifact; + Node uiNode = xmlUtils.getNodeXPath(document, "/art:result/art:ui"); + Node outputNode = xmlUtils + .getNodeXPath(document, "/art:result/art:outputs"); + + Map outputModes = null; + if (outputNode != null) { + NodeList outputModesNodes = xmlUtils.getNodeSetXPath( + outputNode, "art:output"); + if (outputModesNodes != null) { + outputModes = new HashMap( + outputModesNodes.getLength()); + for (int i = 0; i < outputModesNodes.getLength(); i++) { + Node outputModeNode = outputModesNodes.item(i); + String name = xmlUtils.getStringXPath(outputModeNode, + "@name"); + String mimeType = xmlUtils.getStringXPath( + outputModeNode, "@mime-type"); + + NodeList parameterNodes = xmlUtils.getNodeSetXPath( + outputModeNode, "art:parameter/art:parameter"); + Collection parameter = null; + if (parameterNodes != null) { + parameter = new ArrayList( + parameterNodes.getLength()); + for (int j = 0; j < parameterNodes.getLength(); j++) { + Node outputParameterNode = parameterNodes + .item(j); + parameter.add(new DefaultOutputParameter( + xmlUtils.getStringXPath( + outputParameterNode, "@name"), + xmlUtils.getStringXPath( + outputParameterNode, "@value"), + xmlUtils.getStringXPath( + outputParameterNode, "@name"), + xmlUtils.getStringXPath( + outputParameterNode, "@type"))); + } + } + + NodeList exportNodes = xmlUtils.getNodeSetXPath( + outputModeNode, "art:exports/art:export"); + Map exports = null; + + if (exportNodes != null) { + int size = exportNodes.getLength(); + exports = new HashMap(size); + + for (int k = 0; k < size; k++) { + Node export = exportNodes.item(k); + String expName = xmlUtils.getStringXPath( + export, "@name"); + exports.put(expName, new DefaultExportMode( + expName, + xmlUtils.getStringXPath(export, "@description"), + xmlUtils.getStringXPath(export, "@mime-type"))); + } + } + + outputModes.put(name, new DefaultOutputMode(name, + mimeType, parameter, exports)); + } + + } + } + + String currentState = xmlUtils.getStringXPath(document, + "/art:result/art:state/@name"); + NodeList statesList = xmlUtils.getNodeSetXPath(document, + "/art:result/art:reachable-states/art:state/@name"); + Collection reachableStates = new ArrayList( + statesList.getLength()); + for (int i = 0; i < statesList.getLength(); i++) { + reachableStates.add(statesList.item(i).getNodeValue()); + } + + NodeList inputNodes = xmlUtils.getNodeSetXPath(document, + "/art:result/art:model/art:input"); + if (inputNodes != null) { + Collection inputParameter = new ArrayList( + inputNodes.getLength()); + for (int i = 0; i < inputNodes.getLength(); i++) { + Node inputNode = inputNodes.item(i); + String name = xmlUtils.getStringXPath(inputNode, "@name"); + inputParameter.add(name); + } + ad.setInputParameter(inputParameter); + } + + ad.setOutputModes(outputModes); + ad.setCurrentOut(outputNode); + ad.setCurrentUI(uiNode); + ad.setCurrentState(currentState); + ad.setReachableStates(reachableStates); + return ad; + } else { + log.error("Artifact must be Instance of ArtifactDescription"); + throw new ArtifactDatabaseClientException( + "Artifact must be Instance of ArtifactDescription"); + } + + } + + /** + * @see de.intevation.gnv.artifactdatabase.client.ArtifactDatabaseClient#doNextStep(de.intevation.gnv.artifactdatabase.objects.ArtifactObject, + * de.intevation.gnv.artifactdatabase.objects.ArtifactObject, + * java.lang.String, java.util.Collection) + */ + public ArtifactDescription doNextStep( + ArtifactObject artifactFactory, + ArtifactObject currentArtifact, + String target, + Collection inputParameter) + throws ArtifactDatabaseClientException { + + try { + // 1 Feed + this.doFeed(artifactFactory, currentArtifact, inputParameter); + + // 2. Noch einmal Describe um das jetzt zu erreichende Ziel zu ermitteln + ArtifactDescription ad = getCurrentStepDescription( + artifactFactory, + new Artifact(currentArtifact.getId(), + currentArtifact.getHash()), + false + ); + + target = ad.getReachableStates().iterator().next(); + + // 3 Advance + doAdvance(artifactFactory, currentArtifact, target); + + // 3 Describe + return this.getCurrentStepDescription(artifactFactory, + currentArtifact,true); + } catch (IOException e) { + log.error(e, e); + throw new ArtifactDatabaseClientException(e); + } + } + + + public void doAdvance( + ArtifactObject factory, + ArtifactObject artifact, + String target + ) throws IOException, ArtifactDatabaseClientException { + String url = getArtifactUrl(factory, artifact); + Document advanceDocument = createAdvanceRequestBody(artifact, target); + InputStream advanceResult = doPostRequest(url, advanceDocument); + check4ExceptionReport(new XMLUtils().readDocument(advanceResult)); + } + + private Document createFeedRequestBody( + ArtifactObject currentArtifact, + Collection inputParameter) { + Document document = new XMLUtils().newDocument(); + Node rootNode = this.createRootNode(document); + + Element typeNode = this.createArtifactElement(document, "type"); + typeNode.setAttribute("name", "feed"); + rootNode.appendChild(typeNode); + + Element uuidNode = this.createArtifactElement(document, "uuid"); + uuidNode.setAttribute("value", currentArtifact.getId()); + rootNode.appendChild(uuidNode); + + Element hashNode = this.createArtifactElement(document, "hash"); + hashNode.setAttribute("value", currentArtifact.getHash()); + rootNode.appendChild(hashNode); + + Node dataNode = this.createParameterNodes(inputParameter, document, + "data"); + rootNode.appendChild(dataNode); + + return document; + } + + /** + * @param inputParameter + * @param document + * @param rootNode + */ + private Node createParameterNodes( + Collection inputParameter, + Document document, String nodeName) { + Element dataNode = this.createArtifactElement(document, nodeName); + + if (inputParameter != null) { + Iterator it = inputParameter.iterator(); + while (it.hasNext()) { + InputParameter ip = it.next(); + String name = ip.getName(); + String[] values = ip.getValues(); + if (values != null) { + for (int i = 0; i < values.length; i++) { + String value = values[i]; + Element inputNode = this.createArtifactElement( + document, "input"); + inputNode.setAttribute("name", name); + inputNode.setAttribute("value", value); + dataNode.appendChild(inputNode); + } + } + } + } + return dataNode; + } + + private Document createAdvanceRequestBody(ArtifactObject currentArtifact, + String target) { + Document document = new XMLUtils().newDocument(); + Node rootNode = this.createRootNode(document); + + Element typeNode = this.createArtifactElement(document, "type"); + typeNode.setAttribute("name", "advance"); + rootNode.appendChild(typeNode); + + Element uuidNode = this.createArtifactElement(document, "uuid"); + uuidNode.setAttribute("value", currentArtifact.getId()); + rootNode.appendChild(uuidNode); + + Element hashNode = this.createArtifactElement(document, "hash"); + hashNode.setAttribute("value", currentArtifact.getHash()); + rootNode.appendChild(hashNode); + Element targetNode = this.createArtifactElement(document, "target"); + targetNode.setAttribute("name", target); + rootNode.appendChild(targetNode); + return document; + } + + /** + * @see de.intevation.gnv.artifactdatabase.client.ArtifactDatabaseClient#doOutput(de.intevation.gnv.artifactdatabase.objects.ArtifactObject, + * de.intevation.gnv.artifactdatabase.objects.ArtifactObject, + * java.io.OutputStream, java.lang.String, java.lang.String, + * java.util.Collection) + */ + public void doOutput( + ArtifactObject artifactFactory, + ArtifactObject currentArtifact, + OutputStream stream, + String targetName, + String exportMode, + String mimeType, + Collection inputParameter) + throws ArtifactDatabaseClientException + { + try { + Document requestBody = this.createOutRequestBody( + currentArtifact, + targetName, + exportMode, + mimeType, + inputParameter); + + String requestUrl = this.getArtifactUrl(artifactFactory, + currentArtifact) + + "/" + targetName; + InputStream is = this.doPostRequest(requestUrl, requestBody); + + byte[] b = new byte[4096]; + int i = -1; + while ((i = is.read(b)) > 0) { + stream.write(b, 0, i); + } + } catch (IOException e) { + log.error(e, e); + throw new ArtifactDatabaseClientException(e); + } + } + + private Document createOutRequestBody( + ArtifactObject currentArtifact, + String target, + String exportMode, + String mimeType, + Collection inputParameter) + { + Document document = new XMLUtils().newDocument(); + Node rootNode = this.createRootNode(document); + + Element typeNode = this.createArtifactElement(document, "type"); + typeNode.setAttribute("name", "out"); + rootNode.appendChild(typeNode); + + Element uuidNode = this.createArtifactElement(document, "uuid"); + uuidNode.setAttribute("value", currentArtifact.getId()); + rootNode.appendChild(uuidNode); + + Element hashNode = this.createArtifactElement(document, "hash"); + hashNode.setAttribute("value", currentArtifact.getHash()); + rootNode.appendChild(hashNode); + + Element outNode = this.createArtifactElement(document, "out"); + outNode.setAttribute("name", target); + rootNode.appendChild(outNode); + + Element exportNode = this.createArtifactElement(document, "export"); + exportNode.setAttribute("name", exportMode); + outNode.appendChild(exportNode); + + Element mimeTypeNode = this.createArtifactElement(document, "mime-type"); + mimeTypeNode.setAttribute("value", mimeType); + outNode.appendChild(mimeTypeNode); + + Node parameterNode = this.createParameterNodes(inputParameter, + document, "params"); + outNode.appendChild(parameterNode); + + return document; + } + + /** + * @see de.intevation.gnv.artifactdatabase.client.ArtifactDatabaseClient#doFeed(de.intevation.gnv.artifactdatabase.objects.ArtifactObject, + * de.intevation.gnv.artifactdatabase.objects.ArtifactObject, + * java.util.Collection) + */ + public void doFeed(ArtifactObject artifactFactory, + ArtifactObject currentArtifact, + Collection inputParameter) + throws ArtifactDatabaseClientException { + + try { + Document feedDocument = this.createFeedRequestBody(currentArtifact, + inputParameter); + String url = this.getArtifactUrl(artifactFactory, currentArtifact); + InputStream feedResult = this.doPostRequest(url, feedDocument); + Document feedResultDocument = new XMLUtils() + .readDocument(feedResult); + this.check4ExceptionReport(feedResultDocument); + } catch (IOException e) { + log.error(e, e); + throw new ArtifactDatabaseClientException(e); + } + } + + private void check4ExceptionReport(Document document) + throws ArtifactDatabaseClientException { + + String message = new XMLUtils().getStringXPath(document, + "/art:exceptionreport/art:exception"); + if (message != null) { + throw new ArtifactDatabaseClientException(message); + } + + } + + public Document publishWMS(ArtifactObject factory, ArtifactObject artifact) { + log.debug("Start wms publishing..."); + + String target = "wms"; + String requestURL = getArtifactUrl(factory, artifact) + "/" + target; + Document request = createOutRequestBody( + artifact, target, "", "text/xml", null); + try { + InputStream input = doPostRequest(requestURL, request); + Document result = XMLUtils.readDocument(input); + + return result; + } + catch (IOException ioe) { + log.error(ioe, ioe); + return null; + } + } + + public Collection calculateStatistics( + ArtifactObject artifactFactory, + ArtifactObject currentArtifact) + throws ArtifactDatabaseClientException + { + log.debug("DefaultArtifactDatabaseClient.calculateStatistics"); + Collection resultValues = null; + + try { + String targetName = "statistics"; + String requestUrl = this.getArtifactUrl(artifactFactory, + currentArtifact) + "/" + targetName; + Document requestBody = this.createOutRequestBody(currentArtifact, + targetName, "", "text/xml", null); + XMLUtils xmlUtils = new XMLUtils(); + InputStream is = this.doPostRequest(requestUrl, requestBody); + Document resultDocument = xmlUtils.readDocument(is); + if (resultDocument != null) { + + NodeList statisticSetNodes = xmlUtils.getNodeSetXPath(resultDocument, + "/art:statistics/art:statistic"); + resultValues = new ArrayList + (statisticSetNodes.getLength()); + for (int i = 0; i < statisticSetNodes.getLength(); i++) { + Element statisticSetNode = (Element)statisticSetNodes.item(i); + String name = statisticSetNode.getAttribute("name"); + ArtifactStatisticsSet set = + new DefaultArtifactStatisticsSet(name); + NodeList resultNodes = xmlUtils.getNodeSetXPath(statisticSetNode, + "art:statistic-value"); + if (resultNodes != null) { + for (int j = 0; j < resultNodes.getLength(); j++) { + Element statisticNode = (Element)resultNodes.item(j); + String statisticName = statisticNode. + getAttribute("name"); + String statisticValue = statisticNode. + getAttribute("value"); + set.addStatisticValues( + new DefaultArtifactStatisticValue + (statisticName,statisticValue)); + } + } + resultValues.add(set); + } + } + } catch (IOException e) { + log.error(e, e); + throw new ArtifactDatabaseClientException(e); + } + + return resultValues; + } + + public void setLocale(Locale locale) { + this.locale = locale; + } + + /** + * @see de.intevation.gnv.artifactdatabase.client.ArtifactDatabaseClient#getArtifactFactoryMetaInformation(java.util.Collection, java.lang.String, java.lang.String) + */ + public Collection getArtifactFactoryMetaInformation( + Collection mapServices, + String geometry, + String srs) + throws ArtifactDatabaseClientException { + log.debug("DefaultArtifactDatabaseClient.getArtifactFactories"); + Collection resultValues = null; + try { + this.initialize(); + Iterator it = artifactDatabases.iterator(); + Document requestBody = this.createMetaDataRequestBody(mapServices, + geometry, + srs); + while (it.hasNext()) { + String server = it.next(); + String url = server + "/service/metadata/"; + log.debug(url); + + InputStream resultStream = this.doPostRequest(url, requestBody); + resultValues = this.parseMetaDataResult(resultStream, server,geometry); + } + } catch (IOException e) { + log.error(e,e); + } + return resultValues; + } + + private Collection parseMetaDataResult( + InputStream inputStream, + String server, + String geometry) throws ArtifactDatabaseClientException{ + XMLUtils xmlUtils = new XMLUtils(); + Document document = xmlUtils.readDocument(inputStream); + this.check4ExceptionReport(document); + return this.getArtifactFactories(document, server,geometry); + } + + private Document createMetaDataRequestBody(Collection mapServices, + String geometry, + String srs){ + log.debug("DefaultArtifactDatabaseClient.createMetaDataRequestBody"); + Document document = new XMLUtils().newDocument(); + Node rootNode = this.createArtifactElement(document, "GetMetaData"); + document.appendChild(rootNode); + + Element locationNode = this.createArtifactElement(document, "location"); + locationNode.setAttribute("srs", srs); + locationNode.appendChild(document.createTextNode(geometry)); + rootNode.appendChild(locationNode); + + Element mapServicesNode = this.createArtifactElement(document, + "mapservices"); + Iterator it = mapServices.iterator(); + while (it.hasNext()){ + MapService mapService = it.next(); + Element mapServiceNode = this.createArtifactElement(document, + "mapservice"); + mapServiceNode.setAttribute("id", mapService.getID()); + mapServiceNode.setAttribute("type", mapService.getType()); + mapServiceNode.setAttribute("url", mapService.getURL()); + if (mapService.getLayer() != null){ + Iterator layer = mapService.getLayer().iterator(); + while (layer.hasNext()){ + Layer tmpLayer = layer.next(); + Element layerNode = this.createArtifactElement(document, + "layer"); + layerNode.setAttribute("id", tmpLayer.getID()); + layerNode.setAttribute("name", tmpLayer.getName()); + layerNode.setAttribute("isgrouplayer", + ""+tmpLayer.isGroupLayer()); + layerNode.setAttribute("parentid", tmpLayer.parentID()); + mapServiceNode.appendChild(layerNode); + } + } + mapServicesNode.appendChild(mapServiceNode); + } + rootNode.appendChild(mapServicesNode); + return document; + } +} diff -r f99d8f92a640 -r 755dd2fa4a0a gnv/src/main/java/de/intevation/gnv/artifactdatabase/client/exception/ArtifactDatabaseClientException.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv/src/main/java/de/intevation/gnv/artifactdatabase/client/exception/ArtifactDatabaseClientException.java Fri Sep 28 12:13:53 2012 +0200 @@ -0,0 +1,52 @@ +/** + * + */ +package de.intevation.gnv.artifactdatabase.client.exception; + +/** + * @author Tim Englich + * + */ +public class ArtifactDatabaseClientException extends Exception { + + /** + * The UID of this Class + */ + private static final long serialVersionUID = -8979622024425251952L; + + /** + * Constructor + */ + public ArtifactDatabaseClientException() { + super(); + } + + /** + * Constructor + * + * @param arg0 + */ + public ArtifactDatabaseClientException(String arg0) { + super(arg0); + } + + /** + * Constructor + * + * @param arg0 + */ + public ArtifactDatabaseClientException(Throwable arg0) { + super(arg0); + } + + /** + * Constructor + * + * @param arg0 + * @param arg1 + */ + public ArtifactDatabaseClientException(String arg0, Throwable arg1) { + super(arg0, arg1); + } + +} diff -r f99d8f92a640 -r 755dd2fa4a0a gnv/src/main/java/de/intevation/gnv/artifactdatabase/objects/Artifact.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv/src/main/java/de/intevation/gnv/artifactdatabase/objects/Artifact.java Fri Sep 28 12:13:53 2012 +0200 @@ -0,0 +1,179 @@ +/** + * + */ +package de.intevation.gnv.artifactdatabase.objects; + +import java.util.Collection; +import java.util.Map; + +import org.w3c.dom.Node; + +/** + * @author Tim Englich + * + */ +public class Artifact implements ArtifactObject, ArtifactDescription { + + + /** + * The UID of this Class + */ + private static final long serialVersionUID = 8606869493141810364L; + + private String id = null; + private String hash = null; + private boolean selected = false; + + private Node currentUI = null; + private Node currentOut = null; + + private Collection reachableStates; + private Collection inputParameter; + private Map outputModes; + private String currentState = null; + + /** + * @see de.intevation.gnv.artifactdatabase.objects.ArtifactDescription#getCurrentUI() + */ + public Node getCurrentUI() { + return currentUI; + } + + /** + * @see de.intevation.gnv.artifactdatabase.objects.ArtifactDescription#setCurrentUI(org.w3c.dom.Node) + */ + public void setCurrentUI(Node currentUI) { + this.currentUI = currentUI; + } + + /** + * @return the currentOut + */ + public Node getCurrentOut() { + return currentOut; + } + + /** + * @see de.intevation.gnv.artifactdatabase.objects.ArtifactDescription#setCurrentOut(org.w3c.dom.Node) + */ + public void setCurrentOut(Node currentOut) { + this.currentOut = currentOut; + } + + /** + * @see de.intevation.gnv.artifactdatabase.objects.ArtifactDescription#getReachableStates() + */ + public Collection getReachableStates() { + return reachableStates; + } + + /** + * @see de.intevation.gnv.artifactdatabase.objects.ArtifactDescription#setReachableStates(java.util.Collection) + */ + public void setReachableStates(Collection reachableStates) { + this.reachableStates = reachableStates; + } + + /** + * @see de.intevation.gnv.artifactdatabase.objects.ArtifactDescription#getCurrentState() + */ + public String getCurrentState() { + return currentState; + } + + /** + * @see de.intevation.gnv.artifactdatabase.objects.ArtifactDescription#setCurrentState(java.lang.String) + */ + public void setCurrentState(String currentState) { + this.currentState = currentState; + } + + /** + * Constructor + */ + public Artifact(String uuid, String hash) { + + this.id = uuid; + this.hash = hash; + } + + /** + * @see de.intevation.gnv.artifactdatabase.objects.ArtifactObject#getHash() + */ + public String getHash() { + return this.hash; + } + + /** + * @see de.intevation.gnv.artifactdatabase.objects.ArtifactObject#getDescription() + */ + public String getDescription() { + return this.id; + } + + /** + * @see de.intevation.gnv.artifactdatabase.objects.ArtifactObject#getId() + */ + public String getId() { + return this.id; + } + + /** + * @see de.intevation.gnv.artifactdatabase.objects.ArtifactObject#getName() + */ + public String getName() { + return this.id; + } + + /** + * @see de.intevation.gnv.artifactdatabase.objects.ArtifactObject#isSelected() + */ + public boolean isSelected() { + return this.selected; + } + + /** + * @see de.intevation.gnv.artifactdatabase.objects.ArtifactObject#setSelected(boolean) + */ + public void setSelected(boolean selected) { + this.selected = selected; + } + + /** + * @see de.intevation.gnv.artifactdatabase.objects.ArtifactDescription#getInputParameter() + */ + public Collection getInputParameter() { + return this.inputParameter; + } + + /** + * @see de.intevation.gnv.artifactdatabase.objects.ArtifactDescription#setInputParameter(java.util.Collection) + */ + public void setInputParameter(Collection inputParameter) { + this.inputParameter = inputParameter; + } + + /** + * @see de.intevation.gnv.artifactdatabase.objects.ArtifactDescription#getOutputModes() + */ + public Map getOutputModes() { + return this.outputModes; + } + + /** + * @see de.intevation.gnv.artifactdatabase.objects.ArtifactDescription#getOutputModesAsCollection() + */ + public Collection getOutputModesAsCollection() { + if (this.outputModes != null) { + return this.outputModes.values(); + } + return null; + } + + /** + * @see de.intevation.gnv.artifactdatabase.objects.ArtifactDescription#setOutputModes(java.util.Map) + */ + public void setOutputModes(Map outputModes) { + this.outputModes = outputModes; + } +} diff -r f99d8f92a640 -r 755dd2fa4a0a gnv/src/main/java/de/intevation/gnv/artifactdatabase/objects/ArtifactDescription.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv/src/main/java/de/intevation/gnv/artifactdatabase/objects/ArtifactDescription.java Fri Sep 28 12:13:53 2012 +0200 @@ -0,0 +1,82 @@ +/** + * + */ +package de.intevation.gnv.artifactdatabase.objects; + +import java.io.Serializable; +import java.util.Collection; +import java.util.Map; + +import org.w3c.dom.Node; + +/** + * @author Tim Englich + * + */ +public interface ArtifactDescription extends Serializable { + + /** + * @return the currentUI + */ + public Node getCurrentUI(); + + /** + * @param currentUI + * the currentUI to set + */ + public void setCurrentUI(Node currentUI); + + /** + * @param currentOut + * the currentOut to set + */ + public void setCurrentOut(Node currentOut); + + /** + * @return the reachableStates + */ + public Collection getReachableStates(); + + /** + * @param reachableStates + * the reachableStates to set + */ + public void setReachableStates(Collection reachableStates); + + /** + * @return the currentState + */ + public String getCurrentState(); + + /** + * @param currentState + * the currentState to set + */ + public void setCurrentState(String currentState); + + /** + * @return the reachableStates + */ + public Collection getInputParameter(); + + /** + * @param inputParameter + */ + public void setInputParameter(Collection inputParameter); + + /** + * @return the reachableStates + */ + public Map getOutputModes(); + + /** + * @return the reachableStates + */ + public Collection getOutputModesAsCollection(); + + /** + * @param outputParameter + */ + public void setOutputModes(Map outputModes); + +} \ No newline at end of file diff -r f99d8f92a640 -r 755dd2fa4a0a gnv/src/main/java/de/intevation/gnv/artifactdatabase/objects/ArtifactFactory.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv/src/main/java/de/intevation/gnv/artifactdatabase/objects/ArtifactFactory.java Fri Sep 28 12:13:53 2012 +0200 @@ -0,0 +1,100 @@ +/** + * + */ +package de.intevation.gnv.artifactdatabase.objects; + +/** + * @author Tim Englich + * + */ +public class ArtifactFactory implements ArtifactObject { + + /** + * The UID of this Class. + */ + private static final long serialVersionUID = 5453748230625831527L; + + private String name = null; + + private String description = null; + + private boolean selected = false; + + private String dataBaseUrl = null; + + /** + * @return the dataBaseUrl + */ + public String getDataBaseUrl() { + return dataBaseUrl; + } + + /** + * Constructor + * + * @param name + * @param description + * @param dataBaseUrl + */ + public ArtifactFactory(String name, String description, String dataBaseUrl) { + super(); + this.name = name; + this.description = description; + this.dataBaseUrl = dataBaseUrl; + } + + /** + * @see de.intevation.gnv.artifactdatabase.objects.ArtifactObject#getId() + */ + public String getId() { + return this.name; + } + + /** + * @see de.intevation.gnv.artifactdatabase.objects.ArtifactObject#isSelected() + */ + public boolean isSelected() { + + return this.selected; + } + + /** + * @see de.intevation.gnv.artifactdatabase.objects.ArtifactObject#setSelected(boolean) + */ + public void setSelected(boolean selected) { + this.selected = selected; + } + + /** + * @see de.intevation.gnv.artifactdatabase.objects.ArtifactObject#getName() + */ + public String getName() { + return name; + } + + /** + * @see de.intevation.gnv.artifactdatabase.objects.ArtifactObject#getDescription() + */ + public String getDescription() { + return description; + } + + /** + * @see de.intevation.gnv.artifactdatabase.objects.ArtifactObject#getHash() + */ + public String getHash() { + return null; + } + + @Override + public boolean equals(Object obj) { + boolean returnValue = false; + if (obj instanceof ArtifactFactory){ + ArtifactFactory af = (ArtifactFactory)obj; + returnValue = this.getName().equals(af.getName()) && + this.getDataBaseUrl().equals(af.getDataBaseUrl()); + } + return returnValue; + } + +} diff -r f99d8f92a640 -r 755dd2fa4a0a gnv/src/main/java/de/intevation/gnv/artifactdatabase/objects/ArtifactObject.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv/src/main/java/de/intevation/gnv/artifactdatabase/objects/ArtifactObject.java Fri Sep 28 12:13:53 2012 +0200 @@ -0,0 +1,26 @@ +/** + * + */ +package de.intevation.gnv.artifactdatabase.objects; + +import java.io.Serializable; + +/** + * @author Tim Englich + * + */ +public interface ArtifactObject extends Serializable { + + public String getId(); + + public boolean isSelected(); + + public void setSelected(boolean selected); + + public String getName(); + + public String getDescription(); + + public String getHash(); + +} diff -r f99d8f92a640 -r 755dd2fa4a0a gnv/src/main/java/de/intevation/gnv/artifactdatabase/objects/ArtifactStatisticValue.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv/src/main/java/de/intevation/gnv/artifactdatabase/objects/ArtifactStatisticValue.java Fri Sep 28 12:13:53 2012 +0200 @@ -0,0 +1,18 @@ +/** + * + */ +package de.intevation.gnv.artifactdatabase.objects; + +import java.io.Serializable; + +/** + * @author Tim Englich + * + */ +public interface ArtifactStatisticValue extends Serializable { + + String getKey(); + + String getValue(); + +} diff -r f99d8f92a640 -r 755dd2fa4a0a gnv/src/main/java/de/intevation/gnv/artifactdatabase/objects/ArtifactStatisticsSet.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv/src/main/java/de/intevation/gnv/artifactdatabase/objects/ArtifactStatisticsSet.java Fri Sep 28 12:13:53 2012 +0200 @@ -0,0 +1,22 @@ +/** + * + */ +package de.intevation.gnv.artifactdatabase.objects; + +import java.io.Serializable; +import java.util.Collection; + +/** + * @author Tim Englich + * + */ +public interface ArtifactStatisticsSet extends Serializable { + + + String getName(); + + Collection getStatisticValues(); + + void addStatisticValues(ArtifactStatisticValue value); + +} diff -r f99d8f92a640 -r 755dd2fa4a0a gnv/src/main/java/de/intevation/gnv/artifactdatabase/objects/DefaultArtifactStatisticValue.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv/src/main/java/de/intevation/gnv/artifactdatabase/objects/DefaultArtifactStatisticValue.java Fri Sep 28 12:13:53 2012 +0200 @@ -0,0 +1,35 @@ +/** + * + */ +package de.intevation.gnv.artifactdatabase.objects; + +/** + * @author Tim Englich + * + */ +public class DefaultArtifactStatisticValue implements ArtifactStatisticValue { + + /** + * The UID of this Class. + */ + private static final long serialVersionUID = -8409111023127835398L; + + private String key = null; + + private String value = null; + + public DefaultArtifactStatisticValue(String key, String value) { + super(); + this.key = key; + this.value = value; + } + + public String getKey() { + return this.key; + } + + public String getValue() { + return this.value; + } + +} diff -r f99d8f92a640 -r 755dd2fa4a0a gnv/src/main/java/de/intevation/gnv/artifactdatabase/objects/DefaultArtifactStatisticsSet.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv/src/main/java/de/intevation/gnv/artifactdatabase/objects/DefaultArtifactStatisticsSet.java Fri Sep 28 12:13:53 2012 +0200 @@ -0,0 +1,52 @@ +/** + * + */ +package de.intevation.gnv.artifactdatabase.objects; + +import java.util.ArrayList; +import java.util.Collection; + +/** + * @author Tim Englich + * + */ +public class DefaultArtifactStatisticsSet implements ArtifactStatisticsSet{ + + /** + * The UID of this Class. + */ + private static final long serialVersionUID = 6738878381515708602L; + + private String name = null; + + private Collection statisticValues = + new ArrayList(); + /** + * Constructor + */ + public DefaultArtifactStatisticsSet(String name) { + this.name = name; + } + + /** + * @see de.intevation.gnv.artifactdatabase.objects.ArtifactStatisticsSet#addStatisticValues(de.intevation.gnv.artifactdatabase.objects.ArtifactStatisticValue) + */ + public void addStatisticValues(ArtifactStatisticValue value) { + this.statisticValues.add(value); + } + + /** + * @see de.intevation.gnv.artifactdatabase.objects.ArtifactStatisticsSet#getName() + */ + public String getName() { + return this.name; + } + + /** + * @see de.intevation.gnv.artifactdatabase.objects.ArtifactStatisticsSet#getStatisticValues() + */ + public Collection getStatisticValues() { + return this.statisticValues; + } + +} diff -r f99d8f92a640 -r 755dd2fa4a0a gnv/src/main/java/de/intevation/gnv/artifactdatabase/objects/DefaultExportMode.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv/src/main/java/de/intevation/gnv/artifactdatabase/objects/DefaultExportMode.java Fri Sep 28 12:13:53 2012 +0200 @@ -0,0 +1,31 @@ +package de.intevation.gnv.artifactdatabase.objects; + +/** + * @author Ingo Weinzierl (ingo.weinzierl@intevation.de) + */ +public class DefaultExportMode +implements ExportMode +{ + protected String name; + protected String description; + protected String mimeType; + + public DefaultExportMode(String name, String description, String mimeType){ + this.name = name; + this.description = description; + this.mimeType = mimeType; + } + + public String getName() { + return name; + } + + public String getDescription() { + return description; + } + + public String getMimeType() { + return mimeType; + } +} +// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8: diff -r f99d8f92a640 -r 755dd2fa4a0a gnv/src/main/java/de/intevation/gnv/artifactdatabase/objects/DefaultInputParameter.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv/src/main/java/de/intevation/gnv/artifactdatabase/objects/DefaultInputParameter.java Fri Sep 28 12:13:53 2012 +0200 @@ -0,0 +1,47 @@ +/** + * + */ +package de.intevation.gnv.artifactdatabase.objects; + +/** + * @author Tim Englich + * + */ +public class DefaultInputParameter implements InputParameter { + + /** + * The UID of this Class. + */ + private static final long serialVersionUID = 6597439837482244211L; + + private String name = null; + + private String[] values = null; + + /** + * Constructor + * + * @param name + * @param values + */ + public DefaultInputParameter(String name, String[] values) { + super(); + this.name = name; + this.values = values; + } + + /** + * @see de.intevation.gnv.artifactdatabase.objects.InputParameter#getName() + */ + public String getName() { + return this.name; + } + + /** + * @see de.intevation.gnv.artifactdatabase.objects.InputParameter#getValues() + */ + public String[] getValues() { + return this.values; + } + +} diff -r f99d8f92a640 -r 755dd2fa4a0a gnv/src/main/java/de/intevation/gnv/artifactdatabase/objects/DefaultOutputMode.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv/src/main/java/de/intevation/gnv/artifactdatabase/objects/DefaultOutputMode.java Fri Sep 28 12:13:53 2012 +0200 @@ -0,0 +1,65 @@ +/** + * + */ +package de.intevation.gnv.artifactdatabase.objects; + +import java.util.Collection; +import java.util.Map; + +/** + * @author Tim Englich + * + */ +public class DefaultOutputMode implements OutputMode { + + /** + * The UID of this Class. + */ + private static final long serialVersionUID = 7487880486604174521L; + + private String name = null; + + private String mimeType = null; + + private Collection outputParameter = null; + + private Map exports; + + public DefaultOutputMode( + String name, + String mimeType, + Collection outputParameter, + Map exports) + { + super(); + this.name = name; + this.mimeType = mimeType; + this.outputParameter = outputParameter; + this.exports = exports; + } + + /** + * @see de.intevation.gnv.artifactdatabase.objects.OutputMode#getMimeType() + */ + public String getMimeType() { + return this.mimeType; + } + + /** + * @see de.intevation.gnv.artifactdatabase.objects.OutputMode#getName() + */ + public String getName() { + return this.name; + } + + /** + * @see de.intevation.gnv.artifactdatabase.objects.OutputMode#getOutputParameters() + */ + public Collection getOutputParameters() { + return this.outputParameter; + } + + public ExportMode getExportMode(String mode) { + return exports.get(mode); + } +} diff -r f99d8f92a640 -r 755dd2fa4a0a gnv/src/main/java/de/intevation/gnv/artifactdatabase/objects/DefaultOutputParameter.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv/src/main/java/de/intevation/gnv/artifactdatabase/objects/DefaultOutputParameter.java Fri Sep 28 12:13:53 2012 +0200 @@ -0,0 +1,63 @@ +/** + * + */ +package de.intevation.gnv.artifactdatabase.objects; + +/** + * @author Tim Englich + * + */ +public class DefaultOutputParameter implements OutputParameter { + + /** + * The UID of this Class. + */ + private static final long serialVersionUID = -8416057640116638152L; + + private String name = null; + + private String value = null; + + private String description = null; + + private String type = null; + + /** + * Constructor + * + * @param name + * @param value + * @param description + */ + public DefaultOutputParameter(String name, String value, + String description, String type) { + super(); + this.name = name; + this.value = value; + this.description = description; + this.type = type; + } + + /** + * @see de.intevation.gnv.artifactdatabase.objects.OutputParameter#getName() + */ + public String getName() { + return this.name; + } + + /** + * @see de.intevation.gnv.artifactdatabase.objects.OutputParameter#getValue() + */ + public String getValue() { + return this.value; + } + + public String getDescription() { + return this.description; + } + + public String getType() { + return this.type; + } + +} diff -r f99d8f92a640 -r 755dd2fa4a0a gnv/src/main/java/de/intevation/gnv/artifactdatabase/objects/ExportMode.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv/src/main/java/de/intevation/gnv/artifactdatabase/objects/ExportMode.java Fri Sep 28 12:13:53 2012 +0200 @@ -0,0 +1,15 @@ +package de.intevation.gnv.artifactdatabase.objects; + +import java.io.Serializable; + +/** + * @author Ingo Weinzierl (ingo.weinzierl@intevation.de) + */ +public interface ExportMode +extends Serializable +{ + public String getName(); + public String getDescription(); + public String getMimeType(); +} +// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8: diff -r f99d8f92a640 -r 755dd2fa4a0a gnv/src/main/java/de/intevation/gnv/artifactdatabase/objects/InputParameter.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv/src/main/java/de/intevation/gnv/artifactdatabase/objects/InputParameter.java Fri Sep 28 12:13:53 2012 +0200 @@ -0,0 +1,18 @@ +/** + * + */ +package de.intevation.gnv.artifactdatabase.objects; + +import java.io.Serializable; + +/** + * @author Tim Englich + * + */ +public interface InputParameter extends Serializable { + + public String getName(); + + public String[] getValues(); + +} diff -r f99d8f92a640 -r 755dd2fa4a0a gnv/src/main/java/de/intevation/gnv/artifactdatabase/objects/OutputMode.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv/src/main/java/de/intevation/gnv/artifactdatabase/objects/OutputMode.java Fri Sep 28 12:13:53 2012 +0200 @@ -0,0 +1,22 @@ +/** + * + */ +package de.intevation.gnv.artifactdatabase.objects; + +import java.io.Serializable; +import java.util.Collection; + +/** + * @author Tim Englich + * + */ +public interface OutputMode extends Serializable{ + + public String getName(); + + public String getMimeType(); + + public Collection getOutputParameters(); + + public ExportMode getExportMode(String mode); +} diff -r f99d8f92a640 -r 755dd2fa4a0a gnv/src/main/java/de/intevation/gnv/artifactdatabase/objects/OutputParameter.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv/src/main/java/de/intevation/gnv/artifactdatabase/objects/OutputParameter.java Fri Sep 28 12:13:53 2012 +0200 @@ -0,0 +1,22 @@ +/** + * + */ +package de.intevation.gnv.artifactdatabase.objects; + +import java.io.Serializable; + +/** + * @author Tim Englich + * + */ +public interface OutputParameter extends Serializable{ + + String getName(); + + String getValue(); + + String getDescription(); + + String getType(); + +} diff -r f99d8f92a640 -r 755dd2fa4a0a gnv/src/main/java/de/intevation/gnv/artifactdatabase/objects/ParametrizedArtifactFactory.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv/src/main/java/de/intevation/gnv/artifactdatabase/objects/ParametrizedArtifactFactory.java Fri Sep 28 12:13:53 2012 +0200 @@ -0,0 +1,49 @@ +/** + * + */ +package de.intevation.gnv.artifactdatabase.objects; + +import java.util.Collection; +import java.util.HashMap; +import java.util.Map; + +/** + * @author Tim Englich + * + */ +public class ParametrizedArtifactFactory extends ArtifactFactory implements + ParametrizedArtifactObject { + + /** + * The UID of this Class + */ + private static final long serialVersionUID = 4516368434861819032L; + + private Map> parameters = null; + + /** + * Constructor + * @param name + * @param description + * @param dataBaseUrl + */ + public ParametrizedArtifactFactory(String name, String description, + String dataBaseUrl) { + super(name, description, dataBaseUrl); + this.parameters = new HashMap>(); + } + + /** + * @see de.intevation.gnv.artifactdatabase.objects.ParametrizedArtifactObject#getParameters() + */ + @Override + public Map> getParameters() { + return parameters; + } + + @Override + public void addParameters(String key, Collection values) { + this.parameters.put(key, values); + } + +} diff -r f99d8f92a640 -r 755dd2fa4a0a gnv/src/main/java/de/intevation/gnv/artifactdatabase/objects/ParametrizedArtifactObject.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv/src/main/java/de/intevation/gnv/artifactdatabase/objects/ParametrizedArtifactObject.java Fri Sep 28 12:13:53 2012 +0200 @@ -0,0 +1,24 @@ +/** + * + */ +package de.intevation.gnv.artifactdatabase.objects; + +import java.util.Collection; +import java.util.Map; + +/** + * @author Tim Englich + * + */ +public interface ParametrizedArtifactObject extends ArtifactObject { + + /** + * Returns the Parameters which could be used to manage (e.g. create) an + * ArtifactObject. + * @return + */ + Map> getParameters(); + + void addParameters(String key, Collection values); + +} diff -r f99d8f92a640 -r 755dd2fa4a0a gnv/src/main/java/de/intevation/gnv/artifactdatabase/objects/map/DefaultLayer.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv/src/main/java/de/intevation/gnv/artifactdatabase/objects/map/DefaultLayer.java Fri Sep 28 12:13:53 2012 +0200 @@ -0,0 +1,67 @@ +/** + * + */ +package de.intevation.gnv.artifactdatabase.objects.map; +/** + * @author Tim Englich + * + */ +public class DefaultLayer implements Layer { + + + private String id = null; + + private String name = null; + + private boolean groupLayer = false; + + private String parentId = null; + /** + * Constructor + */ + public DefaultLayer(String id,String name, + boolean groupLayer,String parentId) { + this.id = id; + this.name = name; + this.groupLayer = groupLayer; + this.parentId = parentId; + } + + + + /** + * @see de.intevation.gnv.artifactdatabase.objects.map.Layer#getID() + */ + public String getID() { + return this.id; + } + + /** + * @see de.intevation.gnv.artifactdatabase.objects.map.Layer#getName() + */ + public String getName() { + return this.name; + } + + /** + * @see de.intevation.gnv.artifactdatabase.objects.map.Layer#isGroupLayer() + */ + public boolean isGroupLayer() { + return this.groupLayer; + } + + /** + * @see de.intevation.gnv.artifactdatabase.objects.map.Layer#parentID() + */ + public String parentID() { + return this.parentId; + } + + @Override + public String toString() { + return "ID: "+ this.id + " Name: "+this.name+ + " IsGroupLayer: "+this.groupLayer+ + " ParentID: "+this.parentId; + } + +} diff -r f99d8f92a640 -r 755dd2fa4a0a gnv/src/main/java/de/intevation/gnv/artifactdatabase/objects/map/DefaultMapService.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv/src/main/java/de/intevation/gnv/artifactdatabase/objects/map/DefaultMapService.java Fri Sep 28 12:13:53 2012 +0200 @@ -0,0 +1,63 @@ +/** + * + */ +package de.intevation.gnv.artifactdatabase.objects.map; + +import java.util.Collection; + +/** + * @author Tim Englich + * + */ +public class DefaultMapService implements MapService { + + private String id = null; + + + + private Collection layer = null; + + private String type = null; + + private String url = null; + /** + * Constructor + */ + public DefaultMapService(String id, Collection layer, + String type, String url) { + super(); + this.id = id; + this.layer = layer; + this.type = type; + this.url = url; + } + + /** + * @see de.intevation.gnv.artifactdatabase.objects.map.MapService#getID() + */ + public String getID() { + return this.id; + } + + /** + * @see de.intevation.gnv.artifactdatabase.objects.map.MapService#getLayer() + */ + public Collection getLayer() { + return this.layer; + } + + /** + * @see de.intevation.gnv.artifactdatabase.objects.map.MapService#getType() + */ + public String getType() { + return this.type; + } + + /** + * @see de.intevation.gnv.artifactdatabase.objects.map.MapService#getURL() + */ + public String getURL() { + return this.url; + } + +} diff -r f99d8f92a640 -r 755dd2fa4a0a gnv/src/main/java/de/intevation/gnv/artifactdatabase/objects/map/Layer.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv/src/main/java/de/intevation/gnv/artifactdatabase/objects/map/Layer.java Fri Sep 28 12:13:53 2012 +0200 @@ -0,0 +1,16 @@ +/** + * + */ +package de.intevation.gnv.artifactdatabase.objects.map; +/** + * @author Tim Englich + * + */ +public interface Layer { + + String getName(); + String getID(); + boolean isGroupLayer(); + String parentID(); + +} diff -r f99d8f92a640 -r 755dd2fa4a0a gnv/src/main/java/de/intevation/gnv/artifactdatabase/objects/map/MapService.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv/src/main/java/de/intevation/gnv/artifactdatabase/objects/map/MapService.java Fri Sep 28 12:13:53 2012 +0200 @@ -0,0 +1,23 @@ +/** + * + */ +package de.intevation.gnv.artifactdatabase.objects.map; + +import java.util.Collection; + +/** + * @author Tim Englich + * + */ +public interface MapService { + + + String getID(); + + String getURL(); + + String getType(); + + Collection getLayer(); + +} diff -r f99d8f92a640 -r 755dd2fa4a0a gnv/src/main/java/de/intevation/gnv/propertiesreader/MapPropertiesReader.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv/src/main/java/de/intevation/gnv/propertiesreader/MapPropertiesReader.java Fri Sep 28 12:13:53 2012 +0200 @@ -0,0 +1,42 @@ +/** + * + */ +package de.intevation.gnv.propertiesreader; + +import java.util.Map; + +import org.apache.log4j.Logger; + +/** + * @author Tim Englich + * + */ +public class MapPropertiesReader implements PropertiesReader { + /** + * the logger, used to log exceptions and additonaly information + */ + private static Logger log = Logger.getLogger(MapPropertiesReader.class); + + private Map properties = null; + + /** + * Constructor + */ + public MapPropertiesReader(Map properties) { + super(); + this.properties = properties; + } + + /** + * @see de.intevation.gnv.propertiesreader.PropertiesReader#getPropertieValue(java.lang.String, + * java.lang.String) + */ + public String getPropertieValue(String key, String defaultValue) { + String value = this.properties.get(key); + if (value == null) { + value = defaultValue; + } + return value; + } + +} diff -r f99d8f92a640 -r 755dd2fa4a0a gnv/src/main/java/de/intevation/gnv/propertiesreader/PropertiesReader.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv/src/main/java/de/intevation/gnv/propertiesreader/PropertiesReader.java Fri Sep 28 12:13:53 2012 +0200 @@ -0,0 +1,14 @@ +/** + * + */ +package de.intevation.gnv.propertiesreader; + +/** + * @author Tim Englich + * + */ +public interface PropertiesReader { + + public String getPropertieValue(String key, String defaultValue); + +} diff -r f99d8f92a640 -r 755dd2fa4a0a gnv/src/main/java/de/intevation/gnv/propertiesreader/PropertiesReaderFactory.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv/src/main/java/de/intevation/gnv/propertiesreader/PropertiesReaderFactory.java Fri Sep 28 12:13:53 2012 +0200 @@ -0,0 +1,81 @@ +/** + * + */ +package de.intevation.gnv.propertiesreader; + +import java.util.Map; + +import javax.servlet.ServletConfig; + +import org.apache.log4j.Logger; + +/** + * @author Tim Englich + * + */ +public class PropertiesReaderFactory { + + /** + * the logger, used to log exceptions and additonaly information + */ + private static Logger log = Logger.getLogger(PropertiesReaderFactory.class); + + /** + * The singleton Instance of this Factory. + */ + private static PropertiesReaderFactory instance = null; + + /** + * The ConnectionPool providing the Connections to the DatabaseBackends + */ + private PropertiesReader propertiesReader = null; + + /** + * Constructor + */ + private PropertiesReaderFactory() { + super(); + } + + /** + * This Method provides an singleton Instance of this Class. + * + * @return an singleton Instance of this Class + */ + public static PropertiesReaderFactory getInstance() { + if (instance == null) { + instance = new PropertiesReaderFactory(); + } + return instance; + } + + /** + * Getting the ConnectionPool + * + * @return the ConnectionPool + */ + public PropertiesReader getPropertiesReader() { + return this.propertiesReader; + } + + /** + * Getting the ConnectionPool + * + * @param config + * The Config that should be read + */ + public void initPropertiesReader(Object config) { + if (config instanceof ServletConfig) { + this.propertiesReader = new ServletPropertiesReader( + (ServletConfig) config); + } else if (config instanceof Map) { + this.propertiesReader = new MapPropertiesReader( + (Map) config); + } else { + log.error("No PropertiesReader for Instance " + + config.getClass().getName()); + } + + } + +} diff -r f99d8f92a640 -r 755dd2fa4a0a gnv/src/main/java/de/intevation/gnv/propertiesreader/ServletPropertiesReader.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv/src/main/java/de/intevation/gnv/propertiesreader/ServletPropertiesReader.java Fri Sep 28 12:13:53 2012 +0200 @@ -0,0 +1,58 @@ +/** + * + */ +package de.intevation.gnv.propertiesreader; + +import java.util.Enumeration; +import java.util.HashMap; +import java.util.Map; + +import javax.servlet.ServletConfig; + +import org.apache.log4j.Logger; + +/** + * @author Tim Englich + * + */ +public class ServletPropertiesReader implements PropertiesReader { + + /** + * the logger, used to log exceptions and additonaly information + */ + private static Logger log = Logger.getLogger(ServletPropertiesReader.class); + + private Map properties = null; + + /** + * Constructor + */ + public ServletPropertiesReader(ServletConfig config) { + super(); + log.info("ServletPropertiesReader will be initialized"); + if (config != null) { + + Enumeration keys = config.getInitParameterNames(); + properties = new HashMap(); + while (keys.hasMoreElements()) { + String key = keys.nextElement(); + String value = config.getInitParameter(key); + log.info("New ConbfigurationValue; " + key + " ==> " + value); + this.properties.put(key, value); + } + } + } + + /** + * @see de.intevation.gnv.propertiesreader.PropertiesReader#getPropertieValue(java.lang.String, + * java.lang.String) + */ + public String getPropertieValue(String key, String defaultValue) { + String value = this.properties.get(key); + if (value == null) { + value = defaultValue; + } + return value; + } + +} diff -r f99d8f92a640 -r 755dd2fa4a0a gnv/src/main/java/de/intevation/gnv/servlet/GNVActionServlet.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv/src/main/java/de/intevation/gnv/servlet/GNVActionServlet.java Fri Sep 28 12:13:53 2012 +0200 @@ -0,0 +1,55 @@ +/* + * + */ +package de.intevation.gnv.servlet; + +import javax.servlet.ServletConfig; +import javax.servlet.ServletException; + +import org.apache.log4j.Logger; +import org.apache.log4j.PropertyConfigurator; +import org.apache.struts.action.ActionServlet; + +import de.intevation.gnv.propertiesreader.PropertiesReaderFactory; + +/** + * + * @author Tim Englich + * + */ +public class GNVActionServlet extends ActionServlet { + /** + * the logger, used to log exceptions and additonaly information + */ + private static Logger log = null; + + static { + // BasicConfigurator.configure(); + + } + + static String LOGGINIG_CONFIG_FILE_ID = "de.intevation.gnv.servlet.log4j.configuration"; + + /** + * The UID of this Class + */ + private static final long serialVersionUID = 3597396283436383943L; + + /** + * @see javax.servlet.GenericServlet#init(javax.servlet.ServletConfig) + */ + @Override + public void init(ServletConfig config) throws ServletException { + super.init(config); + try { + String path = config.getServletContext().getRealPath("/") + + config.getInitParameter(LOGGINIG_CONFIG_FILE_ID); + PropertyConfigurator.configure(path); + log = Logger.getLogger(GNVActionServlet.class); + } catch (Exception e) { + log.error(e, e); + } + log.info("PropertiesReader will be configured."); + PropertiesReaderFactory.getInstance().initPropertiesReader(config); + } +} diff -r f99d8f92a640 -r 755dd2fa4a0a gnv/src/main/java/de/intevation/gnv/util/ArtifactNamespaceContext.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv/src/main/java/de/intevation/gnv/util/ArtifactNamespaceContext.java Fri Sep 28 12:13:53 2012 +0200 @@ -0,0 +1,56 @@ +package de.intevation.gnv.util; + +import javax.xml.XMLConstants; + +import javax.xml.namespace.NamespaceContext; + +import java.util.Iterator; + +/** + * @author Sascha L. Teichmann (sascha.teichmann@intevation) + */ +public class ArtifactNamespaceContext +implements NamespaceContext +{ + /** + * The URI of the namespace of the artifacts. + */ + public final static String NAMESPACE_URI = "http://www.intevation.de/2009/artifacts"; + + /** + * The XML prefix for the artifacts namespace. + */ + public final static String NAMESPACE_PREFIX = "art"; + + public static final ArtifactNamespaceContext INSTANCE = + new ArtifactNamespaceContext(); + + public ArtifactNamespaceContext() { + } + + public String getNamespaceURI(String prefix) { + + if (prefix == null) { + throw new NullPointerException("Null prefix"); + } + + if (NAMESPACE_PREFIX.equals(prefix)) { + return NAMESPACE_URI; + } + + if ("xml".equals(prefix)) { + return XMLConstants.XML_NS_URI; + } + + return XMLConstants.NULL_NS_URI; + } + + public String getPrefix(String uri) { + throw new UnsupportedOperationException(); + } + + public Iterator getPrefixes(String uri) { + throw new UnsupportedOperationException(); + } +} +// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8: diff -r f99d8f92a640 -r 755dd2fa4a0a gnv/src/main/java/de/intevation/gnv/util/XMLUtils.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv/src/main/java/de/intevation/gnv/util/XMLUtils.java Fri Sep 28 12:13:53 2012 +0200 @@ -0,0 +1,223 @@ +package de.intevation.gnv.util; + +import java.io.IOException; +import java.io.InputStream; +import java.io.StringBufferInputStream; +import java.io.StringWriter; + +import javax.xml.namespace.NamespaceContext; +import javax.xml.namespace.QName; +import javax.xml.parsers.DocumentBuilder; +import javax.xml.parsers.DocumentBuilderFactory; +import javax.xml.parsers.ParserConfigurationException; +import javax.xml.transform.Transformer; +import javax.xml.transform.TransformerConfigurationException; +import javax.xml.transform.TransformerException; +import javax.xml.transform.TransformerFactory; +import javax.xml.transform.TransformerFactoryConfigurationError; +import javax.xml.transform.dom.DOMSource; +import javax.xml.transform.stream.StreamResult; +import javax.xml.xpath.XPath; +import javax.xml.xpath.XPathConstants; +import javax.xml.xpath.XPathExpressionException; +import javax.xml.xpath.XPathFactory; + +import org.apache.log4j.Logger; +import org.w3c.dom.Attr; +import org.w3c.dom.Document; +import org.w3c.dom.Element; +import org.w3c.dom.Node; +import org.w3c.dom.NodeList; +import org.xml.sax.SAXException; + +/** + * @author Sascha L. Teichmann + */ +public class XMLUtils { + private static Logger logger = Logger.getLogger(XMLUtils.class); + + public XMLUtils() { + } + + public static class ElementCreator { + protected Document document; + protected String ns; + protected String prefix; + + public ElementCreator(Document document, String ns, String prefix) { + this.document = document; + this.ns = ns; + this.prefix = prefix; + } + + public Element create(String name) { + Element element = document.createElementNS(ns, name); + element.setPrefix(prefix); + return element; + } + + public void addAttr(Element element, String name, String value) { + Attr attr = document.createAttributeNS(ns, name); + attr.setValue(value); + attr.setPrefix(prefix); + element.setAttributeNode(attr); + } + } // class ElementCreator + + public static Document newDocument() { + try { + return DocumentBuilderFactory.newInstance().newDocumentBuilder() + .newDocument(); + } catch (ParserConfigurationException pce) { + logger.error(pce.getLocalizedMessage(), pce); + } + return null; + } + + public static XPath newXPath() { + return newXPath(null); + } + + public static XPath newXPath(NamespaceContext namespaceContext) { + XPathFactory factory = XPathFactory.newInstance(); + XPath xpath = factory.newXPath(); + if (namespaceContext != null) { + xpath.setNamespaceContext(namespaceContext); + } + return xpath; + } + + public static Object xpath(Object root, String query, QName returnTyp) { + return xpath(root, query, returnTyp, null); + } + + public static final String xpathString(Object root, String query, + NamespaceContext namespaceContext) { + return (String) xpath(root, query, XPathConstants.STRING, + namespaceContext); + } + + public static final Object xpath(Object root, String query, + QName returnType, + NamespaceContext namespaceContext) { + if (root == null) { + return null; + } + + try { + XPath xpath = new XMLUtils().newXPath(namespaceContext); + if (xpath != null) { + return xpath.evaluate(query, root, returnType); + } + } catch (XPathExpressionException xpee) { + logger.error(xpee.getLocalizedMessage(), xpee); + } + + return null; + } + + public static Object getXPath(Object root, String query, QName returnType) { + return getXPath(root,query,returnType,ArtifactNamespaceContext.INSTANCE); + } + + public static Object getXPath( + Object root, String query, QName returnType, NamespaceContext context + ) { + return xpath(root, query, returnType, context); + } + + public static String getStringXPath(String xpath) { + return getStringXPath(xpath, null); + } + + public static NodeList getNodeSetXPath(Object root, String query) { + return (NodeList) getXPath(root, query, XPathConstants.NODESET); + } + + public static Node getNodeXPath(Object root, String query) { + return (Node) getXPath(root, query, XPathConstants.NODE); + } + + public static String getStringXPath(Object root, String xpath) { + return getStringXPath(root, xpath, null); + } + + public static String getStringXPath(Object root, String query, String def) { + String s = (String) getXPath(root, query, XPathConstants.STRING); + return s == null || s.length() == 0 ? def : s; + } + + public static Document readDocument(InputStream inputStream) { + Document returnValue = null; + try { + DocumentBuilderFactory docBuilderFactory = DocumentBuilderFactory + .newInstance(); + docBuilderFactory.setNamespaceAware(true); + DocumentBuilder docBuilder = docBuilderFactory.newDocumentBuilder(); + returnValue = docBuilder.parse(inputStream); + } catch (ParserConfigurationException e) { + logger.error(e, e); + } catch (SAXException e) { + logger.error(e, e); + } catch (IOException e) { + logger.error(e, e); + } + return returnValue; + } + + public static String writeNode2String(Node node) { + try { + DOMSource source = new DOMSource(node); + return writeDOMSource2String(source); + } catch (TransformerConfigurationException e) { + logger.error(e, e); + } catch (TransformerFactoryConfigurationError e) { + logger.error(e, e); + } catch (TransformerException e) { + logger.error(e, e); + } + return null; + } + + public static Document reInitDocument(Document document) { + + StringBufferInputStream inputStream = new StringBufferInputStream( + writeDocument2String(document)); + return readDocument(inputStream); + } + + public static String writeDocument2String(Document document) { + try { + DOMSource source = new DOMSource(document); + return writeDOMSource2String(source); + } catch (TransformerConfigurationException e) { + logger.error(e, e); + } catch (TransformerFactoryConfigurationError e) { + logger.error(e, e); + } catch (TransformerException e) { + logger.error(e, e); + } + return null; + } + + /** + * @param source + * @return + * @throws TransformerFactoryConfigurationError + * @throws TransformerConfigurationException + * @throws TransformerException + */ + private static String writeDOMSource2String(DOMSource source) + throws TransformerFactoryConfigurationError, + TransformerConfigurationException, + TransformerException { + TransformerFactory transformerFactory = TransformerFactory + .newInstance(); + Transformer transformer = transformerFactory.newTransformer(); + StringWriter sw = new StringWriter(); + StreamResult result = new StreamResult(sw); + transformer.transform(source, result); + return sw.getBuffer().toString(); + } +} +// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8: diff -r f99d8f92a640 -r 755dd2fa4a0a gnv/src/main/java/de/intevation/gnv/util/XSLTransformer.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv/src/main/java/de/intevation/gnv/util/XSLTransformer.java Fri Sep 28 12:13:53 2012 +0200 @@ -0,0 +1,92 @@ +/** + * + */ +package de.intevation.gnv.util; + +import java.io.ByteArrayOutputStream; +import java.io.File; +import java.io.UnsupportedEncodingException; + +import java.util.HashMap; +import java.util.Map; + +import javax.xml.transform.Source; +import javax.xml.transform.Transformer; +import javax.xml.transform.TransformerConfigurationException; +import javax.xml.transform.TransformerException; +import javax.xml.transform.TransformerFactory; +import javax.xml.transform.TransformerFactoryConfigurationError; + +import javax.xml.transform.dom.DOMSource; + +import javax.xml.transform.stream.StreamResult; +import javax.xml.transform.stream.StreamSource; + +import org.apache.log4j.Logger; + +import org.w3c.dom.Node; + +/** + * @author Tim Englich + * + */ +public class XSLTransformer { + /** + * the logger, used to log exceptions and additonaly information + */ + private static Logger log = Logger.getLogger(XSLTransformer.class); + + + private Map params; + + /** + * Constructor + */ + public XSLTransformer() { + super(); + } + + public String transform(Node toTransform, String encoding, + String templateFileName) { + String resultValue = null; + try { + //XMLUtils xmlUtils = new XMLUtils(); + Source templateSource = new StreamSource(new File(templateFileName)); + TransformerFactory xformFactory = TransformerFactory.newInstance(); + Transformer transformer = xformFactory + .newTransformer(templateSource); + + if (params != null) { + for(Map.Entry entry: params.entrySet()) { + transformer.setParameter(entry.getKey(), entry.getValue()); + } + } + + ByteArrayOutputStream baos = new ByteArrayOutputStream(); + StreamResult scrResult = new StreamResult(baos); + // log.debug(xmlUtils.writeNode2String(toTransform)); + DOMSource source = new DOMSource(toTransform); + transformer.transform(source, scrResult); + resultValue = new String(baos.toByteArray(), encoding); + } catch (TransformerConfigurationException e) { + log.error(e, e); + } catch (UnsupportedEncodingException e) { + log.error(e, e); + } catch (TransformerFactoryConfigurationError e) { + log.error(e, e); + } catch (TransformerException e) { + log.error(e, e); + } + + return resultValue; + } + + + public void addParameter(String name, String value) { + if (params == null) { + params = new HashMap(3); + } + + params.put(name, value); + } +} diff -r f99d8f92a640 -r 755dd2fa4a0a gnv/src/main/resources/applicationMessages.properties --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv/src/main/resources/applicationMessages.properties Fri Sep 28 12:13:53 2012 +0200 @@ -0,0 +1,98 @@ +# application.properties +application.name=${pom.name} +application.version=${pom.version} +application.releasedate=${timestamp} + +gnviewer.app.title = BSH-GDI genericViewer + +gnviewer.project.save = Projekt speichern +gnviewer.project.load = Projekt laden +gnviewer.project.load.button = Laden + +gnviewer.history.title=\u00dcberblick + +gnviewer.fis.fis_marnet = Marnet +gnviewer.fis.fis_imis = IMIS +gnviewer.fis.fis_staun = STAUN +gnviewer.fis.fis_modeldata = Modelldaten +gnviewer.fis.fis_delphin = Delphin +gnviewer.fis.fis_thermosalinograph = Thermosalinograph +gnviewer.fis.fis_chemusurvey = Chemusurvey +gnviewer.fis.fis_gts = GTS +gnviewer.fis.fis_bsh_ctd = CTD +gnviewer.fis.fis_bsh_xbt = XBT +gnviewer.fis.fis_eisklimatologie = Eisklimatologie +gnviewer.fis.fis_sst = SST +gnviewer.fis.fis_seastate = Seegangsarchiv +gnviewer.fis.fis_seacat = SeaCat +gnviewer.fis.fis_currentmeter = Strommesser +gnviewer.fis.fis_icestations = Eismeldungen + +gnviewer.select.button = Ausw\u00e4hlen +gnviewer.draw.button = Aktualisieren + +gnviewer.productselection.overlay.title = Die Anfrage wird bearbeitet, bitte gedulden Sie sich einen Moment. +gnviewer.productselection.fisselection.title = Fachinformationssystem + +# Statistik +gnviewer.statistics.header.title=Datenstatistik +gnviewer.statistics.table.header.param=Parameter +gnviewer.statistics.table.header.value=Wert +gnviewer.statistics.series=Series +gnviewer.statistics.descriptive.arithmeticMean=Arithmetisches Mittel +gnviewer.statistics.descriptive.geometricMean=Geometrisches Mittel +gnviewer.statistics.descriptive.kurtosis=Kurtosis +gnviewer.statistics.descriptive.kurtosisClass=kurtosisClass +gnviewer.statistics.descriptive.max=Maximum +gnviewer.statistics.descriptive.min=Minimum +gnviewer.statistics.descriptive.n=Anzahl Werte +gnviewer.statistics.descriptive.percentile.90=Perzentil (90/10) +gnviewer.statistics.descriptive.percentile.75=Perzentil (75/25) +gnviewer.statistics.descriptive.percentile.50=Perzentil (50/50) +gnviewer.statistics.descriptive.percentile.10=Perzentil (10/90) +gnviewer.statistics.descriptive.deviation=Standardabweichung +gnviewer.statistics.descriptive.variance=Varianz +gnviewer.statistics.descriptive.intercept=Intercept +gnviewer.statistics.descriptive.slope=Steigung +gnviewer.statistic.button = Statistik + +# Histogramm +gnviewer.histogram.button=Histogramm +gnviewer.histogram.options.header.title=Histogrammoptionen +bincount=Anzahl der Klassen +binwidth=Breite einer Klasse + +# diagram options dialog +gnviewer.diagram.options.header.title=Diagrammoptionen + +# wms +gnviewer.wms.server.path=URL des WMS +gnviewer.wms.server.layer=Name des Layers + +# attachedOutputOptions +gnviewer.output.options.diagramm.alt=Diagramm +gnviewer.output.options.histogram.alt=Histogramm +gnviewer.output.options.save.title=Diagramm speichern +gnviewer.output.options.export.csv.title=Daten als CSV exportieren +gnviewer.output.options.export.odv.title=Daten als ODV exportieren +gnviewer.output.options.export.pdf.title=Diagramm als PDF exportieren +gnviewer.output.options.export.svg.title=Diagramm als SVG exportieren +gnviewer.output.options.export.zip.title=ZIP-Archiv exportieren +gnviewer.output.options.export.wms.title=WMS-Layer bereitstellen + +# export options +gnviewer.export.fieldset.title=Aktionen + +height=H\u00f6he +width=Breite +points=Zeichne Datenpunkte + +# Fehlermeldungen: + +java.io.ioexception..connection.refused=Die Verbindung zur Artifaktdatenbank ist unterbrochen. Bitte probieren Sie es zu einem sp\u00e4teren Zeitpunkt erneut. +java.io.ioexception..unable.to.parse.the.response.http.version..end.of.stream.reached.too.early=Die Verbindung zur Artifaktdatenbank wurde unerwartet unterbrochen. +no.inputdata.given..please.select.at.least.one.entry=Es wurde kein Eintrag ausgew\u00e4hlt. Bitte w\u00e4hlen sie mindestens einen Eintrag aus. +de.intevation.gnv.geobackend.base.query.exception.queryexception..java.sql.sqlexception =Es ist ein interner Serverfehler aufgetreten. Bitte benachrichtigen Sie den Support. +java.io.ioexception..the.server.encountered.an.unexpected.condition.which.prevented.it.from.fulfilling.the.request=Es ist ein interner Serverfehler aufgetreten. Bitte benachrichtigen Sie den Support. +java.lang.illegalargumentexception..inputstream.cannot.be.null=Es ist ein interner Serverfehler aufgetreten. Bitte benachrichtigen Sie den Support. + diff -r f99d8f92a640 -r 755dd2fa4a0a gnv/src/main/resources/applicationMessages_en.properties --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv/src/main/resources/applicationMessages_en.properties Fri Sep 28 12:13:53 2012 +0200 @@ -0,0 +1,95 @@ +# application.properties +application.name=${pom.name} +application.version=${pom.version} +application.releasedate=${timestamp} + +gnviewer.app.title = BSH-GDI genericViewer + +gnviewer.history.title=Summary + +gnviewer.project.save = Save Project +gnviewer.project.load = Load Project +gnviewer.project.load.button = Load + +gnviewer.fis.fis_marnet = Marnet +gnviewer.fis.fis_imis = IMIS +gnviewer.fis.fis_staun = STAUN +gnviewer.fis.fis_modeldata = Modeldata +gnviewer.fis.fis_delphin = Delphin +gnviewer.fis.fis_thermosalinograph = Thermosalinograph +gnviewer.fis.fis_chemusurvey = Chemusurvey +gnviewer.fis.fis_gts = GTS +gnviewer.fis.fis_bsh_ctd = CTD +gnviewer.fis.fis_bsh_xbt = XBT +gnviewer.fis.fis_eisklimatologie = Iceclimatology +gnviewer.fis.fis_sst = SST +gnviewer.fis.fis_seastate = Sea State +gnviewer.fis.fis_seacat = SeaCat +gnviewer.fis.fis_currentmeter = Current Meter +gnviewer.fis.fis_icestations = Ice Station Report + +gnviewer.select.button = Choose +gnviewer.draw.button = Update + +gnviewer.productselection.overlay.title = Your request will be processed. Please wait... +gnviewer.productselection.fisselection.title = Data set + +# Statistik +gnviewer.statistics.header.title=Statistics +gnviewer.statistics.table.header.param=Parameter +gnviewer.statistics.table.header.value=Value +gnviewer.statistics.series=Series +gnviewer.statistics.descriptive.arithmeticMean=Arithmetic mean +gnviewer.statistics.descriptive.geometricMean=Geometric Mean +gnviewer.statistics.descriptive.kurtosis=Kurtosis +gnviewer.statistics.descriptive.kurtosisClass=kurtosisClass +gnviewer.statistics.descriptive.max=Maximum +gnviewer.statistics.descriptive.min=Minimum +gnviewer.statistics.descriptive.n=Number of Values +gnviewer.statistics.descriptive.percentile.90=Percentile (90/10) +gnviewer.statistics.descriptive.percentile.75=Percentile (75/25) +gnviewer.statistics.descriptive.percentile.50=Percentile (50/50) +gnviewer.statistics.descriptive.percentile.10=Percentile (90/10) +gnviewer.statistics.descriptive.deviation=Standard deviation +gnviewer.statistics.descriptive.variance=Variance +gnviewer.statistics.descriptive.intercept=Intercept +gnviewer.statistics.descriptive.slope=Increase +gnviewer.statistic.button = Statistic + +# Histogramm +gnviewer.histogram.button=Histogram +gnviewer.histogram.options.header.title=Histogram Options +bincount=Number of classes +binwidth=Class width + +# diagram options dialog +gnviewer.diagram.options.header.title=Diagram options + +# wms +gnviewer.wms.server.path=WMS URL +gnviewer.wms.server.layer=Layername + +# attachedOutputOptions +gnviewer.output.options.diagramm.alt=Diagram +gnviewer.output.options.histogram.alt=Histogram +gnviewer.output.options.save.title=Save Diagram +gnviewer.output.options.export.csv.title=Export Data as CSV +gnviewer.output.options.export.odv.title=Export Data as ODV +gnviewer.output.options.export.pdf.title=Export chart as PDF +gnviewer.output.options.export.svg.title=Export chart as SVG +gnviewer.output.options.export.zip.title=Export as ZIP archive +gnviewer.output.options.export.wms.title=Serve as WMS layer + +# export options +gnviewer.export.fieldset.title=Actions + +height=Height +width=Width +points=Draw data points + +java.io.ioexception..connection.refused = The Connection to the ArtifactDatabase is interrupted. Please try again later. +java.io.ioexception..unable.to.parse.the.response.http.version..end.of.stream.reached.too.early= The Connection to the ArtifactDatabase was interrupted unexpected. +no.inputdata.given..please.select.at.least.one.entry = No Entry was chosen. Please select at least one entry. +de.intevation.gnv.geobackend.base.query.exception.queryexception..java.sql.sqlexception: A internal Server error has occurred. Please contact the Support. +java.io.ioexception..the.server.encountered.an.unexpected.condition.which.prevented.it.from.fulfilling.the.request = A internal Server error has occurred. Please contact the Support. +java.lang.illegalargumentexception..inputstream.cannot.be.null = A internal Server error has occurred. Please contact the Support. diff -r f99d8f92a640 -r 755dd2fa4a0a gnv/src/main/webapp/META-INF/context.xml --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv/src/main/webapp/META-INF/context.xml Fri Sep 28 12:13:53 2012 +0200 @@ -0,0 +1,2 @@ + + diff -r f99d8f92a640 -r 755dd2fa4a0a gnv/src/main/webapp/WEB-INF/config/log4j.properties --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv/src/main/webapp/WEB-INF/config/log4j.properties Fri Sep 28 12:13:53 2012 +0200 @@ -0,0 +1,13 @@ +# Set root logger level to DEBUG and its only appender to A1. +log4j.rootLogger=DEBUG, A1 + +# A1 is set to be a ConsoleAppender. +log4j.appender.A1=org.apache.log4j.ConsoleAppender + +# A1 uses PatternLayout. +log4j.appender.A1.layout=org.apache.log4j.PatternLayout +log4j.appender.A1.layout.ConversionPattern=%d [%t] %-5p %c - %m%n + +# Abschalten des geschwätzigen Loggings in dre Klasse JspServlet +log4j.category.org.apache.jasper.servlet.JspServlet=WARN +log4j.category.org.apache.catalina.core.ContainerBase=WARN \ No newline at end of file diff -r f99d8f92a640 -r 755dd2fa4a0a gnv/src/main/webapp/WEB-INF/config/struts-config.xml --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv/src/main/webapp/WEB-INF/config/struts-config.xml Fri Sep 28 12:13:53 2012 +0200 @@ -0,0 +1,175 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff -r f99d8f92a640 -r 755dd2fa4a0a gnv/src/main/webapp/WEB-INF/config/templates/describe-ui-static.xsl --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv/src/main/webapp/WEB-INF/config/templates/describe-ui-static.xsl Fri Sep 28 12:13:53 2012 +0200 @@ -0,0 +1,113 @@ + + + + + + + + bearbeiten + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + {$edit} + + + + + {$edit} + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + +
+ + + + + + + + + +
+ + + + + +   + + + +
diff -r f99d8f92a640 -r 755dd2fa4a0a gnv/src/main/webapp/WEB-INF/config/templates/describe-ui.xsl --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv/src/main/webapp/WEB-INF/config/templates/describe-ui.xsl Fri Sep 28 12:13:53 2012 +0200 @@ -0,0 +1,173 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + +
.
+ +
+
+
+ + + + + + + + + + + + + + + + + + +
.:
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + Beispiel WKT-Linestring einfügen:
+
+ + Beispiel WKT-Polygon einfügen:
+
+
+ + + + + : + + + + +
+ + +
+ + + + + + +
diff -r f99d8f92a640 -r 755dd2fa4a0a gnv/src/main/webapp/WEB-INF/jsp/footer.jsp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv/src/main/webapp/WEB-INF/jsp/footer.jsp Fri Sep 28 12:13:53 2012 +0200 @@ -0,0 +1,6 @@ +<%@ page contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" language="java" %> +<%@ taglib uri="http://jakarta.apache.org/struts/tags-html" prefix="html" %> +<%@ taglib uri="http://jakarta.apache.org/struts/tags-bean" prefix="bean" %> +<%@ taglib uri="http://java.sun.com/jstl/core" prefix="c" %> + +<%--div style="clear: left; margin-top: 40px;"/--%> \ No newline at end of file diff -r f99d8f92a640 -r 755dd2fa4a0a gnv/src/main/webapp/WEB-INF/jsp/header.jsp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv/src/main/webapp/WEB-INF/jsp/header.jsp Fri Sep 28 12:13:53 2012 +0200 @@ -0,0 +1,47 @@ +<%@ page contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" language="java"%> +<%@ taglib uri="http://jakarta.apache.org/struts/tags-html" prefix="html"%> +<%@ taglib uri="http://jakarta.apache.org/struts/tags-bean" prefix="bean"%> +<%@ taglib uri="http://jakarta.apache.org/struts/tags-bean-el" prefix="bean-el" %> +<%@ taglib uri="http://java.sun.com/jstl/core" prefix="c"%> +<%@ taglib uri="http://jakarta.apache.org/struts/tags-tiles" prefix="tiles"%> +<% Object exceptionMessage = request.getAttribute(CommunicationKeys.REQUEST_EXCEPTION_MESSAGE_ID); + exceptionMessage = (exceptionMessage != null ? exceptionMessage.toString().replaceAll(" ", ".").replaceAll(":",".").toLowerCase() : null); + exceptionMessage = (exceptionMessage != null && exceptionMessage.toString().endsWith(".") ? exceptionMessage.toString().substring(0,exceptionMessage.toString().length()-1) : exceptionMessage); + + boolean showmapviewercallBody = request.getAttribute("MAPVIEWERCALL") != null; + +%> +<%@page import="de.intevation.gnv.action.CommunicationKeys"%> + + + diff -r f99d8f92a640 -r 755dd2fa4a0a gnv/src/main/webapp/WEB-INF/jsp/includes/display_diagramm_inc.jsp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv/src/main/webapp/WEB-INF/jsp/includes/display_diagramm_inc.jsp Fri Sep 28 12:13:53 2012 +0200 @@ -0,0 +1,39 @@ +<%@ taglib uri="http://jakarta.apache.org/struts/tags-bean" prefix="bean" %> +<%@page import="de.intevation.gnv.action.sessionmodel.SessionModelFactory"%> +<%@page import="de.intevation.gnv.action.sessionmodel.SessionModel"%> +<%@page import="de.intevation.gnv.action.sessionmodel.DiagrammOptions"%> +<%@page import="de.intevation.gnv.artifactdatabase.objects.OutputParameter"%> +<%@page import="java.util.Collection"%> +<%@page import="java.util.Iterator"%> +<%@page import="java.net.URLEncoder"%> +<% + // fetch diagramm parameter from request if the user clicked 'draw' + SessionModel sm = SessionModelFactory.getInstance().getSessionModel(request); + + String target = "chart"; + String mimeType = null; + String parameterString = ""; + + boolean supportChart = sm.getOutputMode(target) != null; + + if (supportChart){ + mimeType = sm.getOutputMode(target).getMimeType(); + DiagrammOptions diagrammOptions = sm.getDiagrammOptions(); + Collection op = sm.getOutputMode(target).getOutputParameters(); + + if (op != null){ + Iterator it = op.iterator(); + while (it.hasNext()){ + OutputParameter parameter = it.next(); + parameterString = parameterString +"&"+parameter.getName()+"="+(diagrammOptions != null ? diagrammOptions.getValue(parameter.getName()): parameter.getValue()); + } + } + } +%> + +<%-- diagramm is not null if the user clicked the 'draw' button --%> + +
+ <bean:message key="gnviewer.output.options.diagramm.alt"/> +
+
diff -r f99d8f92a640 -r 755dd2fa4a0a gnv/src/main/webapp/WEB-INF/jsp/includes/display_diagramm_options_inc.jsp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv/src/main/webapp/WEB-INF/jsp/includes/display_diagramm_options_inc.jsp Fri Sep 28 12:13:53 2012 +0200 @@ -0,0 +1,103 @@ +<%@ taglib uri="http://jakarta.apache.org/struts/tags-bean" prefix="bean" %> +<%@ taglib uri="http://jakarta.apache.org/struts/tags-bean-el" prefix="bean-el" %> +<%@page import="de.intevation.gnv.action.sessionmodel.DiagrammOptions"%> +<%@page import="de.intevation.gnv.action.sessionmodel.SessionModelFactory"%> +<%@page import="de.intevation.gnv.artifactdatabase.objects.OutputMode"%> +<%@page import="de.intevation.gnv.action.sessionmodel.SessionModel"%> +<%@page import="de.intevation.gnv.artifactdatabase.objects.OutputParameter"%> +<%@page import="de.intevation.gnv.artifactdatabase.objects.ExportMode"%> +<%@page import="java.util.Collection"%> +<%@page import="java.util.Iterator"%> +<%@page import="java.net.URLEncoder"%> +<% + String target = "chart"; + String targetPDF = "pdf"; + String targetSVG = "svg"; + String targetIMG = "img"; + SessionModel sm = SessionModelFactory.getInstance().getSessionModel(request); + OutputMode outputMode = sm.getOutputMode(target); + DiagrammOptions diagrammOptions = sm.getDiagrammOptions(); + + boolean useDiagrammOptions = diagrammOptions != null; + ExportMode supportIMG = outputMode.getExportMode(targetIMG); + ExportMode supportPDF = outputMode.getExportMode(targetPDF); + ExportMode supportSVG = outputMode.getExportMode(targetSVG); + + String mimeType = outputMode.getMimeType(); + String parameterString = ""; + Collection op = outputMode.getOutputParameters(); + + if (op != null){ + Iterator it = op.iterator(); + while (it.hasNext()){ + OutputParameter parameter = it.next(); + parameterString = parameterString +"&"+parameter.getName()+"="+(diagrammOptions != null ? diagrammOptions.getValue(parameter.getName()): parameter.getValue()); + } + } + + + String mimeTypeIMG = null; + if (supportIMG != null) { + mimeTypeIMG = supportIMG.getMimeType(); + } + String mimeTypePDF = null; + if (supportPDF != null) { + mimeTypePDF = supportPDF.getMimeType(); + } + String mimeTypeSVG = null; + if (supportSVG != null) { + mimeTypeSVG = supportSVG.getMimeType(); + mimeTypeSVG = URLEncoder.encode(mimeTypeSVG, "UTF-8"); + } +%> +
+
+ + + +
"> + + <%if (outputMode != null && outputMode.getOutputParameters() != null && !outputMode.getOutputParameters().isEmpty()){ + Iterator it = outputMode.getOutputParameters().iterator(); + while (it.hasNext()){ + OutputParameter om = it.next(); %> + + + + + <%}%> +
+ + + <%if (om.getType().equalsIgnoreCase("boolean")){ + boolean checked = useDiagrammOptions ? "true".equalsIgnoreCase(diagrammOptions.getValue(om.getName())) : om.getValue().equalsIgnoreCase("true"); + %> + /> + <%}else{%> + + <%}%> +
+
+ "/> + <%}%> + <%if (supportIMG != null) { %> + "> + + + <%}%> + <%if (supportPDF != null) { %> + "> + + + <%}%> + <%if (supportSVG != null) { %> + "> + + + <%}%> +
+
+
+
diff -r f99d8f92a640 -r 755dd2fa4a0a gnv/src/main/webapp/WEB-INF/jsp/includes/display_diagramm_statistics_inc.jsp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv/src/main/webapp/WEB-INF/jsp/includes/display_diagramm_statistics_inc.jsp Fri Sep 28 12:13:53 2012 +0200 @@ -0,0 +1,43 @@ +<%@ taglib uri="http://jakarta.apache.org/struts/tags-bean" prefix="bean" %> +<%@ taglib uri="http://jakarta.apache.org/struts/tags-bean-el" prefix="bean-el" %> +<%@page import="de.intevation.gnv.action.sessionmodel.SessionModel"%> +<%@page import="de.intevation.gnv.action.sessionmodel.SessionModelFactory"%> +<%@page import="java.util.Collection"%> +<%@page import="de.intevation.gnv.artifactdatabase.objects.ArtifactStatisticValue"%> +<%@page import="java.util.Iterator"%> +<%@page import="de.intevation.gnv.artifactdatabase.objects.ArtifactStatisticsSet"%> +
+<% + SessionModel sm = SessionModelFactory.getInstance().getSessionModel(request); + Collection statistics = sm.getStatistics(); +%> +
+ + + + <%if (statistics != null){ + Iterator it = statistics.iterator(); + while (it.hasNext()){ + ArtifactStatisticsSet set = it.next(); + %> +

<%=set.getName()%>

+ + + + + + <% + Iterator sit = set.getStatisticValues().iterator(); + while (sit.hasNext()){ + ArtifactStatisticValue asv = sit.next(); + %> + + + + + <%}%> +
<%=asv.getValue()%>
+ <%} %> + <%}%> +
+
diff -r f99d8f92a640 -r 755dd2fa4a0a gnv/src/main/webapp/WEB-INF/jsp/includes/display_export_inc.jsp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv/src/main/webapp/WEB-INF/jsp/includes/display_export_inc.jsp Fri Sep 28 12:13:53 2012 +0200 @@ -0,0 +1,113 @@ +<%@ taglib uri="http://jakarta.apache.org/struts/tags-bean" prefix="bean" %> +<%@page import="de.intevation.gnv.action.sessionmodel.SessionModelFactory"%> +<%@page import="de.intevation.gnv.action.sessionmodel.SessionModel"%> +<%@page import="de.intevation.gnv.action.sessionmodel.DiagrammOptions"%> +<%@page import="de.intevation.gnv.artifactdatabase.objects.OutputParameter"%> +<%@page import="de.intevation.gnv.artifactdatabase.objects.ArtifactObject"%> +<%@page import="java.util.Collection"%> +<%@page import="java.util.Iterator"%> +<%@page import="java.net.URLEncoder"%> +<% + SessionModel sm = SessionModelFactory.getInstance().getSessionModel(request); + ArtifactObject artifact = sm.getCurrentArtifact(); + String mimeType = null; + String wmslayer = null; + String parameterString = ""; + + String target = "chart"; + String targetCSV = "csv"; + String targetODV = "odv"; + String targetZIP = "zip"; + String targetWMS = "wms"; + String targetSta = "statistics"; + String targetHis = "histogram"; + + boolean supportChart = sm.getOutputMode(target) != null; + boolean supportCSV = sm.getOutputMode(targetCSV) != null; + boolean supportODV = sm.getOutputMode(targetODV) != null; + boolean supportZIP = sm.getOutputMode(targetZIP) != null; + boolean supportWMS = sm.getOutputMode(targetWMS) != null; + boolean supportSta = sm.getOutputMode(targetSta) != null; + boolean supportHis = sm.getOutputMode(targetHis) != null; + + if (supportChart){ + mimeType = sm.getOutputMode(target).getMimeType(); + DiagrammOptions diagrammOptions = sm.getDiagrammOptions(); + Collection op = sm.getOutputMode(target).getOutputParameters(); + + if (op != null){ + Iterator it = op.iterator(); + while (it.hasNext()){ + OutputParameter parameter = it.next(); + parameterString = parameterString +"&"+parameter.getName()+"="+(diagrammOptions != null ? diagrammOptions.getValue(parameter.getName()): parameter.getValue()); + } + } + } + + String mimeTypeCSV = null; + if (supportCSV){ + mimeTypeCSV = sm.getOutputMode(targetCSV).getMimeType(); + } + + String mimeTypeODV = null; + if (supportODV){ + mimeTypeODV = sm.getOutputMode(targetODV).getMimeType(); + } + + String mimeTypeZIP = null; + if (supportZIP) { + mimeTypeZIP = sm.getOutputMode(targetZIP).getMimeType(); + } + + String mimeTypeWMS = null; + if (supportWMS) { + mimeTypeWMS = sm.getOutputMode(targetWMS).getMimeType(); + wmslayer = artifact.getId(); + } +%> + +<%-- display export options if one is supported in this state --%> +<% if (supportChart || supportCSV || supportODV || supportWMS || supportZIP) { %> +
+
+ + <%if (supportChart) { %> + " title=""> + + + <%}%> + <%if (supportWMS) { %> + "> + + + <%}%> + <%if (supportZIP) { %> + "> + + + <%}%> + + <%if (supportSta) { %> + " title=""> + + + <%}%> + + <%if (supportHis) { %> + " title=""> + + + <%}%> + <%if (supportCSV) { %> + "> + + + <%}%> + <%if (supportODV) { %> + "> + + + <%}%> +
+
+<%}%> diff -r f99d8f92a640 -r 755dd2fa4a0a gnv/src/main/webapp/WEB-INF/jsp/includes/display_fis_inc.jsp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv/src/main/webapp/WEB-INF/jsp/includes/display_fis_inc.jsp Fri Sep 28 12:13:53 2012 +0200 @@ -0,0 +1,31 @@ +<%@ taglib uri="http://jakarta.apache.org/struts/tags-bean" prefix="bean" %> +<%@ taglib uri="http://jakarta.apache.org/struts/tags-bean-el" prefix="bean-el" %> +<%@page import="de.intevation.gnv.action.sessionmodel.SessionModel"%> +<%@page import="de.intevation.gnv.action.sessionmodel.SessionModelFactory"%> +<%@page import="java.util.Collection"%> +<%@page import="de.intevation.gnv.artifactdatabase.objects.ArtifactObject"%> +<%@page import="java.util.Iterator"%> +<% + SessionModel sm = SessionModelFactory.getInstance().getSessionModel(request); + Collection artifactFactories = sm.getArtifactFactories(); + String prefix = "gnviewer.fis."; +%> +
+
" method="post"> +
+ + <%if (artifactFactories != null){%> + + + <%}%> +
+ " /> +
+
+
\ No newline at end of file diff -r f99d8f92a640 -r 755dd2fa4a0a gnv/src/main/webapp/WEB-INF/jsp/includes/display_histogram_inc.jsp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv/src/main/webapp/WEB-INF/jsp/includes/display_histogram_inc.jsp Fri Sep 28 12:13:53 2012 +0200 @@ -0,0 +1,33 @@ +<%@ taglib uri="http://jakarta.apache.org/struts/tags-bean" prefix="bean" %> +<%@ taglib uri="http://jakarta.apache.org/struts/tags-bean-el" prefix="bean-el" %> +<%@page import="de.intevation.gnv.action.sessionmodel.SessionModel"%> +<%@page import="de.intevation.gnv.action.sessionmodel.SessionModelFactory"%> +<%@page import="de.intevation.gnv.action.sessionmodel.DiagrammOptions"%> +<%@page import="de.intevation.gnv.artifactdatabase.objects.OutputParameter"%> +<%@page import="java.util.Collection"%> +<%@page import="java.util.Iterator"%> +<% + SessionModel sm = SessionModelFactory.getInstance().getSessionModel(request); + + String parameterString = ""; + String target = "histogram"; + String mimeType = sm.getOutputMode(target).getMimeType(); + + DiagrammOptions diagrammOptions = sm.getDiagrammOptions(); + Collection op = sm.getOutputMode(target).getOutputParameters(); + + if (op != null){ + Iterator it = op.iterator(); + while (it.hasNext()){ + OutputParameter parameter = it.next(); + parameterString = parameterString +"&"+parameter.getName()+"="+(diagrammOptions != null ? diagrammOptions.getValue(parameter.getName()): parameter.getValue()); + } + + parameterString += "&bintype="+request.getAttribute("bintype"); + } +%> + + +
+ <bean:message key="gnviewer.output.options.histogram.alt"/> +
diff -r f99d8f92a640 -r 755dd2fa4a0a gnv/src/main/webapp/WEB-INF/jsp/includes/display_histogram_options_inc.jsp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv/src/main/webapp/WEB-INF/jsp/includes/display_histogram_options_inc.jsp Fri Sep 28 12:13:53 2012 +0200 @@ -0,0 +1,126 @@ +<%@ taglib uri="http://jakarta.apache.org/struts/tags-bean" prefix="bean" %> +<%@ taglib uri="http://jakarta.apache.org/struts/tags-bean-el" prefix="bean-el" %> +<%@page import="de.intevation.gnv.action.sessionmodel.DiagrammOptions"%> +<%@page import="de.intevation.gnv.action.sessionmodel.SessionModelFactory"%> +<%@page import="de.intevation.gnv.artifactdatabase.objects.OutputMode"%> +<%@page import="de.intevation.gnv.action.sessionmodel.SessionModel"%> +<%@page import="de.intevation.gnv.artifactdatabase.objects.OutputParameter"%> +<%@page import="de.intevation.gnv.artifactdatabase.objects.ExportMode"%> +<%@page import="java.util.Collection"%> +<%@page import="java.util.Iterator"%> +<%@page import="java.net.URLEncoder"%> +<% + String target = "histogram"; + String targetPDF = "pdf"; + String targetSVG = "svg"; + String targetIMG = "img"; + SessionModel sm = SessionModelFactory.getInstance().getSessionModel(request); + OutputMode outputMode = sm.getOutputMode(target); + DiagrammOptions diagrammOptions = sm.getDiagrammOptions(); + + boolean useDiagrammOptions = diagrammOptions != null; + ExportMode supportIMG = outputMode.getExportMode(targetIMG); + ExportMode supportPDF = outputMode.getExportMode(targetPDF); + ExportMode supportSVG = outputMode.getExportMode(targetSVG); + + String mimeType = outputMode.getMimeType(); + String parameterString = ""; + Collection op = outputMode.getOutputParameters(); + + if (op != null){ + Iterator it = op.iterator(); + while (it.hasNext()){ + OutputParameter parameter = it.next(); + parameterString = parameterString +"&"+parameter.getName()+"="+(diagrammOptions != null ? diagrammOptions.getValue(parameter.getName()): parameter.getValue()); + } + } + + String mimeTypeIMG = null; + if (supportIMG != null) { + mimeTypeIMG = supportIMG.getMimeType(); + } + String mimeTypePDF = null; + if (supportPDF != null) { + mimeTypePDF = supportPDF.getMimeType(); + } + String mimeTypeSVG = null; + if (supportSVG != null) { + mimeTypeSVG = supportSVG.getMimeType(); + mimeTypeSVG = URLEncoder.encode(mimeTypeSVG, "UTF-8"); + } +%> +
+
+ + + +
+ + <%if (outputMode != null && outputMode.getOutputParameters() != null && !outputMode.getOutputParameters().isEmpty()){ + Iterator it = outputMode.getOutputParameters().iterator(); + while (it.hasNext()){ + OutputParameter om = it.next(); + String diaOpts = null; + if (diagrammOptions != null) { + diaOpts = request.getParameter("bintype"); + }%> + + + + + + <%}%> +
+ <%if (om.getName().equals("bincount")) { + String check = ""; + if (diaOpts != null && diaOpts.equalsIgnoreCase("binwidth")) { + check = ""; + } + else { + check = "checked=\"checked\""; + }%> + name="bintype" value="bincount" id="checkCount" onClick="toggleBinType('checkWidth')">  + <%}%> + <%if (om.getName().equals("binwidth")) { + String check = ""; + if (diaOpts != null && diaOpts.equalsIgnoreCase("binwidth")) { + check = "checked=\"checked\""; + } + else if (diaOpts == null) { + check = ""; + }%> + name="bintype" value="binwidth" id="checkWidth" onClick="toggleBinType('checkCount')">  + <%}%> + + + + <%if (om.getType().equalsIgnoreCase("boolean")){ + boolean checked = useDiagrammOptions ? "true".equalsIgnoreCase(diagrammOptions.getValue(om.getName())) : om.getValue().equalsIgnoreCase("true"); + %> + /> + <%}else{%> + + <%}%> +
+ "/> + <%}%> + <%if (supportIMG != null) { %> + "> + + + <%}%> + <%if (supportPDF != null) { %> + "> + + + <%}%> + <%if (supportSVG != null) { %> + "> + + + <%}%> +
+
+
diff -r f99d8f92a640 -r 755dd2fa4a0a gnv/src/main/webapp/WEB-INF/jsp/includes/display_mapviewercall_inc.jsp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv/src/main/webapp/WEB-INF/jsp/includes/display_mapviewercall_inc.jsp Fri Sep 28 12:13:53 2012 +0200 @@ -0,0 +1,49 @@ +
+
" method="post"> +
+ Kartenviewer Request + + +
+
+
\ No newline at end of file diff -r f99d8f92a640 -r 755dd2fa4a0a gnv/src/main/webapp/WEB-INF/jsp/index.jsp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv/src/main/webapp/WEB-INF/jsp/index.jsp Fri Sep 28 12:13:53 2012 +0200 @@ -0,0 +1,73 @@ +<%@ taglib uri="http://jakarta.apache.org/struts/tags-bean" prefix="bean" %> +<%@page import="java.util.Collection"%> +<%@page import="de.intevation.gnv.artifactdatabase.objects.ArtifactObject"%> +<%@page import="de.intevation.gnv.action.sessionmodel.SessionModel"%> +<%@page import="de.intevation.gnv.action.sessionmodel.SessionModelFactory"%> +<%@page import="java.util.Iterator"%> +<% + SessionModel sm = SessionModelFactory.getInstance().getSessionModel(request); + Object ui = request.getAttribute("ui"); + Object staticui = request.getAttribute("staticui"); + Object chart = request.getAttribute("chart"); + Object statistic = request.getAttribute("statistic"); + Object histogram = request.getAttribute("histogram"); + Object wms = request.getAttribute("wms"); + boolean furthertargets = true; + + if (chart == null && statistic == null && histogram == null && wms == null) { + boolean supportChart = sm.getOutputMode("chart") != null; + if (supportChart) { + chart = "true"; + } + } + + Object furthertargetsObject = request.getAttribute("furthertargets"); + if (furthertargetsObject != null){ + furthertargets = ((Boolean)furthertargetsObject).booleanValue(); + } +%> +
+ <%if (staticui == null){ %> + + <%} else {%> +
+
+ + <%=staticui.toString()%> +
+
+ <%}%> + + <%-- render the dynamic part to feed the state and advance to the next state --%> + <%if (ui != null){%> +
+
" method="post"> +
+ <%=ui != null ? ui.toString().replaceAll(" ", "") : "" %> + + <%if(furthertargets){%> + "/> + <%}%> +
+
+
+ <%}%> +
+ + <%-- render export options if existing for this state --%> + + + <%if (chart != null) {%> + <%-- render chart options if existing for this state --%> + + <%}%> + + <%-- render statistic --%> + <%if (statistic != null) {%> + + <%}%> + + <%-- render histogram --%> + <%if (histogram != null) {%> + + <%}%> diff -r f99d8f92a640 -r 755dd2fa4a0a gnv/src/main/webapp/WEB-INF/jsp/mainlayout.jsp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv/src/main/webapp/WEB-INF/jsp/mainlayout.jsp Fri Sep 28 12:13:53 2012 +0200 @@ -0,0 +1,71 @@ + +<%@ taglib uri="http://jakarta.apache.org/struts/tags-bean" prefix="bean" %> + + + + <bean:message key="gnviewer.app.title"/> + + + + + + + + + + + + + + +
+
+
+

+ +

+
+
+
+ + + +
+ + diff -r f99d8f92a640 -r 755dd2fa4a0a gnv/src/main/webapp/WEB-INF/jsp/version.jsp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv/src/main/webapp/WEB-INF/jsp/version.jsp Fri Sep 28 12:13:53 2012 +0200 @@ -0,0 +1,45 @@ + +<%@ taglib uri="http://jakarta.apache.org/struts/tags-bean" prefix="bean" %> + + + + <bean:message key="gnviewer.app.title"/> + + + + + + + + + + + + + +
+
+
+

+ +

+
+
+
+ +
+
+

Generischer Viewer

+ Name:
+ Version:
+ Date:
+

Artifaktdatenbank

+ Name: N/N
+ Version: N/N
+ Date: N/N
+
+ +
+ + \ No newline at end of file diff -r f99d8f92a640 -r 755dd2fa4a0a gnv/src/main/webapp/WEB-INF/jsp/wmslayout.jsp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv/src/main/webapp/WEB-INF/jsp/wmslayout.jsp Fri Sep 28 12:13:53 2012 +0200 @@ -0,0 +1,83 @@ + +<%@ taglib uri="http://jakarta.apache.org/struts/tags-bean" prefix="bean" %> +<% + String serverPath = (String) request.getAttribute("mapserver"); + String mapfilePath = (String) request.getAttribute("mapfile"); + String layerName = (String) request.getAttribute("layer"); +%> + + + + + <bean:message key="gnviewer.app.title"/> + + + + + + + + + + + + + + + +
+
+
+

+ +

+
+
+
+ + + + +
+
+ + + + + + + + + +
:<%=serverPath%>?MAP=<%=mapfilePath%>
:<%=layerName%>
+
+
+
+
+ + diff -r f99d8f92a640 -r 755dd2fa4a0a gnv/src/main/webapp/WEB-INF/web.xml --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv/src/main/webapp/WEB-INF/web.xml Fri Sep 28 12:13:53 2012 +0200 @@ -0,0 +1,52 @@ + + + + Archetype Created Web Application + + action + de.intevation.gnv.servlet.GNVActionServlet + + + + config + /WEB-INF/config/struts-config.xml + + + + + de.intevation.gnv.servlet.log4j.configuration + WEB-INF/config/log4j.properties + + + + + de.intevation.gnv.artifactdatabase.client.ArtifactDatabase.count + 1 + + + + + de.intevation.gnv.artifactdatabase.client.ArtifactDatabase.url.1 + http://localhost:8181 + + + + 1 + + + + + action + *.do + + diff -r f99d8f92a640 -r 755dd2fa4a0a gnv/src/main/webapp/images/arrow_refresh.png Binary file gnv/src/main/webapp/images/arrow_refresh.png has changed diff -r f99d8f92a640 -r 755dd2fa4a0a gnv/src/main/webapp/images/back_button.png Binary file gnv/src/main/webapp/images/back_button.png has changed diff -r f99d8f92a640 -r 755dd2fa4a0a gnv/src/main/webapp/images/bg_fieldset.gif Binary file gnv/src/main/webapp/images/bg_fieldset.gif has changed diff -r f99d8f92a640 -r 755dd2fa4a0a gnv/src/main/webapp/images/bg_fieldset_ie6.gif Binary file gnv/src/main/webapp/images/bg_fieldset_ie6.gif has changed diff -r f99d8f92a640 -r 755dd2fa4a0a gnv/src/main/webapp/images/bsh_logo.gif Binary file gnv/src/main/webapp/images/bsh_logo.gif has changed diff -r f99d8f92a640 -r 755dd2fa4a0a gnv/src/main/webapp/images/chart_bar.png Binary file gnv/src/main/webapp/images/chart_bar.png has changed diff -r f99d8f92a640 -r 755dd2fa4a0a gnv/src/main/webapp/images/chart_curve.png Binary file gnv/src/main/webapp/images/chart_curve.png has changed diff -r f99d8f92a640 -r 755dd2fa4a0a gnv/src/main/webapp/images/data_export.png Binary file gnv/src/main/webapp/images/data_export.png has changed diff -r f99d8f92a640 -r 755dd2fa4a0a gnv/src/main/webapp/images/diagram_export.png Binary file gnv/src/main/webapp/images/diagram_export.png has changed diff -r f99d8f92a640 -r 755dd2fa4a0a gnv/src/main/webapp/images/disk.png Binary file gnv/src/main/webapp/images/disk.png has changed diff -r f99d8f92a640 -r 755dd2fa4a0a gnv/src/main/webapp/images/img.gif Binary file gnv/src/main/webapp/images/img.gif has changed diff -r f99d8f92a640 -r 755dd2fa4a0a gnv/src/main/webapp/images/list-item.gif Binary file gnv/src/main/webapp/images/list-item.gif has changed diff -r f99d8f92a640 -r 755dd2fa4a0a gnv/src/main/webapp/images/map_go.png Binary file gnv/src/main/webapp/images/map_go.png has changed diff -r f99d8f92a640 -r 755dd2fa4a0a gnv/src/main/webapp/images/pdf.png Binary file gnv/src/main/webapp/images/pdf.png has changed diff -r f99d8f92a640 -r 755dd2fa4a0a gnv/src/main/webapp/images/statistics.png Binary file gnv/src/main/webapp/images/statistics.png has changed diff -r f99d8f92a640 -r 755dd2fa4a0a gnv/src/main/webapp/images/stock_data-save.png Binary file gnv/src/main/webapp/images/stock_data-save.png has changed diff -r f99d8f92a640 -r 755dd2fa4a0a gnv/src/main/webapp/images/svg.png Binary file gnv/src/main/webapp/images/svg.png has changed diff -r f99d8f92a640 -r 755dd2fa4a0a gnv/src/main/webapp/index.jsp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv/src/main/webapp/index.jsp Fri Sep 28 12:13:53 2012 +0200 @@ -0,0 +1,2 @@ +<%@ taglib uri="http://struts.apache.org/tags-logic" prefix="logic" %> + diff -r f99d8f92a640 -r 755dd2fa4a0a gnv/src/main/webapp/scripts/calendar-de.js --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv/src/main/webapp/scripts/calendar-de.js Fri Sep 28 12:13:53 2012 +0200 @@ -0,0 +1,129 @@ +// ** I18N + +// Calendar DE language +// Author: Jack (tR), +// Encoding: any +// Distributed under the same terms as the calendar itself. + +// For translators: please use UTF-8 if possible. We strongly believe that +// Unicode is the answer to a real internationalized world. Also please +// include your contact information in the header, as can be seen above. + +// full day names +Calendar._DN = new Array +("Sonntag", + "Montag", + "Dienstag", + "Mittwoch", + "Donnerstag", + "Freitag", + "Samstag", + "Sonntag"); + +// Please note that the following array of short day names (and the same goes +// for short month names, _SMN) isn't absolutely necessary. We give it here +// for exemplification on how one can customize the short day names, but if +// they are simply the first N letters of the full name you can simply say: +// +// Calendar._SDN_len = N; // short day name length +// Calendar._SMN_len = N; // short month name length +// +// If N = 3 then this is not needed either since we assume a value of 3 if not +// present, to be compatible with translation files that were written before +// this feature. + +// short day names +Calendar._SDN = new Array +("So", + "Mo", + "Di", + "Mi", + "Do", + "Fr", + "Sa", + "So"); + + // First day of the week. "0" means display Sunday first, "1" means display +// Monday first, etc. +Calendar._FD = 0; + + +// full month names +Calendar._MN = new Array +("Januar", + "Februar", + "M\u00e4rz", + "April", + "Mai", + "Juni", + "Juli", + "August", + "September", + "Oktober", + "November", + "Dezember"); + +// short month names +Calendar._SMN = new Array +("Jan", + "Feb", + "M\u00e4r", + "Apr", + "May", + "Jun", + "Jul", + "Aug", + "Sep", + "Okt", + "Nov", + "Dez"); + +// tooltips +Calendar._TT = {}; +Calendar._TT["INFO"] = "\u00DCber dieses Kalendarmodul"; + +Calendar._TT["ABOUT"] = +"DHTML Date/Time Selector\n" + +"(c) dynarch.com 2002-2005 / Author: Mihai Bazon\n" + // don't translate this ;-) +"For latest version visit: http://www.dynarch.com/projects/calendar/\n" + +"Distributed under GNU LGPL. See http://gnu.org/licenses/lgpl.html for details." + +"\n\n" + +"Datum ausw\u00e4hlen:\n" + +"- Benutzen Sie die \xab, \xbb Buttons um das Jahr zu w\u00e4hlen\n" + +"- Benutzen Sie die " + String.fromCharCode(0x2039) + ", " + String.fromCharCode(0x203a) + " Buttons um den Monat zu w\u00e4hlen\n" + +"- F\u00fcr eine Schnellauswahl halten Sie die Maustaste \u00fcber diesen Buttons fest."; +Calendar._TT["ABOUT_TIME"] = "\n\n" + +"Zeit ausw\u00e4hlen:\n" + +"- Klicken Sie auf die Teile der Uhrzeit, um diese zu erh\u00F6hen\n" + +"- oder klicken Sie mit festgehaltener Shift-Taste um diese zu verringern\n" + +"- oder klicken und festhalten f\u00fcr Schnellauswahl."; + +Calendar._TT["TOGGLE"] = "Ersten Tag der Woche w\u00e4hlen"; +Calendar._TT["PREV_YEAR"] = "Voriges Jahr (Festhalten f\u00fcr Schnellauswahl)"; +Calendar._TT["PREV_MONTH"] = "Voriger Monat (Festhalten f\u00fcr Schnellauswahl)"; +Calendar._TT["GO_TODAY"] = "Heute ausw\u00e4hlen"; +Calendar._TT["NEXT_MONTH"] = "N\u00e4chst. Monat (Festhalten f\u00fcr Schnellauswahl)"; +Calendar._TT["NEXT_YEAR"] = "N\u00e4chst. Jahr (Festhalten f\u00fcr Schnellauswahl)"; +Calendar._TT["SEL_DATE"] = "Datum ausw\u00e4hlen"; +Calendar._TT["DRAG_TO_MOVE"] = "Zum Bewegen festhalten"; +Calendar._TT["PART_TODAY"] = " (Heute)"; + +// the following is to inform that "%s" is to be the first day of week +// %s will be replaced with the day name. +Calendar._TT["DAY_FIRST"] = "Woche beginnt mit %s "; + +// This may be locale-dependent. It specifies the week-end days, as an array +// of comma-separated numbers. The numbers are from 0 to 6: 0 means Sunday, 1 +// means Monday, etc. +Calendar._TT["WEEKEND"] = "0,6"; + +Calendar._TT["CLOSE"] = "Schlie\u00dfen"; +Calendar._TT["TODAY"] = "Heute"; +Calendar._TT["TIME_PART"] = "(Shift-)Klick oder Festhalten und Ziehen um den Wert zu \u00e4ndern"; + +// date formats +Calendar._TT["DEF_DATE_FORMAT"] = "%d.%m.%Y"; +Calendar._TT["TT_DATE_FORMAT"] = "%a, %b %e"; + +Calendar._TT["WK"] = "wk"; +Calendar._TT["TIME"] = "Zeit:"; diff -r f99d8f92a640 -r 755dd2fa4a0a gnv/src/main/webapp/scripts/calendar-en.js --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv/src/main/webapp/scripts/calendar-en.js Fri Sep 28 12:13:53 2012 +0200 @@ -0,0 +1,127 @@ +// ** I18N + +// Calendar EN language +// Author: Mihai Bazon, +// Encoding: any +// Distributed under the same terms as the calendar itself. + +// For translators: please use UTF-8 if possible. We strongly believe that +// Unicode is the answer to a real internationalized world. Also please +// include your contact information in the header, as can be seen above. + +// full day names +Calendar._DN = new Array +("Sunday", + "Monday", + "Tuesday", + "Wednesday", + "Thursday", + "Friday", + "Saturday", + "Sunday"); + +// Please note that the following array of short day names (and the same goes +// for short month names, _SMN) isn't absolutely necessary. We give it here +// for exemplification on how one can customize the short day names, but if +// they are simply the first N letters of the full name you can simply say: +// +// Calendar._SDN_len = N; // short day name length +// Calendar._SMN_len = N; // short month name length +// +// If N = 3 then this is not needed either since we assume a value of 3 if not +// present, to be compatible with translation files that were written before +// this feature. + +// short day names +Calendar._SDN = new Array +("Sun", + "Mon", + "Tue", + "Wed", + "Thu", + "Fri", + "Sat", + "Sun"); + +// First day of the week. "0" means display Sunday first, "1" means display +// Monday first, etc. +Calendar._FD = 0; + +// full month names +Calendar._MN = new Array +("January", + "February", + "March", + "April", + "May", + "June", + "July", + "August", + "September", + "October", + "November", + "December"); + +// short month names +Calendar._SMN = new Array +("Jan", + "Feb", + "Mar", + "Apr", + "May", + "Jun", + "Jul", + "Aug", + "Sep", + "Oct", + "Nov", + "Dec"); + +// tooltips +Calendar._TT = {}; +Calendar._TT["INFO"] = "About the calendar"; + +Calendar._TT["ABOUT"] = +"DHTML Date/Time Selector\n" + +"(c) dynarch.com 2002-2005 / Author: Mihai Bazon\n" + // don't translate this this ;-) +"For latest version visit: http://www.dynarch.com/projects/calendar/\n" + +"Distributed under GNU LGPL. See http://gnu.org/licenses/lgpl.html for details." + +"\n\n" + +"Date selection:\n" + +"- Use the \xab, \xbb buttons to select year\n" + +"- Use the " + String.fromCharCode(0x2039) + ", " + String.fromCharCode(0x203a) + " buttons to select month\n" + +"- Hold mouse button on any of the above buttons for faster selection."; +Calendar._TT["ABOUT_TIME"] = "\n\n" + +"Time selection:\n" + +"- Click on any of the time parts to increase it\n" + +"- or Shift-click to decrease it\n" + +"- or click and drag for faster selection."; + +Calendar._TT["PREV_YEAR"] = "Prev. year (hold for menu)"; +Calendar._TT["PREV_MONTH"] = "Prev. month (hold for menu)"; +Calendar._TT["GO_TODAY"] = "Go Today"; +Calendar._TT["NEXT_MONTH"] = "Next month (hold for menu)"; +Calendar._TT["NEXT_YEAR"] = "Next year (hold for menu)"; +Calendar._TT["SEL_DATE"] = "Select date"; +Calendar._TT["DRAG_TO_MOVE"] = "Drag to move"; +Calendar._TT["PART_TODAY"] = " (today)"; + +// the following is to inform that "%s" is to be the first day of week +// %s will be replaced with the day name. +Calendar._TT["DAY_FIRST"] = "Display %s first"; + +// This may be locale-dependent. It specifies the week-end days, as an array +// of comma-separated numbers. The numbers are from 0 to 6: 0 means Sunday, 1 +// means Monday, etc. +Calendar._TT["WEEKEND"] = "0,6"; + +Calendar._TT["CLOSE"] = "Close"; +Calendar._TT["TODAY"] = "Today"; +Calendar._TT["TIME_PART"] = "(Shift-)Click or drag to change value"; + +// date formats +Calendar._TT["DEF_DATE_FORMAT"] = "%Y-%m-%d"; +Calendar._TT["TT_DATE_FORMAT"] = "%a, %b %e"; + +Calendar._TT["WK"] = "wk"; +Calendar._TT["TIME"] = "Time:"; diff -r f99d8f92a640 -r 755dd2fa4a0a gnv/src/main/webapp/scripts/calendar-setup.js --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv/src/main/webapp/scripts/calendar-setup.js Fri Sep 28 12:13:53 2012 +0200 @@ -0,0 +1,200 @@ +/* Copyright Mihai Bazon, 2002, 2003 | http://dynarch.com/mishoo/ + * --------------------------------------------------------------------------- + * + * The DHTML Calendar + * + * Details and latest version at: + * http://dynarch.com/mishoo/calendar.epl + * + * This script is distributed under the GNU Lesser General Public License. + * Read the entire license text here: http://www.gnu.org/licenses/lgpl.html + * + * This file defines helper functions for setting up the calendar. They are + * intended to help non-programmers get a working calendar on their site + * quickly. This script should not be seen as part of the calendar. It just + * shows you what one can do with the calendar, while in the same time + * providing a quick and simple method for setting it up. If you need + * exhaustive customization of the calendar creation process feel free to + * modify this code to suit your needs (this is recommended and much better + * than modifying calendar.js itself). + */ + +// $Id: calendar-setup.js,v 1.1 2007/12/06 13:55:16 drewnak Exp $ + +/** + * This function "patches" an input field (or other element) to use a calendar + * widget for date selection. + * + * The "params" is a single object that can have the following properties: + * + * prop. name | description + * ------------------------------------------------------------------------------------------------- + * inputField | the ID of an input field to store the date + * displayArea | the ID of a DIV or other element to show the date + * button | ID of a button or other element that will trigger the calendar + * eventName | event that will trigger the calendar, without the "on" prefix (default: "click") + * ifFormat | date format that will be stored in the input field + * daFormat | the date format that will be used to display the date in displayArea + * singleClick | (true/false) wether the calendar is in single click mode or not (default: true) + * firstDay | numeric: 0 to 6. "0" means display Sunday first, "1" means display Monday first, etc. + * align | alignment (default: "Br"); if you don't know what's this see the calendar documentation + * range | array with 2 elements. Default: [1900, 2999] -- the range of years available + * weekNumbers | (true/false) if it's true (default) the calendar will display week numbers + * flat | null or element ID; if not null the calendar will be a flat calendar having the parent with the given ID + * flatCallback | function that receives a JS Date object and returns an URL to point the browser to (for flat calendar) + * disableFunc | function that receives a JS Date object and should return true if that date has to be disabled in the calendar + * onSelect | function that gets called when a date is selected. You don't _have_ to supply this (the default is generally okay) + * onClose | function that gets called when the calendar is closed. [default] + * onUpdate | function that gets called after the date is updated in the input field. Receives a reference to the calendar. + * date | the date that the calendar will be initially displayed to + * showsTime | default: false; if true the calendar will include a time selector + * timeFormat | the time format; can be "12" or "24", default is "12" + * electric | if true (default) then given fields/date areas are updated for each move; otherwise they're updated only on close + * step | configures the step of the years in drop-down boxes; default: 2 + * position | configures the calendar absolute position; default: null + * cache | if "true" (but default: "false") it will reuse the same calendar object, where possible + * showOthers | if "true" (but default: "false") it will show days from other months too + * + * None of them is required, they all have default values. However, if you + * pass none of "inputField", "displayArea" or "button" you'll get a warning + * saying "nothing to setup". + */ +Calendar.setup = function (params) { + function param_default(pname, def) { if (typeof params[pname] == "undefined") { params[pname] = def; } }; + + param_default("inputField", null); + param_default("displayArea", null); + param_default("button", null); + param_default("eventName", "click"); + param_default("ifFormat", "%Y/%m/%d"); + param_default("daFormat", "%Y/%m/%d"); + param_default("singleClick", true); + param_default("disableFunc", null); + param_default("dateStatusFunc", params["disableFunc"]); // takes precedence if both are defined + param_default("dateText", null); + param_default("firstDay", null); + param_default("align", "Br"); + param_default("range", [1900, 2999]); + param_default("weekNumbers", true); + param_default("flat", null); + param_default("flatCallback", null); + param_default("onSelect", null); + param_default("onClose", null); + param_default("onUpdate", null); + param_default("date", null); + param_default("showsTime", false); + param_default("timeFormat", "24"); + param_default("electric", true); + param_default("step", 2); + param_default("position", null); + param_default("cache", false); + param_default("showOthers", false); + param_default("multiple", null); + + var tmp = ["inputField", "displayArea", "button"]; + for (var i in tmp) { + if (typeof params[tmp[i]] == "string") { + params[tmp[i]] = document.getElementById(params[tmp[i]]); + } + } + if (!(params.flat || params.multiple || params.inputField || params.displayArea || params.button)) { + alert("Calendar.setup:\n Nothing to setup (no fields found). Please check your code"); + return false; + } + + function onSelect(cal) { + var p = cal.params; + var update = (cal.dateClicked || p.electric); + if (update && p.inputField) { + p.inputField.value = cal.date.print(p.ifFormat); + if (typeof p.inputField.onchange == "function") + p.inputField.onchange(); + } + if (update && p.displayArea) + p.displayArea.innerHTML = cal.date.print(p.daFormat); + if (update && typeof p.onUpdate == "function") + p.onUpdate(cal); + if (update && p.flat) { + if (typeof p.flatCallback == "function") + p.flatCallback(cal); + } + if (update && p.singleClick && cal.dateClicked) + cal.callCloseHandler(); + }; + + if (params.flat != null) { + if (typeof params.flat == "string") + params.flat = document.getElementById(params.flat); + if (!params.flat) { + alert("Calendar.setup:\n Flat specified but can't find parent."); + return false; + } + var cal = new Calendar(params.firstDay, params.date, params.onSelect || onSelect); + cal.showsOtherMonths = params.showOthers; + cal.showsTime = params.showsTime; + cal.time24 = (params.timeFormat == "24"); + cal.params = params; + cal.weekNumbers = params.weekNumbers; + cal.setRange(params.range[0], params.range[1]); + cal.setDateStatusHandler(params.dateStatusFunc); + cal.getDateText = params.dateText; + if (params.ifFormat) { + cal.setDateFormat(params.ifFormat); + } + if (params.inputField && typeof params.inputField.value == "string") { + cal.parseDate(params.inputField.value); + } + cal.create(params.flat); + cal.show(); + return false; + } + + var triggerEl = params.button || params.displayArea || params.inputField; + triggerEl["on" + params.eventName] = function() { + var dateEl = params.inputField || params.displayArea; + var dateFmt = params.inputField ? params.ifFormat : params.daFormat; + var mustCreate = false; + var cal = window.calendar; + if (dateEl) + params.date = Date.parseDate(dateEl.value || dateEl.innerHTML, dateFmt); + if (!(cal && params.cache)) { + window.calendar = cal = new Calendar(params.firstDay, + params.date, + params.onSelect || onSelect, + params.onClose || function(cal) { cal.hide(); }); + cal.showsTime = params.showsTime; + cal.time24 = (params.timeFormat == "24"); + cal.weekNumbers = params.weekNumbers; + mustCreate = true; + } else { + if (params.date) + cal.setDate(params.date); + cal.hide(); + } + if (params.multiple) { + cal.multiple = {}; + for (var i = params.multiple.length; --i >= 0;) { + var d = params.multiple[i]; + var ds = d.print("%Y%m%d"); + cal.multiple[ds] = d; + } + } + cal.showsOtherMonths = params.showOthers; + cal.yearStep = params.step; + cal.setRange(params.range[0], params.range[1]); + cal.params = params; + cal.setDateStatusHandler(params.dateStatusFunc); + cal.getDateText = params.dateText; + cal.setDateFormat(dateFmt); + if (mustCreate) + cal.create(); + cal.refresh(); + if (!params.position) + cal.showAtElement(params.button || params.displayArea || params.inputField, params.align); + else + cal.showAt(params.position[0], params.position[1]); + return false; + }; + + return cal; +}; diff -r f99d8f92a640 -r 755dd2fa4a0a gnv/src/main/webapp/scripts/calendar-setup_stripped.js --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv/src/main/webapp/scripts/calendar-setup_stripped.js Fri Sep 28 12:13:53 2012 +0200 @@ -0,0 +1,21 @@ +/* Copyright Mihai Bazon, 2002, 2003 | http://dynarch.com/mishoo/ + * --------------------------------------------------------------------------- + * + * The DHTML Calendar + * + * Details and latest version at: + * http://dynarch.com/mishoo/calendar.epl + * + * This script is distributed under the GNU Lesser General Public License. + * Read the entire license text here: http://www.gnu.org/licenses/lgpl.html + * + * This file defines helper functions for setting up the calendar. They are + * intended to help non-programmers get a working calendar on their site + * quickly. This script should not be seen as part of the calendar. It just + * shows you what one can do with the calendar, while in the same time + * providing a quick and simple method for setting it up. If you need + * exhaustive customization of the calendar creation process feel free to + * modify this code to suit your needs (this is recommended and much better + * than modifying calendar.js itself). + */ + Calendar.setup=function(params){function param_default(pname,def){if(typeof params[pname]=="undefined"){params[pname]=def;}};param_default("inputField",null);param_default("displayArea",null);param_default("button",null);param_default("eventName","click");param_default("ifFormat","%Y/%m/%d");param_default("daFormat","%Y/%m/%d");param_default("singleClick",true);param_default("disableFunc",null);param_default("dateStatusFunc",params["disableFunc"]);param_default("dateText",null);param_default("firstDay",null);param_default("align","Br");param_default("range",[1900,2999]);param_default("weekNumbers",true);param_default("flat",null);param_default("flatCallback",null);param_default("onSelect",null);param_default("onClose",null);param_default("onUpdate",null);param_default("date",null);param_default("showsTime",false);param_default("timeFormat","24");param_default("electric",true);param_default("step",2);param_default("position",null);param_default("cache",false);param_default("showOthers",false);param_default("multiple",null);var tmp=["inputField","displayArea","button"];for(var i in tmp){if(typeof params[tmp[i]]=="string"){params[tmp[i]]=document.getElementById(params[tmp[i]]);}}if(!(params.flat||params.multiple||params.inputField||params.displayArea||params.button)){alert("Calendar.setup:\n Nothing to setup (no fields found). Please check your code");return false;}function onSelect(cal){var p=cal.params;var update=(cal.dateClicked||p.electric);if(update&&p.inputField){p.inputField.value=cal.date.print(p.ifFormat);if(typeof p.inputField.onchange=="function")p.inputField.onchange();}if(update&&p.displayArea)p.displayArea.innerHTML=cal.date.print(p.daFormat);if(update&&typeof p.onUpdate=="function")p.onUpdate(cal);if(update&&p.flat){if(typeof p.flatCallback=="function")p.flatCallback(cal);}if(update&&p.singleClick&&cal.dateClicked)cal.callCloseHandler();};if(params.flat!=null){if(typeof params.flat=="string")params.flat=document.getElementById(params.flat);if(!params.flat){alert("Calendar.setup:\n Flat specified but can't find parent.");return false;}var cal=new Calendar(params.firstDay,params.date,params.onSelect||onSelect);cal.showsOtherMonths=params.showOthers;cal.showsTime=params.showsTime;cal.time24=(params.timeFormat=="24");cal.params=params;cal.weekNumbers=params.weekNumbers;cal.setRange(params.range[0],params.range[1]);cal.setDateStatusHandler(params.dateStatusFunc);cal.getDateText=params.dateText;if(params.ifFormat){cal.setDateFormat(params.ifFormat);}if(params.inputField&&typeof params.inputField.value=="string"){cal.parseDate(params.inputField.value);}cal.create(params.flat);cal.show();return false;}var triggerEl=params.button||params.displayArea||params.inputField;triggerEl["on"+params.eventName]=function(){var dateEl=params.inputField||params.displayArea;var dateFmt=params.inputField?params.ifFormat:params.daFormat;var mustCreate=false;var cal=window.calendar;if(dateEl)params.date=Date.parseDate(dateEl.value||dateEl.innerHTML,dateFmt);if(!(cal&¶ms.cache)){window.calendar=cal=new Calendar(params.firstDay,params.date,params.onSelect||onSelect,params.onClose||function(cal){cal.hide();});cal.showsTime=params.showsTime;cal.time24=(params.timeFormat=="24");cal.weekNumbers=params.weekNumbers;mustCreate=true;}else{if(params.date)cal.setDate(params.date);cal.hide();}if(params.multiple){cal.multiple={};for(var i=params.multiple.length;--i>=0;){var d=params.multiple[i];var ds=d.print("%Y%m%d");cal.multiple[ds]=d;}}cal.showsOtherMonths=params.showOthers;cal.yearStep=params.step;cal.setRange(params.range[0],params.range[1]);cal.params=params;cal.setDateStatusHandler(params.dateStatusFunc);cal.getDateText=params.dateText;cal.setDateFormat(dateFmt);if(mustCreate)cal.create();cal.refresh();if(!params.position)cal.showAtElement(params.button||params.displayArea||params.inputField,params.align);else cal.showAt(params.position[0],params.position[1]);return false;};return cal;}; \ No newline at end of file diff -r f99d8f92a640 -r 755dd2fa4a0a gnv/src/main/webapp/scripts/calendar.js --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv/src/main/webapp/scripts/calendar.js Fri Sep 28 12:13:53 2012 +0200 @@ -0,0 +1,1806 @@ +/* Copyright Mihai Bazon, 2002-2005 | www.bazon.net/mishoo + * ----------------------------------------------------------- + * + * The DHTML Calendar, version 1.0 "It is happening again" + * + * Details and latest version at: + * www.dynarch.com/projects/calendar + * + * This script is developed by Dynarch.com. Visit us at www.dynarch.com. + * + * This script is distributed under the GNU Lesser General Public License. + * Read the entire license text here: http://www.gnu.org/licenses/lgpl.html + */ + +// $Id: calendar.js,v 1.1 2007/12/06 13:55:16 drewnak Exp $ + +/** The Calendar object constructor. */ +Calendar = function (firstDayOfWeek, dateStr, onSelected, onClose) { + // member variables + this.activeDiv = null; + this.currentDateEl = null; + this.getDateStatus = null; + this.getDateToolTip = null; + this.getDateText = null; + this.timeout = null; + this.onSelected = onSelected || null; + this.onClose = onClose || null; + this.dragging = false; + this.hidden = false; + this.minYear = 1970; + this.maxYear = 2050; + this.dateFormat = Calendar._TT["DEF_DATE_FORMAT"]; + this.ttDateFormat = Calendar._TT["TT_DATE_FORMAT"]; + this.isPopup = true; + this.weekNumbers = true; + this.firstDayOfWeek = typeof firstDayOfWeek == "number" ? firstDayOfWeek : Calendar._FD; // 0 for Sunday, 1 for Monday, etc. + this.showsOtherMonths = false; + this.dateStr = dateStr; + this.ar_days = null; + this.showsTime = false; + this.time24 = true; + this.yearStep = 2; + this.hiliteToday = true; + this.multiple = null; + // HTML elements + this.table = null; + this.element = null; + this.tbody = null; + this.firstdayname = null; + // Combo boxes + this.monthsCombo = null; + this.yearsCombo = null; + this.hilitedMonth = null; + this.activeMonth = null; + this.hilitedYear = null; + this.activeYear = null; + // Information + this.dateClicked = false; + + // one-time initializations + if (typeof Calendar._SDN == "undefined") { + // table of short day names + if (typeof Calendar._SDN_len == "undefined") + Calendar._SDN_len = 3; + var ar = new Array(); + for (var i = 8; i > 0;) { + ar[--i] = Calendar._DN[i].substr(0, Calendar._SDN_len); + } + Calendar._SDN = ar; + // table of short month names + if (typeof Calendar._SMN_len == "undefined") + Calendar._SMN_len = 3; + ar = new Array(); + for (var i = 12; i > 0;) { + ar[--i] = Calendar._MN[i].substr(0, Calendar._SMN_len); + } + Calendar._SMN = ar; + } +}; + +// ** constants + +/// "static", needed for event handlers. +Calendar._C = null; + +/// detect a special case of "web browser" +Calendar.is_ie = ( /msie/i.test(navigator.userAgent) && + !/opera/i.test(navigator.userAgent) ); + +Calendar.is_ie5 = ( Calendar.is_ie && /msie 5\.0/i.test(navigator.userAgent) ); + +/// detect Opera browser +Calendar.is_opera = /opera/i.test(navigator.userAgent); + +/// detect KHTML-based browsers +Calendar.is_khtml = /Konqueror|Safari|KHTML/i.test(navigator.userAgent); + +// BEGIN: UTILITY FUNCTIONS; beware that these might be moved into a separate +// library, at some point. + +Calendar.getAbsolutePos = function(el) { + var SL = 0, ST = 0; + var is_div = /^div$/i.test(el.tagName); + if (is_div && el.scrollLeft) + SL = el.scrollLeft; + if (is_div && el.scrollTop) + ST = el.scrollTop; + var r = { x: el.offsetLeft - SL, y: el.offsetTop - ST }; + if (el.offsetParent) { + var tmp = this.getAbsolutePos(el.offsetParent); + r.x += tmp.x; + r.y += tmp.y; + } + return r; +}; + +Calendar.isRelated = function (el, evt) { + var related = evt.relatedTarget; + if (!related) { + var type = evt.type; + if (type == "mouseover") { + related = evt.fromElement; + } else if (type == "mouseout") { + related = evt.toElement; + } + } + while (related) { + if (related == el) { + return true; + } + related = related.parentNode; + } + return false; +}; + +Calendar.removeClass = function(el, className) { + if (!(el && el.className)) { + return; + } + var cls = el.className.split(" "); + var ar = new Array(); + for (var i = cls.length; i > 0;) { + if (cls[--i] != className) { + ar[ar.length] = cls[i]; + } + } + el.className = ar.join(" "); +}; + +Calendar.addClass = function(el, className) { + Calendar.removeClass(el, className); + el.className += " " + className; +}; + +// FIXME: the following 2 functions totally suck, are useless and should be replaced immediately. +Calendar.getElement = function(ev) { + var f = Calendar.is_ie ? window.event.srcElement : ev.currentTarget; + while (f.nodeType != 1 || /^div$/i.test(f.tagName)) + f = f.parentNode; + return f; +}; + +Calendar.getTargetElement = function(ev) { + var f = Calendar.is_ie ? window.event.srcElement : ev.target; + while (f.nodeType != 1) + f = f.parentNode; + return f; +}; + +Calendar.stopEvent = function(ev) { + ev || (ev = window.event); + if (Calendar.is_ie) { + ev.cancelBubble = true; + ev.returnValue = false; + } else { + ev.preventDefault(); + ev.stopPropagation(); + } + return false; +}; + +Calendar.addEvent = function(el, evname, func) { + if (el.attachEvent) { // IE + el.attachEvent("on" + evname, func); + } else if (el.addEventListener) { // Gecko / W3C + el.addEventListener(evname, func, true); + } else { + el["on" + evname] = func; + } +}; + +Calendar.removeEvent = function(el, evname, func) { + if (el.detachEvent) { // IE + el.detachEvent("on" + evname, func); + } else if (el.removeEventListener) { // Gecko / W3C + el.removeEventListener(evname, func, true); + } else { + el["on" + evname] = null; + } +}; + +Calendar.createElement = function(type, parent) { + var el = null; + if (document.createElementNS) { + // use the XHTML namespace; IE won't normally get here unless + // _they_ "fix" the DOM2 implementation. + el = document.createElementNS("http://www.w3.org/1999/xhtml", type); + } else { + el = document.createElement(type); + } + if (typeof parent != "undefined") { + parent.appendChild(el); + } + return el; +}; + +// END: UTILITY FUNCTIONS + +// BEGIN: CALENDAR STATIC FUNCTIONS + +/** Internal -- adds a set of events to make some element behave like a button. */ +Calendar._add_evs = function(el) { + with (Calendar) { + addEvent(el, "mouseover", dayMouseOver); + addEvent(el, "mousedown", dayMouseDown); + addEvent(el, "mouseout", dayMouseOut); + if (is_ie) { + addEvent(el, "dblclick", dayMouseDblClick); + el.setAttribute("unselectable", true); + } + } +}; + +Calendar.findMonth = function(el) { + if (typeof el.month != "undefined") { + return el; + } else if (typeof el.parentNode.month != "undefined") { + return el.parentNode; + } + return null; +}; + +Calendar.findYear = function(el) { + if (typeof el.year != "undefined") { + return el; + } else if (typeof el.parentNode.year != "undefined") { + return el.parentNode; + } + return null; +}; + +Calendar.showMonthsCombo = function () { + var cal = Calendar._C; + if (!cal) { + return false; + } + var cal = cal; + var cd = cal.activeDiv; + var mc = cal.monthsCombo; + if (cal.hilitedMonth) { + Calendar.removeClass(cal.hilitedMonth, "hilite"); + } + if (cal.activeMonth) { + Calendar.removeClass(cal.activeMonth, "active"); + } + var mon = cal.monthsCombo.getElementsByTagName("div")[cal.date.getMonth()]; + Calendar.addClass(mon, "active"); + cal.activeMonth = mon; + var s = mc.style; + s.display = "block"; + if (cd.navtype < 0) + s.left = cd.offsetLeft + "px"; + else { + var mcw = mc.offsetWidth; + if (typeof mcw == "undefined") + // Konqueror brain-dead techniques + mcw = 50; + s.left = (cd.offsetLeft + cd.offsetWidth - mcw) + "px"; + } + s.top = (cd.offsetTop + cd.offsetHeight) + "px"; +}; + +Calendar.showYearsCombo = function (fwd) { + var cal = Calendar._C; + if (!cal) { + return false; + } + var cal = cal; + var cd = cal.activeDiv; + var yc = cal.yearsCombo; + if (cal.hilitedYear) { + Calendar.removeClass(cal.hilitedYear, "hilite"); + } + if (cal.activeYear) { + Calendar.removeClass(cal.activeYear, "active"); + } + cal.activeYear = null; + var Y = cal.date.getFullYear() + (fwd ? 1 : -1); + var yr = yc.firstChild; + var show = false; + for (var i = 12; i > 0; --i) { + if (Y >= cal.minYear && Y <= cal.maxYear) { + yr.innerHTML = Y; + yr.year = Y; + yr.style.display = "block"; + show = true; + } else { + yr.style.display = "none"; + } + yr = yr.nextSibling; + Y += fwd ? cal.yearStep : -cal.yearStep; + } + if (show) { + var s = yc.style; + s.display = "block"; + if (cd.navtype < 0) + s.left = cd.offsetLeft + "px"; + else { + var ycw = yc.offsetWidth; + if (typeof ycw == "undefined") + // Konqueror brain-dead techniques + ycw = 50; + s.left = (cd.offsetLeft + cd.offsetWidth - ycw) + "px"; + } + s.top = (cd.offsetTop + cd.offsetHeight) + "px"; + } +}; + +// event handlers + +Calendar.tableMouseUp = function(ev) { + var cal = Calendar._C; + if (!cal) { + return false; + } + if (cal.timeout) { + clearTimeout(cal.timeout); + } + var el = cal.activeDiv; + if (!el) { + return false; + } + var target = Calendar.getTargetElement(ev); + ev || (ev = window.event); + Calendar.removeClass(el, "active"); + if (target == el || target.parentNode == el) { + Calendar.cellClick(el, ev); + } + var mon = Calendar.findMonth(target); + var date = null; + if (mon) { + date = new Date(cal.date); + if (mon.month != date.getMonth()) { + date.setMonth(mon.month); + cal.setDate(date); + cal.dateClicked = false; + cal.callHandler(); + } + } else { + var year = Calendar.findYear(target); + if (year) { + date = new Date(cal.date); + if (year.year != date.getFullYear()) { + date.setFullYear(year.year); + cal.setDate(date); + cal.dateClicked = false; + cal.callHandler(); + } + } + } + with (Calendar) { + removeEvent(document, "mouseup", tableMouseUp); + removeEvent(document, "mouseover", tableMouseOver); + removeEvent(document, "mousemove", tableMouseOver); + cal._hideCombos(); + _C = null; + return stopEvent(ev); + } +}; + +Calendar.tableMouseOver = function (ev) { + var cal = Calendar._C; + if (!cal) { + return; + } + var el = cal.activeDiv; + var target = Calendar.getTargetElement(ev); + if (target == el || target.parentNode == el) { + Calendar.addClass(el, "hilite active"); + Calendar.addClass(el.parentNode, "rowhilite"); + } else { + if (typeof el.navtype == "undefined" || (el.navtype != 50 && (el.navtype == 0 || Math.abs(el.navtype) > 2))) + Calendar.removeClass(el, "active"); + Calendar.removeClass(el, "hilite"); + Calendar.removeClass(el.parentNode, "rowhilite"); + } + ev || (ev = window.event); + if (el.navtype == 50 && target != el) { + var pos = Calendar.getAbsolutePos(el); + var w = el.offsetWidth; + var x = ev.clientX; + var dx; + var decrease = true; + if (x > pos.x + w) { + dx = x - pos.x - w; + decrease = false; + } else + dx = pos.x - x; + + if (dx < 0) dx = 0; + var range = el._range; + var current = el._current; + var count = Math.floor(dx / 10) % range.length; + for (var i = range.length; --i >= 0;) + if (range[i] == current) + break; + while (count-- > 0) + if (decrease) { + if (--i < 0) + i = range.length - 1; + } else if ( ++i >= range.length ) + i = 0; + var newval = range[i]; + el.innerHTML = newval; + + cal.onUpdateTime(); + } + var mon = Calendar.findMonth(target); + if (mon) { + if (mon.month != cal.date.getMonth()) { + if (cal.hilitedMonth) { + Calendar.removeClass(cal.hilitedMonth, "hilite"); + } + Calendar.addClass(mon, "hilite"); + cal.hilitedMonth = mon; + } else if (cal.hilitedMonth) { + Calendar.removeClass(cal.hilitedMonth, "hilite"); + } + } else { + if (cal.hilitedMonth) { + Calendar.removeClass(cal.hilitedMonth, "hilite"); + } + var year = Calendar.findYear(target); + if (year) { + if (year.year != cal.date.getFullYear()) { + if (cal.hilitedYear) { + Calendar.removeClass(cal.hilitedYear, "hilite"); + } + Calendar.addClass(year, "hilite"); + cal.hilitedYear = year; + } else if (cal.hilitedYear) { + Calendar.removeClass(cal.hilitedYear, "hilite"); + } + } else if (cal.hilitedYear) { + Calendar.removeClass(cal.hilitedYear, "hilite"); + } + } + return Calendar.stopEvent(ev); +}; + +Calendar.tableMouseDown = function (ev) { + if (Calendar.getTargetElement(ev) == Calendar.getElement(ev)) { + return Calendar.stopEvent(ev); + } +}; + +Calendar.calDragIt = function (ev) { + var cal = Calendar._C; + if (!(cal && cal.dragging)) { + return false; + } + var posX; + var posY; + if (Calendar.is_ie) { + posY = window.event.clientY + document.body.scrollTop; + posX = window.event.clientX + document.body.scrollLeft; + } else { + posX = ev.pageX; + posY = ev.pageY; + } + cal.hideShowCovered(); + var st = cal.element.style; + st.left = (posX - cal.xOffs) + "px"; + st.top = (posY - cal.yOffs) + "px"; + return Calendar.stopEvent(ev); +}; + +Calendar.calDragEnd = function (ev) { + var cal = Calendar._C; + if (!cal) { + return false; + } + cal.dragging = false; + with (Calendar) { + removeEvent(document, "mousemove", calDragIt); + removeEvent(document, "mouseup", calDragEnd); + tableMouseUp(ev); + } + cal.hideShowCovered(); +}; + +Calendar.dayMouseDown = function(ev) { + var el = Calendar.getElement(ev); + if (el.disabled) { + return false; + } + var cal = el.calendar; + cal.activeDiv = el; + Calendar._C = cal; + if (el.navtype != 300) with (Calendar) { + if (el.navtype == 50) { + el._current = el.innerHTML; + addEvent(document, "mousemove", tableMouseOver); + } else + addEvent(document, Calendar.is_ie5 ? "mousemove" : "mouseover", tableMouseOver); + addClass(el, "hilite active"); + addEvent(document, "mouseup", tableMouseUp); + } else if (cal.isPopup) { + cal._dragStart(ev); + } + if (el.navtype == -1 || el.navtype == 1) { + if (cal.timeout) clearTimeout(cal.timeout); + cal.timeout = setTimeout("Calendar.showMonthsCombo()", 250); + } else if (el.navtype == -2 || el.navtype == 2) { + if (cal.timeout) clearTimeout(cal.timeout); + cal.timeout = setTimeout((el.navtype > 0) ? "Calendar.showYearsCombo(true)" : "Calendar.showYearsCombo(false)", 250); + } else { + cal.timeout = null; + } + return Calendar.stopEvent(ev); +}; + +Calendar.dayMouseDblClick = function(ev) { + Calendar.cellClick(Calendar.getElement(ev), ev || window.event); + if (Calendar.is_ie) { + document.selection.empty(); + } +}; + +Calendar.dayMouseOver = function(ev) { + var el = Calendar.getElement(ev); + if (Calendar.isRelated(el, ev) || Calendar._C || el.disabled) { + return false; + } + if (el.ttip) { + if (el.ttip.substr(0, 1) == "_") { + el.ttip = el.caldate.print(el.calendar.ttDateFormat) + el.ttip.substr(1); + } + el.calendar.tooltips.innerHTML = el.ttip; + } + if (el.navtype != 300) { + Calendar.addClass(el, "hilite"); + if (el.caldate) { + Calendar.addClass(el.parentNode, "rowhilite"); + } + } + return Calendar.stopEvent(ev); +}; + +Calendar.dayMouseOut = function(ev) { + with (Calendar) { + var el = getElement(ev); + if (isRelated(el, ev) || _C || el.disabled) + return false; + removeClass(el, "hilite"); + if (el.caldate) + removeClass(el.parentNode, "rowhilite"); + if (el.calendar) + el.calendar.tooltips.innerHTML = _TT["SEL_DATE"]; + return stopEvent(ev); + } +}; + +/** + * A generic "click" handler :) handles all types of buttons defined in this + * calendar. + */ +Calendar.cellClick = function(el, ev) { + var cal = el.calendar; + var closing = false; + var newdate = false; + var date = null; + if (typeof el.navtype == "undefined") { + if (cal.currentDateEl) { + Calendar.removeClass(cal.currentDateEl, "selected"); + Calendar.addClass(el, "selected"); + closing = (cal.currentDateEl == el); + if (!closing) { + cal.currentDateEl = el; + } + } + cal.date.setDateOnly(el.caldate); + date = cal.date; + var other_month = !(cal.dateClicked = !el.otherMonth); + if (!other_month && !cal.currentDateEl) + cal._toggleMultipleDate(new Date(date)); + else + newdate = !el.disabled; + // a date was clicked + if (other_month) + cal._init(cal.firstDayOfWeek, date); + } else { + if (el.navtype == 200) { + Calendar.removeClass(el, "hilite"); + cal.callCloseHandler(); + return; + } + date = new Date(cal.date); + if (el.navtype == 0) + date.setDateOnly(new Date()); // TODAY + // unless "today" was clicked, we assume no date was clicked so + // the selected handler will know not to close the calenar when + // in single-click mode. + // cal.dateClicked = (el.navtype == 0); + cal.dateClicked = false; + var year = date.getFullYear(); + var mon = date.getMonth(); + function setMonth(m) { + var day = date.getDate(); + var max = date.getMonthDays(m); + if (day > max) { + date.setDate(max); + } + date.setMonth(m); + }; + switch (el.navtype) { + case 400: + Calendar.removeClass(el, "hilite"); + var text = Calendar._TT["ABOUT"]; + if (typeof text != "undefined") { + text += cal.showsTime ? Calendar._TT["ABOUT_TIME"] : ""; + } else { + // FIXME: this should be removed as soon as lang files get updated! + text = "Help and about box text is not translated into this language.\n" + + "If you know this language and you feel generous please update\n" + + "the corresponding file in \"lang\" subdir to match calendar-en.js\n" + + "and send it back to to get it into the distribution ;-)\n\n" + + "Thank you!\n" + + "http://dynarch.com/mishoo/calendar.epl\n"; + } + alert(text); + return; + case -2: + if (year > cal.minYear) { + date.setFullYear(year - 1); + } + break; + case -1: + if (mon > 0) { + setMonth(mon - 1); + } else if (year-- > cal.minYear) { + date.setFullYear(year); + setMonth(11); + } + break; + case 1: + if (mon < 11) { + setMonth(mon + 1); + } else if (year < cal.maxYear) { + date.setFullYear(year + 1); + setMonth(0); + } + break; + case 2: + if (year < cal.maxYear) { + date.setFullYear(year + 1); + } + break; + case 100: + cal.setFirstDayOfWeek(el.fdow); + return; + case 50: + var range = el._range; + var current = el.innerHTML; + for (var i = range.length; --i >= 0;) + if (range[i] == current) + break; + if (ev && ev.shiftKey) { + if (--i < 0) + i = range.length - 1; + } else if ( ++i >= range.length ) + i = 0; + var newval = range[i]; + el.innerHTML = newval; + cal.onUpdateTime(); + return; + case 0: + // TODAY will bring us here + if ((typeof cal.getDateStatus == "function") && + cal.getDateStatus(date, date.getFullYear(), date.getMonth(), date.getDate())) { + return false; + } + break; + } + if (!date.equalsTo(cal.date)) { + cal.setDate(date); + newdate = true; + } else if (el.navtype == 0) + newdate = closing = true; + } + if (newdate) { + ev && cal.callHandler(); + } + if (closing) { + Calendar.removeClass(el, "hilite"); + ev && cal.callCloseHandler(); + } +}; + +// END: CALENDAR STATIC FUNCTIONS + +// BEGIN: CALENDAR OBJECT FUNCTIONS + +/** + * This function creates the calendar inside the given parent. If _par is + * null than it creates a popup calendar inside the BODY element. If _par is + * an element, be it BODY, then it creates a non-popup calendar (still + * hidden). Some properties need to be set before calling this function. + */ +Calendar.prototype.create = function (_par) { + var parent = null; + if (! _par) { + // default parent is the document body, in which case we create + // a popup calendar. + parent = document.getElementsByTagName("body")[0]; + this.isPopup = true; + } else { + parent = _par; + this.isPopup = false; + } + this.date = this.dateStr ? new Date(this.dateStr) : new Date(); + + var table = Calendar.createElement("table"); + this.table = table; + table.cellSpacing = 0; + table.cellPadding = 0; + table.calendar = this; + Calendar.addEvent(table, "mousedown", Calendar.tableMouseDown); + + var div = Calendar.createElement("div"); + this.element = div; + div.className = "calendar"; + if (this.isPopup) { + div.style.position = "absolute"; + div.style.display = "none"; + } + div.appendChild(table); + + var thead = Calendar.createElement("thead", table); + var cell = null; + var row = null; + + var cal = this; + var hh = function (text, cs, navtype) { + cell = Calendar.createElement("td", row); + cell.colSpan = cs; + cell.className = "button"; + if (navtype != 0 && Math.abs(navtype) <= 2) + cell.className += " nav"; + Calendar._add_evs(cell); + cell.calendar = cal; + cell.navtype = navtype; + cell.innerHTML = "
" + text + "
"; + return cell; + }; + + row = Calendar.createElement("tr", thead); + var title_length = 6; + (this.isPopup) && --title_length; + (this.weekNumbers) && ++title_length; + + hh("?", 1, 400).ttip = Calendar._TT["INFO"]; + this.title = hh("", title_length, 300); + this.title.className = "title"; + if (this.isPopup) { + this.title.ttip = Calendar._TT["DRAG_TO_MOVE"]; + this.title.style.cursor = "move"; + hh("×", 1, 200).ttip = Calendar._TT["CLOSE"]; + } + + row = Calendar.createElement("tr", thead); + row.className = "headrow"; + + this._nav_py = hh("«", 1, -2); + this._nav_py.ttip = Calendar._TT["PREV_YEAR"]; + + this._nav_pm = hh("‹", 1, -1); + this._nav_pm.ttip = Calendar._TT["PREV_MONTH"]; + + this._nav_now = hh(Calendar._TT["TODAY"], this.weekNumbers ? 4 : 3, 0); + this._nav_now.ttip = Calendar._TT["GO_TODAY"]; + + this._nav_nm = hh("›", 1, 1); + this._nav_nm.ttip = Calendar._TT["NEXT_MONTH"]; + + this._nav_ny = hh("»", 1, 2); + this._nav_ny.ttip = Calendar._TT["NEXT_YEAR"]; + + // day names + row = Calendar.createElement("tr", thead); + row.className = "daynames"; + if (this.weekNumbers) { + cell = Calendar.createElement("td", row); + cell.className = "name wn"; + cell.innerHTML = Calendar._TT["WK"]; + } + for (var i = 7; i > 0; --i) { + cell = Calendar.createElement("td", row); + if (!i) { + cell.navtype = 100; + cell.calendar = this; + Calendar._add_evs(cell); + } + } + this.firstdayname = (this.weekNumbers) ? row.firstChild.nextSibling : row.firstChild; + this._displayWeekdays(); + + var tbody = Calendar.createElement("tbody", table); + this.tbody = tbody; + + for (i = 6; i > 0; --i) { + row = Calendar.createElement("tr", tbody); + if (this.weekNumbers) { + cell = Calendar.createElement("td", row); + } + for (var j = 7; j > 0; --j) { + cell = Calendar.createElement("td", row); + cell.calendar = this; + Calendar._add_evs(cell); + } + } + + if (this.showsTime) { + row = Calendar.createElement("tr", tbody); + row.className = "time"; + + cell = Calendar.createElement("td", row); + cell.className = "time"; + cell.colSpan = 2; + cell.innerHTML = Calendar._TT["TIME"] || " "; + + cell = Calendar.createElement("td", row); + cell.className = "time"; + cell.colSpan = this.weekNumbers ? 4 : 3; + + (function(){ + function makeTimePart(className, init, range_start, range_end) { + var part = Calendar.createElement("span", cell); + part.className = className; + part.innerHTML = init; + part.calendar = cal; + part.ttip = Calendar._TT["TIME_PART"]; + part.navtype = 50; + part._range = []; + if (typeof range_start != "number") + part._range = range_start; + else { + for (var i = range_start; i <= range_end; ++i) { + var txt; + if (i < 10 && range_end >= 10) txt = '0' + i; + else txt = '' + i; + part._range[part._range.length] = txt; + } + } + Calendar._add_evs(part); + return part; + }; + var hrs = cal.date.getHours(); + var mins = cal.date.getMinutes(); + var t12 = !cal.time24; + var pm = (hrs > 12); + if (t12 && pm) hrs -= 12; + var H = makeTimePart("hour", hrs, t12 ? 1 : 0, t12 ? 12 : 23); + var span = Calendar.createElement("span", cell); + span.innerHTML = ":"; + span.className = "colon"; + var M = makeTimePart("minute", mins, 0, 59); + var AP = null; + cell = Calendar.createElement("td", row); + cell.className = "time"; + cell.colSpan = 2; + if (t12) + AP = makeTimePart("ampm", pm ? "pm" : "am", ["am", "pm"]); + else + cell.innerHTML = " "; + + cal.onSetTime = function() { + var pm, hrs = this.date.getHours(), + mins = this.date.getMinutes(); + if (t12) { + pm = (hrs >= 12); + if (pm) hrs -= 12; + if (hrs == 0) hrs = 12; + AP.innerHTML = pm ? "pm" : "am"; + } + H.innerHTML = (hrs < 10) ? ("0" + hrs) : hrs; + M.innerHTML = (mins < 10) ? ("0" + mins) : mins; + }; + + cal.onUpdateTime = function() { + var date = this.date; + var h = parseInt(H.innerHTML, 10); + if (t12) { + if (/pm/i.test(AP.innerHTML) && h < 12) + h += 12; + else if (/am/i.test(AP.innerHTML) && h == 12) + h = 0; + } + var d = date.getDate(); + var m = date.getMonth(); + var y = date.getFullYear(); + date.setHours(h); + date.setMinutes(parseInt(M.innerHTML, 10)); + date.setFullYear(y); + date.setMonth(m); + date.setDate(d); + this.dateClicked = false; + this.callHandler(); + }; + })(); + } else { + this.onSetTime = this.onUpdateTime = function() {}; + } + + var tfoot = Calendar.createElement("tfoot", table); + + row = Calendar.createElement("tr", tfoot); + row.className = "footrow"; + + cell = hh(Calendar._TT["SEL_DATE"], this.weekNumbers ? 8 : 7, 300); + cell.className = "ttip"; + if (this.isPopup) { + cell.ttip = Calendar._TT["DRAG_TO_MOVE"]; + cell.style.cursor = "move"; + } + this.tooltips = cell; + + div = Calendar.createElement("div", this.element); + this.monthsCombo = div; + div.className = "combo"; + for (i = 0; i < Calendar._MN.length; ++i) { + var mn = Calendar.createElement("div"); + mn.className = Calendar.is_ie ? "label-IEfix" : "label"; + mn.month = i; + mn.innerHTML = Calendar._SMN[i]; + div.appendChild(mn); + } + + div = Calendar.createElement("div", this.element); + this.yearsCombo = div; + div.className = "combo"; + for (i = 12; i > 0; --i) { + var yr = Calendar.createElement("div"); + yr.className = Calendar.is_ie ? "label-IEfix" : "label"; + div.appendChild(yr); + } + + this._init(this.firstDayOfWeek, this.date); + parent.appendChild(this.element); +}; + +/** keyboard navigation, only for popup calendars */ +Calendar._keyEvent = function(ev) { + var cal = window._dynarch_popupCalendar; + if (!cal || cal.multiple) + return false; + (Calendar.is_ie) && (ev = window.event); + var act = (Calendar.is_ie || ev.type == "keypress"), + K = ev.keyCode; + if (ev.ctrlKey) { + switch (K) { + case 37: // KEY left + act && Calendar.cellClick(cal._nav_pm); + break; + case 38: // KEY up + act && Calendar.cellClick(cal._nav_py); + break; + case 39: // KEY right + act && Calendar.cellClick(cal._nav_nm); + break; + case 40: // KEY down + act && Calendar.cellClick(cal._nav_ny); + break; + default: + return false; + } + } else switch (K) { + case 32: // KEY space (now) + Calendar.cellClick(cal._nav_now); + break; + case 27: // KEY esc + act && cal.callCloseHandler(); + break; + case 37: // KEY left + case 38: // KEY up + case 39: // KEY right + case 40: // KEY down + if (act) { + var prev, x, y, ne, el, step; + prev = K == 37 || K == 38; + step = (K == 37 || K == 39) ? 1 : 7; + function setVars() { + el = cal.currentDateEl; + var p = el.pos; + x = p & 15; + y = p >> 4; + ne = cal.ar_days[y][x]; + };setVars(); + function prevMonth() { + var date = new Date(cal.date); + date.setDate(date.getDate() - step); + cal.setDate(date); + }; + function nextMonth() { + var date = new Date(cal.date); + date.setDate(date.getDate() + step); + cal.setDate(date); + }; + while (1) { + switch (K) { + case 37: // KEY left + if (--x >= 0) + ne = cal.ar_days[y][x]; + else { + x = 6; + K = 38; + continue; + } + break; + case 38: // KEY up + if (--y >= 0) + ne = cal.ar_days[y][x]; + else { + prevMonth(); + setVars(); + } + break; + case 39: // KEY right + if (++x < 7) + ne = cal.ar_days[y][x]; + else { + x = 0; + K = 40; + continue; + } + break; + case 40: // KEY down + if (++y < cal.ar_days.length) + ne = cal.ar_days[y][x]; + else { + nextMonth(); + setVars(); + } + break; + } + break; + } + if (ne) { + if (!ne.disabled) + Calendar.cellClick(ne); + else if (prev) + prevMonth(); + else + nextMonth(); + } + } + break; + case 13: // KEY enter + if (act) + Calendar.cellClick(cal.currentDateEl, ev); + break; + default: + return false; + } + return Calendar.stopEvent(ev); +}; + +/** + * (RE)Initializes the calendar to the given date and firstDayOfWeek + */ +Calendar.prototype._init = function (firstDayOfWeek, date) { + var today = new Date(), + TY = today.getFullYear(), + TM = today.getMonth(), + TD = today.getDate(); + this.table.style.visibility = "hidden"; + var year = date.getFullYear(); + if (year < this.minYear) { + year = this.minYear; + date.setFullYear(year); + } else if (year > this.maxYear) { + year = this.maxYear; + date.setFullYear(year); + } + this.firstDayOfWeek = firstDayOfWeek; + this.date = new Date(date); + var month = date.getMonth(); + var mday = date.getDate(); + var no_days = date.getMonthDays(); + + // calendar voodoo for computing the first day that would actually be + // displayed in the calendar, even if it's from the previous month. + // WARNING: this is magic. ;-) + date.setDate(1); + var day1 = (date.getDay() - this.firstDayOfWeek) % 7; + if (day1 < 0) + day1 += 7; + date.setDate(-day1); + date.setDate(date.getDate() + 1); + + var row = this.tbody.firstChild; + var MN = Calendar._SMN[month]; + var ar_days = this.ar_days = new Array(); + var weekend = Calendar._TT["WEEKEND"]; + var dates = this.multiple ? (this.datesCells = {}) : null; + for (var i = 0; i < 6; ++i, row = row.nextSibling) { + var cell = row.firstChild; + if (this.weekNumbers) { + cell.className = "day wn"; + cell.innerHTML = date.getWeekNumber(); + cell = cell.nextSibling; + } + row.className = "daysrow"; + var hasdays = false, iday, dpos = ar_days[i] = []; + for (var j = 0; j < 7; ++j, cell = cell.nextSibling, date.setDate(iday + 1)) { + iday = date.getDate(); + var wday = date.getDay(); + cell.className = "day"; + cell.pos = i << 4 | j; + dpos[j] = cell; + var current_month = (date.getMonth() == month); + if (!current_month) { + if (this.showsOtherMonths) { + cell.className += " othermonth"; + cell.otherMonth = true; + } else { + cell.className = "emptycell"; + cell.innerHTML = " "; + cell.disabled = true; + continue; + } + } else { + cell.otherMonth = false; + hasdays = true; + } + cell.disabled = false; + cell.innerHTML = this.getDateText ? this.getDateText(date, iday) : iday; + if (dates) + dates[date.print("%Y%m%d")] = cell; + if (this.getDateStatus) { + var status = this.getDateStatus(date, year, month, iday); + if (this.getDateToolTip) { + var toolTip = this.getDateToolTip(date, year, month, iday); + if (toolTip) + cell.title = toolTip; + } + if (status === true) { + cell.className += " disabled"; + cell.disabled = true; + } else { + if (/disabled/i.test(status)) + cell.disabled = true; + cell.className += " " + status; + } + } + if (!cell.disabled) { + cell.caldate = new Date(date); + cell.ttip = "_"; + if (!this.multiple && current_month + && iday == mday && this.hiliteToday) { + cell.className += " selected"; + this.currentDateEl = cell; + } + if (date.getFullYear() == TY && + date.getMonth() == TM && + iday == TD) { + cell.className += " today"; + cell.ttip += Calendar._TT["PART_TODAY"]; + } + if (weekend.indexOf(wday.toString()) != -1) + cell.className += cell.otherMonth ? " oweekend" : " weekend"; + } + } + if (!(hasdays || this.showsOtherMonths)) + row.className = "emptyrow"; + } + this.title.innerHTML = Calendar._MN[month] + ", " + year; + this.onSetTime(); + this.table.style.visibility = "visible"; + this._initMultipleDates(); + // PROFILE + // this.tooltips.innerHTML = "Generated in " + ((new Date()) - today) + " ms"; +}; + +Calendar.prototype._initMultipleDates = function() { + if (this.multiple) { + for (var i in this.multiple) { + var cell = this.datesCells[i]; + var d = this.multiple[i]; + if (!d) + continue; + if (cell) + cell.className += " selected"; + } + } +}; + +Calendar.prototype._toggleMultipleDate = function(date) { + if (this.multiple) { + var ds = date.print("%Y%m%d"); + var cell = this.datesCells[ds]; + if (cell) { + var d = this.multiple[ds]; + if (!d) { + Calendar.addClass(cell, "selected"); + this.multiple[ds] = date; + } else { + Calendar.removeClass(cell, "selected"); + delete this.multiple[ds]; + } + } + } +}; + +Calendar.prototype.setDateToolTipHandler = function (unaryFunction) { + this.getDateToolTip = unaryFunction; +}; + +/** + * Calls _init function above for going to a certain date (but only if the + * date is different than the currently selected one). + */ +Calendar.prototype.setDate = function (date) { + if (!date.equalsTo(this.date)) { + this._init(this.firstDayOfWeek, date); + } +}; + +/** + * Refreshes the calendar. Useful if the "disabledHandler" function is + * dynamic, meaning that the list of disabled date can change at runtime. + * Just * call this function if you think that the list of disabled dates + * should * change. + */ +Calendar.prototype.refresh = function () { + this._init(this.firstDayOfWeek, this.date); +}; + +/** Modifies the "firstDayOfWeek" parameter (pass 0 for Synday, 1 for Monday, etc.). */ +Calendar.prototype.setFirstDayOfWeek = function (firstDayOfWeek) { + this._init(firstDayOfWeek, this.date); + this._displayWeekdays(); +}; + +/** + * Allows customization of what dates are enabled. The "unaryFunction" + * parameter must be a function object that receives the date (as a JS Date + * object) and returns a boolean value. If the returned value is true then + * the passed date will be marked as disabled. + */ +Calendar.prototype.setDateStatusHandler = Calendar.prototype.setDisabledHandler = function (unaryFunction) { + this.getDateStatus = unaryFunction; +}; + +/** Customization of allowed year range for the calendar. */ +Calendar.prototype.setRange = function (a, z) { + this.minYear = a; + this.maxYear = z; +}; + +/** Calls the first user handler (selectedHandler). */ +Calendar.prototype.callHandler = function () { + if (this.onSelected) { + this.onSelected(this, this.date.print(this.dateFormat)); + } +}; + +/** Calls the second user handler (closeHandler). */ +Calendar.prototype.callCloseHandler = function () { + if (this.onClose) { + this.onClose(this); + } + this.hideShowCovered(); +}; + +/** Removes the calendar object from the DOM tree and destroys it. */ +Calendar.prototype.destroy = function () { + var el = this.element.parentNode; + el.removeChild(this.element); + Calendar._C = null; + window._dynarch_popupCalendar = null; +}; + +/** + * Moves the calendar element to a different section in the DOM tree (changes + * its parent). + */ +Calendar.prototype.reparent = function (new_parent) { + var el = this.element; + el.parentNode.removeChild(el); + new_parent.appendChild(el); +}; + +// This gets called when the user presses a mouse button anywhere in the +// document, if the calendar is shown. If the click was outside the open +// calendar this function closes it. +Calendar._checkCalendar = function(ev) { + var calendar = window._dynarch_popupCalendar; + if (!calendar) { + return false; + } + var el = Calendar.is_ie ? Calendar.getElement(ev) : Calendar.getTargetElement(ev); + for (; el != null && el != calendar.element; el = el.parentNode); + if (el == null) { + // calls closeHandler which should hide the calendar. + window._dynarch_popupCalendar.callCloseHandler(); + return Calendar.stopEvent(ev); + } +}; + +/** Shows the calendar. */ +Calendar.prototype.show = function () { + var rows = this.table.getElementsByTagName("tr"); + for (var i = rows.length; i > 0;) { + var row = rows[--i]; + Calendar.removeClass(row, "rowhilite"); + var cells = row.getElementsByTagName("td"); + for (var j = cells.length; j > 0;) { + var cell = cells[--j]; + Calendar.removeClass(cell, "hilite"); + Calendar.removeClass(cell, "active"); + } + } + this.element.style.display = "block"; + this.hidden = false; + if (this.isPopup) { + window._dynarch_popupCalendar = this; + Calendar.addEvent(document, "keydown", Calendar._keyEvent); + Calendar.addEvent(document, "keypress", Calendar._keyEvent); + Calendar.addEvent(document, "mousedown", Calendar._checkCalendar); + } + this.hideShowCovered(); +}; + +/** + * Hides the calendar. Also removes any "hilite" from the class of any TD + * element. + */ +Calendar.prototype.hide = function () { + if (this.isPopup) { + Calendar.removeEvent(document, "keydown", Calendar._keyEvent); + Calendar.removeEvent(document, "keypress", Calendar._keyEvent); + Calendar.removeEvent(document, "mousedown", Calendar._checkCalendar); + } + this.element.style.display = "none"; + this.hidden = true; + this.hideShowCovered(); +}; + +/** + * Shows the calendar at a given absolute position (beware that, depending on + * the calendar element style -- position property -- this might be relative + * to the parent's containing rectangle). + */ +Calendar.prototype.showAt = function (x, y) { + var s = this.element.style; + s.left = x + "px"; + s.top = y + "px"; + this.show(); +}; + +/** Shows the calendar near a given element. */ +Calendar.prototype.showAtElement = function (el, opts) { + var self = this; + var p = Calendar.getAbsolutePos(el); + if (!opts || typeof opts != "string") { + this.showAt(p.x, p.y + el.offsetHeight); + return true; + } + function fixPosition(box) { + if (box.x < 0) + box.x = 0; + if (box.y < 0) + box.y = 0; + var cp = document.createElement("div"); + var s = cp.style; + s.position = "absolute"; + s.right = s.bottom = s.width = s.height = "0px"; + document.body.appendChild(cp); + var br = Calendar.getAbsolutePos(cp); + document.body.removeChild(cp); + if (Calendar.is_ie) { + br.y += document.body.scrollTop; + br.x += document.body.scrollLeft; + } else { + br.y += window.scrollY; + br.x += window.scrollX; + } + var tmp = box.x + box.width - br.x; + if (tmp > 0) box.x -= tmp; + tmp = box.y + box.height - br.y; + if (tmp > 0) box.y -= tmp; + }; + this.element.style.display = "block"; + Calendar.continuation_for_the_fucking_khtml_browser = function() { + var w = self.element.offsetWidth; + var h = self.element.offsetHeight; + self.element.style.display = "none"; + var valign = opts.substr(0, 1); + var halign = "l"; + if (opts.length > 1) { + halign = opts.substr(1, 1); + } + // vertical alignment + switch (valign) { + case "T": p.y -= h; break; + case "B": p.y += el.offsetHeight; break; + case "C": p.y += (el.offsetHeight - h) / 2; break; + case "t": p.y += el.offsetHeight - h; break; + case "b": break; // already there + } + // horizontal alignment + switch (halign) { + case "L": p.x -= w; break; + case "R": p.x += el.offsetWidth; break; + case "C": p.x += (el.offsetWidth - w) / 2; break; + case "l": p.x += el.offsetWidth - w; break; + case "r": break; // already there + } + p.width = w; + p.height = h + 40; + self.monthsCombo.style.display = "none"; + fixPosition(p); + self.showAt(p.x, p.y); + }; + if (Calendar.is_khtml) + setTimeout("Calendar.continuation_for_the_fucking_khtml_browser()", 10); + else + Calendar.continuation_for_the_fucking_khtml_browser(); +}; + +/** Customizes the date format. */ +Calendar.prototype.setDateFormat = function (str) { + this.dateFormat = str; +}; + +/** Customizes the tooltip date format. */ +Calendar.prototype.setTtDateFormat = function (str) { + this.ttDateFormat = str; +}; + +/** + * Tries to identify the date represented in a string. If successful it also + * calls this.setDate which moves the calendar to the given date. + */ +Calendar.prototype.parseDate = function(str, fmt) { + if (!fmt) + fmt = this.dateFormat; + this.setDate(Date.parseDate(str, fmt)); +}; + +Calendar.prototype.hideShowCovered = function () { + if (!Calendar.is_ie && !Calendar.is_opera) + return; + function getVisib(obj){ + var value = obj.style.visibility; + if (!value) { + if (document.defaultView && typeof (document.defaultView.getComputedStyle) == "function") { // Gecko, W3C + if (!Calendar.is_khtml) + value = document.defaultView. + getComputedStyle(obj, "").getPropertyValue("visibility"); + else + value = ''; + } else if (obj.currentStyle) { // IE + value = obj.currentStyle.visibility; + } else + value = ''; + } + return value; + }; + + var tags = new Array("applet", "iframe", "select"); + var el = this.element; + + var p = Calendar.getAbsolutePos(el); + var EX1 = p.x; + var EX2 = el.offsetWidth + EX1; + var EY1 = p.y; + var EY2 = el.offsetHeight + EY1; + + for (var k = tags.length; k > 0; ) { + var ar = document.getElementsByTagName(tags[--k]); + var cc = null; + + for (var i = ar.length; i > 0;) { + cc = ar[--i]; + + p = Calendar.getAbsolutePos(cc); + var CX1 = p.x; + var CX2 = cc.offsetWidth + CX1; + var CY1 = p.y; + var CY2 = cc.offsetHeight + CY1; + + if (this.hidden || (CX1 > EX2) || (CX2 < EX1) || (CY1 > EY2) || (CY2 < EY1)) { + if (!cc.__msh_save_visibility) { + cc.__msh_save_visibility = getVisib(cc); + } + cc.style.visibility = cc.__msh_save_visibility; + } else { + if (!cc.__msh_save_visibility) { + cc.__msh_save_visibility = getVisib(cc); + } + cc.style.visibility = "hidden"; + } + } + } +}; + +/** Internal function; it displays the bar with the names of the weekday. */ +Calendar.prototype._displayWeekdays = function () { + var fdow = this.firstDayOfWeek; + var cell = this.firstdayname; + var weekend = Calendar._TT["WEEKEND"]; + for (var i = 0; i < 7; ++i) { + cell.className = "day name"; + var realday = (i + fdow) % 7; + if (i) { + cell.ttip = Calendar._TT["DAY_FIRST"].replace("%s", Calendar._DN[realday]); + cell.navtype = 100; + cell.calendar = this; + cell.fdow = realday; + Calendar._add_evs(cell); + } + if (weekend.indexOf(realday.toString()) != -1) { + Calendar.addClass(cell, "weekend"); + } + cell.innerHTML = Calendar._SDN[(i + fdow) % 7]; + cell = cell.nextSibling; + } +}; + +/** Internal function. Hides all combo boxes that might be displayed. */ +Calendar.prototype._hideCombos = function () { + this.monthsCombo.style.display = "none"; + this.yearsCombo.style.display = "none"; +}; + +/** Internal function. Starts dragging the element. */ +Calendar.prototype._dragStart = function (ev) { + if (this.dragging) { + return; + } + this.dragging = true; + var posX; + var posY; + if (Calendar.is_ie) { + posY = window.event.clientY + document.body.scrollTop; + posX = window.event.clientX + document.body.scrollLeft; + } else { + posY = ev.clientY + window.scrollY; + posX = ev.clientX + window.scrollX; + } + var st = this.element.style; + this.xOffs = posX - parseInt(st.left); + this.yOffs = posY - parseInt(st.top); + with (Calendar) { + addEvent(document, "mousemove", calDragIt); + addEvent(document, "mouseup", calDragEnd); + } +}; + +// BEGIN: DATE OBJECT PATCHES + +/** Adds the number of days array to the Date object. */ +Date._MD = new Array(31,28,31,30,31,30,31,31,30,31,30,31); + +/** Constants used for time computations */ +Date.SECOND = 1000 /* milliseconds */; +Date.MINUTE = 60 * Date.SECOND; +Date.HOUR = 60 * Date.MINUTE; +Date.DAY = 24 * Date.HOUR; +Date.WEEK = 7 * Date.DAY; + +Date.parseDate = function(str, fmt) { + var today = new Date(); + var y = 0; + var m = -1; + var d = 0; + var a = str.split(/\W+/); + var b = fmt.match(/%./g); + var i = 0, j = 0; + var hr = 0; + var min = 0; + for (i = 0; i < a.length; ++i) { + if (!a[i]) + continue; + switch (b[i]) { + case "%d": + case "%e": + d = parseInt(a[i], 10); + break; + + case "%m": + m = parseInt(a[i], 10) - 1; + break; + + case "%Y": + case "%y": + y = parseInt(a[i], 10); + (y < 100) && (y += (y > 29) ? 1900 : 2000); + break; + + case "%b": + case "%B": + for (j = 0; j < 12; ++j) { + if (Calendar._MN[j].substr(0, a[i].length).toLowerCase() == a[i].toLowerCase()) { m = j; break; } + } + break; + + case "%H": + case "%I": + case "%k": + case "%l": + hr = parseInt(a[i], 10); + break; + + case "%P": + case "%p": + if (/pm/i.test(a[i]) && hr < 12) + hr += 12; + else if (/am/i.test(a[i]) && hr >= 12) + hr -= 12; + break; + + case "%M": + min = parseInt(a[i], 10); + break; + } + } + if (isNaN(y)) y = today.getFullYear(); + if (isNaN(m)) m = today.getMonth(); + if (isNaN(d)) d = today.getDate(); + if (isNaN(hr)) hr = today.getHours(); + if (isNaN(min)) min = today.getMinutes(); + if (y != 0 && m != -1 && d != 0) + return new Date(y, m, d, hr, min, 0); + y = 0; m = -1; d = 0; + for (i = 0; i < a.length; ++i) { + if (a[i].search(/[a-zA-Z]+/) != -1) { + var t = -1; + for (j = 0; j < 12; ++j) { + if (Calendar._MN[j].substr(0, a[i].length).toLowerCase() == a[i].toLowerCase()) { t = j; break; } + } + if (t != -1) { + if (m != -1) { + d = m+1; + } + m = t; + } + } else if (parseInt(a[i], 10) <= 12 && m == -1) { + m = a[i]-1; + } else if (parseInt(a[i], 10) > 31 && y == 0) { + y = parseInt(a[i], 10); + (y < 100) && (y += (y > 29) ? 1900 : 2000); + } else if (d == 0) { + d = a[i]; + } + } + if (y == 0) + y = today.getFullYear(); + if (m != -1 && d != 0) + return new Date(y, m, d, hr, min, 0); + return today; +}; + +/** Returns the number of days in the current month */ +Date.prototype.getMonthDays = function(month) { + var year = this.getFullYear(); + if (typeof month == "undefined") { + month = this.getMonth(); + } + if (((0 == (year%4)) && ( (0 != (year%100)) || (0 == (year%400)))) && month == 1) { + return 29; + } else { + return Date._MD[month]; + } +}; + +/** Returns the number of day in the year. */ +Date.prototype.getDayOfYear = function() { + var now = new Date(this.getFullYear(), this.getMonth(), this.getDate(), 0, 0, 0); + var then = new Date(this.getFullYear(), 0, 0, 0, 0, 0); + var time = now - then; + return Math.floor(time / Date.DAY); +}; + +/** Returns the number of the week in year, as defined in ISO 8601. */ +Date.prototype.getWeekNumber = function() { + var d = new Date(this.getFullYear(), this.getMonth(), this.getDate(), 0, 0, 0); + var DoW = d.getDay(); + d.setDate(d.getDate() - (DoW + 6) % 7 + 3); // Nearest Thu + var ms = d.valueOf(); // GMT + d.setMonth(0); + d.setDate(4); // Thu in Week 1 + return Math.round((ms - d.valueOf()) / (7 * 864e5)) + 1; +}; + +/** Checks date and time equality */ +Date.prototype.equalsTo = function(date) { + return ((this.getFullYear() == date.getFullYear()) && + (this.getMonth() == date.getMonth()) && + (this.getDate() == date.getDate()) && + (this.getHours() == date.getHours()) && + (this.getMinutes() == date.getMinutes())); +}; + +/** Set only the year, month, date parts (keep existing time) */ +Date.prototype.setDateOnly = function(date) { + var tmp = new Date(date); + this.setDate(1); + this.setFullYear(tmp.getFullYear()); + this.setMonth(tmp.getMonth()); + this.setDate(tmp.getDate()); +}; + +/** Prints the date in a string according to the given format. */ +Date.prototype.print = function (str) { + var m = this.getMonth(); + var d = this.getDate(); + var y = this.getFullYear(); + var wn = this.getWeekNumber(); + var w = this.getDay(); + var s = {}; + var hr = this.getHours(); + var pm = (hr >= 12); + var ir = (pm) ? (hr - 12) : hr; + var dy = this.getDayOfYear(); + if (ir == 0) + ir = 12; + var min = this.getMinutes(); + var sec = this.getSeconds(); + s["%a"] = Calendar._SDN[w]; // abbreviated weekday name [FIXME: I18N] + s["%A"] = Calendar._DN[w]; // full weekday name + s["%b"] = Calendar._SMN[m]; // abbreviated month name [FIXME: I18N] + s["%B"] = Calendar._MN[m]; // full month name + // FIXME: %c : preferred date and time representation for the current locale + s["%C"] = 1 + Math.floor(y / 100); // the century number + s["%d"] = (d < 10) ? ("0" + d) : d; // the day of the month (range 01 to 31) + s["%e"] = d; // the day of the month (range 1 to 31) + // FIXME: %D : american date style: %m/%d/%y + // FIXME: %E, %F, %G, %g, %h (man strftime) + s["%H"] = (hr < 10) ? ("0" + hr) : hr; // hour, range 00 to 23 (24h format) + s["%I"] = (ir < 10) ? ("0" + ir) : ir; // hour, range 01 to 12 (12h format) + s["%j"] = (dy < 100) ? ((dy < 10) ? ("00" + dy) : ("0" + dy)) : dy; // day of the year (range 001 to 366) + s["%k"] = hr; // hour, range 0 to 23 (24h format) + s["%l"] = ir; // hour, range 1 to 12 (12h format) + s["%m"] = (m < 9) ? ("0" + (1+m)) : (1+m); // month, range 01 to 12 + s["%M"] = (min < 10) ? ("0" + min) : min; // minute, range 00 to 59 + s["%n"] = "\n"; // a newline character + s["%p"] = pm ? "PM" : "AM"; + s["%P"] = pm ? "pm" : "am"; + // FIXME: %r : the time in am/pm notation %I:%M:%S %p + // FIXME: %R : the time in 24-hour notation %H:%M + s["%s"] = Math.floor(this.getTime() / 1000); + s["%S"] = (sec < 10) ? ("0" + sec) : sec; // seconds, range 00 to 59 + s["%t"] = "\t"; // a tab character + // FIXME: %T : the time in 24-hour notation (%H:%M:%S) + s["%U"] = s["%W"] = s["%V"] = (wn < 10) ? ("0" + wn) : wn; + s["%u"] = w + 1; // the day of the week (range 1 to 7, 1 = MON) + s["%w"] = w; // the day of the week (range 0 to 6, 0 = SUN) + // FIXME: %x : preferred date representation for the current locale without the time + // FIXME: %X : preferred time representation for the current locale without the date + s["%y"] = ('' + y).substr(2, 2); // year without the century (range 00 to 99) + s["%Y"] = y; // year with the century + s["%%"] = "%"; // a literal '%' character + + var re = /%./g; + if (!Calendar.is_ie5 && !Calendar.is_khtml) + return str.replace(re, function (par) { return s[par] || par; }); + + var a = str.match(re); + for (var i = 0; i < a.length; i++) { + var tmp = s[a[i]]; + if (tmp) { + re = new RegExp(a[i], 'g'); + str = str.replace(re, tmp); + } + } + + return str; +}; + +Date.prototype.__msh_oldSetFullYear = Date.prototype.setFullYear; +Date.prototype.setFullYear = function(y) { + var d = new Date(this); + d.__msh_oldSetFullYear(y); + if (d.getMonth() != this.getMonth()) + this.setDate(28); + this.__msh_oldSetFullYear(y); +}; + +// END: DATE OBJECT PATCHES + + +// global object that remembers the calendar +window._dynarch_popupCalendar = null; diff -r f99d8f92a640 -r 755dd2fa4a0a gnv/src/main/webapp/scripts/calendar_stripped.js --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv/src/main/webapp/scripts/calendar_stripped.js Fri Sep 28 12:13:53 2012 +0200 @@ -0,0 +1,14 @@ +/* Copyright Mihai Bazon, 2002-2005 | www.bazon.net/mishoo + * ----------------------------------------------------------- + * + * The DHTML Calendar, version 1.0 "It is happening again" + * + * Details and latest version at: + * www.dynarch.com/projects/calendar + * + * This script is developed by Dynarch.com. Visit us at www.dynarch.com. + * + * This script is distributed under the GNU Lesser General Public License. + * Read the entire license text here: http://www.gnu.org/licenses/lgpl.html + */ + Calendar=function(firstDayOfWeek,dateStr,onSelected,onClose){this.activeDiv=null;this.currentDateEl=null;this.getDateStatus=null;this.getDateToolTip=null;this.getDateText=null;this.timeout=null;this.onSelected=onSelected||null;this.onClose=onClose||null;this.dragging=false;this.hidden=false;this.minYear=1970;this.maxYear=2050;this.dateFormat=Calendar._TT["DEF_DATE_FORMAT"];this.ttDateFormat=Calendar._TT["TT_DATE_FORMAT"];this.isPopup=true;this.weekNumbers=true;this.firstDayOfWeek=typeof firstDayOfWeek=="number"?firstDayOfWeek:Calendar._FD;this.showsOtherMonths=false;this.dateStr=dateStr;this.ar_days=null;this.showsTime=false;this.time24=true;this.yearStep=2;this.hiliteToday=true;this.multiple=null;this.table=null;this.element=null;this.tbody=null;this.firstdayname=null;this.monthsCombo=null;this.yearsCombo=null;this.hilitedMonth=null;this.activeMonth=null;this.hilitedYear=null;this.activeYear=null;this.dateClicked=false;if(typeof Calendar._SDN=="undefined"){if(typeof Calendar._SDN_len=="undefined")Calendar._SDN_len=3;var ar=new Array();for(var i=8;i>0;){ar[--i]=Calendar._DN[i].substr(0,Calendar._SDN_len);}Calendar._SDN=ar;if(typeof Calendar._SMN_len=="undefined")Calendar._SMN_len=3;ar=new Array();for(var i=12;i>0;){ar[--i]=Calendar._MN[i].substr(0,Calendar._SMN_len);}Calendar._SMN=ar;}};Calendar._C=null;Calendar.is_ie=(/msie/i.test(navigator.userAgent)&&!/opera/i.test(navigator.userAgent));Calendar.is_ie5=(Calendar.is_ie&&/msie 5\.0/i.test(navigator.userAgent));Calendar.is_opera=/opera/i.test(navigator.userAgent);Calendar.is_khtml=/Konqueror|Safari|KHTML/i.test(navigator.userAgent);Calendar.getAbsolutePos=function(el){var SL=0,ST=0;var is_div=/^div$/i.test(el.tagName);if(is_div&&el.scrollLeft)SL=el.scrollLeft;if(is_div&&el.scrollTop)ST=el.scrollTop;var r={x:el.offsetLeft-SL,y:el.offsetTop-ST};if(el.offsetParent){var tmp=this.getAbsolutePos(el.offsetParent);r.x+=tmp.x;r.y+=tmp.y;}return r;};Calendar.isRelated=function(el,evt){var related=evt.relatedTarget;if(!related){var type=evt.type;if(type=="mouseover"){related=evt.fromElement;}else if(type=="mouseout"){related=evt.toElement;}}while(related){if(related==el){return true;}related=related.parentNode;}return false;};Calendar.removeClass=function(el,className){if(!(el&&el.className)){return;}var cls=el.className.split(" ");var ar=new Array();for(var i=cls.length;i>0;){if(cls[--i]!=className){ar[ar.length]=cls[i];}}el.className=ar.join(" ");};Calendar.addClass=function(el,className){Calendar.removeClass(el,className);el.className+=" "+className;};Calendar.getElement=function(ev){var f=Calendar.is_ie?window.event.srcElement:ev.currentTarget;while(f.nodeType!=1||/^div$/i.test(f.tagName))f=f.parentNode;return f;};Calendar.getTargetElement=function(ev){var f=Calendar.is_ie?window.event.srcElement:ev.target;while(f.nodeType!=1)f=f.parentNode;return f;};Calendar.stopEvent=function(ev){ev||(ev=window.event);if(Calendar.is_ie){ev.cancelBubble=true;ev.returnValue=false;}else{ev.preventDefault();ev.stopPropagation();}return false;};Calendar.addEvent=function(el,evname,func){if(el.attachEvent){el.attachEvent("on"+evname,func);}else if(el.addEventListener){el.addEventListener(evname,func,true);}else{el["on"+evname]=func;}};Calendar.removeEvent=function(el,evname,func){if(el.detachEvent){el.detachEvent("on"+evname,func);}else if(el.removeEventListener){el.removeEventListener(evname,func,true);}else{el["on"+evname]=null;}};Calendar.createElement=function(type,parent){var el=null;if(document.createElementNS){el=document.createElementNS("http://www.w3.org/1999/xhtml",type);}else{el=document.createElement(type);}if(typeof parent!="undefined"){parent.appendChild(el);}return el;};Calendar._add_evs=function(el){with(Calendar){addEvent(el,"mouseover",dayMouseOver);addEvent(el,"mousedown",dayMouseDown);addEvent(el,"mouseout",dayMouseOut);if(is_ie){addEvent(el,"dblclick",dayMouseDblClick);el.setAttribute("unselectable",true);}}};Calendar.findMonth=function(el){if(typeof el.month!="undefined"){return el;}else if(typeof el.parentNode.month!="undefined"){return el.parentNode;}return null;};Calendar.findYear=function(el){if(typeof el.year!="undefined"){return el;}else if(typeof el.parentNode.year!="undefined"){return el.parentNode;}return null;};Calendar.showMonthsCombo=function(){var cal=Calendar._C;if(!cal){return false;}var cal=cal;var cd=cal.activeDiv;var mc=cal.monthsCombo;if(cal.hilitedMonth){Calendar.removeClass(cal.hilitedMonth,"hilite");}if(cal.activeMonth){Calendar.removeClass(cal.activeMonth,"active");}var mon=cal.monthsCombo.getElementsByTagName("div")[cal.date.getMonth()];Calendar.addClass(mon,"active");cal.activeMonth=mon;var s=mc.style;s.display="block";if(cd.navtype<0)s.left=cd.offsetLeft+"px";else{var mcw=mc.offsetWidth;if(typeof mcw=="undefined")mcw=50;s.left=(cd.offsetLeft+cd.offsetWidth-mcw)+"px";}s.top=(cd.offsetTop+cd.offsetHeight)+"px";};Calendar.showYearsCombo=function(fwd){var cal=Calendar._C;if(!cal){return false;}var cal=cal;var cd=cal.activeDiv;var yc=cal.yearsCombo;if(cal.hilitedYear){Calendar.removeClass(cal.hilitedYear,"hilite");}if(cal.activeYear){Calendar.removeClass(cal.activeYear,"active");}cal.activeYear=null;var Y=cal.date.getFullYear()+(fwd?1:-1);var yr=yc.firstChild;var show=false;for(var i=12;i>0;--i){if(Y>=cal.minYear&&Y<=cal.maxYear){yr.innerHTML=Y;yr.year=Y;yr.style.display="block";show=true;}else{yr.style.display="none";}yr=yr.nextSibling;Y+=fwd?cal.yearStep:-cal.yearStep;}if(show){var s=yc.style;s.display="block";if(cd.navtype<0)s.left=cd.offsetLeft+"px";else{var ycw=yc.offsetWidth;if(typeof ycw=="undefined")ycw=50;s.left=(cd.offsetLeft+cd.offsetWidth-ycw)+"px";}s.top=(cd.offsetTop+cd.offsetHeight)+"px";}};Calendar.tableMouseUp=function(ev){var cal=Calendar._C;if(!cal){return false;}if(cal.timeout){clearTimeout(cal.timeout);}var el=cal.activeDiv;if(!el){return false;}var target=Calendar.getTargetElement(ev);ev||(ev=window.event);Calendar.removeClass(el,"active");if(target==el||target.parentNode==el){Calendar.cellClick(el,ev);}var mon=Calendar.findMonth(target);var date=null;if(mon){date=new Date(cal.date);if(mon.month!=date.getMonth()){date.setMonth(mon.month);cal.setDate(date);cal.dateClicked=false;cal.callHandler();}}else{var year=Calendar.findYear(target);if(year){date=new Date(cal.date);if(year.year!=date.getFullYear()){date.setFullYear(year.year);cal.setDate(date);cal.dateClicked=false;cal.callHandler();}}}with(Calendar){removeEvent(document,"mouseup",tableMouseUp);removeEvent(document,"mouseover",tableMouseOver);removeEvent(document,"mousemove",tableMouseOver);cal._hideCombos();_C=null;return stopEvent(ev);}};Calendar.tableMouseOver=function(ev){var cal=Calendar._C;if(!cal){return;}var el=cal.activeDiv;var target=Calendar.getTargetElement(ev);if(target==el||target.parentNode==el){Calendar.addClass(el,"hilite active");Calendar.addClass(el.parentNode,"rowhilite");}else{if(typeof el.navtype=="undefined"||(el.navtype!=50&&(el.navtype==0||Math.abs(el.navtype)>2)))Calendar.removeClass(el,"active");Calendar.removeClass(el,"hilite");Calendar.removeClass(el.parentNode,"rowhilite");}ev||(ev=window.event);if(el.navtype==50&&target!=el){var pos=Calendar.getAbsolutePos(el);var w=el.offsetWidth;var x=ev.clientX;var dx;var decrease=true;if(x>pos.x+w){dx=x-pos.x-w;decrease=false;}else dx=pos.x-x;if(dx<0)dx=0;var range=el._range;var current=el._current;var count=Math.floor(dx/10)%range.length;for(var i=range.length;--i>=0;)if(range[i]==current)break;while(count-->0)if(decrease){if(--i<0)i=range.length-1;}else if(++i>=range.length)i=0;var newval=range[i];el.innerHTML=newval;cal.onUpdateTime();}var mon=Calendar.findMonth(target);if(mon){if(mon.month!=cal.date.getMonth()){if(cal.hilitedMonth){Calendar.removeClass(cal.hilitedMonth,"hilite");}Calendar.addClass(mon,"hilite");cal.hilitedMonth=mon;}else if(cal.hilitedMonth){Calendar.removeClass(cal.hilitedMonth,"hilite");}}else{if(cal.hilitedMonth){Calendar.removeClass(cal.hilitedMonth,"hilite");}var year=Calendar.findYear(target);if(year){if(year.year!=cal.date.getFullYear()){if(cal.hilitedYear){Calendar.removeClass(cal.hilitedYear,"hilite");}Calendar.addClass(year,"hilite");cal.hilitedYear=year;}else if(cal.hilitedYear){Calendar.removeClass(cal.hilitedYear,"hilite");}}else if(cal.hilitedYear){Calendar.removeClass(cal.hilitedYear,"hilite");}}return Calendar.stopEvent(ev);};Calendar.tableMouseDown=function(ev){if(Calendar.getTargetElement(ev)==Calendar.getElement(ev)){return Calendar.stopEvent(ev);}};Calendar.calDragIt=function(ev){var cal=Calendar._C;if(!(cal&&cal.dragging)){return false;}var posX;var posY;if(Calendar.is_ie){posY=window.event.clientY+document.body.scrollTop;posX=window.event.clientX+document.body.scrollLeft;}else{posX=ev.pageX;posY=ev.pageY;}cal.hideShowCovered();var st=cal.element.style;st.left=(posX-cal.xOffs)+"px";st.top=(posY-cal.yOffs)+"px";return Calendar.stopEvent(ev);};Calendar.calDragEnd=function(ev){var cal=Calendar._C;if(!cal){return false;}cal.dragging=false;with(Calendar){removeEvent(document,"mousemove",calDragIt);removeEvent(document,"mouseup",calDragEnd);tableMouseUp(ev);}cal.hideShowCovered();};Calendar.dayMouseDown=function(ev){var el=Calendar.getElement(ev);if(el.disabled){return false;}var cal=el.calendar;cal.activeDiv=el;Calendar._C=cal;if(el.navtype!=300)with(Calendar){if(el.navtype==50){el._current=el.innerHTML;addEvent(document,"mousemove",tableMouseOver);}else addEvent(document,Calendar.is_ie5?"mousemove":"mouseover",tableMouseOver);addClass(el,"hilite active");addEvent(document,"mouseup",tableMouseUp);}else if(cal.isPopup){cal._dragStart(ev);}if(el.navtype==-1||el.navtype==1){if(cal.timeout)clearTimeout(cal.timeout);cal.timeout=setTimeout("Calendar.showMonthsCombo()",250);}else if(el.navtype==-2||el.navtype==2){if(cal.timeout)clearTimeout(cal.timeout);cal.timeout=setTimeout((el.navtype>0)?"Calendar.showYearsCombo(true)":"Calendar.showYearsCombo(false)",250);}else{cal.timeout=null;}return Calendar.stopEvent(ev);};Calendar.dayMouseDblClick=function(ev){Calendar.cellClick(Calendar.getElement(ev),ev||window.event);if(Calendar.is_ie){document.selection.empty();}};Calendar.dayMouseOver=function(ev){var el=Calendar.getElement(ev);if(Calendar.isRelated(el,ev)||Calendar._C||el.disabled){return false;}if(el.ttip){if(el.ttip.substr(0,1)=="_"){el.ttip=el.caldate.print(el.calendar.ttDateFormat)+el.ttip.substr(1);}el.calendar.tooltips.innerHTML=el.ttip;}if(el.navtype!=300){Calendar.addClass(el,"hilite");if(el.caldate){Calendar.addClass(el.parentNode,"rowhilite");}}return Calendar.stopEvent(ev);};Calendar.dayMouseOut=function(ev){with(Calendar){var el=getElement(ev);if(isRelated(el,ev)||_C||el.disabled)return false;removeClass(el,"hilite");if(el.caldate)removeClass(el.parentNode,"rowhilite");if(el.calendar)el.calendar.tooltips.innerHTML=_TT["SEL_DATE"];return stopEvent(ev);}};Calendar.cellClick=function(el,ev){var cal=el.calendar;var closing=false;var newdate=false;var date=null;if(typeof el.navtype=="undefined"){if(cal.currentDateEl){Calendar.removeClass(cal.currentDateEl,"selected");Calendar.addClass(el,"selected");closing=(cal.currentDateEl==el);if(!closing){cal.currentDateEl=el;}}cal.date.setDateOnly(el.caldate);date=cal.date;var other_month=!(cal.dateClicked=!el.otherMonth);if(!other_month&&!cal.currentDateEl)cal._toggleMultipleDate(new Date(date));else newdate=!el.disabled;if(other_month)cal._init(cal.firstDayOfWeek,date);}else{if(el.navtype==200){Calendar.removeClass(el,"hilite");cal.callCloseHandler();return;}date=new Date(cal.date);if(el.navtype==0)date.setDateOnly(new Date());cal.dateClicked=false;var year=date.getFullYear();var mon=date.getMonth();function setMonth(m){var day=date.getDate();var max=date.getMonthDays(m);if(day>max){date.setDate(max);}date.setMonth(m);};switch(el.navtype){case 400:Calendar.removeClass(el,"hilite");var text=Calendar._TT["ABOUT"];if(typeof text!="undefined"){text+=cal.showsTime?Calendar._TT["ABOUT_TIME"]:"";}else{text="Help and about box text is not translated into this language.\n"+"If you know this language and you feel generous please update\n"+"the corresponding file in \"lang\" subdir to match calendar-en.js\n"+"and send it back to to get it into the distribution ;-)\n\n"+"Thank you!\n"+"http://dynarch.com/mishoo/calendar.epl\n";}alert(text);return;case-2:if(year>cal.minYear){date.setFullYear(year-1);}break;case-1:if(mon>0){setMonth(mon-1);}else if(year-->cal.minYear){date.setFullYear(year);setMonth(11);}break;case 1:if(mon<11){setMonth(mon+1);}else if(year=0;)if(range[i]==current)break;if(ev&&ev.shiftKey){if(--i<0)i=range.length-1;}else if(++i>=range.length)i=0;var newval=range[i];el.innerHTML=newval;cal.onUpdateTime();return;case 0:if((typeof cal.getDateStatus=="function")&&cal.getDateStatus(date,date.getFullYear(),date.getMonth(),date.getDate())){return false;}break;}if(!date.equalsTo(cal.date)){cal.setDate(date);newdate=true;}else if(el.navtype==0)newdate=closing=true;}if(newdate){ev&&cal.callHandler();}if(closing){Calendar.removeClass(el,"hilite");ev&&cal.callCloseHandler();}};Calendar.prototype.create=function(_par){var parent=null;if(!_par){parent=document.getElementsByTagName("body")[0];this.isPopup=true;}else{parent=_par;this.isPopup=false;}this.date=this.dateStr?new Date(this.dateStr):new Date();var table=Calendar.createElement("table");this.table=table;table.cellSpacing=0;table.cellPadding=0;table.calendar=this;Calendar.addEvent(table,"mousedown",Calendar.tableMouseDown);var div=Calendar.createElement("div");this.element=div;div.className="calendar";if(this.isPopup){div.style.position="absolute";div.style.display="none";}div.appendChild(table);var thead=Calendar.createElement("thead",table);var cell=null;var row=null;var cal=this;var hh=function(text,cs,navtype){cell=Calendar.createElement("td",row);cell.colSpan=cs;cell.className="button";if(navtype!=0&&Math.abs(navtype)<=2)cell.className+=" nav";Calendar._add_evs(cell);cell.calendar=cal;cell.navtype=navtype;cell.innerHTML="
"+text+"
";return cell;};row=Calendar.createElement("tr",thead);var title_length=6;(this.isPopup)&&--title_length;(this.weekNumbers)&&++title_length;hh("?",1,400).ttip=Calendar._TT["INFO"];this.title=hh("",title_length,300);this.title.className="title";if(this.isPopup){this.title.ttip=Calendar._TT["DRAG_TO_MOVE"];this.title.style.cursor="move";hh("×",1,200).ttip=Calendar._TT["CLOSE"];}row=Calendar.createElement("tr",thead);row.className="headrow";this._nav_py=hh("«",1,-2);this._nav_py.ttip=Calendar._TT["PREV_YEAR"];this._nav_pm=hh("‹",1,-1);this._nav_pm.ttip=Calendar._TT["PREV_MONTH"];this._nav_now=hh(Calendar._TT["TODAY"],this.weekNumbers?4:3,0);this._nav_now.ttip=Calendar._TT["GO_TODAY"];this._nav_nm=hh("›",1,1);this._nav_nm.ttip=Calendar._TT["NEXT_MONTH"];this._nav_ny=hh("»",1,2);this._nav_ny.ttip=Calendar._TT["NEXT_YEAR"];row=Calendar.createElement("tr",thead);row.className="daynames";if(this.weekNumbers){cell=Calendar.createElement("td",row);cell.className="name wn";cell.innerHTML=Calendar._TT["WK"];}for(var i=7;i>0;--i){cell=Calendar.createElement("td",row);if(!i){cell.navtype=100;cell.calendar=this;Calendar._add_evs(cell);}}this.firstdayname=(this.weekNumbers)?row.firstChild.nextSibling:row.firstChild;this._displayWeekdays();var tbody=Calendar.createElement("tbody",table);this.tbody=tbody;for(i=6;i>0;--i){row=Calendar.createElement("tr",tbody);if(this.weekNumbers){cell=Calendar.createElement("td",row);}for(var j=7;j>0;--j){cell=Calendar.createElement("td",row);cell.calendar=this;Calendar._add_evs(cell);}}if(this.showsTime){row=Calendar.createElement("tr",tbody);row.className="time";cell=Calendar.createElement("td",row);cell.className="time";cell.colSpan=2;cell.innerHTML=Calendar._TT["TIME"]||" ";cell=Calendar.createElement("td",row);cell.className="time";cell.colSpan=this.weekNumbers?4:3;(function(){function makeTimePart(className,init,range_start,range_end){var part=Calendar.createElement("span",cell);part.className=className;part.innerHTML=init;part.calendar=cal;part.ttip=Calendar._TT["TIME_PART"];part.navtype=50;part._range=[];if(typeof range_start!="number")part._range=range_start;else{for(var i=range_start;i<=range_end;++i){var txt;if(i<10&&range_end>=10)txt='0'+i;else txt=''+i;part._range[part._range.length]=txt;}}Calendar._add_evs(part);return part;};var hrs=cal.date.getHours();var mins=cal.date.getMinutes();var t12=!cal.time24;var pm=(hrs>12);if(t12&&pm)hrs-=12;var H=makeTimePart("hour",hrs,t12?1:0,t12?12:23);var span=Calendar.createElement("span",cell);span.innerHTML=":";span.className="colon";var M=makeTimePart("minute",mins,0,59);var AP=null;cell=Calendar.createElement("td",row);cell.className="time";cell.colSpan=2;if(t12)AP=makeTimePart("ampm",pm?"pm":"am",["am","pm"]);else cell.innerHTML=" ";cal.onSetTime=function(){var pm,hrs=this.date.getHours(),mins=this.date.getMinutes();if(t12){pm=(hrs>=12);if(pm)hrs-=12;if(hrs==0)hrs=12;AP.innerHTML=pm?"pm":"am";}H.innerHTML=(hrs<10)?("0"+hrs):hrs;M.innerHTML=(mins<10)?("0"+mins):mins;};cal.onUpdateTime=function(){var date=this.date;var h=parseInt(H.innerHTML,10);if(t12){if(/pm/i.test(AP.innerHTML)&&h<12)h+=12;else if(/am/i.test(AP.innerHTML)&&h==12)h=0;}var d=date.getDate();var m=date.getMonth();var y=date.getFullYear();date.setHours(h);date.setMinutes(parseInt(M.innerHTML,10));date.setFullYear(y);date.setMonth(m);date.setDate(d);this.dateClicked=false;this.callHandler();};})();}else{this.onSetTime=this.onUpdateTime=function(){};}var tfoot=Calendar.createElement("tfoot",table);row=Calendar.createElement("tr",tfoot);row.className="footrow";cell=hh(Calendar._TT["SEL_DATE"],this.weekNumbers?8:7,300);cell.className="ttip";if(this.isPopup){cell.ttip=Calendar._TT["DRAG_TO_MOVE"];cell.style.cursor="move";}this.tooltips=cell;div=Calendar.createElement("div",this.element);this.monthsCombo=div;div.className="combo";for(i=0;i0;--i){var yr=Calendar.createElement("div");yr.className=Calendar.is_ie?"label-IEfix":"label";div.appendChild(yr);}this._init(this.firstDayOfWeek,this.date);parent.appendChild(this.element);};Calendar._keyEvent=function(ev){var cal=window._dynarch_popupCalendar;if(!cal||cal.multiple)return false;(Calendar.is_ie)&&(ev=window.event);var act=(Calendar.is_ie||ev.type=="keypress"),K=ev.keyCode;if(ev.ctrlKey){switch(K){case 37:act&&Calendar.cellClick(cal._nav_pm);break;case 38:act&&Calendar.cellClick(cal._nav_py);break;case 39:act&&Calendar.cellClick(cal._nav_nm);break;case 40:act&&Calendar.cellClick(cal._nav_ny);break;default:return false;}}else switch(K){case 32:Calendar.cellClick(cal._nav_now);break;case 27:act&&cal.callCloseHandler();break;case 37:case 38:case 39:case 40:if(act){var prev,x,y,ne,el,step;prev=K==37||K==38;step=(K==37||K==39)?1:7;function setVars(){el=cal.currentDateEl;var p=el.pos;x=p&15;y=p>>4;ne=cal.ar_days[y][x];};setVars();function prevMonth(){var date=new Date(cal.date);date.setDate(date.getDate()-step);cal.setDate(date);};function nextMonth(){var date=new Date(cal.date);date.setDate(date.getDate()+step);cal.setDate(date);};while(1){switch(K){case 37:if(--x>=0)ne=cal.ar_days[y][x];else{x=6;K=38;continue;}break;case 38:if(--y>=0)ne=cal.ar_days[y][x];else{prevMonth();setVars();}break;case 39:if(++x<7)ne=cal.ar_days[y][x];else{x=0;K=40;continue;}break;case 40:if(++ythis.maxYear){year=this.maxYear;date.setFullYear(year);}this.firstDayOfWeek=firstDayOfWeek;this.date=new Date(date);var month=date.getMonth();var mday=date.getDate();var no_days=date.getMonthDays();date.setDate(1);var day1=(date.getDay()-this.firstDayOfWeek)%7;if(day1<0)day1+=7;date.setDate(-day1);date.setDate(date.getDate()+1);var row=this.tbody.firstChild;var MN=Calendar._SMN[month];var ar_days=this.ar_days=new Array();var weekend=Calendar._TT["WEEKEND"];var dates=this.multiple?(this.datesCells={}):null;for(var i=0;i<6;++i,row=row.nextSibling){var cell=row.firstChild;if(this.weekNumbers){cell.className="day wn";cell.innerHTML=date.getWeekNumber();cell=cell.nextSibling;}row.className="daysrow";var hasdays=false,iday,dpos=ar_days[i]=[];for(var j=0;j<7;++j,cell=cell.nextSibling,date.setDate(iday+1)){iday=date.getDate();var wday=date.getDay();cell.className="day";cell.pos=i<<4|j;dpos[j]=cell;var current_month=(date.getMonth()==month);if(!current_month){if(this.showsOtherMonths){cell.className+=" othermonth";cell.otherMonth=true;}else{cell.className="emptycell";cell.innerHTML=" ";cell.disabled=true;continue;}}else{cell.otherMonth=false;hasdays=true;}cell.disabled=false;cell.innerHTML=this.getDateText?this.getDateText(date,iday):iday;if(dates)dates[date.print("%Y%m%d")]=cell;if(this.getDateStatus){var status=this.getDateStatus(date,year,month,iday);if(this.getDateToolTip){var toolTip=this.getDateToolTip(date,year,month,iday);if(toolTip)cell.title=toolTip;}if(status===true){cell.className+=" disabled";cell.disabled=true;}else{if(/disabled/i.test(status))cell.disabled=true;cell.className+=" "+status;}}if(!cell.disabled){cell.caldate=new Date(date);cell.ttip="_";if(!this.multiple&¤t_month&&iday==mday&&this.hiliteToday){cell.className+=" selected";this.currentDateEl=cell;}if(date.getFullYear()==TY&&date.getMonth()==TM&&iday==TD){cell.className+=" today";cell.ttip+=Calendar._TT["PART_TODAY"];}if(weekend.indexOf(wday.toString())!=-1)cell.className+=cell.otherMonth?" oweekend":" weekend";}}if(!(hasdays||this.showsOtherMonths))row.className="emptyrow";}this.title.innerHTML=Calendar._MN[month]+", "+year;this.onSetTime();this.table.style.visibility="visible";this._initMultipleDates();};Calendar.prototype._initMultipleDates=function(){if(this.multiple){for(var i in this.multiple){var cell=this.datesCells[i];var d=this.multiple[i];if(!d)continue;if(cell)cell.className+=" selected";}}};Calendar.prototype._toggleMultipleDate=function(date){if(this.multiple){var ds=date.print("%Y%m%d");var cell=this.datesCells[ds];if(cell){var d=this.multiple[ds];if(!d){Calendar.addClass(cell,"selected");this.multiple[ds]=date;}else{Calendar.removeClass(cell,"selected");delete this.multiple[ds];}}}};Calendar.prototype.setDateToolTipHandler=function(unaryFunction){this.getDateToolTip=unaryFunction;};Calendar.prototype.setDate=function(date){if(!date.equalsTo(this.date)){this._init(this.firstDayOfWeek,date);}};Calendar.prototype.refresh=function(){this._init(this.firstDayOfWeek,this.date);};Calendar.prototype.setFirstDayOfWeek=function(firstDayOfWeek){this._init(firstDayOfWeek,this.date);this._displayWeekdays();};Calendar.prototype.setDateStatusHandler=Calendar.prototype.setDisabledHandler=function(unaryFunction){this.getDateStatus=unaryFunction;};Calendar.prototype.setRange=function(a,z){this.minYear=a;this.maxYear=z;};Calendar.prototype.callHandler=function(){if(this.onSelected){this.onSelected(this,this.date.print(this.dateFormat));}};Calendar.prototype.callCloseHandler=function(){if(this.onClose){this.onClose(this);}this.hideShowCovered();};Calendar.prototype.destroy=function(){var el=this.element.parentNode;el.removeChild(this.element);Calendar._C=null;window._dynarch_popupCalendar=null;};Calendar.prototype.reparent=function(new_parent){var el=this.element;el.parentNode.removeChild(el);new_parent.appendChild(el);};Calendar._checkCalendar=function(ev){var calendar=window._dynarch_popupCalendar;if(!calendar){return false;}var el=Calendar.is_ie?Calendar.getElement(ev):Calendar.getTargetElement(ev);for(;el!=null&&el!=calendar.element;el=el.parentNode);if(el==null){window._dynarch_popupCalendar.callCloseHandler();return Calendar.stopEvent(ev);}};Calendar.prototype.show=function(){var rows=this.table.getElementsByTagName("tr");for(var i=rows.length;i>0;){var row=rows[--i];Calendar.removeClass(row,"rowhilite");var cells=row.getElementsByTagName("td");for(var j=cells.length;j>0;){var cell=cells[--j];Calendar.removeClass(cell,"hilite");Calendar.removeClass(cell,"active");}}this.element.style.display="block";this.hidden=false;if(this.isPopup){window._dynarch_popupCalendar=this;Calendar.addEvent(document,"keydown",Calendar._keyEvent);Calendar.addEvent(document,"keypress",Calendar._keyEvent);Calendar.addEvent(document,"mousedown",Calendar._checkCalendar);}this.hideShowCovered();};Calendar.prototype.hide=function(){if(this.isPopup){Calendar.removeEvent(document,"keydown",Calendar._keyEvent);Calendar.removeEvent(document,"keypress",Calendar._keyEvent);Calendar.removeEvent(document,"mousedown",Calendar._checkCalendar);}this.element.style.display="none";this.hidden=true;this.hideShowCovered();};Calendar.prototype.showAt=function(x,y){var s=this.element.style;s.left=x+"px";s.top=y+"px";this.show();};Calendar.prototype.showAtElement=function(el,opts){var self=this;var p=Calendar.getAbsolutePos(el);if(!opts||typeof opts!="string"){this.showAt(p.x,p.y+el.offsetHeight);return true;}function fixPosition(box){if(box.x<0)box.x=0;if(box.y<0)box.y=0;var cp=document.createElement("div");var s=cp.style;s.position="absolute";s.right=s.bottom=s.width=s.height="0px";document.body.appendChild(cp);var br=Calendar.getAbsolutePos(cp);document.body.removeChild(cp);if(Calendar.is_ie){br.y+=document.body.scrollTop;br.x+=document.body.scrollLeft;}else{br.y+=window.scrollY;br.x+=window.scrollX;}var tmp=box.x+box.width-br.x;if(tmp>0)box.x-=tmp;tmp=box.y+box.height-br.y;if(tmp>0)box.y-=tmp;};this.element.style.display="block";Calendar.continuation_for_the_fucking_khtml_browser=function(){var w=self.element.offsetWidth;var h=self.element.offsetHeight;self.element.style.display="none";var valign=opts.substr(0,1);var halign="l";if(opts.length>1){halign=opts.substr(1,1);}switch(valign){case "T":p.y-=h;break;case "B":p.y+=el.offsetHeight;break;case "C":p.y+=(el.offsetHeight-h)/2;break;case "t":p.y+=el.offsetHeight-h;break;case "b":break;}switch(halign){case "L":p.x-=w;break;case "R":p.x+=el.offsetWidth;break;case "C":p.x+=(el.offsetWidth-w)/2;break;case "l":p.x+=el.offsetWidth-w;break;case "r":break;}p.width=w;p.height=h+40;self.monthsCombo.style.display="none";fixPosition(p);self.showAt(p.x,p.y);};if(Calendar.is_khtml)setTimeout("Calendar.continuation_for_the_fucking_khtml_browser()",10);else Calendar.continuation_for_the_fucking_khtml_browser();};Calendar.prototype.setDateFormat=function(str){this.dateFormat=str;};Calendar.prototype.setTtDateFormat=function(str){this.ttDateFormat=str;};Calendar.prototype.parseDate=function(str,fmt){if(!fmt)fmt=this.dateFormat;this.setDate(Date.parseDate(str,fmt));};Calendar.prototype.hideShowCovered=function(){if(!Calendar.is_ie&&!Calendar.is_opera)return;function getVisib(obj){var value=obj.style.visibility;if(!value){if(document.defaultView&&typeof(document.defaultView.getComputedStyle)=="function"){if(!Calendar.is_khtml)value=document.defaultView. getComputedStyle(obj,"").getPropertyValue("visibility");else value='';}else if(obj.currentStyle){value=obj.currentStyle.visibility;}else value='';}return value;};var tags=new Array("applet","iframe","select");var el=this.element;var p=Calendar.getAbsolutePos(el);var EX1=p.x;var EX2=el.offsetWidth+EX1;var EY1=p.y;var EY2=el.offsetHeight+EY1;for(var k=tags.length;k>0;){var ar=document.getElementsByTagName(tags[--k]);var cc=null;for(var i=ar.length;i>0;){cc=ar[--i];p=Calendar.getAbsolutePos(cc);var CX1=p.x;var CX2=cc.offsetWidth+CX1;var CY1=p.y;var CY2=cc.offsetHeight+CY1;if(this.hidden||(CX1>EX2)||(CX2EY2)||(CY229)?1900:2000);break;case "%b":case "%B":for(j=0;j<12;++j){if(Calendar._MN[j].substr(0,a[i].length).toLowerCase()==a[i].toLowerCase()){m=j;break;}}break;case "%H":case "%I":case "%k":case "%l":hr=parseInt(a[i],10);break;case "%P":case "%p":if(/pm/i.test(a[i])&&hr<12)hr+=12;else if(/am/i.test(a[i])&&hr>=12)hr-=12;break;case "%M":min=parseInt(a[i],10);break;}}if(isNaN(y))y=today.getFullYear();if(isNaN(m))m=today.getMonth();if(isNaN(d))d=today.getDate();if(isNaN(hr))hr=today.getHours();if(isNaN(min))min=today.getMinutes();if(y!=0&&m!=-1&&d!=0)return new Date(y,m,d,hr,min,0);y=0;m=-1;d=0;for(i=0;i31&&y==0){y=parseInt(a[i],10);(y<100)&&(y+=(y>29)?1900:2000);}else if(d==0){d=a[i];}}if(y==0)y=today.getFullYear();if(m!=-1&&d!=0)return new Date(y,m,d,hr,min,0);return today;};Date.prototype.getMonthDays=function(month){var year=this.getFullYear();if(typeof month=="undefined"){month=this.getMonth();}if(((0==(year%4))&&((0!=(year%100))||(0==(year%400))))&&month==1){return 29;}else{return Date._MD[month];}};Date.prototype.getDayOfYear=function(){var now=new Date(this.getFullYear(),this.getMonth(),this.getDate(),0,0,0);var then=new Date(this.getFullYear(),0,0,0,0,0);var time=now-then;return Math.floor(time/Date.DAY);};Date.prototype.getWeekNumber=function(){var d=new Date(this.getFullYear(),this.getMonth(),this.getDate(),0,0,0);var DoW=d.getDay();d.setDate(d.getDate()-(DoW+6)%7+3);var ms=d.valueOf();d.setMonth(0);d.setDate(4);return Math.round((ms-d.valueOf())/(7*864e5))+1;};Date.prototype.equalsTo=function(date){return((this.getFullYear()==date.getFullYear())&&(this.getMonth()==date.getMonth())&&(this.getDate()==date.getDate())&&(this.getHours()==date.getHours())&&(this.getMinutes()==date.getMinutes()));};Date.prototype.setDateOnly=function(date){var tmp=new Date(date);this.setDate(1);this.setFullYear(tmp.getFullYear());this.setMonth(tmp.getMonth());this.setDate(tmp.getDate());};Date.prototype.print=function(str){var m=this.getMonth();var d=this.getDate();var y=this.getFullYear();var wn=this.getWeekNumber();var w=this.getDay();var s={};var hr=this.getHours();var pm=(hr>=12);var ir=(pm)?(hr-12):hr;var dy=this.getDayOfYear();if(ir==0)ir=12;var min=this.getMinutes();var sec=this.getSeconds();s["%a"]=Calendar._SDN[w];s["%A"]=Calendar._DN[w];s["%b"]=Calendar._SMN[m];s["%B"]=Calendar._MN[m];s["%C"]=1+Math.floor(y/100);s["%d"]=(d<10)?("0"+d):d;s["%e"]=d;s["%H"]=(hr<10)?("0"+hr):hr;s["%I"]=(ir<10)?("0"+ir):ir;s["%j"]=(dy<100)?((dy<10)?("00"+dy):("0"+dy)):dy;s["%k"]=hr;s["%l"]=ir;s["%m"]=(m<9)?("0"+(1+m)):(1+m);s["%M"]=(min<10)?("0"+min):min;s["%n"]="\n";s["%p"]=pm?"PM":"AM";s["%P"]=pm?"pm":"am";s["%s"]=Math.floor(this.getTime()/1000);s["%S"]=(sec<10)?("0"+sec):sec;s["%t"]="\t";s["%U"]=s["%W"]=s["%V"]=(wn<10)?("0"+wn):wn;s["%u"]=w+1;s["%w"]=w;s["%y"]=(''+y).substr(2,2);s["%Y"]=y;s["%%"]="%";var re=/%./g;if(!Calendar.is_ie5&&!Calendar.is_khtml)return str.replace(re,function(par){return s[par]||par;});var a=str.match(re);for(var i=0;i", ">>" buttons have this class */ + text-align: center; /* They are the navigation buttons */ + padding: 2px; /* Make the buttons seem like they're pressing */ +} + +.calendar .nav { + background: #778 url(menuarrow.gif) no-repeat 100% 100%; +} + +.calendar thead .title { /* This holds the current "month, year" */ + font-weight: bold; /* Pressing it will take you to the current date */ + text-align: center; + background: #fff; + color: #000; + padding: 2px; +} + +.calendar thead .headrow { /* Row containing navigation buttons */ + background: #778; + color: #fff; +} + +.calendar thead .daynames { /* Row containing the day names */ + background: #bdf; +} + +.calendar thead .name { /* Cells containing the day names */ + border-bottom: 1px solid #556; + padding: 2px; + text-align: center; + color: #000; +} + +.calendar thead .weekend { /* How a weekend day name shows in header */ + color: #a66; +} + +.calendar thead .hilite { /* How do the buttons in header appear when hover */ + background-color: #aaf; + color: #000; + border: 1px solid #04f; + padding: 1px; +} + +.calendar thead .active { /* Active (pressed) buttons in header */ + background-color: #77c; + padding: 2px 0px 0px 2px; +} + +/* The body part -- contains all the days in month. */ + +.calendar tbody .day { /* Cells containing month days dates */ + width: 2em; + color: #456; + text-align: right; + padding: 2px 4px 2px 2px; +} +.calendar tbody .day.othermonth { + font-size: 80%; + color: #bbb; +} +.calendar tbody .day.othermonth.oweekend { + color: #fbb; +} + +.calendar table .wn { + padding: 2px 3px 2px 2px; + border-right: 1px solid #000; + background: #bdf; +} + +.calendar tbody .rowhilite td { + background: #def; +} + +.calendar tbody .rowhilite td.wn { + background: #eef; +} + +.calendar tbody td.hilite { /* Hovered cells */ + background: #def; + padding: 1px 3px 1px 1px; + border: 1px solid #bbb; +} + +.calendar tbody td.active { /* Active (pressed) cells */ + background: #cde; + padding: 2px 2px 0px 2px; +} + +.calendar tbody td.selected { /* Cell showing today date */ + font-weight: bold; + border: 1px solid #000; + padding: 1px 3px 1px 1px; + background: #fff; + color: #000; +} + +.calendar tbody td.weekend { /* Cells showing weekend days */ + color: #a66; +} + +.calendar tbody td.today { /* Cell showing selected date */ + font-weight: bold; + color: #00f; +} + +.calendar tbody .disabled { color: #999; } + +.calendar tbody .emptycell { /* Empty cells (the best is to hide them) */ + visibility: hidden; +} + +.calendar tbody .emptyrow { /* Empty row (some months need less than 6 rows) */ + display: none; +} + +/* The footer part -- status bar and "Close" button */ + +.calendar tfoot .footrow { /* The in footer (only one right now) */ + text-align: center; + background: #556; + color: #fff; +} + +.calendar tfoot .ttip { /* Tooltip (status bar) cell */ + background: #fff; + color: #445; + border-top: 1px solid #556; + padding: 1px; +} + +.calendar tfoot .hilite { /* Hover style for buttons in footer */ + background: #aaf; + border: 1px solid #04f; + color: #000; + padding: 1px; +} + +.calendar tfoot .active { /* Active (pressed) style for buttons in footer */ + background: #77c; + padding: 2px 0px 0px 2px; +} + +/* Combo boxes (menus that display months/years for direct selection) */ + +.calendar .combo { + position: absolute; + display: none; + top: 0px; + left: 0px; + width: 4em; + cursor: default; + border: 1px solid #655; + background: #def; + color: #000; + font-size: 90%; + z-index: 100; +} + +.calendar .combo .label, +.calendar .combo .label-IEfix { + text-align: center; + padding: 1px; +} + +.calendar .combo .label-IEfix { + width: 4em; +} + +.calendar .combo .hilite { + background: #acf; +} + +.calendar .combo .active { + border-top: 1px solid #46a; + border-bottom: 1px solid #46a; + background: #eef; + font-weight: bold; +} + +.calendar td.time { + border-top: 1px solid #000; + padding: 1px 0px; + text-align: center; + background-color: #f4f0e8; +} + +.calendar td.time .hour, +.calendar td.time .minute, +.calendar td.time .ampm { + padding: 0px 3px 0px 4px; + border: 1px solid #889; + font-weight: bold; + background-color: #fff; +} + +.calendar td.time .ampm { + text-align: center; +} + +.calendar td.time .colon { + padding: 0px 2px 0px 3px; + font-weight: bold; +} + +.calendar td.time span.hilite { + border-color: #000; + background-color: #667; + color: #fff; +} + +.calendar td.time span.active { + border-color: #f00; + background-color: #000; + color: #0f0; +} diff -r f99d8f92a640 -r 755dd2fa4a0a gnv/src/main/webapp/styles/default.css --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv/src/main/webapp/styles/default.css Fri Sep 28 12:13:53 2012 +0200 @@ -0,0 +1,434 @@ +@charset +"ISO-8859-1" +; + +body { + background-color: #FFFFFF; + font-family: verdana, arial, Helvetica, sans-serif; + + height: 100%; + margin: 0; + padding: 0; +} + +br { + padding: 0; + margin: 0; + font-size: 0; + clear: both; +} + +form { + margin: 0; + padding: 0; +} + +h1 { + font-weight: bold; + font-size: 0.9em; + color: #00416B; +} + +h2 { + font-weight: bold; + font-size: 0.8em; + color: #00416B; +} + +a { + color: #00416B; + text-decoration: none; +} + +legend { + border: 1px solid #CCD5DE; + padding: 4px 5px; + margin: 0 0 0 0; + background-color: white; + font-weight: bolder; + color: #00416B; + clear: both; +} + +fieldset { + margin: 5px 0 0 10px; + padding-left: 10px; + padding-right: 10px; + border: 1px solid #CCD5DE; + background-repeat: repeat-x; + background-position: top left; + display: block; +} + +div { + margin: 0; + padding: 0; +} + +p, li, dl, input, select, address, legend, label, fieldset span { + font-size: 0.7em; +} + +legend.expandableFieldset { + cursor: pointer; +} + +select, textarea { + width: 250px; +} + +textarea.mapviewer { + width: 450px; +} + +input.textinput { + width: 250px; +} + + +textarea { + font-family: verdana, arial, Helvetica, sans-serif; + font-size: 0.7em; +} + +table.dynamic { + font-size: 1.2em; +} + +table.static { + margin: 0 0 0 0; + width: 293px; +} + +table.wms { + font-size: 0.8em; + margin: 0 0 0 0; +} + +table, th, td { + margin: 0; + padding: 0; + font-size: 0.8em; +} + +img { + border: 0px; +} + +.down { + padding-top: 20px; + width: 315px; +} + +.historyback { + padding-left: 10px; + vertical-align: top; + text-align: right; +} + +.parameter { + color: #00416B; + font-size: 0.8em; + font-weight: bold; + padding-left: 5px; + text-align: left; + vertical-align: top; + width: 110px; +} + +.matrixHeader { + padding-left: 5px; +} + +.wmsvalue { +} + +.value { + font-size: 1.2em; +} + +.submitbutton{ + cursor:pointer; + border:outset 1px #ccc; + background:#ffffff; + color:#666; + font-weight:bold; + padding: 1px 2px; + +} + +.error { + color: #CD3426; + font-size: 10px; + font-weight: bold; + margin: 2px 2px; +} + +.errormsg { + + color: red; + font-weight: bold; +} + +/* ====================== Header ============================= */ +#head { + + height: 25px; + margin: 0; + padding: 0; + background-color: #103D64; +} + +#logo { + float:right; + background-image: url( ../images/bsh_logo.gif ); + background-repeat: no-repeat; + + top:0px; + height: 170px; + width: 75px; + +} +#head a { + clear:left; + +} +#project { + position:absolute; + top:27px; + left:10px; + width: 400px; + text-align: left; + +} + +#load_error { + position:absolute; + top:27px; + left:425px; + width: 400px; + text-align: left; + +} + +#project_load { + position:absolute; + top: 0px; + left: 250px; + width: 277px; + border: 1px solid lightgray; + visibility: hidden; + padding: 5px; +} + + +#head h1, #head h2 { + display: block; + color: white; + font-size: large; + padding-left: 300px; + margin: 0; + + +} + +div#header { + background-color: #143B62; + margin: 0; + padding: 0; + height: 50px; +} + +div#header img { + padding: 0; + margin: 0; + border-width: 0; +} + +div#page { + position: absolute; + top: 0; + left: 0; + width: 100%; + +} + +.showContent { + display: block; +} + +.hideContent { + display: none; +} + +div#selection { + float: left; + width: 300px; + margin-top: 30px; +} + +div#diagram { + position: absolute; + top: 33px; + left: 350px; +} + +div.outerMap { + position: absolute; + top: 62px; + left: 350px; + width: 555px; + height: 436px; + margin: 0 0 0 0; + padding: 0 0 0 0; +} + +div.wms { + position: relative; + top: 0px; + left: 0px; + height: 30px; + border: 1px solid red; +} + +div#map { + position: absolute; + top: 55px; + left: 0px; + width: 555px; + height: 381px; + border: 1px solid #CCD5DE; +} + +div.histogram { + position: absolute; + top: 33px; + left: 350px; +} + +div#export { + width: 325px; +} + +/* this is a wrapper for diagramoptions and statistics*/ +div#diagrammAddOns { + position: absolute; + top: 600px; + left: 300px; +} + +div#diagramoptions { + position: relative; + width: 325px; +} + +div#diagramOptionsContent { + width : 325px; +} + +div.statistics { + position: absolute; + top : 33px; + left : 350px; + width : 325px; +} + +div#statisticValues { + width: 100%; +} + +table#statistik_tab_0{ + position:relative; + top:0px; + left:0px; +} +table#statistik_tab_1{ + position:absolute; + top:30px; + left:230px; +} +table#statistik_tab_2{ + position:relative; + top:-210px; + left:410px; +} +table#statistik_tab_3{ + position:relative; + top:-195px; + left:0px; +} +table#statistik_tab_4{ + position:absolute; + top:260px; + left:230px; +} +table#statistik_tab_5{ + position:absolute; + top:260px; + left:410px; +} +table#statistik_tab_6{ + position:relative; + top:-180px; + left:0px; +} +table#statistik_tab_7{ + position:absolute; + top:485px; + left:230px; +} +table#statistik_tab_8{ + position:absolute; + top:485px; + left:410px; +} + +div#basefilter { + margin-top: 30px; + width: 325px; +} + +div#timeseriesfilter { + margin-top: 1px; + padding: 0px; + width: 325px; +} + +#timeRangeForm label { + float: left; + margin-right: 5px; + text-align: left; + width: 20px; +} + +/* ---------- OVERLAY ------------------------- */ +#overlay { + visibility: hidden; + position: absolute; + left: 0; + top: 0; + width: 100%; + height: 100%; + text-align: center; + z-index: 100; + background-color: white; + -moz-opacity: 0.5; + opacity: 0.5; +} + +#overlayContent { + visibility: hidden; + position: relative; + z-index: 101; + width: 300px; + margin: 150px auto; + background-color: #fff; + border: 1px solid #000; + padding: 75px; + text-align: right; + background-image: url( ../images/bsh_logo.gif ); + background-repeat: no-repeat; + +} + +/* ----------------------------------- */ diff -r f99d8f92a640 -r 755dd2fa4a0a gnv/src/test/java/de/intevation/gnv/action/mapviewer/parser/ExternalCallParserTestCase.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv/src/test/java/de/intevation/gnv/action/mapviewer/parser/ExternalCallParserTestCase.java Fri Sep 28 12:13:53 2012 +0200 @@ -0,0 +1,89 @@ +package de.intevation.gnv.action.mapviewer.parser; + +import java.io.File; +import java.io.FileInputStream; +import java.io.InputStream; +import java.util.Collection; +import java.util.Iterator; + +import junit.framework.TestCase; + +import org.apache.log4j.BasicConfigurator; +import org.apache.log4j.Logger; + +import de.intevation.gnv.artifactdatabase.objects.map.Layer; +import de.intevation.gnv.artifactdatabase.objects.map.MapService; + +public class ExternalCallParserTestCase extends TestCase { + + /** + * the logger, used to log exceptions and additonaly information + */ + private static Logger log = null; + + static { + BasicConfigurator.configure(); + log = Logger.getLogger(ExternalCallParserTestCase.class); + } + + public ExternalCallParserTestCase() { + super(); + } + + public ExternalCallParserTestCase(String name) { + super(name); + } + + public void testParseExternalCall() { + log.debug("Execute testParseExternalCall"); + try { + InputStream inputStream = new FileInputStream( + new File("src/test/ressources/externalinterfacecall.xml")); + ExternalCallParser ecp = new XMLExternalCallParser(inputStream); + ecp.parse(); + String geometry = ecp.getGeometry(); + assertNotNull(geometry); + log.debug("Parsed Geometry: "+geometry); + String srs = ecp.getSRS(); + assertNotNull(srs); + log.debug("Parsed SRS: "+srs); + Collection mapServices = ecp.getMapServices(); + assertNotNull(mapServices); + log.debug(mapServices.size()+"Mapservices parsed"); + assertEquals(2, mapServices.size()); + Iterator it = mapServices.iterator(); + MapService mapService1 = it.next(); + MapService mapService2 = it.next(); + + log.debug("MapService 1"); + log.debug("ID: "+mapService1.getID()); + log.debug("URL: "+mapService1.getURL()); + log.debug("TYPE: "+mapService1.getType()); + Collection layer1 = mapService1.getLayer(); + log.debug("Layer parsed: "+layer1.size()); + assertEquals(5, layer1.size()); + Iterator layerIt1 = layer1.iterator(); + while(layerIt1.hasNext()){ + log.debug(layerIt1.next().toString()); + } + + log.debug("MapService 2"); + log.debug("ID: "+mapService2.getID()); + log.debug("URL: "+mapService2.getURL()); + log.debug("TYPE: "+mapService2.getType()); + Collection layer2 = mapService2.getLayer(); + log.debug("Layer parsed: "+layer2.size()); + assertEquals(2, layer2.size()); + Iterator layerIt2 = layer2.iterator(); + while(layerIt2.hasNext()){ + log.debug(layerIt2.next().toString()); + } + + } catch (Exception e) { + log.error(e,e); + fail(); + } + + } + +} diff -r f99d8f92a640 -r 755dd2fa4a0a gnv/src/test/java/de/intevation/gnv/artifactdatabase/client/ArtifactDatabaseClientTestCase.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv/src/test/java/de/intevation/gnv/artifactdatabase/client/ArtifactDatabaseClientTestCase.java Fri Sep 28 12:13:53 2012 +0200 @@ -0,0 +1,102 @@ +/** + * + */ +package de.intevation.gnv.artifactdatabase.client; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.Iterator; +import java.util.Locale; + +import junit.framework.TestCase; + +import org.apache.log4j.BasicConfigurator; +import org.apache.log4j.Logger; + +import de.intevation.gnv.artifactdatabase.client.exception.ArtifactDatabaseClientException; +import de.intevation.gnv.artifactdatabase.objects.ArtifactDescription; +import de.intevation.gnv.artifactdatabase.objects.ArtifactObject; +import de.intevation.gnv.artifactdatabase.objects.DefaultInputParameter; +import de.intevation.gnv.artifactdatabase.objects.InputParameter; +import de.intevation.gnv.util.XSLTransformer; + +/** + * @author Tim Englich + * + */ +public class ArtifactDatabaseClientTestCase extends TestCase { + + /** + * the logger, used to log exceptions and additonaly information + */ + private static Logger log = null; + + static { + BasicConfigurator.configure(); + log = Logger.getLogger(DefaultArtifactDatabaseClient.class); + } + + /** + * Constructor + * + * @param namemessage + */ + public ArtifactDatabaseClientTestCase(String name) { + super(name); + } + + /** + * @see junit.framework.TestCase#setUp() + */ + @Override + protected void setUp() throws Exception { + super.setUp(); + } + + public void testArtifactDatabaseClient() { + + try { + ArtifactDatabaseClient artifactDatabaseClient = ArtifactDatabaseClientFactory + .getInstance().getArtifactDatabaseClient(Locale.GERMAN); + Collection factories = artifactDatabaseClient + .getArtifactFactories(); + if (factories != null && !factories.isEmpty()) { + Iterator it = factories.iterator(); + while (it.hasNext()) { + ArtifactObject aof = it.next(); + ArtifactObject artifact = artifactDatabaseClient + .createNewArtifact(aof); + ArtifactDescription ad = artifactDatabaseClient + .getCurrentStepDescription(aof, artifact,true); + log.debug("Artifact aktualisert."); + XSLTransformer transformer = new XSLTransformer(); + String transformedUI = transformer + .transform( + ad.getCurrentUI(), + "UTF-8", + ("src/main/webapp/WEB-INF/config/templates/describe-ui.xsl")); + log.debug(transformedUI); + + Collection inputParameter = new ArrayList( + 1); + inputParameter.add(new DefaultInputParameter("product", + new String[] { "timeSeries" })); + ad = artifactDatabaseClient.doNextStep(aof, artifact, + "timeSeries", inputParameter); + + transformedUI = transformer + .transform( + ad.getCurrentUI(), + "UTF-8", + ("src/main/webapp/WEB-INF/config/templates/describe-ui.xsl")); + log.debug(transformedUI); + } + } + + } catch (ArtifactDatabaseClientException e) { + log.error(e, e); + fail(); + } + } + +} diff -r f99d8f92a640 -r 755dd2fa4a0a gnv/src/test/java/de/intevation/gnv/util/XSLTransformerTestCase.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv/src/test/java/de/intevation/gnv/util/XSLTransformerTestCase.java Fri Sep 28 12:13:53 2012 +0200 @@ -0,0 +1,57 @@ +/** + * + */ +package de.intevation.gnv.util; + +import java.io.File; +import java.io.FileInputStream; +import java.io.FileNotFoundException; + +import junit.framework.TestCase; + +import org.apache.log4j.BasicConfigurator; +import org.apache.log4j.Logger; +import org.w3c.dom.Document; + +import de.intevation.gnv.artifactdatabase.client.DefaultArtifactDatabaseClient; + +/** + * @author Tim Englich + * + */ +public class XSLTransformerTestCase extends TestCase { + + /** + * the logger, used to log exceptions and additonaly information + */ + private static Logger log = null; + + static { + BasicConfigurator.configure(); + log = Logger.getLogger(DefaultArtifactDatabaseClient.class); + } + + public XSLTransformerTestCase() { + super(); + } + + public XSLTransformerTestCase(String name) { + super(name); + } + + public void testDescribeUI() { + + try { + // System.setProperty("javax.xml.transform.TransformerFactory","com.icl.saxon.TransformerFactoryImpl"); + Document document = new XMLUtils() + .readDocument(new FileInputStream(new File( + "src/test/ressources/describe-ui-test.xml"))); + XSLTransformer transformer = new XSLTransformer(); + String value = transformer.transform(document, "UTF-8", + "src/main/webapp/WEB-INF/config/templates/describe-ui.xsl"); + log.debug(value); + } catch (FileNotFoundException e) { + log.error(e, e); + } + } +} diff -r f99d8f92a640 -r 755dd2fa4a0a gnv/src/test/ressources/describe-ui-test.xml --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv/src/test/ressources/describe-ui-test.xml Fri Sep 28 12:13:53 2012 +0200 @@ -0,0 +1,10 @@ + + + product + + + timeSeries + timeSeries + + + diff -r f99d8f92a640 -r 755dd2fa4a0a gnv/src/test/ressources/externalinterfacecall.xml --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv/src/test/ressources/externalinterfacecall.xml Fri Sep 28 12:13:53 2012 +0200 @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + EPSG:4324 + POINT(8.6 56.0) + + \ No newline at end of file diff -r f99d8f92a640 -r 755dd2fa4a0a gnv/src/test/ressources/externalinterfacecall_curl.xml --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv/src/test/ressources/externalinterfacecall_curl.xml Fri Sep 28 12:13:53 2012 +0200 @@ -0,0 +1,37 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + EPSG:4324 + POINT(8.6 56.0) + + \ No newline at end of file diff -r f99d8f92a640 -r 755dd2fa4a0a gnv/src/test/ressources/samplecall.txt --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv/src/test/ressources/samplecall.txt Fri Sep 28 12:13:53 2012 +0200 @@ -0,0 +1,1 @@ +curl -v -X POST -H "Content-type: text/xml" http://localhost:8080/gnv/extcall.do -d @externalinterfacecall_curl.xml \ No newline at end of file