From ec42211d075478e4dd44e6ef3917709429fb012e Mon Sep 17 00:00:00 2001 From: ?? ? <ulysseskao@ximple.com.tw> Date: Mon, 03 May 2010 19:21:07 +0800 Subject: [PATCH] --- xdgnjobs/ximple-jobcarrier/pom.xml | 3 .gitattributes | 9 xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/filter/CreateShapeStrategy.java | 2 xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/jobs/context/shapefile/GeneralDgnConvertShpJobContext.java | 8 xdgnjobs/ximple-spatialjob/pom.xml | 5 xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/jobs/context/postgis/IndexDgnConvertPostGISJobContext.java | 7 xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/jobs/context/orasdo/GeneralDgnConvertOraSDOJobContext.java | 8 xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/jobs/context/edbgeo/AbstractDgnToEdbGeoJobContext.java | 665 +++++++ xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/jobs/context/mysql/GeneralDgnConvertMySQLJobContext.java | 8 xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/filter/CreateEllipseShapeStrategy.java | 1 xdgnjobs/pom.xml | 36 xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/filter/CreateComplexChainStrategy.java | 4 xdgnjobs/ximple-jobcarrier/src/main/resources/quartz_jobs_edb.xml | 147 + xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/filter/CreateArcLineStringStrategy.java | 1 xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/jobs/context/postgis/GeneralDgnConvertPostGISJobContext.java | 8 xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/jobs/OracleConvertDgn2MySQLJob.java | 4 xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/filter/CreateTextStrategy.java | 2 xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/filter/CreateLineTextStrategy.java | 4 xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/filter/CreateMultiSymbolStrategy.java | 2 xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/jobs/context/shapefile/IndexDgnConvertShpJobContext.java | 3 xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/jobs/context/edbgeo/DummyFeatureConvertEdbGeoJobContext.java | 236 ++ xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/filter/CreateSymbolStrategy.java | 1 xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/filter/CreateLineStringStrategy.java | 4 xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/jobs/OracleConvertDgn2PostGISJob.java | 10 xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/jobs/context/mysql/IndexDgnConvertMySQLJobContext.java | 3 xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/jobs/OracleConvertDgn2EdbGeoJob.java | 1409 +++++++++++++++ xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/jobs/context/edbgeo/AbstractOracleToEdbGeoJobContext.java | 691 +++++++ xdgnjobs/ximple-jobcarrier/src/main/resources/quartz_jobs.xml | 8 xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/jobs/context/edbgeo/IndexDgnConvertEdbGeoJobContext.java | 838 +++++++++ xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/jobs/context/orasdo/IndexDgnConvertOraSDOJobContext.java | 3 xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/jobs/context/edbgeo/GeneralDgnConvertEdbGeoJobContext.java | 574 ++++++ xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/jobs/context/edbgeo/OracleConvertEdbGeoJobContext.java | 387 ++++ xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/jobs/context/edbgeo/FeatureDgnConvertEdbGeoJobContext.java | 227 ++ xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/jobs/context/postgis/AbstractDgnToPostGISJobContext.java | 2 34 files changed, 5,237 insertions(+), 83 deletions(-) diff --git a/.gitattributes b/.gitattributes index e5d83c6..f605414 100644 --- a/.gitattributes +++ b/.gitattributes @@ -61,6 +61,7 @@ xdgnjobs/ximple-jobcarrier/src/main/resources/log4j.properties svneol=native#text/plain xdgnjobs/ximple-jobcarrier/src/main/resources/quartz.properties svneol=native#text/plain xdgnjobs/ximple-jobcarrier/src/main/resources/quartz_jobs.xml svneol=native#text/xml +xdgnjobs/ximple-jobcarrier/src/main/resources/quartz_jobs_edb.xml -text svneol=unset#text/xml xdgnjobs/ximple-jobcarrier/src/main/resources/quartz_jobs_shapefiles.xml svneol=native#text/xml xdgnjobs/ximple-jobcarrier/src/test/java/com/ximple/eofms/XQuartzJobCarrierTest.java svneol=native#text/plain xdgnjobs/ximple-spatialjob/pom.xml svneol=native#text/xml @@ -90,6 +91,7 @@ xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/jobs/AbstractOracleDatabaseJob.java svneol=native#text/plain xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/jobs/DataReposVersionManager.java -text xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/jobs/DummyFeatureConvertJobContext.java svneol=native#text/plain +xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/jobs/OracleConvertDgn2EdbGeoJob.java -text svneol=unset#text/plain xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/jobs/OracleConvertDgn2MySQLJob.java svneol=native#text/plain xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/jobs/OracleConvertDgn2OraSDOJob.java svneol=native#text/plain xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/jobs/OracleConvertDgn2PostGISJob.java svneol=native#text/plain @@ -99,6 +101,13 @@ xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/jobs/context/AbstractDgnFileJobContext.java -text xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/jobs/context/AbstractOracleJobContext.java svneol=native#text/plain xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/jobs/context/OracleUpgradeJobContext.java svneol=native#text/plain +xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/jobs/context/edbgeo/AbstractDgnToEdbGeoJobContext.java -text svneol=unset#text/plain +xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/jobs/context/edbgeo/AbstractOracleToEdbGeoJobContext.java -text svneol=unset#text/plain +xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/jobs/context/edbgeo/DummyFeatureConvertEdbGeoJobContext.java -text svneol=unset#text/plain +xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/jobs/context/edbgeo/FeatureDgnConvertEdbGeoJobContext.java -text svneol=unset#text/plain +xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/jobs/context/edbgeo/GeneralDgnConvertEdbGeoJobContext.java -text svneol=unset#text/plain +xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/jobs/context/edbgeo/IndexDgnConvertEdbGeoJobContext.java -text svneol=unset#text/plain +xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/jobs/context/edbgeo/OracleConvertEdbGeoJobContext.java -text svneol=unset#text/plain xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/jobs/context/mysql/AbstractDgnToMySQLJobContext.java svneol=native#text/plain xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/jobs/context/mysql/AbstractOracleToMySQLJobContext.java svneol=native#text/plain xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/jobs/context/mysql/DummyFeatureConvertMySQlJobContext.java svneol=native#text/plain diff --git a/xdgnjobs/pom.xml b/xdgnjobs/pom.xml index ea4ee22..5e6dee2 100644 --- a/xdgnjobs/pom.xml +++ b/xdgnjobs/pom.xml @@ -139,7 +139,7 @@ <dependency> <groupId>com.vividsolutions</groupId> <artifactId>jts</artifactId> - <version>1.10</version> + <version>1.11</version> </dependency> <!-- Apache --> @@ -256,6 +256,12 @@ <groupId>org.geotools</groupId> <artifactId>gt-epsg-h2</artifactId> <version>${gt2.version}</version> + <exclusions> + <exclusion> + <groupId>com.h2database</groupId> + <artifactId>h2</artifactId> + </exclusion> + </exclusions> </dependency> <dependency> @@ -318,6 +324,19 @@ <version>5.1.12</version> </dependency> + <dependency> + <groupId>com.h2database</groupId> + <artifactId>h2</artifactId> + <version>1.2.134</version> + </dependency> + + <!-- EnterpriseDB --> + <dependency> + <groupId>com.ximple.eofms</groupId> + <artifactId>xedb-gt-geospatial</artifactId> + <version>0.1.1</version> + </dependency> + <!-- quartz-scheduler--> <dependency> <groupId>org.quartz-scheduler</groupId> @@ -330,6 +349,11 @@ <version>1.1.0-rc</version> </dependency> + <dependency> + <groupId>xerces</groupId> + <artifactId>xercesImpl</artifactId> + <version>2.9.1</version> + </dependency> <!-- Tests or legacy --> <dependency> <groupId>org.testng</groupId> @@ -407,6 +431,16 @@ </dependency> <dependency> + <groupId>com.h2database</groupId> + <artifactId>h2</artifactId> + </dependency> + + <dependency> + <groupId>xerces</groupId> + <artifactId>xercesImpl</artifactId> + </dependency> + + <dependency> <artifactId>testng</artifactId> <groupId>org.testng</groupId> <classifier>jdk15</classifier> diff --git a/xdgnjobs/ximple-jobcarrier/pom.xml b/xdgnjobs/ximple-jobcarrier/pom.xml index f53d185..fffc6a9 100644 --- a/xdgnjobs/ximple-jobcarrier/pom.xml +++ b/xdgnjobs/ximple-jobcarrier/pom.xml @@ -290,7 +290,8 @@ <includes> <include>log4j.properties</include> <include>quartz.properties</include> - <include>quartz_jobs.xml</include> + <!--<include>quartz_jobs.xml</include>--> + <include>quartz_jobs_edb.xml</include> </includes> <!-- <excludes> diff --git a/xdgnjobs/ximple-jobcarrier/src/main/resources/quartz_jobs.xml b/xdgnjobs/ximple-jobcarrier/src/main/resources/quartz_jobs.xml index 91819a3..dc6fa7c 100644 --- a/xdgnjobs/ximple-jobcarrier/src/main/resources/quartz_jobs.xml +++ b/xdgnjobs/ximple-jobcarrier/src/main/resources/quartz_jobs.xml @@ -23,7 +23,7 @@ <job> <name>ConvertDgn2PostGisIntoPostgre</name> <group>DEFAULT</group> - <description>A job that convert dgn to shapefiles</description> + <description>A job that convert dgn to postgis</description> <job-class>com.ximple.eofms.jobs.OracleConvertDgn2PostGISJob</job-class> <volatility>false</volatility> <durability>false</durability> @@ -39,7 +39,7 @@ <value>192.168.11.99</value> </entry> <entry> - <key>PGDDATBASE</key> + <key>PGDATBASE</key> <value>pgNSTPC</value> </entry> <entry> @@ -88,7 +88,7 @@ </entry> <entry> <key>CONVERTFILE</key> - <value>true</value> + <value>false</value> </entry> <entry> <key>CONVERTELEMIN</key> @@ -116,7 +116,7 @@ </entry> <entry> <key>COPYCONNECTIVITYMODE</key> - <value>true</value> + <value>false</value> </entry> <entry> <key>PROFILEMODE</key> diff --git a/xdgnjobs/ximple-jobcarrier/src/main/resources/quartz_jobs_edb.xml b/xdgnjobs/ximple-jobcarrier/src/main/resources/quartz_jobs_edb.xml new file mode 100644 index 0000000..e37fb37 --- /dev/null +++ b/xdgnjobs/ximple-jobcarrier/src/main/resources/quartz_jobs_edb.xml @@ -0,0 +1,147 @@ +<?xml version='1.0' encoding='utf-8'?> + +<job-scheduling-data xmlns="http://www.quartz-scheduler.org/xml/JobSchedulingData" + xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:schemaLocation="http://www.quartz-scheduler.org/xml/JobSchedulingData http://www.quartz-scheduler.org/xml/job_scheduling_data_1_8.xsd" + version="1.8"> + + <pre-processing-commands> + <delete-jobs-in-group>*</delete-jobs-in-group> + <!-- clear all jobs in scheduler --> + <delete-triggers-in-group>*</delete-triggers-in-group> + <!-- clear all triggers in scheduler --> + </pre-processing-commands> + + <processing-directives> + <!-- if there are any jobs/trigger in scheduler of same name (as in this file), overwrite them --> + <overwrite-existing-data>true</overwrite-existing-data> + <!-- if there are any jobs/trigger in scheduler of same name (as in this file), and over-write is false, ignore them rather then generating an error --> + <ignore-duplicates>false</ignore-duplicates> + </processing-directives> + + <schedule> + <job> + <name>ConvertDgn2GeoSpatialIntoEdb</name> + <group>DEFAULT</group> + <description>A job that convert dgn to gdb spatial</description> + <job-class>com.ximple.eofms.jobs.OracleConvertDgn2EdbGeoJob</job-class> + <volatility>false</volatility> + <durability>false</durability> + <recover>false</recover> + <!--job-data-map allows-transient-data="true"--> + <job-data-map> + <entry> + <key>JOBDATA_DIR</key> + <value>C:\Usr\Projects\XDCAD\nstpcjobs</value> + </entry> + <entry> + <key>EDBHOST</key> + <value>192.168.11.99</value> + </entry> + <entry> + <key>EDBDATBASE</key> + <value>tpcdb</value> + </entry> + <entry> + <key>EDBPORT</key> + <value>5444</value> + </entry> + <entry> + <key>EDBSCHEMA</key> + <value>public</value> + </entry> + <entry> + <key>EDBUSER</key> + <value>tpcdb</value> + </entry> + <entry> + <key>EDBPASS</key> + <value>simple000</value> + </entry> + <entry> + <key>ORAHOST</key> + <value>192.168.11.200</value> + </entry> + <entry> + <key>ORAINST</key> + <value>nntpc</value> + </entry> + <entry> + <key>ORAPORT</key> + <value>1521</value> + </entry> + <entry> + <key>ORAUSER</key> + <value>spatialdb</value> + </entry> + <entry> + <key>ORAPASS</key> + <value>spatialdb000</value> + </entry> + <entry> + <key>ORGSCHEMA</key> + <value>SPATIALDB, CMMS_SPATIALDB</value> + </entry> + <entry> + <key>CONVERTDB</key> + <value>true</value> + </entry> + <entry> + <key>CONVERTFILE</key> + <value>false</value> + </entry> + <entry> + <key>CONVERTELEMIN</key> + <value>false</value> + </entry> + <entry> + <key>CREATEDUMMY</key> + <value>false</value> + </entry> + <entry> + <key>ELEMLOG</key> + <value>true</value> + </entry> + <entry> + <key>USEWKB</key> + <value>true</value> + </entry> + <entry> + <key>TESTMODE</key> + <value>false</value> + </entry> + <entry> + <key>TESTCOUNT</key> + <value>2</value> + </entry> + <entry> + <key>COPYCONNECTIVITYMODE</key> + <value>false</value> + </entry> + <entry> + <key>PROFILEMODE</key> + <value>true</value> + </entry> + <entry> + <key>USEZONE121</key> + <value>true</value> + </entry> + </job-data-map> + </job> + + <trigger> + <simple> + <name>convertTrigger</name> + <group>DEFAULT</group> + <job-name>ConvertDgn2GeoSpatialIntoEdb</job-name> + <job-group>DEFAULT</job-group> + <start-time>2008-03-01T18:10:00</start-time> + <!-- repeat indefinitely every 10 seconds --> + <repeat-count>0</repeat-count> + <repeat-interval>500</repeat-interval> + <!-- <repeat-interval>72000000</repeat-interval> --> + </simple> + </trigger> + + </schedule> +</job-scheduling-data> diff --git a/xdgnjobs/ximple-spatialjob/pom.xml b/xdgnjobs/ximple-spatialjob/pom.xml index 44ebd85..bc76e79 100644 --- a/xdgnjobs/ximple-spatialjob/pom.xml +++ b/xdgnjobs/ximple-spatialjob/pom.xml @@ -137,6 +137,11 @@ </dependency> <dependency> + <groupId>com.ximple.eofms</groupId> + <artifactId>xedb-gt-geospatial</artifactId> + </dependency> + + <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> </dependency> diff --git a/xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/filter/CreateArcLineStringStrategy.java b/xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/filter/CreateArcLineStringStrategy.java index 8b3597a..7060c28 100644 --- a/xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/filter/CreateArcLineStringStrategy.java +++ b/xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/filter/CreateArcLineStringStrategy.java @@ -73,7 +73,6 @@ gobj = lineStringElement.toGeometry(geometryFactory); } if (gobj != null) - gobj.setSRID(FeatureTypeBuilderUtil.getDefaultFeatureSRID()); feature = SimpleFeatureBuilder.build(featureType, new Object[]{ gobj, fLinkage.getFsc(), diff --git a/xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/filter/CreateComplexChainStrategy.java b/xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/filter/CreateComplexChainStrategy.java index 9f515de..e4baeea 100644 --- a/xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/filter/CreateComplexChainStrategy.java +++ b/xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/filter/CreateComplexChainStrategy.java @@ -73,7 +73,6 @@ gobj = geometryFactory.createMultiLineString(new LineString[]{(LineString) gobj}); } if (gobj != null) - gobj.setSRID(FeatureTypeBuilderUtil.getDefaultFeatureSRID()); feature = SimpleFeatureBuilder.build(featureType, new Object[]{ gobj, fLinkage.getFsc(), @@ -98,7 +97,6 @@ gobj = geometryFactory.createMultiLineString(new LineString[]{(LineString) gobj}); } if (gobj != null) - gobj.setSRID(FeatureTypeBuilderUtil.getDefaultFeatureSRID()); feature = SimpleFeatureBuilder.build(featureType, new Object[]{ gobj, fLinkage.getFsc(), @@ -124,7 +122,6 @@ gobj = geometryFactory.createMultiLineString(new LineString[]{(LineString) gobj}); } if (gobj != null) - gobj.setSRID(FeatureTypeBuilderUtil.getDefaultFeatureSRID()); feature = SimpleFeatureBuilder.build(featureType, new Object[]{ gobj, fLinkage.getFsc(), @@ -151,7 +148,6 @@ gobj = geometryFactory.createMultiLineString(new LineString[]{(LineString) gobj}); } if (gobj != null) - gobj.setSRID(FeatureTypeBuilderUtil.getDefaultFeatureSRID()); feature = SimpleFeatureBuilder.build(featureType, new Object[]{ gobj, fLinkage.getFsc(), diff --git a/xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/filter/CreateEllipseShapeStrategy.java b/xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/filter/CreateEllipseShapeStrategy.java index 41656f4..8b190cc 100644 --- a/xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/filter/CreateEllipseShapeStrategy.java +++ b/xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/filter/CreateEllipseShapeStrategy.java @@ -71,7 +71,6 @@ gobj = ellipseElement.toGeometry(geometryFactory); } if (gobj != null) - gobj.setSRID(FeatureTypeBuilderUtil.getDefaultFeatureSRID()); feature = SimpleFeatureBuilder.build(featureType, new Object[]{ gobj, fLinkage.getFsc(), diff --git a/xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/filter/CreateLineStringStrategy.java b/xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/filter/CreateLineStringStrategy.java index 8140939..aaa56c2 100644 --- a/xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/filter/CreateLineStringStrategy.java +++ b/xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/filter/CreateLineStringStrategy.java @@ -71,7 +71,6 @@ gobj = lineStringElement.toGeometry(geometryFactory); } if (gobj != null) - gobj.setSRID(FeatureTypeBuilderUtil.getDefaultFeatureSRID()); feature = SimpleFeatureBuilder.build(featureType, new Object[]{ gobj, fLinkage.getFsc(), @@ -103,7 +102,6 @@ gobj = geometryFactory.createLineString(coordinateList.toCoordinateArray()); } if (gobj != null) - gobj.setSRID(FeatureTypeBuilderUtil.getDefaultFeatureSRID()); feature = SimpleFeatureBuilder.build(featureType, new Object[]{ gobj, fLinkage.getFsc(), @@ -126,7 +124,6 @@ gobj = lineElement.toGeometry(geometryFactory); } if (gobj != null) - gobj.setSRID(FeatureTypeBuilderUtil.getDefaultFeatureSRID()); feature = SimpleFeatureBuilder.build(featureType, new Object[]{ gobj, fLinkage.getFsc(), @@ -150,7 +147,6 @@ gobj = arcElement.toGeometry(geometryFactory); } if (gobj != null) - gobj.setSRID(FeatureTypeBuilderUtil.getDefaultFeatureSRID()); feature = SimpleFeatureBuilder.build(featureType, new Object[]{ gobj, fLinkage.getFsc(), diff --git a/xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/filter/CreateLineTextStrategy.java b/xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/filter/CreateLineTextStrategy.java index 387bea2..0ff87c1 100644 --- a/xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/filter/CreateLineTextStrategy.java +++ b/xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/filter/CreateLineTextStrategy.java @@ -68,7 +68,6 @@ gobj = lineStringElement.toGeometry(geometryFactory); } if (gobj != null) - gobj.setSRID(FeatureTypeBuilderUtil.getDefaultFeatureSRID()); feature = SimpleFeatureBuilder.build(featureType, new Object[]{ gobj, fLinkage.getFsc(), @@ -105,7 +104,6 @@ txtElement.getRotationAngle(); - line.setSRID(FeatureTypeBuilderUtil.getDefaultFeatureSRID()); feature = SimpleFeatureBuilder.build(featureType, new Object[]{ line, fLinkage.getFsc(), @@ -139,7 +137,6 @@ gobj = geometryFactory.createLineString(coordinateList.toCoordinateArray()); } if (gobj != null) - gobj.setSRID(FeatureTypeBuilderUtil.getDefaultFeatureSRID()); feature = SimpleFeatureBuilder.build(featureType, new Object[]{ gobj, fLinkage.getFsc(), @@ -161,7 +158,6 @@ } else { gobj = lineElement.toGeometry(geometryFactory); } - gobj.setSRID(FeatureTypeBuilderUtil.getDefaultFeatureSRID()); feature = SimpleFeatureBuilder.build(featureType, new Object[]{ gobj, fLinkage.getFsc(), diff --git a/xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/filter/CreateMultiSymbolStrategy.java b/xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/filter/CreateMultiSymbolStrategy.java index 897d3f0..1622ddf 100644 --- a/xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/filter/CreateMultiSymbolStrategy.java +++ b/xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/filter/CreateMultiSymbolStrategy.java @@ -91,7 +91,6 @@ gobj = txtElement.toGeometry(geometryFactory); } if (gobj != null) - gobj.setSRID(FeatureTypeBuilderUtil.getDefaultFeatureSRID()); feature = SimpleFeatureBuilder.build(featureType, new Object[]{ gobj, fLinkage.getFsc(), @@ -154,7 +153,6 @@ } if (gobj != null) - gobj.setSRID(FeatureTypeBuilderUtil.getDefaultFeatureSRID()); feature = SimpleFeatureBuilder.build(featureType, new Object[]{ gobj, fLinkage.getFsc(), diff --git a/xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/filter/CreateShapeStrategy.java b/xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/filter/CreateShapeStrategy.java index 795c21b..ea971d0 100644 --- a/xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/filter/CreateShapeStrategy.java +++ b/xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/filter/CreateShapeStrategy.java @@ -70,7 +70,6 @@ } if (gobj != null) - gobj.setSRID(FeatureTypeBuilderUtil.getDefaultFeatureSRID()); feature = SimpleFeatureBuilder.build(featureType, new Object[]{ gobj, fLinkage.getFsc(), @@ -93,7 +92,6 @@ gobj = complexShape.toGeometry(geometryFactory); } if (gobj != null) - gobj.setSRID(FeatureTypeBuilderUtil.getDefaultFeatureSRID()); feature = SimpleFeatureBuilder.build(featureType, new Object[]{ gobj, fLinkage.getFsc(), diff --git a/xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/filter/CreateSymbolStrategy.java b/xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/filter/CreateSymbolStrategy.java index 20862bc..37143fa 100644 --- a/xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/filter/CreateSymbolStrategy.java +++ b/xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/filter/CreateSymbolStrategy.java @@ -88,7 +88,6 @@ gobj = txtElement.toGeometry(geometryFactory); } if (gobj != null) - gobj.setSRID(FeatureTypeBuilderUtil.getDefaultFeatureSRID()); feature = SimpleFeatureBuilder.build(featureType, new Object[]{ gobj, fLinkage.getFsc(), diff --git a/xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/filter/CreateTextStrategy.java b/xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/filter/CreateTextStrategy.java index f0ddb09..b60ed7b 100644 --- a/xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/filter/CreateTextStrategy.java +++ b/xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/filter/CreateTextStrategy.java @@ -75,7 +75,6 @@ gobj = txtElement.toGeometry(geometryFactory); } if (gobj != null) - gobj.setSRID(FeatureTypeBuilderUtil.getDefaultFeatureSRID()); feature = SimpleFeatureBuilder.build(featureType, new Object[]{ gobj, fLinkage.getFsc(), @@ -114,7 +113,6 @@ gobj = nodeElement.toGeometry(geometryFactory); } if (gobj != null) - gobj.setSRID(FeatureTypeBuilderUtil.getDefaultFeatureSRID()); feature = SimpleFeatureBuilder.build(featureType, new Object[]{ gobj, fLinkage.getFsc(), diff --git a/xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/jobs/OracleConvertDgn2EdbGeoJob.java b/xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/jobs/OracleConvertDgn2EdbGeoJob.java new file mode 100644 index 0000000..69633a4 --- /dev/null +++ b/xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/jobs/OracleConvertDgn2EdbGeoJob.java @@ -0,0 +1,1409 @@ +package com.ximple.eofms.jobs; + +import com.ximple.eofms.jobs.context.AbstractOracleJobContext; +import com.ximple.eofms.jobs.context.edbgeo.FeatureDgnConvertEdbGeoJobContext; +import com.ximple.eofms.jobs.context.edbgeo.GeneralDgnConvertEdbGeoJobContext; +import com.ximple.eofms.jobs.context.edbgeo.IndexDgnConvertEdbGeoJobContext; +import com.ximple.eofms.jobs.context.edbgeo.OracleConvertEdbGeoJobContext; +import com.ximple.eofms.util.BinConverter; +import com.ximple.eofms.util.ByteArrayCompressor; +import com.ximple.eofms.util.FileUtils; +import com.ximple.eofms.util.StringUtils; +import com.ximple.io.dgn7.ComplexElement; +import com.ximple.io.dgn7.Dgn7fileException; +import com.ximple.io.dgn7.Dgn7fileReader; +import com.ximple.io.dgn7.Element; +import com.ximple.io.dgn7.ElementType; +import com.ximple.io.dgn7.IElementHandler; +import com.ximple.io.dgn7.Lock; +import com.ximple.util.PrintfFormat; +import oracle.jdbc.OracleConnection; +import oracle.jdbc.OracleResultSet; +import oracle.sql.ARRAY; +import oracle.sql.BLOB; +import org.apache.commons.collections.OrderedMap; +import org.apache.commons.collections.OrderedMapIterator; +import org.apache.commons.collections.map.LinkedMap; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.geotools.data.DataStore; +import org.geotools.data.Transaction; +import org.geotools.data.jdbc.JDBCUtils; +import org.geotools.data.edbgeo.PostgisDataStore; +import org.geotools.data.edbgeo.PostgisDataStoreFactory; +import org.geotools.feature.IllegalAttributeException; +import org.geotools.feature.SchemaException; +import org.quartz.JobDataMap; +import org.quartz.JobDetail; +import org.quartz.JobExecutionContext; +import org.quartz.JobExecutionException; + +import java.io.File; +import java.io.FileFilter; +import java.io.FileInputStream; +import java.io.FileNotFoundException; +import java.io.FilenameFilter; +import java.io.IOException; +import java.math.BigDecimal; +import java.nio.BufferOverflowException; +import java.nio.ByteBuffer; +import java.nio.ByteOrder; +import java.nio.channels.FileChannel; +import java.sql.Connection; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.sql.Statement; +import java.sql.Types; +import java.util.ArrayList; +import java.util.Date; +import java.util.List; +import java.util.Map; +import java.util.TreeMap; + +public class OracleConvertDgn2EdbGeoJob extends AbstractOracleDatabaseJob { + final static Log logger = LogFactory.getLog(OracleConvertDgn2EdbGeoJob.class); + + private static final String EDBHOST = "EDBHOST"; + private static final String EDBDATBASE = "EDBDATBASE"; + private static final String EDBPORT = "EDBPORT"; + private static final String EDBSCHEMA = "EDBSCHEMA"; + private static final String EDBUSER = "EDBUSER"; + private static final String EDBPASS = "EDBPASS"; + private static final String USEWKB = "USEWKB"; + + private static final boolean useTpclidText = false; + + private static final int FETCHSIZE = 30; + private static final int COMMITSIZE = 100; + private static final String INDEXPATHNAME = "index"; + private static final String OTHERPATHNAME = "other"; + + protected static class Pair { + Object first; + Object second; + + public Pair(Object first, Object second) { + this.first = first; + this.second = second; + } + } + + protected static PostgisDataStoreFactory dataStoreFactory = new PostgisDataStoreFactory(); + + protected String _edbHost; + protected String _edbDatabase; + protected String _edbPort; + protected String _edbSchema; + protected String _edbUsername; + protected String _edbPassword; + protected String _edbUseWKB; + + protected Map<String, String> edbProperties; + protected PostgisDataStore targetDataStore; + // protected OracleConvertEdbGeoJobContext oracleJobContext; + + private long queryTime = 0; + private long queryTimeStart = 0; + + public Log getLogger() { + return logger; + } + + protected AbstractOracleJobContext prepareJobContext(String targetSchemaName, String filterPath, + boolean profileMode, + boolean useTransform) { + return new OracleConvertEdbGeoJobContext(getDataPath(), + getTargetDataStore(), targetSchemaName, filterPath, profileMode, useTransform); + } + + protected void extractJobConfiguration(JobDetail jobDetail) throws JobExecutionException { + super.extractJobConfiguration(jobDetail); + JobDataMap dataMap = jobDetail.getJobDataMap(); + _edbHost = dataMap.getString(EDBHOST); + _edbDatabase = dataMap.getString(EDBDATBASE); + _edbPort = dataMap.getString(EDBPORT); + _edbSchema = dataMap.getString(EDBSCHEMA); + _edbUsername = dataMap.getString(EDBUSER); + _edbPassword = dataMap.getString(EDBPASS); + _edbUseWKB = dataMap.getString(USEWKB); + + Log logger = getLogger(); + /* + logger.info("EDBHOST=" + _myHost); + logger.info("EDBDATBASE=" + _myDatabase); + logger.info("EDBPORT=" + _myPort); + logger.info("EDBSCHEMA=" + _mySchema); + logger.info("EDBUSER=" + _myUsername); + logger.info("EDBPASS=" + _myPassword); + logger.info("USEWKB=" + _myUseWKB); + */ + + if (_edbHost == null) { + logger.warn("EDBHOST is null"); + throw new JobExecutionException("Unknown EdbGeoSpatial host."); + } + if (_edbDatabase == null) { + logger.warn("PGDATABASE is null"); + throw new JobExecutionException("Unknown EdbGeoSpatial database."); + } + if (_edbPort == null) { + logger.warn("EDBPORT is null"); + throw new JobExecutionException("Unknown EdbGeoSpatial port."); + } + if (_edbSchema == null) { + logger.warn("EDBSCHEMA is null"); + throw new JobExecutionException("Unknown EdbGeoSpatial schema."); + } + if (_edbUsername == null) { + logger.warn("PGUSERNAME is null"); + throw new JobExecutionException("Unknown EdbGeoSpatial username."); + } + if (_edbPassword == null) { + logger.warn("PGPASSWORD is null"); + throw new JobExecutionException("Unknown EdbGeoSpatial password."); + } + + Map<String, String> remote = new TreeMap<String, String>(); + remote.put("dbtype", "edbgeo"); + remote.put("charset", "UTF-8"); + remote.put("host", _edbHost); + remote.put("port", _edbPort); + remote.put("database", _edbDatabase); + remote.put("user", _edbUsername); + remote.put("passwd", _edbPassword); + remote.put("namespace", null); + edbProperties = remote; + } + + public void execute(JobExecutionContext context) throws JobExecutionException { + // Every job has its own job detail + JobDetail jobDetail = context.getJobDetail(); + + // The name is defined in the job definition + String jobName = jobDetail.getName(); + + // Log the time the job started + logger.info(jobName + " fired at " + new Date()); + extractJobConfiguration(jobDetail); + createSourceDataStore(); + createTargetDataStore(); + if (getSourceDataStore() == null) { + logger.warn("Cannot connect source oracle database."); + throw new JobExecutionException("Cannot connect source oracle database."); + } + + if (getTargetDataStore() == null) { + logger.warn("Cannot connect source postgreSQL database."); + throw new JobExecutionException("Cannot connect source postgreSQL database."); + } + + if (isProfileMode()) { + queryTime = 0; + } + + long t1 = System.currentTimeMillis(); + String targetSchemaName; + try { + logger.info("-- step:clearOutputDatabase --"); + clearOutputDatabase(); + targetSchemaName = determineTargetSchemaName(); + + if (checkConvertFile()) { + logger.info("-- step:convertIndexDesignFile --"); + long tStep = System.currentTimeMillis(); + convertIndexDesignFile(context, targetSchemaName); + if (isProfileMode()) { + long tStepEnd = System.currentTimeMillis(); + logTimeDiff("Profile-convertIndexDesignFile", tStep, tStepEnd); + } + + logger.info("-- step:convertOtherDesignFile --"); + tStep = System.currentTimeMillis(); + convertOtherDesignFile(context, targetSchemaName); + if (isProfileMode()) { + long tStepEnd = System.currentTimeMillis(); + logTimeDiff("Profile-convertOtherDesignFile", tStep, tStepEnd); + } + + } + + if (checkConvertDB()) { + logger.info("-- step:convertOracleDB --"); + + OracleConvertEdbGeoJobContext jobContext = + (OracleConvertEdbGeoJobContext) prepareJobContext(targetSchemaName, _filterPath, + isProfileMode(), isTransformed()); + jobContext.setSourceDataStore(getSourceDataStore()); + // jobContext.setConvertElementIn(_convertElementIn); + jobContext.setElementLogging(checkElementLogging()); + jobContext.setExecutionContext(context); + + createHibernateSequence(jobContext); + + long tStep = System.currentTimeMillis(); + + if (isCopyConnectivityMode()) + { + copyConnectivity(jobContext); + } + + if (isProfileMode()) { + long tStepEnd = System.currentTimeMillis(); + logTimeDiff("Profile-Copy Connectivity", tStep, tStepEnd); + } + + for (String orgSchema : _orgSchema) { + logger.info("----- start schema:" + orgSchema + " -----"); + if (isProfileMode()) { + jobContext.resetProcessTime(); + jobContext.resetUpdateTime(); + } + tStep = System.currentTimeMillis(); + exetcuteConvert(jobContext, orgSchema, _dataPath); + + //close all open filewriter instance + jobContext.closeFeatureWriter(); + + if (isProfileMode()) { + logger.warn("Profile-Current Query Oracle Cost-" + + ((int) ((getQueryTime()) / 60000.0)) + " min - " + + (((int) ((getQueryTime()) % 60000.0)) / 1000) + " sec"); + long tStepEnd = System.currentTimeMillis(); + logger.warn("Profile-Current Process Cost-" + + ((int) ((getProcessTime()) / 60000.0)) + " min - " + + (((int) ((getProcessTime()) % 60000.0)) / 1000) + " sec"); + logger.warn("Profile-Current Update Cost-" + + ((int) ((getUpdateTime()) / 60000.0)) + " min - " + + (((int) ((getUpdateTime()) % 60000.0)) / 1000) + " sec"); + logger.warn("Profile-Current JobContext Process Cost-" + + ((int) ((jobContext.getProcessTime()) / 60000.0)) + " min - " + + (((int) ((jobContext.getProcessTime()) % 60000.0)) / 1000) + " sec"); + logger.warn("Profile-Current JobContext Update Cost-" + + ((int) ((jobContext.getUpdateTime()) / 60000.0)) + " min - " + + (((int) ((jobContext.getUpdateTime()) % 60000.0)) / 1000) + " sec"); + logTimeDiff("Profile-Convert[" + orgSchema + "]", tStep, tStepEnd); + + resetQueryTime(); + resetProcessTime(); + resetUpdateTime(); + } + } + + jobContext.closeOracleConnection(); + } + + if (checkConvertElementIn()) { + logger.info("-- step:convertFeatureDesignFile --"); + long tStep = System.currentTimeMillis(); + convertFeatureDesignFile(context, targetSchemaName); + if (isProfileMode()) { + long tStepEnd = System.currentTimeMillis(); + logTimeDiff("Profile-convertFeatureDesignFile", tStep, tStepEnd); + } + } + + if (checkCreateDummy()) { + logger.info("-- step:createDummyFeatureFile --"); + createDummyFeatureFile(context); + } + + long t2 = System.currentTimeMillis(); + // public static final String DATE_FORMAT_NOW = "yyyy-MM-dd HH:mm:ss"; + // SimpleDateFormat sdf = new SimpleDateFormat(DATE_FORMAT_NOW); + logTimeDiff("Total ", t1, t2); + + updateRepoStatusToReady(targetSchemaName); + + } catch (SQLException e) { + disconnect(); + logger.warn(e.getMessage(), e); + throw new JobExecutionException("Database error. " + e.getMessage(), e); + } catch (IOException ex) { + disconnect(); + logger.warn(ex.getMessage(), ex); + throw new JobExecutionException("IO error. " + ex.getMessage(), ex); + } finally { + disconnect(); + } + logger.warn(jobName + " end at " + new Date()); + } + + private void logTimeDiff(String message, long tBefore, long tCurrent) { + logger.warn(message + ":use time = " + ((int) ((tCurrent - tBefore) / 60000.0)) + " min - " + + (((int) ((tCurrent - tBefore) % 60000.0)) / 1000) + " sec"); + } + + /** + * Connectivity�ƻs�@�Ӫ����A�b�d�߹q�y��V�ɥΨӤ��OMS��Ʈw���q���s����(Connectivity) + * + * @param jobContext job context + * @throws SQLException sql exception + */ + private void copyConnectivity(OracleConvertEdbGeoJobContext jobContext) throws SQLException { + Connection connection = jobContext.getOracleConnection(); + ResultSet rsMeta = connection.getMetaData().getTables(null, "BASEDB", + AbstractOracleJobContext.CONNECTIVITY_WEBCHECK_NAME + "%", + new String[]{"TABLE"}); + + boolean found = false; + try { + while (rsMeta.next()) { + String tablename = rsMeta.getString(3); + if (AbstractOracleJobContext.CONNECTIVITY_WEBCHECK_NAME.equalsIgnoreCase(tablename)) { + found = true; + break; + } + } + // } catch (SQLException e) + } finally { + if (rsMeta != null) { + rsMeta.close(); + rsMeta = null; + } + } + Statement stmt = connection.createStatement(); + if (found) { + stmt.execute(AbstractOracleJobContext.TRUNCATE_CONNECTIVITY_WEBCHECK); + } else { + logger.info("Create CONNECTIVITY_WEBCHECK table."); + stmt.execute(AbstractOracleJobContext.CREATE_CONNECTIVITY_WEBCHECK); + stmt.execute(AbstractOracleJobContext.CREATE_CONNECTIVITY_WEBCHECK_INDEX_1); + stmt.execute(AbstractOracleJobContext.CREATE_CONNECTIVITY_WEBCHECK_INDEX_2); + stmt.execute(AbstractOracleJobContext.CREATE_CONNECTIVITY_WEBCHECK_INDEX_3); + stmt.execute(AbstractOracleJobContext.CREATE_CONNECTIVITY_WEBCHECK_INDEX_4); + stmt.execute(AbstractOracleJobContext.CREATE_CONNECTIVITY_WEBCHECK_INDEX_5); + stmt.execute(AbstractOracleJobContext.CREATE_CONNECTIVITY_WEBCHECK_INDEX_6); + stmt.execute(AbstractOracleJobContext.ALTER_CONNECTIVITY_WEBCHECK_1); + stmt.execute(AbstractOracleJobContext.ALTER_CONNECTIVITY_WEBCHECK_2); + } + + stmt.execute(AbstractOracleJobContext.COPY_CONNECTIVITY_TO_WEBCHECK); + stmt.close(); + } + + + private void createHibernateSequence(OracleConvertEdbGeoJobContext jobContext) throws SQLException { + Connection connection = jobContext.getOracleConnection(); + + try { + Statement stmt = connection.createStatement(); + stmt.execute(AbstractOracleJobContext.CREATE_HIBERNATE_SEQUENCE); + stmt.close(); + } catch (SQLException e) + { + logger.warn("HIBERNATE_SEQUENCE is already exist."); + } + } + + private void exetcuteConvert(OracleConvertEdbGeoJobContext jobContext, + String querySchema, String targetSchemaName) throws SQLException { + int order = 0; + OrderedMap map = getBlobStorageList(jobContext.getOracleConnection(), + querySchema, "SD$SPACENODES", null); + + logger.info("begin convert job:[" + map.size() + "]:testmode=" + _testMode); + + int total = map.size(); //spacenodes count + int step = total / 100; + int current = 0; + + if (total == 0) { + logger.warn("SELECT COUNT FROM " + querySchema + ".SD$SPACENODES is zero."); + return; + } + logger.warn("SELECT COUNT FROM " + querySchema + ".SD$SPACENODES is " + map.size() ); + + //jobContext.startTransaction(); + jobContext.setCurrentSchema(querySchema); + jobContext.getExecutionContext().put("ConvertDgn2EdbGeoJobProgress", 0); + for (OrderedMapIterator it = map.orderedMapIterator(); it.hasNext();) { + it.next(); + + Pair pair = (Pair) it.getValue(); + String tableSrc = (String) pair.first; + + logger.info("begin convert:[" + order + "]-" + tableSrc); + queryIgsetElement(jobContext, querySchema, tableSrc); + + + order++; + + if (_testMode) { + if ((_testCount < 0) || (order >= _testCount)) + break; + } + + if ((order % COMMITSIZE) == 0) { + // OracleConnection connection = jobContext.getOracleConnection(); + // connection.commitTransaction(); + jobContext.commitTransaction(); + //jobContext.startTransaction(); + System.gc(); + System.runFinalization(); + } + + if( step != 0) + { + int now = order % step; + if (now != current) { + current = now; + jobContext.getExecutionContext().put("ConvertDgn2EdbGeoSpatialJob", current); + + } + }else + { + jobContext.getExecutionContext().put("ConvertDgn2EdbGeoSpatialJob", current); + current++; + } + } + jobContext.getExecutionContext().put("ConvertDgn2EdbGeoSpatialJob", 100); + + jobContext.commitTransaction(); + jobContext.resetFeatureContext(); + + if (isProfileMode()) { + + } + + logger.info("end convert job:[" + order + "]"); + System.gc(); + System.runFinalization(); + } + + protected OrderedMap getBlobStorageList(Connection connection, String schemaSrc, String tableSrc, + OrderedMap orderedMap) throws SQLException { + if (orderedMap == null) + orderedMap = new LinkedMap(99); + String fetchStmtFmt = "SELECT SNID, SPACETABLE FROM \"%s\".\"%s\""; + PrintfFormat spf = new PrintfFormat(fetchStmtFmt); + String fetchStmt = spf.sprintf(new Object[]{schemaSrc, tableSrc}); + Statement stmt = connection.createStatement(ResultSet.TYPE_FORWARD_ONLY, ResultSet.CONCUR_READ_ONLY); + ResultSet rs = null; + + stmt.setFetchSize(FETCHSIZE); + try { + rs = stmt.executeQuery(fetchStmt); + int size = rs.getMetaData().getColumnCount(); + + while (rs.next()) { + Object[] values = new Object[size]; + + for (int i = 0; i < size; i++) { + values[i] = rs.getObject(i + 1); + } + + Integer key = ((BigDecimal) values[0]).intValue(); + String name = (String) values[1]; + + Pair pair = (Pair) orderedMap.get(key); + if (pair == null) + orderedMap.put(key, new Pair(name, null)); + else + pair.first = name; + } + } catch (SQLException e) { + logger.error(e.toString(), e); + logger.error("stmt=" + fetchStmt); + throw e; + } finally { + JDBCUtils.close(rs); + JDBCUtils.close(stmt); + } + + return orderedMap; + } + + protected OrderedMap getRawFormatStorageList(OracleConnection connection, String schemaSrc, String tableSrc, + OrderedMap orderedMap) throws SQLException { + if (orderedMap == null) + orderedMap = new LinkedMap(99); + String fetchStmtFmt = "SELECT RNID, SPACETABLE FROM \"%s\".\"%s\""; + PrintfFormat spf = new PrintfFormat(fetchStmtFmt); + String fetchStmt = spf.sprintf(new Object[]{schemaSrc, tableSrc}); + Statement stmt = connection.createStatement(ResultSet.TYPE_FORWARD_ONLY, ResultSet.CONCUR_READ_ONLY); + + stmt.setFetchSize(FETCHSIZE); + ResultSet rs = stmt.executeQuery(fetchStmt); + try { + int size = rs.getMetaData().getColumnCount(); + while (rs.next()) { + Object[] values = new Object[size]; + + for (int i = 0; i < size; i++) { + values[i] = rs.getObject(i + 1); + } + + Integer key = ((BigDecimal) values[0]).intValue(); + String name = (String) values[1]; + + Pair pair = (Pair) orderedMap.get(key); + if (pair == null) + orderedMap.put(key, new Pair(null, name)); + else + pair.second = name; + } + } finally { + JDBCUtils.close(rs); + JDBCUtils.close(stmt); + } + return orderedMap; + } + + protected void queryIgsetElement(OracleConvertEdbGeoJobContext jobContext, + String srcschema, String srctable) throws SQLException { + Connection connection = jobContext.getOracleConnection(); + String fetchSrcStmtFmt = "SELECT IGDSELM FROM \"%s\".\"%s\" ORDER BY ROWID"; + //String fetchSrcStmtFmt = "SELECT IGDSELM FROM \"%s\".\"%s\" WHERE TAG_SFSC = 423 AND TAG_LUFID = 21612065 ORDER BY ROWID"; + PrintfFormat spf = new PrintfFormat(fetchSrcStmtFmt); + String fetchSrcStmt = spf.sprintf(new Object[]{srcschema, srctable}); + Statement stmtSrc = connection.createStatement(ResultSet.TYPE_FORWARD_ONLY, ResultSet.CONCUR_READ_ONLY); + + stmtSrc.setFetchSize(FETCHSIZE); + ResultSet rsSrc = stmtSrc.executeQuery(fetchSrcStmt); + int igdsMetaType = rsSrc.getMetaData().getColumnType(1); + while (rsSrc.next()) { + if (isProfileMode()) { + markQueryTime(); + } + + byte[] raw = null; + if (igdsMetaType == Types.BLOB) { + BLOB blob = (BLOB) rsSrc.getBlob(1); + + try { + raw = getBytesFromBLOB(blob); + } catch (BufferOverflowException e) { + logger.warn("Wrong Element Structure-", e); + } finally { + // blob.close(); + } + } else { + raw = rsSrc.getBytes(1); + } + + try { + if (raw != null) { + Element element = fetchBinaryElement(raw); + if (isProfileMode()) { + accumulateQueryTime(); + } + jobContext.putFeatureCollection(element); + } else { + if (isProfileMode()) { + accumulateQueryTime(); + } + } + } catch (Dgn7fileException e) { + logger.warn("Dgn7Exception", e); + } + } + + JDBCUtils.close(rsSrc); + JDBCUtils.close(stmtSrc); + } + + protected void queryRawElement(OracleConvertEdbGeoJobContext jobContext, + String srcschema, String srctable) throws SQLException { + Connection connection = jobContext.getOracleConnection(); + String fetchDestStmtFmt = "SELECT ELEMENT FROM \"%s\".\"%s\" ORDER BY ROWID"; + PrintfFormat spf = new PrintfFormat(fetchDestStmtFmt); + String fetchDestStmt = spf.sprintf(new Object[]{srcschema, srctable}); + Statement stmtDest = connection.createStatement(ResultSet.TYPE_FORWARD_ONLY, ResultSet.CONCUR_READ_ONLY); + + stmtDest.setFetchSize(FETCHSIZE); + ResultSet rsDest = stmtDest.executeQuery(fetchDestStmt); + + try { + while (rsDest.next()) { + ARRAY rawsValue = ((OracleResultSet) rsDest).getARRAY(1); + long[] rawData = rawsValue.getLongArray(); + byte[] comparessedValue; + + /* + if (dataMode == TransferTask.DataMode.Normal) + { + comparessedValue = BinConverter.unmarshalByteArray(rawData, true); + } else + { + comparessedValue = BinConverter.unmarshalCompactByteArray(rawData); + } + */ + comparessedValue = BinConverter.unmarshalByteArray(rawData, true); + + byte[] rawDest = ByteArrayCompressor.decompressByteArray(comparessedValue); + + try { + Element element = fetchBinaryElement(rawDest); + jobContext.putFeatureCollection(element); + } catch (Dgn7fileException e) { + logger.warn("Dgn7Exception:" + e.getMessage(), e); + } + } + } finally { + JDBCUtils.close(rsDest); + JDBCUtils.close(stmtDest); + } + } + + // Binary to Element + private Element fetchBinaryElement(byte[] raws) throws Dgn7fileException { + ByteBuffer buffer = ByteBuffer.wrap(raws); + buffer.order(ByteOrder.LITTLE_ENDIAN); + short signature = buffer.getShort(); + + // byte type = (byte) (buffer.get() & 0x7f); + byte type = (byte) ((signature >>> 8) & 0x007f); + + // silly Bentley say contentLength is in 2-byte words + // and ByteByffer uses raws. + // track the record location + int elementLength = (buffer.getShort() * 2) + 4; + ElementType recordType = ElementType.forID(type); + IElementHandler handler; + + handler = recordType.getElementHandler(); + + Element dgnElement = (Element) handler.read(buffer, signature, elementLength); + if (recordType.isComplexElement() && (elementLength < raws.length)) { + int offset = elementLength; + while (offset < (raws.length - 4)) { + buffer.position(offset); + signature = buffer.getShort(); + type = (byte) ((signature >>> 8) & 0x007f); + elementLength = (buffer.getShort() * 2) + 4; + if (raws.length < (offset + elementLength)) { + logger.debug("Length not match:" + offset + ":" + buffer.position() + ":" + buffer.limit()); + break; + } + recordType = ElementType.forID(type); + handler = recordType.getElementHandler(); + if (handler != null) { + Element subElement = (Element) handler.read(buffer, signature, elementLength); + ((ComplexElement) dgnElement).add(subElement); + offset += elementLength; + } else { + byte[] remain = new byte[buffer.remaining()]; + System.arraycopy(raws, offset, remain, 0, buffer.remaining()); + for (int i = 0; i < remain.length; i++) { + if (remain[i] != 0) { + logger.info("fetch element has some error. index=" + (offset + i) + ":value=" + remain[i]); + } + } + break; + } + } + } + + return dgnElement; + } + + /** + * �����ഫ�����ɪ��u�@ + * + * @param context �u�@�������� + * @throws org.quartz.JobExecutionException + * exception + */ + private void convertIndexDesignFile(JobExecutionContext context, String targetSchemaName) throws JobExecutionException { + File indexDir = new File(getDataPath(), INDEXPATHNAME); + if (!indexDir.exists()) { + logger.info("index dir=" + indexDir + " not exist."); + return; + } + + if (!indexDir.isDirectory()) { + logger.info("index dir=" + indexDir + " is not a directory."); + } + + List<File> dgnFiles = FileUtils.recurseDir(indexDir, new FileFilter() { + public boolean accept(File pathname) { + return pathname.isDirectory() || pathname.getName().toLowerCase().endsWith("dgn"); + } + }); + + for (File dgnFile : dgnFiles) { + if (dgnFile.isDirectory()) continue; + IndexDgnConvertEdbGeoJobContext convertContext = + new IndexDgnConvertEdbGeoJobContext(getDataPath(), getTargetDataStore(), targetSchemaName, + isProfileMode(), isTransformed()); + logger.info("--- start index dgnfile-" + dgnFile.toString() + " ---"); + FileInputStream fs = null; + FileChannel fc = null; + Dgn7fileReader reader = null; + try { + convertContext.clearOutputDatabase(); + convertContext.setExecutionContext(context); + String dgnPaths[] = StringUtils.splitToArray(dgnFile.toString(), File.separator); + convertContext.setFilename(dgnPaths[dgnPaths.length - 1]); + convertContext.startTransaction(); + + fs = new FileInputStream(dgnFile); + fc = fs.getChannel(); + reader = new Dgn7fileReader(fc, new Lock()); + convertContext.setReader(reader); + + scanIndexDgnElement(convertContext); + + convertContext.commitTransaction(); + convertContext.closeFeatureWriter(); + + System.gc(); + System.runFinalization(); + } catch (FileNotFoundException e) { + convertContext.rollbackTransaction(); + logger.warn(e.getMessage(), e); + throw new JobExecutionException(e.getMessage(), e); + } catch (Dgn7fileException e) { + convertContext.rollbackTransaction(); + logger.warn(e.getMessage(), e); + throw new JobExecutionException(e.getMessage(), e); + } catch (IOException e) { + convertContext.rollbackTransaction(); + logger.warn(e.getMessage(), e); + throw new JobExecutionException(e.getMessage(), e); + } catch (IllegalAttributeException e) { + convertContext.rollbackTransaction(); + logger.warn(e.getMessage(), e); + throw new JobExecutionException(e.getMessage(), e); + } catch (SchemaException e) { + convertContext.rollbackTransaction(); + logger.warn(e.getMessage(), e); + throw new JobExecutionException(e.getMessage(), e); + } finally { + convertContext.closeFeatureWriter(); + + if (reader != null) + { + try { + reader.close(); + } catch (IOException e) { + logger.warn(e.getMessage(), e); + } + } + + if (fs != null) { + try { + fs.close(); + } catch (IOException e) { + logger.warn(e.getMessage(), e); + } + } + + if (isProfileMode()) { + logger.warn("Profile-Current convertContext Process Cost-" + + ((int) ((convertContext.getProcessTime()) / 60000.0)) + " min - " + + (((int) ((convertContext.getProcessTime()) % 60000.0)) / 1000) + " sec"); + logger.warn("Profile-Current convertContext Update Cost-" + + ((int) ((convertContext.getUpdateTime()) / 60000.0)) + " min - " + + (((int) ((convertContext.getUpdateTime()) % 60000.0)) / 1000) + " sec"); + } + } + } + } + + protected void scanIndexDgnElement(IndexDgnConvertEdbGeoJobContext convertContext) + throws Dgn7fileException, IOException, IllegalAttributeException, SchemaException { + Dgn7fileReader reader = convertContext.getReader(); + int count = 0; + Element lastComplex = null; + + while (reader.hasNext()) { + if (isProfileMode()) markProcessTime(); + Element.FileRecord record = reader.nextElement(); + if (record.element() != null) { + Element element = (Element) record.element(); + ElementType type = element.getElementType(); + + if ((!type.isComplexElement()) && (!element.isComponentElement())) { + if (lastComplex != null) { + processIndexElement(lastComplex, convertContext); + lastComplex = null; + } + + processIndexElement(element, convertContext); + } else if (element.isComponentElement()) { + if (lastComplex != null) { + ((ComplexElement) lastComplex).add(element); + } + } else if (type.isComplexElement()) { + if (lastComplex != null) { + processIndexElement(lastComplex, convertContext); + } + lastComplex = element; + } + } + count++; + } + + if (lastComplex != null) { + processIndexElement(lastComplex, convertContext); + } + logger.debug("ElementRecord Count=" + count); + } + + private void processIndexElement(Element element, IndexDgnConvertEdbGeoJobContext convertContext) + throws IllegalAttributeException, SchemaException { + //if (useTpclidText) { + // if (element instanceof TextElement) { + // convertContext.putFeatureCollection(element); + // } + //} else { + // if (element instanceof ShapeElement) { + convertContext.putFeatureCollection(element); + // } + //} + } + + + /** + * �����ഫ��L�]�p���ɪ��u�@ + * + * @param context jobContext + * @throws org.quartz.JobExecutionException + * exception + */ + private void convertOtherDesignFile(JobExecutionContext context, String targetSchemaName) throws JobExecutionException { + File otherDir = new File(getDataPath(), OTHERPATHNAME); + if (!otherDir.exists()) { + logger.info("other dir=" + otherDir + " not exist."); + return; + } + + if (!otherDir.isDirectory()) { + logger.info("other dir=" + otherDir + " is not a directory."); + } + + List<File> dgnFiles = FileUtils.recurseDir(otherDir, new FileFilter() { + public boolean accept(File pathname) { + return pathname.isDirectory() || pathname.getName().toLowerCase().endsWith("dgn"); + } + }); + + for (File dgnFile : dgnFiles) { + if (dgnFile.isDirectory()) continue; + + GeneralDgnConvertEdbGeoJobContext convertContext = + new GeneralDgnConvertEdbGeoJobContext(getDataPath(), getTargetDataStore(), targetSchemaName, + isProfileMode(), isTransformed()); + logger.info("--- start other dgnfile-" + dgnFile.toString() + " ---"); + FileInputStream fs = null; + FileChannel fc; + Dgn7fileReader reader = null; + try { + convertContext.setExecutionContext(context); + String dgnPaths[] = StringUtils.splitToArray(dgnFile.toString(), File.separator); + convertContext.setFilename(dgnPaths[dgnPaths.length - 1]); + convertContext.startTransaction(); + + fs = new FileInputStream(dgnFile); + fc = fs.getChannel(); + reader = new Dgn7fileReader(fc, new Lock()); + convertContext.setReader(reader); + + scanOtherDgnElement(convertContext); + + convertContext.commitTransaction(); + convertContext.closeFeatureWriter(); + + System.gc(); + System.runFinalization(); + } catch (FileNotFoundException e) { + convertContext.rollbackTransaction(); + logger.warn(e.getMessage(), e); + throw new JobExecutionException(e.getMessage(), e); + } catch (Dgn7fileException e) { + convertContext.rollbackTransaction(); + logger.warn(e.getMessage(), e); + throw new JobExecutionException(e.getMessage(), e); + } catch (IOException e) { + convertContext.rollbackTransaction(); + logger.warn(e.getMessage(), e); + throw new JobExecutionException(e.getMessage(), e); + } catch (IllegalAttributeException e) { + convertContext.rollbackTransaction(); + logger.warn(e.getMessage(), e); + throw new JobExecutionException(e.getMessage(), e); + } catch (SchemaException e) { + convertContext.rollbackTransaction(); + logger.warn(e.getMessage(), e); + throw new JobExecutionException(e.getMessage(), e); + } finally { + convertContext.closeFeatureWriter(); + + if (reader != null) + { + try { + reader.close(); + } catch (IOException e) { + logger.warn(e.getMessage(), e); + } + } + + if (fs != null) { + try { + fs.close(); + } catch (IOException e) { + logger.warn(e.getMessage(), e); + } + } + + if (isProfileMode()) { + logger.warn("Profile-Current convertContext Process Cost-" + + ((int) ((convertContext.getProcessTime()) / 60000.0)) + " min - " + + (((int) ((convertContext.getProcessTime()) % 60000.0)) / 1000) + " sec"); + logger.warn("Profile-Current convertContext Update Cost-" + + ((int) ((convertContext.getUpdateTime()) / 60000.0)) + " min - " + + (((int) ((convertContext.getUpdateTime()) % 60000.0)) / 1000) + " sec"); + } + } + } + } + + public void scanOtherDgnElement(GeneralDgnConvertEdbGeoJobContext convertContext) + throws Dgn7fileException, IOException, IllegalAttributeException, SchemaException { + Dgn7fileReader reader = convertContext.getReader(); + int count = 0; + Element lastComplex = null; + while (reader.hasNext()) { + Element.FileRecord record = reader.nextElement(); + if (record.element() != null) { + Element element = (Element) record.element(); + ElementType type = element.getElementType(); + + if ((!type.isComplexElement()) && (!element.isComponentElement())) { + if (lastComplex != null) { + processOtherElement(lastComplex, convertContext); + lastComplex = null; + } + + processOtherElement(element, convertContext); + } else if (element.isComponentElement()) { + if (lastComplex != null) { + ((ComplexElement) lastComplex).add(element); + } + } else if (type.isComplexElement()) { + if (lastComplex != null) { + processOtherElement(lastComplex, convertContext); + } + lastComplex = element; + } + } + count++; + } + + if (lastComplex != null) { + processOtherElement(lastComplex, convertContext); + } + logger.debug("ElementRecord Count=" + count); + } + + private void processOtherElement(Element element, GeneralDgnConvertEdbGeoJobContext convertContext) + throws IllegalAttributeException, SchemaException { + convertContext.putFeatureCollection(element); + } + + private void clearOutputDatabase() { + /* + File outDataPath = new File(getDataPath(), OracleConvertEdbGeoJobContext.SHPOUTPATH); + if (outDataPath.exists() && outDataPath.isDirectory()) + { + deleteFilesInPath(outDataPath); + } + outDataPath = new File(getDataPath(), IndexDgnConvertShpJobContext.SHPOUTPATH); + if (outDataPath.exists() && outDataPath.isDirectory()) + { + deleteFilesInPath(outDataPath); + } + outDataPath = new File(getDataPath(), GeneralDgnConvertShpJobContext.SHPOUTPATH); + if (outDataPath.exists() && outDataPath.isDirectory()) + { + deleteFilesInPath(outDataPath); + } + */ + } + + private void deleteFilesInPath(File outDataPath) { + deleteFilesInPath(outDataPath, true); + } + + private void deleteFilesInPath(File outDataPath, boolean removeSubDir) { + if (!outDataPath.isDirectory()) { + return; + } + File[] files = outDataPath.listFiles(); + for (File file : files) { + if (file.isFile()) { + if (!file.delete()) { + logger.info("Cannot delete file-" + file.toString()); + } + } else if (file.isDirectory()) { + deleteFilesInPath(file, removeSubDir); + if (removeSubDir) { + if (file.delete()) { + logger.info("Cannot delete dir-" + file.toString()); + } + } + } + } + } + + private void convertFeatureDesignFile(JobExecutionContext context, String targetSchemaName) throws JobExecutionException { + File elminDir = new File(getDataPath(), "elmin"); + if (!elminDir.exists()) { + logger.info("elmin dir=" + elminDir + " not exist."); + return; + } + + if (!elminDir.isDirectory()) { + logger.info("elmin dir=" + elminDir + " is not a directory."); + } + + File[] dgnFiles = elminDir.listFiles(new FilenameFilter() { + public boolean accept(File dir, String name) { + return name.toLowerCase().endsWith(".dgn"); + } + }); + + for (File dgnFile : dgnFiles) { + FeatureDgnConvertEdbGeoJobContext convertContext = + new FeatureDgnConvertEdbGeoJobContext(getDataPath(), getTargetDataStore(), targetSchemaName, _filterPath, + isProfileMode(), isTransformed()); + logger.info("--- start dgnfile-" + dgnFile.toString() + " ---"); + try { + convertContext.setExecutionContext(context); + String dgnPaths[] = StringUtils.splitToArray(dgnFile.toString(), File.separator); + convertContext.setFilename(dgnPaths[dgnPaths.length - 1]); + convertContext.startTransaction(); + + FileInputStream fs = new FileInputStream(dgnFile); + FileChannel fc = fs.getChannel(); + Dgn7fileReader reader = new Dgn7fileReader(fc, new Lock()); + convertContext.setReader(reader); + + scanFeatureDgnElement(convertContext); + + convertContext.commitTransaction(); + convertContext.closeFeatureWriter(); + System.gc(); + System.runFinalization(); + } catch (FileNotFoundException e) { + convertContext.rollbackTransaction(); + logger.warn(e.getMessage(), e); + throw new JobExecutionException(e.getMessage(), e); + } catch (Dgn7fileException e) { + convertContext.rollbackTransaction(); + logger.warn(e.getMessage(), e); + throw new JobExecutionException(e.getMessage(), e); + } catch (IOException e) { + convertContext.rollbackTransaction(); + logger.warn(e.getMessage(), e); + throw new JobExecutionException(e.getMessage(), e); + } catch (IllegalAttributeException e) { + convertContext.rollbackTransaction(); + logger.warn(e.getMessage(), e); + throw new JobExecutionException(e.getMessage(), e); + } catch (SchemaException e) { + convertContext.rollbackTransaction(); + logger.warn(e.getMessage(), e); + throw new JobExecutionException(e.getMessage(), e); + } finally { + convertContext.closeFeatureWriter(); + } + } + } + + public void scanFeatureDgnElement(FeatureDgnConvertEdbGeoJobContext convertContext) + throws Dgn7fileException, IOException, IllegalAttributeException, SchemaException { + Dgn7fileReader reader = convertContext.getReader(); + int count = 0; + Element lastComplex = null; + while (reader.hasNext()) { + Element.FileRecord record = reader.nextElement(); + if (record.element() != null) { + Element element = (Element) record.element(); + ElementType type = element.getElementType(); + + if ((!type.isComplexElement()) && (!element.isComponentElement())) { + if (lastComplex != null) { + processFeatureElement(lastComplex, convertContext); + lastComplex = null; + } + + processFeatureElement(element, convertContext); + } else if (element.isComponentElement()) { + if (lastComplex != null) { + ((ComplexElement) lastComplex).add(element); + } + } else if (type.isComplexElement()) { + if (lastComplex != null) { + processFeatureElement(lastComplex, convertContext); + } + lastComplex = element; + } + } + count++; + } + + if (lastComplex != null) { + processFeatureElement(lastComplex, convertContext); + } + logger.debug("ElementRecord Count=" + count); + } + + private void processFeatureElement(Element element, FeatureDgnConvertEdbGeoJobContext convertContext) + throws IllegalAttributeException, SchemaException { + convertContext.putFeatureCollection(element); + } + + private void createDummyFeatureFile(JobExecutionContext context) throws JobExecutionException { + /* + DummyFeatureConvertShpJobContext convertContext = new DummyFeatureConvertShpJobContext(getDataPath(), _filterPath); + try { + convertContext.startTransaction(); + convertContext.commitTransaction(); + convertContext.closeFeatureWriter(); + } catch (IOException e) + { + logger.warn(e.getMessage(), e); + throw new JobExecutionException(e.getMessage(), e); + } + */ + } + + public DataStore getTargetDataStore() { + return targetDataStore; + } + + protected void createTargetDataStore() throws JobExecutionException { + if (targetDataStore != null) { + targetDataStore.dispose(); + targetDataStore = null; + } + + /* + if (!isDriverFound()) + { + throw new JobExecutionException("Oracle JDBC Driver not found.-" + JDBC_DRIVER); + } + */ + + if (!edbProperties.containsKey(PostgisDataStoreFactory.MAXCONN.key)) { + edbProperties.put(PostgisDataStoreFactory.MAXCONN.key, "5"); + } + + if (!edbProperties.containsKey(PostgisDataStoreFactory.MINCONN.key)) { + edbProperties.put(PostgisDataStoreFactory.MINCONN.key, "1"); + } + + if (!edbProperties.containsKey(PostgisDataStoreFactory.WKBENABLED.key)) { + edbProperties.put(PostgisDataStoreFactory.WKBENABLED.key, "true"); + } + + if (!dataStoreFactory.canProcess(edbProperties)) { + getLogger().warn("cannot process properties-"); + throw new JobExecutionException("cannot process properties-"); + } + try { + targetDataStore = (PostgisDataStore) dataStoreFactory.createDataStore(edbProperties); + } catch (IOException e) { + getLogger().warn(e.getMessage(), e); + throw new JobExecutionException(e.getMessage(), e); + } + } + + protected void disconnect() { + super.disconnect(); + if (targetDataStore != null) { + targetDataStore.dispose(); + targetDataStore = null; + } + } + + private String determineTargetSchemaName() throws IOException { + if (targetDataStore == null) return null; + Connection connection = null; + Statement stmt = null; + ResultSet rs = null; + String targetSchema = null; + boolean needCreate = false; + try { + connection = targetDataStore.getConnection(Transaction.AUTO_COMMIT); + rs = connection.getMetaData().getTables(null, _edbSchema, DataReposVersionManager.XGVERSIONTABLE_NAME, new String[]{"TABLE"}); + if (!rs.next()) needCreate = true; + if (needCreate) + createXGeosVersionTable(connection, _edbSchema); + rs.close(); + rs = null; + + StringBuilder sbSQL = new StringBuilder("SELECT "); + sbSQL.append("vsschema, vsstatus FROM "); + sbSQL.append(encodeSchemaTableName(_edbSchema, DataReposVersionManager.XGVERSIONTABLE_NAME)).append(' '); + sbSQL.append("ORDER BY vsid"); + stmt = connection.createStatement(); + rs = stmt.executeQuery(sbSQL.toString()); + ArrayList<Object[]> tmpSchemas = new ArrayList<Object[]>(); + int i = 0; + int current = -1; + while (rs.next()) { + Object[] values = new Object[2]; + values[0] = rs.getString("vsschema"); + values[1] = rs.getShort("vsstatus"); + tmpSchemas.add(values); + if ((((Short) values[1]) & DataReposVersionManager.VSSTATUS_USING) != 0) { + current = i; + } + i++; + } + + if (current == -1) { + Object[] values = tmpSchemas.get(0); + targetSchema = (String) values[0]; + } else if (current < (tmpSchemas.size() - 1)) { + Object[] values = tmpSchemas.get(current + 1); + targetSchema = (String) values[0]; + } else { + Object[] values = tmpSchemas.get(0); + targetSchema = (String) values[0]; + } + + sbSQL = new StringBuilder("UPDATE "); + sbSQL.append(encodeSchemaTableName(_edbSchema, DataReposVersionManager.XGVERSIONTABLE_NAME)).append(' '); + sbSQL.append(" SET vsstatus = "); + sbSQL.append(DataReposVersionManager.VSSTATUS_COVERT); + sbSQL.append(" WHERE vsschema = '"); + sbSQL.append(targetSchema).append("'"); + int count = stmt.executeUpdate(sbSQL.toString()); + if (count != 1) { + logger.info("update status for " + targetSchema + " update result count=" + + count); + } + } catch (SQLException e) { + logger.warn(e.getMessage(), e); + } finally { + JDBCUtils.close(rs); + JDBCUtils.close(stmt); + JDBCUtils.close(connection, Transaction.AUTO_COMMIT, null); + } + return targetSchema; + } + + public String encodeSchemaTableName(String schemaName, String tableName) { + return "\"" + schemaName + "\".\"" + tableName + "\""; + } + + private void createXGeosVersionTable(Connection connection, String pgSchema) throws SQLException { + Statement stmt = null; + StringBuilder sql = new StringBuilder("CREATE TABLE "); + sql.append(encodeSchemaTableName(pgSchema, DataReposVersionManager.XGVERSIONTABLE_NAME)); + sql.append(" ( vsid serial PRIMARY KEY, "); + sql.append(" vsschema character varying(64) NOT NULL, "); + sql.append(" vsstatus smallint NOT NULL, "); + sql.append(" vstimestamp timestamp with time zone ) "); + try { + stmt = connection.createStatement(); + stmt.executeUpdate(sql.toString()); + + sql = new StringBuilder("ALTER TABLE "); + sql.append(encodeSchemaTableName(pgSchema, DataReposVersionManager.XGVERSIONTABLE_NAME)); + sql.append(" OWNER TO ").append(_edbUsername); + stmt.executeUpdate(sql.toString()); + + sql = new StringBuilder("GRANT ALL ON TABLE "); + sql.append(encodeSchemaTableName(pgSchema, DataReposVersionManager.XGVERSIONTABLE_NAME)); + sql.append(" TO public"); + stmt.executeUpdate(sql.toString()); + + for (String schemaName : DataReposVersionManager.DEFAULTXGVERSIONSCHEMA_NAMES) { + sql = new StringBuilder("INSERT INTO "); + sql.append(encodeSchemaTableName(pgSchema, DataReposVersionManager.XGVERSIONTABLE_NAME)); + sql.append(" (vsschema, vsstatus) VALUES ('"); + sql.append(schemaName).append("', "); + sql.append(DataReposVersionManager.VSSTATUS_AVAILABLE).append(" )"); + stmt.executeUpdate(sql.toString()); + + createIfNotExistNewSchema(connection, schemaName); + } + + } finally { + if (stmt != null) stmt.close(); + } + } + + private void updateRepoStatusToReady(String targetSchema) { + if (targetDataStore == null) return; + Connection connection = null; + Statement stmt = null; + ResultSet rs = null; + boolean needCreate = false; + try { + StringBuilder sbSQL = new StringBuilder("UPDATE "); + sbSQL.append(encodeSchemaTableName(_edbSchema, DataReposVersionManager.XGVERSIONTABLE_NAME)).append(' '); + sbSQL.append(" SET vsstatus = "); + sbSQL.append(DataReposVersionManager.VSSTATUS_READY); + sbSQL.append(" , vstimestamp = CURRENT_TIMESTAMP WHERE vsschema = '"); + sbSQL.append(targetSchema).append("'"); + + connection = targetDataStore.getConnection(Transaction.AUTO_COMMIT); + stmt = connection.createStatement(); + int count = stmt.executeUpdate(sbSQL.toString()); + if (count != 1) { + logger.info("update status for " + targetSchema + " update result count=" + + count); + } + } catch (SQLException e) { + logger.warn(e.getMessage(), e); + } catch (IOException e) { + logger.warn(e.getMessage(), e); + } finally { + JDBCUtils.close(rs); + JDBCUtils.close(stmt); + JDBCUtils.close(connection, Transaction.AUTO_COMMIT, null); + } + } + + private void createIfNotExistNewSchema(Connection connection, String s) throws SQLException { + Statement stmt = null; + ResultSet rs = null; + try { + /* + rs = connection.getMetaData().getSchemas(null, s); + if (rs.next()) return; + rs.close(); + rs = null; + */ + + StringBuilder sbSQL = new StringBuilder("CREATE SCHEMA "); + sbSQL.append(s).append(' '); + sbSQL.append("AUTHORIZATION ").append(_edbUsername); + stmt = connection.createStatement(); + stmt.executeUpdate(sbSQL.toString()); + + sbSQL = new StringBuilder("GRANT ALL ON SCHEMA "); + sbSQL.append(s).append(' '); + sbSQL.append("TO public"); + stmt.executeUpdate(sbSQL.toString()); + } catch (SQLException e) { + logger.info("create schema:" + s + " has exception."); + logger.info(e.getMessage(), e); + } finally { + if (rs != null) rs.close(); + if (stmt != null) stmt.close(); + } + } + + public final void accumulateQueryTime() { + queryTime += System.currentTimeMillis() - queryTimeStart; + } + + public long getQueryTime() { + return queryTime; + } + + public final void markQueryTime() { + queryTimeStart = System.currentTimeMillis(); + } + + public final void resetQueryTime() { + queryTime = 0; + } +} diff --git a/xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/jobs/OracleConvertDgn2MySQLJob.java b/xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/jobs/OracleConvertDgn2MySQLJob.java index aa58315..99ef4d8 100644 --- a/xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/jobs/OracleConvertDgn2MySQLJob.java +++ b/xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/jobs/OracleConvertDgn2MySQLJob.java @@ -34,8 +34,6 @@ import org.quartz.JobExecutionContext; import org.quartz.JobExecutionException; -import com.vividsolutions.jts.geom.GeometryFactory; - import oracle.jdbc.OracleConnection; import oracle.jdbc.OracleResultSet; import oracle.sql.ARRAY; @@ -767,7 +765,7 @@ private void clearOutputDatabase() { /* - File outDataPath = new File(getDataPath(), OracleConvertPostGISJobContext.SHPOUTPATH); + File outDataPath = new File(getDataPath(), OracleConvertEdbGeoJobContext.SHPOUTPATH); if (outDataPath.exists() && outDataPath.isDirectory()) { deleteFilesInPath(outDataPath); diff --git a/xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/jobs/OracleConvertDgn2PostGISJob.java b/xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/jobs/OracleConvertDgn2PostGISJob.java index d713440..99df9bc 100644 --- a/xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/jobs/OracleConvertDgn2PostGISJob.java +++ b/xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/jobs/OracleConvertDgn2PostGISJob.java @@ -66,7 +66,7 @@ final static Log logger = LogFactory.getLog(OracleConvertDgn2PostGISJob.class); private static final String PGHOST = "PGHOST"; - private static final String PGDDATBASE = "PGDDATBASE"; + private static final String PGDATBASE = "PGDATBASE"; private static final String PGPORT = "PGPORT"; private static final String PGSCHEMA = "PGSCHEMA"; private static final String PGUSER = "PGUSER"; @@ -102,7 +102,7 @@ protected Map<String, String> pgProperties; protected PostgisDataStore targetDataStore; - // protected OracleConvertPostGISJobContext oracleJobContext; + // protected OracleConvertEdbGeoJobContext oracleJobContext; private long queryTime = 0; private long queryTimeStart = 0; @@ -122,7 +122,7 @@ super.extractJobConfiguration(jobDetail); JobDataMap dataMap = jobDetail.getJobDataMap(); _pgHost = dataMap.getString(PGHOST); - _pgDatabase = dataMap.getString(PGDDATBASE); + _pgDatabase = dataMap.getString(PGDATBASE); _pgPort = dataMap.getString(PGPORT); _pgSchema = dataMap.getString(PGSCHEMA); _pgUsername = dataMap.getString(PGUSER); @@ -132,7 +132,7 @@ Log logger = getLogger(); /* logger.info("PGHOST=" + _myHost); - logger.info("PGDDATBASE=" + _myDatabase); + logger.info("PGDATBASE=" + _myDatabase); logger.info("PGPORT=" + _myPort); logger.info("PGSCHEMA=" + _mySchema); logger.info("PGUSER=" + _myUsername); @@ -1006,7 +1006,7 @@ private void clearOutputDatabase() { /* - File outDataPath = new File(getDataPath(), OracleConvertPostGISJobContext.SHPOUTPATH); + File outDataPath = new File(getDataPath(), OracleConvertEdbGeoJobContext.SHPOUTPATH); if (outDataPath.exists() && outDataPath.isDirectory()) { deleteFilesInPath(outDataPath); diff --git a/xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/jobs/context/edbgeo/AbstractDgnToEdbGeoJobContext.java b/xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/jobs/context/edbgeo/AbstractDgnToEdbGeoJobContext.java new file mode 100644 index 0000000..f72012a --- /dev/null +++ b/xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/jobs/context/edbgeo/AbstractDgnToEdbGeoJobContext.java @@ -0,0 +1,665 @@ +package com.ximple.eofms.jobs.context.edbgeo; + +import java.io.IOException; +import java.math.BigDecimal; +import java.sql.Connection; +import java.sql.DatabaseMetaData; +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.sql.Statement; +import java.util.*; + +import com.ximple.eofms.util.FeatureTypeBuilderUtil; +import org.geotools.data.DataSourceException; +import org.geotools.data.DataStore; +import org.geotools.data.SchemaNotFoundException; +import org.geotools.data.Transaction; +import org.geotools.data.jdbc.JDBCUtils; +import org.geotools.data.edbgeo.PostgisDataStore; +import org.geotools.filter.LengthFunction; +import org.geotools.referencing.NamedIdentifier; +import org.geotools.referencing.crs.DefaultGeographicCRS; +import org.opengis.feature.simple.SimpleFeature; +import org.opengis.feature.simple.SimpleFeatureType; +import org.opengis.feature.type.AttributeDescriptor; +import org.opengis.feature.type.AttributeType; +import org.opengis.feature.type.GeometryDescriptor; +import org.opengis.feature.type.GeometryType; +import org.opengis.feature.type.PropertyType; +import org.opengis.filter.BinaryComparisonOperator; +import org.opengis.filter.Filter; +import org.opengis.filter.PropertyIsLessThan; +import org.opengis.filter.PropertyIsLessThanOrEqualTo; +import org.opengis.filter.expression.Literal; +import org.opengis.referencing.crs.CoordinateReferenceSystem; + +import com.vividsolutions.jts.geom.Geometry; +import com.vividsolutions.jts.geom.GeometryCollection; +import com.vividsolutions.jts.geom.LineString; +import com.vividsolutions.jts.geom.MultiLineString; +import com.vividsolutions.jts.geom.MultiPoint; +import com.vividsolutions.jts.geom.MultiPolygon; +import com.vividsolutions.jts.geom.Point; +import com.vividsolutions.jts.geom.Polygon; +import com.vividsolutions.jts.io.WKBWriter; +import com.vividsolutions.jts.io.WKTWriter; + +import com.ximple.eofms.jobs.context.AbstractDgnFileJobContext; +import com.ximple.eofms.util.postjts.JtsBinaryWriter; + +public abstract class AbstractDgnToEdbGeoJobContext extends AbstractDgnFileJobContext { + private static Map<String, Class> GEOM_TYPE_MAP = new HashMap<String, Class>(); + private static Map<String, Class> GEOM3D_TYPE_MAP = new HashMap<String, Class>(); + + static { + GEOM_TYPE_MAP.put("GEOMETRY", Geometry.class); + GEOM_TYPE_MAP.put("POINT", Point.class); + GEOM_TYPE_MAP.put("LINESTRING", LineString.class); + GEOM_TYPE_MAP.put("POLYGON", Polygon.class); + GEOM_TYPE_MAP.put("MULTIPOINT", MultiPoint.class); + GEOM_TYPE_MAP.put("MULTILINESTRING", MultiLineString.class); + GEOM_TYPE_MAP.put("MULTIPOLYGON", MultiPolygon.class); + GEOM_TYPE_MAP.put("GEOMETRYCOLLECTION", GeometryCollection.class); + + GEOM3D_TYPE_MAP.put("POINTM", Point.class); + GEOM3D_TYPE_MAP.put("LINESTRINGM", LineString.class); + GEOM3D_TYPE_MAP.put("POLYGONM", Polygon.class); + GEOM3D_TYPE_MAP.put("MULTIPOINTM", MultiPoint.class); + GEOM3D_TYPE_MAP.put("MULTILINESTRINGM", MultiLineString.class); + GEOM3D_TYPE_MAP.put("MULTIPOLYGONM", MultiPolygon.class); + GEOM3D_TYPE_MAP.put("GEOMETRYCOLLECTIONM", GeometryCollection.class); + } + + private static Map<Class, String> CLASS_MAPPINGS = new HashMap<Class, String>(); + + static { + CLASS_MAPPINGS.put(String.class, "VARCHAR"); + + CLASS_MAPPINGS.put(Boolean.class, "BOOLEAN"); + + CLASS_MAPPINGS.put(Short.class, "SMALLINT"); + CLASS_MAPPINGS.put(Integer.class, "INTEGER"); + CLASS_MAPPINGS.put(Long.class, "BIGINT"); + + CLASS_MAPPINGS.put(Float.class, "REAL"); + CLASS_MAPPINGS.put(Double.class, "DOUBLE PRECISION"); + + CLASS_MAPPINGS.put(BigDecimal.class, "DECIMAL"); + + CLASS_MAPPINGS.put(java.sql.Date.class, "DATE"); + CLASS_MAPPINGS.put(java.util.Date.class, "DATE"); + CLASS_MAPPINGS.put(java.sql.Time.class, "TIME"); + CLASS_MAPPINGS.put(java.sql.Timestamp.class, "TIMESTAMP"); + } + + private static Map<Class, String> GEOM_CLASS_MAPPINGS = new HashMap<Class, String>(); + + //why don't we just stick this in with the non-geom class mappings? + static { + // init the inverse map + Set keys = GEOM_TYPE_MAP.keySet(); + + for (Object key : keys) { + String name = (String) key; + Class geomClass = GEOM_TYPE_MAP.get(name); + GEOM_CLASS_MAPPINGS.put(geomClass, name); + } + } + + /** + * Maximum string size for postgres + */ + private static final int MAX_ALLOWED_VALUE = 10485760; + + // protected static final int BATCHSIZE = 2048; + protected static final int BATCHSIZE = 256; + + /** + * Well Known Text writer (from JTS). + */ + protected static WKTWriter geometryWriter = new WKTWriter(); + protected static JtsBinaryWriter binaryWriter = new JtsBinaryWriter(); + + private PostgisDataStore targetDataStore; + // protected Connection connection; + protected String targetSchema = "public"; + + protected boolean schemaEnabled = true; + + public AbstractDgnToEdbGeoJobContext(String dataPath, DataStore targetDataStore, String targetSchema, + boolean profileMode, boolean useTransform) { + super(dataPath, profileMode, useTransform); + if ((targetDataStore != null) && (targetDataStore instanceof PostgisDataStore)) { + this.targetDataStore = (PostgisDataStore) targetDataStore; + } else { + getLogger().info("targetDataStore has wrong."); + } + // this.connection = connection; + setTargetSchema(targetSchema); + } + + public PostgisDataStore getTargetDataStore() { + return targetDataStore; + } + + public void setTargetDataStore(PostgisDataStore targetDataStore) { + this.targetDataStore = targetDataStore; + } + + public String getTargetSchema() { + return targetSchema; + } + + public void setTargetSchema(String schemaName) { + targetSchema = schemaName; + } + + public Connection getConnection() { + try { + return targetDataStore.getConnection(Transaction.AUTO_COMMIT); + + } catch (IOException e) + { + getLogger().warn(e.getMessage(), e); + return null; + } + // return connection; + } + + protected boolean isExistFeature(SimpleFeatureType featureType) { + try { + SimpleFeatureType existFeatureType = targetDataStore.getSchema(featureType.getTypeName()); + return existFeatureType != null; // && existFeatureType.equals(featureType); + } catch (SchemaNotFoundException e) { + return false; + } catch (IOException e) { + getLogger().info(e.getMessage(), e); + return false; + } + } + + protected void deleteTable(Connection conn, String tableName) throws SQLException { + Statement stmt = conn.createStatement(); + StringBuilder sb = new StringBuilder(); + sb.append("DELETE FROM \""); + sb.append(getTargetSchema()); + sb.append("\".\""); + sb.append(tableName); + sb.append('\"'); + stmt.execute(sb.toString()); + if (!conn.getAutoCommit()) + conn.commit(); + JDBCUtils.close(stmt); + } + + protected void dropTable(Connection conn, String tableName) throws SQLException { + Statement stmt = conn.createStatement(); + StringBuilder sb = new StringBuilder(); + sb.append("DROP TABLE \""); + sb.append(getTargetSchema()); + sb.append("\".\""); + sb.append(tableName); + sb.append("\""); + // sb.append(" CASCADE"); + stmt.execute(sb.toString()); + if (!conn.getAutoCommit()) + conn.commit(); + JDBCUtils.close(stmt); + } + + protected void dropGeometryColumn(Connection conn, String tableName, String geomField) throws SQLException { + Statement stmt = conn.createStatement(); + StringBuilder sb = new StringBuilder(); + sb.append("SELECT \"public\".DropGeometryColumn('','"); + sb.append(tableName); + sb.append("','"); + sb.append(geomField); + sb.append("')"); + stmt.execute(sb.toString()); + if (!conn.getAutoCommit()) + conn.commit(); + JDBCUtils.close(stmt); + } + + protected String dropGeometryColumn(String dbSchema, String tableName, String geomField) { + StringBuilder sb = new StringBuilder(); + sb.append("SELECT \"public\".DropGeometryColumn('"); + sb.append(dbSchema); + sb.append("','"); + sb.append(tableName); + sb.append("','"); + sb.append(geomField); + sb.append("')"); + getLogger().info("Execute-" + sb.toString()); + return sb.toString(); + } + + private String addGeometryColumn(String dbSchema, String tableName, GeometryDescriptor geometryDescriptor, int srid) { + StringBuilder sql; + String typeName = getGeometrySQLTypeName(((AttributeType) geometryDescriptor.getType()).getBinding()); + if (typeName == null) { + getLogger().warn("Error: " + geometryDescriptor.getLocalName() + " unknown type!!!"); + throw new RuntimeException("Error: " + geometryDescriptor.getLocalName() + " unknown type!!!"); + } + + sql = new StringBuilder("SELECT \"public\".AddGeometryColumn('"); + sql.append(dbSchema); + sql.append("','"); + sql.append(tableName); + sql.append("','"); + sql.append(geometryDescriptor.getLocalName()); + sql.append("','"); + sql.append(srid); + sql.append("','"); + sql.append(typeName); + sql.append("', 2);"); + + //prints statement for later reuse + return sql.toString(); + } + + public ArrayList<String> createNewSchemaTexts(Connection conn, SimpleFeatureType featureType) throws IOException { + String origintableName = featureType.getTypeName(); + String tableName = origintableName.toLowerCase(); + + ArrayList<String> result = new ArrayList<String>(); + + List<AttributeDescriptor> descriptors = featureType.getAttributeDescriptors(); + + boolean shouldDrop = tablePresent(getTargetSchema(), tableName, conn); + + if (shouldDrop) { + String sqlStr; + for (AttributeDescriptor descriptor : descriptors) { + if (!(descriptor instanceof GeometryDescriptor)) { + continue; + } + GeometryDescriptor geometryDescriptor = (GeometryDescriptor) descriptor; + sqlStr = dropGeometryColumn(getTargetSchema(), tableName, geometryDescriptor.getLocalName()); + getLogger().info(sqlStr); + result.add(sqlStr); + } + // sqlStr = "DROP TABLE " + encodeSchemaTableName(tableName) + " CASCADE;"; + sqlStr = "DROP TABLE " + encodeSchemaTableName(tableName) + " ;"; + getLogger().info(sqlStr); + result.add(sqlStr); + } + + StringBuilder sql = new StringBuilder("CREATE TABLE "); + sql.append(encodeSchemaTableName(tableName)); + sql.append(" ( gid serial PRIMARY KEY, "); + sql.append(makeNonGeomSqlCreate(descriptors)); + sql.append(");"); + + String sqlStr = sql.toString(); + getLogger().debug(sqlStr); + result.add(sqlStr); + + for (AttributeDescriptor descriptor : descriptors) { + if (!(descriptor instanceof GeometryDescriptor)) { + continue; + } + GeometryDescriptor geometryDescriptor = (GeometryDescriptor) descriptor; + + CoordinateReferenceSystem refSys = geometryDescriptor.getCoordinateReferenceSystem(); + int SRID = getSRID(refSys); + + sqlStr = addGeometryColumn(getTargetSchema(), tableName, geometryDescriptor, SRID); + getLogger().debug(sqlStr); + result.add(sqlStr); + + + String indexName = tableName.replace('-', '_'); + //also build a spatial index on each geometry column. + sql = new StringBuilder("CREATE INDEX \"spatial_"); + sql.append(indexName); + sql.append("_"); + sql.append(descriptor.getLocalName().toLowerCase()); + sql.append("\" ON "); + sql.append(encodeSchemaTableName(tableName)); + sql.append(" USING GIST ("); + sql.append(encodeSchemaColumnName(descriptor.getLocalName())); + sql.append(" gist_geometry_ops);"); + + sqlStr = sql.toString(); + getLogger().debug(sqlStr); + + result.add(sqlStr); + } + return result; + } + + private int getSRID(CoordinateReferenceSystem refSys) { + int SRID; + if (refSys != null) { + try { + Set ident = refSys.getIdentifiers(); + if ((ident == null || ident.isEmpty()) && refSys == DefaultGeographicCRS.WGS84) { + SRID = 4326; + } else { + assert ident != null; + String code = ((NamedIdentifier) ident.toArray()[0]).getCode(); + SRID = Integer.parseInt(code); + } + } catch (Exception e) { + getLogger().warn("SRID could not be determined"); + SRID = -1; + } + } else { + SRID = -1; + } + return SRID; + } + + private boolean tablePresent(String schema, String table, Connection conn) throws IOException { + final int TABLE_NAME_COL = 3; + + ResultSet tables = null; + try { + DatabaseMetaData meta = conn.getMetaData(); + String[] tableType = {"TABLE"}; + tables = meta.getTables(null, schema, "%", tableType); + + while (tables.next()) { + String tableName = tables.getString(TABLE_NAME_COL); + + if (allowTable(tableName) && (tableName != null) + && (tableName.equalsIgnoreCase(table))) { + return (true); + } + } + + return false; + } catch (SQLException sqlException) { + String message = "Error querying database for list of tables:" + + sqlException.getMessage(); + throw new DataSourceException(message, sqlException); + } finally { + if (tables != null) + JDBCUtils.close(tables); + } + } + + protected boolean allowTable(String tablename) { + if (tablename.equals("geometry_columns")) { + return false; + } else if (tablename.startsWith("spatial_ref_sys")) { + return false; + } + + //others? + return true; + } + + + private StringBuilder makeNonGeomSqlCreate(List<AttributeDescriptor> descriptors) + throws IOException { + StringBuilder buf = new StringBuilder(""); + + for (AttributeDescriptor descriptor : descriptors) { + String typeName; + typeName = CLASS_MAPPINGS.get(((AttributeType) descriptor.getType()).getBinding()); + if (typeName == null) { + typeName = GEOM_CLASS_MAPPINGS.get(((AttributeType) descriptor.getType()).getBinding()); + if (typeName != null) continue; + } + + if (typeName != null) { + if (typeName.equals("VARCHAR")) { + int length = -1; + List<Filter> flist = ((PropertyType) descriptor.getType()).getRestrictions(); + for (Filter f : flist) { + if (f != null && f != Filter.EXCLUDE && f != Filter.INCLUDE && + (f instanceof PropertyIsLessThan || f instanceof PropertyIsLessThanOrEqualTo)) { + try { + BinaryComparisonOperator cf = (BinaryComparisonOperator) f; + if (cf.getExpression1() instanceof LengthFunction) { + length = Integer.parseInt(((Literal) cf.getExpression2()).getValue().toString()); + } else { + if (cf.getExpression2() instanceof LengthFunction) { + length = Integer.parseInt(((Literal) cf.getExpression1()).getValue().toString()); + } + } + } catch (NumberFormatException e) { + length = 256; + } + } else { + length = 256; + } + break; + } + if (length < 1) { + getLogger().warn("FeatureType did not specify string length; defaulted to 256"); + length = 256; + } else if (length > MAX_ALLOWED_VALUE) { + length = MAX_ALLOWED_VALUE; + } + typeName = typeName + "(" + length + ")"; + } + + if (!descriptor.isNillable()) { + typeName = typeName + " NOT NULL"; + } + + //TODO review!!! Is toString() always OK??? + Object defaultValue = descriptor.getDefaultValue(); + + if (defaultValue != null) { + typeName = typeName + " DEFAULT '" + + defaultValue.toString() + "'"; + } + + buf.append(" \"").append(descriptor.getLocalName()).append("\" ").append(typeName).append(","); + + } else { + String msg; + if (descriptor == null) { + msg = "AttributeType was null!"; + } else { + msg = "Type '" + ((AttributeType) descriptor.getType()).getBinding() + "' not supported!"; + } + throw (new IOException(msg)); + } + } + + return buf.deleteCharAt(buf.length() - 1); + } + + private String getGeometrySQLTypeName(Class type) { + String res = GEOM_CLASS_MAPPINGS.get(type); + + if (res == null) { + throw new RuntimeException("Unknown type name for class " + type + + " please update GEOMETRY_MAPPINGS"); + } + + return res; + } + + protected String getGeometryInsertText(Geometry geom, int srid) // throws IOException + { + if (geom == null) { + return "null"; + } + + if (targetDataStore.isWKBEnabled()) { + //String wkb = WKBEncoder.encodeGeometryHex(geom); + String wkb = WKBWriter.bytesToHex(new WKBWriter().write(geom)); + + if (targetDataStore.isByteaWKB()) { + return "setSRID('" + wkb + "'::geometry," + srid + ")"; + } else { + return "GeomFromWKB('" + wkb + "', " + srid + ")"; + } + } + + String geoText = geometryWriter.write(geom); + + return "GeometryFromText('" + geoText + "', " + srid + ")"; + } + + protected String makeInsertSql(SimpleFeature feature, int srid) // throws IOException + { + SimpleFeatureType featureType = feature.getFeatureType(); + + String tableName = encodeSchemaTableName(featureType.getTypeName()); + List<AttributeDescriptor> descriptors = featureType.getAttributeDescriptors(); + + String attrValue; + + StringBuilder statementSQL = new StringBuilder("INSERT INTO " + tableName + " ("); + + // encode insertion for attributes, but remember to avoid auto-increment ones, + // they may be included in the feature type as well + for (AttributeDescriptor attributeType : descriptors) { + String attName = attributeType.getLocalName(); + + if (feature.getAttribute(attName) != null) { + String colName = encodeSchemaColumnName(attName); + statementSQL.append(colName).append(","); + } + } + + statementSQL.setCharAt(statementSQL.length() - 1, ')'); + statementSQL.append(" VALUES ("); + + List<Object> attributes = feature.getAttributes(); + + for (int i = 0; i < descriptors.size(); i++) { + attrValue = null; + + if (descriptors.get(i) instanceof GeometryDescriptor) { + // String geomName = descriptors[i].getLocalName(); + // int srid = ftInfo.getSRID(geomName); + Geometry geometry = (Geometry) attributes.get(i); + geometry.setSRID(FeatureTypeBuilderUtil.getDefaultFeatureSRID()); + + if (geometry == null) { + attrValue = "NULL"; + } else { + attrValue = getGeometryInsertText(geometry, srid); + } + } else { + if (attributes.get(i) != null) { + attrValue = addQuotes(attributes.get(i)); + } + } + + if (attrValue != null) { + statementSQL.append(attrValue).append(","); + } + } + + statementSQL.setCharAt(statementSQL.length() - 1, ')'); + + return (statementSQL.toString()); + } + + protected String makePrepareInsertSql(SimpleFeatureType featureType) { + String tableName = encodeSchemaTableName(featureType.getTypeName()); + List<AttributeDescriptor> attributeTypes = featureType.getAttributeDescriptors(); + + String attrValue; + + StringBuilder statementSQL = new StringBuilder("INSERT INTO " + tableName + " ("); + + // encode insertion for attributes, but remember to avoid auto-increment ones, + // they may be included in the feature type as well + for (AttributeDescriptor descriptor : attributeTypes) { + String attName = descriptor.getName().getLocalPart(); + + String colName = encodeSchemaColumnName(attName); + statementSQL.append(colName).append(","); + } + + statementSQL.setCharAt(statementSQL.length() - 1, ')'); + statementSQL.append(" VALUES ("); + + for (AttributeDescriptor attributeType : attributeTypes) { + statementSQL.append(" ? ,"); + } + + statementSQL.setCharAt(statementSQL.length() - 1, ')'); + + return (statementSQL.toString()); + } + + protected String addQuotes(Object value) { + String retString; + + if (value != null) { + if (value instanceof Number) { + retString = value.toString(); + } else { + retString = "'" + doubleQuote(value) + "'"; + } + } else { + retString = "null"; + } + + return retString; + } + + String doubleQuote(Object obj) { + return obj.toString().replaceAll("'", "''"); + } + + protected String encodeName(String tableName) { + return tableName; + } + + protected String encodeColumnName(String colName) { + return encodeName(colName); + } + + public String encodeSchemaTableName(String tableName) { + return schemaEnabled ? ("\"" + getTargetSchema() + "\".\"" + tableName + "\"") + : ("\"" + tableName + "\""); + } + + public String encodeSchemaColumnName(String columnName) { + return "\"" + columnName + "\""; + } + + protected void bindFeatureParameters(PreparedStatement pstmt, SimpleFeature feature) throws SQLException { + SimpleFeatureType featureType = feature.getFeatureType(); + + List<AttributeDescriptor> descriptors = featureType.getAttributeDescriptors(); + List<Object> attributes = feature.getAttributes(); + + for (int i = 0; i < descriptors.size(); i++) { + if (descriptors.get(i) instanceof GeometryDescriptor) { + pstmt.setBytes(i + 1, binaryWriter.writeBinary((Geometry) attributes.get(i))); + } else { + Class<?> bindingType = ((AttributeType) descriptors.get(i).getType()).getBinding(); + if (bindingType.equals(Short.class)) { + pstmt.setShort(i + 1, (Short) attributes.get(i)); + } else if (bindingType.equals(Integer.class)) { + pstmt.setInt(i + 1, (Short) attributes.get(i)); + } else if (bindingType.equals(Long.class)) { + pstmt.setLong(i + 1, (Long) attributes.get(i)); + } else if (bindingType.equals(String.class)) { + pstmt.setString(i + 1, (String) attributes.get(i)); + } else if (bindingType.equals(Float.class)) { + pstmt.setFloat(i + 1, (Float) attributes.get(i)); + } else if (bindingType.equals(Double.class)) { + pstmt.setDouble(i + 1, (Double) attributes.get(i)); + } else if (bindingType.equals(Boolean.class)) { + pstmt.setBoolean(i + 1, (Boolean) attributes.get(i)); + } else if (bindingType.equals(BigDecimal.class)) { + pstmt.setBigDecimal(i + 1, (BigDecimal) attributes.get(i)); + } else if (bindingType.equals(java.sql.Date.class)) { + pstmt.setDate(i + 1, (java.sql.Date) attributes.get(i)); + } else if (bindingType.equals(java.sql.Time.class)) { + pstmt.setTime(i + 1, (java.sql.Time) attributes.get(i)); + } else if (bindingType.equals(java.sql.Timestamp.class)) { + pstmt.setTimestamp(i + 1, (java.sql.Timestamp) attributes.get(i)); + } else if (bindingType.equals(java.util.Date.class)) { + java.sql.Date sDate = new java.sql.Date(((java.util.Date) attributes.get(i)).getTime()); + pstmt.setDate(i + 1, sDate); + } + } + } + } +} diff --git a/xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/jobs/context/edbgeo/AbstractOracleToEdbGeoJobContext.java b/xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/jobs/context/edbgeo/AbstractOracleToEdbGeoJobContext.java new file mode 100644 index 0000000..b8c3ac2 --- /dev/null +++ b/xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/jobs/context/edbgeo/AbstractOracleToEdbGeoJobContext.java @@ -0,0 +1,691 @@ +package com.ximple.eofms.jobs.context.edbgeo; + +import java.io.IOException; +import java.math.BigDecimal; +import java.sql.Connection; +import java.sql.DatabaseMetaData; +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.sql.Statement; +import java.util.*; + +import com.ximple.eofms.util.FeatureTypeBuilderUtil; +import org.geotools.data.DataSourceException; +import org.geotools.data.DataStore; +import org.geotools.data.SchemaNotFoundException; +import org.geotools.data.edbgeo.PostgisDataStore; +import org.geotools.filter.LengthFunction; +import org.geotools.referencing.NamedIdentifier; +import org.geotools.referencing.crs.DefaultGeographicCRS; +import org.opengis.feature.simple.SimpleFeature; +import org.opengis.feature.simple.SimpleFeatureType; +import org.opengis.feature.type.AttributeDescriptor; +import org.opengis.feature.type.AttributeType; +import org.opengis.feature.type.GeometryDescriptor; +import org.opengis.feature.type.PropertyType; +import org.opengis.filter.BinaryComparisonOperator; +import org.opengis.filter.Filter; +import org.opengis.filter.PropertyIsLessThan; +import org.opengis.filter.PropertyIsLessThanOrEqualTo; +import org.opengis.filter.expression.Literal; +import org.opengis.referencing.crs.CoordinateReferenceSystem; + +import com.vividsolutions.jts.geom.Geometry; +import com.vividsolutions.jts.geom.GeometryCollection; +import com.vividsolutions.jts.geom.LineString; +import com.vividsolutions.jts.geom.MultiLineString; +import com.vividsolutions.jts.geom.MultiPoint; +import com.vividsolutions.jts.geom.MultiPolygon; +import com.vividsolutions.jts.geom.Point; +import com.vividsolutions.jts.geom.Polygon; +import com.vividsolutions.jts.io.WKBWriter; +import com.vividsolutions.jts.io.WKTWriter; + +import com.ximple.eofms.jobs.context.AbstractOracleJobContext; +import com.ximple.eofms.util.postjts.JtsBinaryWriter; + +public abstract class AbstractOracleToEdbGeoJobContext extends AbstractOracleJobContext { + private static Map<String, Class> GEOM_TYPE_MAP = new HashMap<String, Class>(); + private static Map<String, Class> GEOM3D_TYPE_MAP = new HashMap<String, Class>(); + + static { + GEOM_TYPE_MAP.put("GEOMETRY", Geometry.class); + GEOM_TYPE_MAP.put("POINT", Point.class); + GEOM_TYPE_MAP.put("LINESTRING", LineString.class); + GEOM_TYPE_MAP.put("POLYGON", Polygon.class); + GEOM_TYPE_MAP.put("MULTIPOINT", MultiPoint.class); + GEOM_TYPE_MAP.put("MULTILINESTRING", MultiLineString.class); + GEOM_TYPE_MAP.put("MULTIPOLYGON", MultiPolygon.class); + GEOM_TYPE_MAP.put("GEOMETRYCOLLECTION", GeometryCollection.class); + + GEOM3D_TYPE_MAP.put("POINTM", Point.class); + GEOM3D_TYPE_MAP.put("LINESTRINGM", LineString.class); + GEOM3D_TYPE_MAP.put("POLYGONM", Polygon.class); + GEOM3D_TYPE_MAP.put("MULTIPOINTM", MultiPoint.class); + GEOM3D_TYPE_MAP.put("MULTILINESTRINGM", MultiLineString.class); + GEOM3D_TYPE_MAP.put("MULTIPOLYGONM", MultiPolygon.class); + GEOM3D_TYPE_MAP.put("GEOMETRYCOLLECTIONM", GeometryCollection.class); + } + + private static Map<Class, String> CLASS_MAPPINGS = new HashMap<Class, String>(); + + static { + CLASS_MAPPINGS.put(String.class, "VARCHAR"); + + CLASS_MAPPINGS.put(Boolean.class, "BOOLEAN"); + + CLASS_MAPPINGS.put(Short.class, "SMALLINT"); + CLASS_MAPPINGS.put(Integer.class, "INTEGER"); + CLASS_MAPPINGS.put(Long.class, "BIGINT"); + + CLASS_MAPPINGS.put(Float.class, "REAL"); + CLASS_MAPPINGS.put(Double.class, "DOUBLE PRECISION"); + + CLASS_MAPPINGS.put(BigDecimal.class, "DECIMAL"); + + CLASS_MAPPINGS.put(java.sql.Date.class, "DATE"); + CLASS_MAPPINGS.put(java.util.Date.class, "DATE"); + CLASS_MAPPINGS.put(java.sql.Time.class, "TIME"); + CLASS_MAPPINGS.put(java.sql.Timestamp.class, "TIMESTAMP"); + } + + private static Map<Class, String> GEOM_CLASS_MAPPINGS = new HashMap<Class, String>(); + + //why don't we just stick this in with the non-geom class mappings? + static { + // init the inverse map + Set keys = GEOM_TYPE_MAP.keySet(); + + for (Object key : keys) { + String name = (String) key; + Class geomClass = GEOM_TYPE_MAP.get(name); + GEOM_CLASS_MAPPINGS.put(geomClass, name); + } + } + + /** + * Maximum string size for postgres + */ + private static final int MAX_ALLOWED_VALUE = 10485760; + + // protected static final int BATCHSIZE = 512; + protected static final int BATCHSIZE = 128; + + /** + * Well Known Text writer (from JTS). + */ + protected static WKTWriter geometryWriter = new WKTWriter(); + protected static JtsBinaryWriter binaryWriter = new JtsBinaryWriter(); + + protected boolean schemaEnabled = true; + + private PostgisDataStore targetDataStore; + private String targetSchema = "public"; + + public AbstractOracleToEdbGeoJobContext(String dataPath, DataStore targetDataStore, String targetSchema, + boolean profileMode, boolean useTransform) { + super(profileMode, useTransform); + if ((targetDataStore != null) && (targetDataStore instanceof PostgisDataStore)) { + this.targetDataStore = (PostgisDataStore) targetDataStore; + } else { + getLogger().info("targetDataStore has wrong."); + } + setDataPath(dataPath); + setTargetSchema(targetSchema); + } + + public PostgisDataStore getTargetDataStore() { + return targetDataStore; + } + + public void setTargetDataStore(PostgisDataStore targetDataStore) { + this.targetDataStore = targetDataStore; + } + + public String getTargetSchema() { + return targetSchema; + } + + public void setTargetSchema(String schemaName) { + targetSchema = schemaName; + } + + public Connection getConnection() { + if (targetDataStore != null) { + try { + return targetDataStore.getDataSource().getConnection(); + } catch (SQLException e) { + getLogger().warn(e.getMessage(), e); + return null; + } + } + return null; + } + + protected boolean isExistFeature(SimpleFeatureType featureType) { + try { + SimpleFeatureType existFeatureType = targetDataStore.getSchema(featureType.getTypeName()); + return existFeatureType != null; // && existFeatureType.equals(featureType); + } catch (SchemaNotFoundException e) { + return false; + } catch (IOException e) { + getLogger().info(e.getMessage(), e); + return false; + } + } + + protected void deleteTable(Connection conn, String schemaName, String tableName) throws SQLException { + Statement stmt = conn.createStatement(); + StringBuilder sb = new StringBuilder(); + sb.append("DELETE FROM \""); + sb.append(schemaName); + sb.append("\".\""); + sb.append(tableName); + sb.append('\"'); + stmt.execute(sb.toString()); + stmt.close(); + conn.commit(); + } + + protected void dropTable(Connection conn, String schemaName, String tableName) throws SQLException { + Statement stmt = conn.createStatement(); + StringBuilder sb = new StringBuilder(); + sb.append("DROP TABLE \""); + sb.append(schemaName); + sb.append("\".\""); + sb.append(tableName); + sb.append("\""); + // sb.append(" CASCADE"); + stmt.execute(sb.toString()); + stmt.close(); + conn.commit(); + } + + protected void dropGeometryColumn(Connection conn, String dbSchema, String tableName, String geomField) throws SQLException { + Statement stmt = conn.createStatement(); + StringBuilder sb = new StringBuilder(); + sb.append("SELECT \"public\".DropGeometryColumn('"); + sb.append(dbSchema); + sb.append("','"); + sb.append(tableName); + sb.append("','"); + sb.append(geomField); + sb.append("')"); + stmt.execute(sb.toString()); + stmt.close(); + conn.commit(); + } + + protected String dropGeometryColumn(String dbSchema, String tableName, String geomField) { + StringBuilder sb = new StringBuilder(); + sb.append("SELECT \"public\".DropGeometryColumn('"); + sb.append(dbSchema); + sb.append("','"); + sb.append(tableName); + sb.append("','"); + sb.append(geomField); + sb.append("')"); + return sb.toString(); + } + + private String addGeometryColumn(String dbSchema, String tableName, GeometryDescriptor geometryDescriptor, int srid) { + StringBuilder sql; + String typeName = getGeometrySQLTypeName(((PropertyType)geometryDescriptor.getType()).getBinding()); + if (typeName == null) { + getLogger().warn("Error: " + geometryDescriptor.getLocalName() + " unknown type!!!"); + throw new RuntimeException("Error: " + geometryDescriptor.getLocalName() + " unknown type!!!"); + } + + sql = new StringBuilder("SELECT \"public\".AddGeometryColumn('"); + sql.append(dbSchema); + sql.append("','"); + sql.append(tableName); + sql.append("','"); + sql.append(geometryDescriptor.getLocalName()); + sql.append("','"); + sql.append(srid); + sql.append("','"); + sql.append(typeName); + sql.append("', 2);"); + + //prints statement for later reuse + return sql.toString(); + } + + public ArrayList<String> createNewSchemaTexts(Connection conn, SimpleFeatureType featureType) throws IOException { + String origintableName = featureType.getTypeName(); + String tableName = origintableName.toLowerCase(); + + ArrayList<String> result = new ArrayList<String>(); + + List<AttributeDescriptor> attributeType = featureType.getAttributeDescriptors(); + // String dbSchema = targetDataStore.getDatabaseSchemaName(); + + boolean shouldDrop = tablePresent(getTargetSchema(), tableName, conn); + if (shouldDrop) { + String sqlStr; + for (AttributeDescriptor descriptor : attributeType) { + if (!(descriptor instanceof GeometryDescriptor)) { + continue; + } + GeometryDescriptor geomAttribute = (GeometryDescriptor) descriptor; + sqlStr = dropGeometryColumn(getTargetSchema(), tableName, geomAttribute.getLocalName()); + getLogger().info(sqlStr); + result.add(sqlStr); + } + // sqlStr = "DROP TABLE " + encodeSchemaTableName(tableName) + " CASCADE;"; + sqlStr = "DROP TABLE " + encodeSchemaTableName(tableName) + " ;"; + getLogger().info(sqlStr); + result.add(sqlStr); + } + + StringBuilder sql = new StringBuilder("CREATE TABLE "); + sql.append(encodeSchemaTableName(tableName)); + sql.append(" ( gid serial PRIMARY KEY, "); + sql.append(makeNonGeomSqlCreate(attributeType)); + sql.append(");"); + + String sqlStr = sql.toString(); + getLogger().debug(sqlStr); + result.add(sqlStr); + + String indexName = tableName.replace('-', '_'); + + for (AttributeDescriptor descriptor : attributeType) { + if (!(descriptor instanceof GeometryDescriptor)) { + String fieldName = descriptor.getLocalName().toLowerCase(); + continue; + } + GeometryDescriptor geomDescriptor = (GeometryDescriptor) descriptor; + + CoordinateReferenceSystem refSys = geomDescriptor.getCoordinateReferenceSystem(); + int SRID = getSRID(refSys); + + sqlStr = addGeometryColumn(getTargetSchema(), tableName, geomDescriptor, SRID); + getLogger().debug(sqlStr); + result.add(sqlStr); + + //also build a spatial index on each geometry column. + sql = new StringBuilder("CREATE INDEX \""); + sql.append("spatial_"); + sql.append(indexName); + sql.append("_"); + sql.append(descriptor.getLocalName().toLowerCase()); + sql.append("\" ON "); + sql.append(encodeSchemaTableName(tableName)); + sql.append(" USING GIST ("); + sql.append(encodeSchemaColumnName(descriptor.getLocalName())); + sql.append(" gist_geometry_ops);"); + + sqlStr = sql.toString(); + getLogger().debug(sqlStr); + result.add(sqlStr); + } + + if (origintableName.startsWith("fsc")) { + sql = new StringBuilder("CREATE INDEX \""); + sql.append("oid_"); + sql.append(indexName); + sql.append("\" ON "); + sql.append(encodeSchemaTableName(tableName)); + sql.append(" USING BTREE (\"tid\", \"oid\")"); + sqlStr = sql.toString(); + getLogger().debug(sqlStr); + result.add(sqlStr); + + sql = new StringBuilder("CREATE INDEX \""); + sql.append("lvwt_"); + sql.append(indexName); + sql.append("\" ON "); + sql.append(encodeSchemaTableName(tableName)); + sql.append(" USING BTREE (\"level\", \"symweight\")"); + sqlStr = sql.toString(); + getLogger().debug(sqlStr); + result.add(sqlStr); + } + + return result; + } + + private int getSRID(CoordinateReferenceSystem refSys) { + int SRID; + if (refSys != null) { + try { + Set ident = refSys.getIdentifiers(); + if ((ident == null || ident.isEmpty()) && refSys == DefaultGeographicCRS.WGS84) { + SRID = 4326; + } else { + String code = ((NamedIdentifier) ident.toArray()[0]).getCode(); + SRID = Integer.parseInt(code); + } + } catch (Exception e) { + getLogger().warn("SRID could not be determined"); + SRID = -1; + } + } else { + SRID = -1; + } + return SRID; + } + + private boolean tablePresent(String schema, String table, Connection conn) throws IOException { + final int TABLE_NAME_COL = 3; + + ResultSet tables = null; + try { + DatabaseMetaData meta = conn.getMetaData(); + String[] tableType = {"TABLE"}; + tables = meta.getTables(null, schema, "%", tableType); + + while (tables.next()) { + String tableName = tables.getString(TABLE_NAME_COL); + + if (allowTable(tableName) && (tableName != null) + && (tableName.equalsIgnoreCase(table))) { + return true; + } + } + + return false; + } catch (SQLException sqlException) { + // JDBCUtils.close(conn, Transaction.AUTO_COMMIT, sqlException); + String message = "Error querying database for list of tables:" + + sqlException.getMessage(); + throw new DataSourceException(message, sqlException); + } finally { + if (tables != null) try { + tables.close(); + } catch (SQLException e) { + } + // JDBCUtils.close(conn, Transaction.AUTO_COMMIT, null); + } + } + + protected boolean allowTable(String tablename) { + if (tablename.equals("geometry_columns")) { + return false; + } else if (tablename.startsWith("spatial_ref_sys")) { + return false; + } + + //others? + return true; + } + + + private StringBuffer makeNonGeomSqlCreate(List<AttributeDescriptor> descriptors) + throws IOException { + StringBuffer buf = new StringBuffer(""); + + for (AttributeDescriptor descriptor : descriptors) { + String typeName; + typeName = CLASS_MAPPINGS.get(((PropertyType) descriptor.getType()).getBinding()); + if (typeName == null) { + typeName = GEOM_CLASS_MAPPINGS.get(((PropertyType) descriptor.getType()).getBinding()); + if (typeName != null) continue; + } + + if (typeName != null) { + if (typeName.equals("VARCHAR")) { + int length = -1; + List<Filter> flist = ((PropertyType) descriptor.getType()).getRestrictions(); + for (Filter f : flist) { + if (f != null && f != Filter.EXCLUDE && f != Filter.INCLUDE && + (f instanceof PropertyIsLessThan || f instanceof PropertyIsLessThanOrEqualTo)) { + try { + BinaryComparisonOperator cf = (BinaryComparisonOperator) f; + if (cf.getExpression1() instanceof LengthFunction) { + length = Integer.parseInt(((Literal) cf.getExpression2()).getValue().toString()); + } else { + if (cf.getExpression2() instanceof LengthFunction) { + length = Integer.parseInt(((Literal) cf.getExpression1()).getValue().toString()); + } + } + } catch (NumberFormatException e) { + length = 512; + } + } else { + length = 512; + } + break; + } + + if (length < 1) { + getLogger().info("FeatureType did not specify string length; defaulted to 512"); + length = 512; + } else if (length > MAX_ALLOWED_VALUE) { + length = MAX_ALLOWED_VALUE; + } + typeName = typeName + "(" + length + ")"; + } + + if (!descriptor.isNillable()) { + typeName = typeName + " NOT NULL"; + } + + //TODO review!!! Is toString() always OK??? + Object defaultValue = descriptor.getDefaultValue(); + + if (defaultValue != null) { + typeName = typeName + " DEFAULT '" + + defaultValue.toString() + "'"; + } + + buf.append(" \"").append(descriptor.getLocalName()).append("\" ").append(typeName).append(","); + + } else { + String msg; + if (descriptor == null) { + msg = "AttributeType was null!"; + } else { + msg = "Type '" + ((PropertyType) descriptor.getType()).getBinding() + "' not supported!"; + } + throw (new IOException(msg)); + } + } + + return buf.deleteCharAt(buf.length() - 1); + } + + private String getGeometrySQLTypeName(Class type) { + String res = GEOM_CLASS_MAPPINGS.get(type); + + if (res == null) { + throw new RuntimeException("Unknown type name for class " + type + + " please update GEOMETRY_MAPPINGS"); + } + + return res; + } + + protected String getGeometryInsertText(Geometry geom, int srid) // throws IOException + { + if (geom == null) { + return "null"; + } + + if (targetDataStore.isWKBEnabled()) { + //String wkb = WKBEncoder.encodeGeometryHex(geom); + String wkb = WKBWriter.bytesToHex(new WKBWriter().write(geom)); + + if (targetDataStore.isByteaWKB()) { + return "setSRID('" + wkb + "'::geometry," + srid + ")"; + } else { + return "GeomFromWKB('" + wkb + "', " + srid + ")"; + } + } + + String geoText = geometryWriter.write(geom); + + return "GeometryFromText('" + geoText + "', " + srid + ")"; + } + + protected String makeInsertSql(SimpleFeature feature, int srid) // throws IOException + { + SimpleFeatureType featureType = feature.getFeatureType(); + + String tableName = encodeSchemaTableName(featureType.getTypeName()); + List<AttributeDescriptor> descriptors = featureType.getAttributeDescriptors(); + + String attrValue; + + StringBuilder statementSQL = new StringBuilder(512); + statementSQL.append("INSERT INTO ").append(tableName).append(" ("); + + // encode insertion for attributes, but remember to avoid auto-increment ones, + // they may be included in the feature type as well + for (AttributeDescriptor attributeDescriptor : descriptors) { + String attName = attributeDescriptor.getLocalName(); + + if (feature.getAttribute(attName) != null) { + String colName = encodeSchemaColumnName(attName); + statementSQL.append(colName).append(","); + } + } + + statementSQL.setCharAt(statementSQL.length() - 1, ')'); + statementSQL.append(" VALUES ("); + + List<Object> attributes = feature.getAttributes(); + + for (int i = 0; i < descriptors.size(); i++) { + attrValue = null; + + if (descriptors.get(i) instanceof GeometryDescriptor) { + // String geomName = descriptors[i].getLocalName(); + // int srid = ftInfo.getSRID(geomName); + Geometry geometry = (Geometry) attributes.get(i); + + if (geometry == null) { + attrValue = "NULL"; + } else { + attrValue = getGeometryInsertText(geometry, srid); + } + } else { + if (attributes.get(i) != null) { + attrValue = addQuotes(attributes.get(i)); + } + } + + if (attrValue != null) { + statementSQL.append(attrValue).append(","); + } + } + + statementSQL.setCharAt(statementSQL.length() - 1, ')'); + + return (statementSQL.toString()); + } + + protected String makePrepareInsertSql(SimpleFeatureType featureType) { + String tableName = encodeSchemaTableName(featureType.getTypeName()); + List<AttributeDescriptor> descriptors = featureType.getAttributeDescriptors(); + + String attrValue; + + StringBuilder statementSQL = new StringBuilder("INSERT INTO " + tableName + " ("); + + // encode insertion for attributes, but remember to avoid auto-increment ones, + // they may be included in the feature type as well + for (AttributeDescriptor descriptor : descriptors) { + String attName = descriptor.getLocalName(); + + String colName = encodeSchemaColumnName(attName); + statementSQL.append(colName).append(","); + } + + statementSQL.setCharAt(statementSQL.length() - 1, ')'); + statementSQL.append(" VALUES ("); + + for (AttributeDescriptor descriptor : descriptors) { + statementSQL.append(" ? ,"); + } + + statementSQL.setCharAt(statementSQL.length() - 1, ')'); + + return (statementSQL.toString()); + } + + protected String addQuotes(Object value) { + String retString; + + if (value != null) { + if (value instanceof Number) { + retString = value.toString(); + } else { + retString = "'" + doubleQuote(value) + "'"; + } + } else { + retString = "null"; + } + + return retString; + } + + String doubleQuote(Object obj) { + return obj.toString().replaceAll("'", "''"); + } + + protected String encodeName(String tableName) { + return tableName; + } + + protected String encodeColumnName(String colName) { + return encodeName(colName); + } + + public String encodeSchemaTableName(String tableName) { + return schemaEnabled ? ("\"" + getTargetSchema() + "\".\"" + tableName + "\"") + : ("\"" + tableName + "\""); + } + + public String encodeSchemaColumnName(String columnName) { + return "\"" + columnName + "\""; + } + + protected void bindFeatureParameters(PreparedStatement pstmt, SimpleFeature feature) throws SQLException { + SimpleFeatureType featureType = feature.getFeatureType(); + + List<AttributeDescriptor> descriptors = featureType.getAttributeDescriptors(); + List<Object> attributes = feature.getAttributes(); + + for (int i = 0; i < descriptors.size(); i++) { + if (descriptors.get(i) instanceof GeometryDescriptor) { + // String wktTest = geometryWriter.write((Geometry) attributes.get(i)); + Geometry geom = (Geometry) attributes.get(i); + geom.setSRID(FeatureTypeBuilderUtil.getDefaultFeatureSRID()); + pstmt.setBytes(i + 1, binaryWriter.writeBinary((Geometry) attributes.get(i))); + } else { + Class<?> bindingType = ((AttributeType)descriptors.get(i).getType()).getBinding(); + if (bindingType.equals(Short.class)) { + pstmt.setShort(i + 1, (Short) attributes.get(i)); + } else if (bindingType.equals(Integer.class)) { + pstmt.setInt(i + 1, (Short) attributes.get(i)); + } else if (bindingType.equals(Long.class)) { + pstmt.setLong(i + 1, (Long) attributes.get(i)); + } else if (bindingType.equals(String.class)) { + pstmt.setString(i + 1, (String) attributes.get(i)); + } else if (bindingType.equals(Float.class)) { + pstmt.setFloat(i + 1, (Float) attributes.get(i)); + } else if (bindingType.equals(Double.class)) { + pstmt.setDouble(i + 1, (Double) attributes.get(i)); + } else if (bindingType.equals(Boolean.class)) { + pstmt.setBoolean(i + 1, (Boolean) attributes.get(i)); + } else if (bindingType.equals(BigDecimal.class)) { + pstmt.setBigDecimal(i + 1, (BigDecimal) attributes.get(i)); + } else if (bindingType.equals(java.sql.Date.class)) { + pstmt.setDate(i + 1, (java.sql.Date) attributes.get(i)); + } else if (bindingType.equals(java.sql.Time.class)) { + pstmt.setTime(i + 1, (java.sql.Time) attributes.get(i)); + } else if (bindingType.equals(java.sql.Timestamp.class)) { + pstmt.setTimestamp(i + 1, (java.sql.Timestamp) attributes.get(i)); + } else if (bindingType.equals(java.util.Date.class)) { + java.sql.Date sDate = new java.sql.Date(((java.util.Date) attributes.get(i)).getTime()); + pstmt.setDate(i + 1, sDate); + } + } + + } + } +} diff --git a/xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/jobs/context/edbgeo/DummyFeatureConvertEdbGeoJobContext.java b/xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/jobs/context/edbgeo/DummyFeatureConvertEdbGeoJobContext.java new file mode 100644 index 0000000..1cd0adb --- /dev/null +++ b/xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/jobs/context/edbgeo/DummyFeatureConvertEdbGeoJobContext.java @@ -0,0 +1,236 @@ +package com.ximple.eofms.jobs.context.edbgeo; + +import java.io.File; +import java.io.IOException; +import java.io.UnsupportedEncodingException; +import java.net.MalformedURLException; +import java.net.URL; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.Iterator; +import java.util.List; + +import org.apache.commons.digester.Digester; +import org.apache.commons.digester.xmlrules.DigesterLoader; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.apache.commons.transaction.memory.PessimisticMapWrapper; +import org.apache.commons.transaction.util.CommonsLoggingLogger; +import org.apache.commons.transaction.util.LoggerFacade; +import org.geotools.data.DataStore; +import org.geotools.data.FeatureWriter; +import org.geotools.data.Transaction; +import org.geotools.feature.IllegalAttributeException; +import org.geotools.feature.SchemaException; +import org.opengis.feature.simple.SimpleFeature; +import org.opengis.feature.simple.SimpleFeatureType; +import org.xml.sax.SAXException; + +import com.ximple.eofms.filter.AbstractFLinkageDispatchableFilter; +import com.ximple.eofms.filter.ElementDispatchableFilter; +import com.ximple.eofms.filter.ElementDispatcher; +import com.ximple.eofms.filter.TypeCompIdDispatchableFilter; +import com.ximple.eofms.filter.TypeCompLevelIdDispatchableFilter; +import com.ximple.eofms.filter.TypeIdDispatchableFilter; +import com.ximple.io.dgn7.ComplexElement; +import com.ximple.io.dgn7.Element; +import com.ximple.io.dgn7.FrammeAttributeData; +import com.ximple.io.dgn7.UserAttributeData; + +public class DummyFeatureConvertEdbGeoJobContext extends AbstractDgnToEdbGeoJobContext { + static final Log logger = LogFactory.getLog(DummyFeatureConvertEdbGeoJobContext.class); + static final LoggerFacade sLogger = new CommonsLoggingLogger(logger); + + private String dataOut = null; + + private HashMap<String, ArrayList<SimpleFeature>> featuresContext = new HashMap<String, ArrayList<SimpleFeature>>(); + private HashMap<String, FeatureWriter> featuresWriterContext = new HashMap<String, FeatureWriter>(); + + private PessimisticMapWrapper txFeaturesContext; + + private ElementDispatcher elementDispatcher; + private String _filterConfig; + private boolean withIndex = false; + + public DummyFeatureConvertEdbGeoJobContext(String dataPath, DataStore targetDataStore, String targetSchema, + String filterConfig, boolean profileMode, + boolean useTransform) { + super(dataPath, targetDataStore, targetSchema, profileMode, useTransform); + txFeaturesContext = new PessimisticMapWrapper(featuresContext, sLogger); + _filterConfig = filterConfig; + elementDispatcher = createElementDispatcher(); + } + + private ElementDispatcher createElementDispatcher() { + try { + URL rulesURL = ElementDispatcher.class.getResource("ElementDispatcherRules.xml"); + assert rulesURL != null; + Digester digester = DigesterLoader.createDigester(rulesURL); + URL filterURL = null; + if (_filterConfig != null) { + File config = new File(_filterConfig); + if (config.exists()) { + filterURL = config.toURI().toURL(); + } + } + if (filterURL == null) { + // config = new File("conf/DefaultConvertShpFilter.xml"); + filterURL = this.getClass().getResource("/conf/DefaultConvertShpFilter.xml"); + // filterURL = this.getClass().getResource("/conf/ConvertShpFilterForLevel.xml"); + } + assert filterURL != null; + return (ElementDispatcher) digester.parse(filterURL); + } catch (UnsupportedEncodingException e) { + logger.info(e.getMessage(), e); + throw new RuntimeException(e.getMessage(), e); + } catch (MalformedURLException e) { + logger.info(e.getMessage(), e); + throw new RuntimeException(e.getMessage(), e); + } catch (IOException e) { + logger.info(e.getMessage(), e); + throw new RuntimeException(e.getMessage(), e); + } catch (SAXException e) { + logger.info(e.getMessage(), e); + throw new RuntimeException(e.getMessage(), e); + } + } + + public void putFeatureCollection(Element element) throws IllegalAttributeException, SchemaException { + assert elementDispatcher != null; + + if (element == null) { + logger.warn("Unknown Element:" + null); + return; + } + + // �P�_�O�_�ũM��� + SimpleFeature feature = elementDispatcher.execute(element, isTransformed()); + if (feature == null) { + FrammeAttributeData linkage = + AbstractFLinkageDispatchableFilter.getFeatureLinkage(element); + logger.warn("Unknown Element:" + element.getElementType().toString() + + ":type=" + element.getType() + ":lv=" + element.getLevelIndex() + ":id=" + + (linkage == null ? "NULL" : (linkage.getFsc() + "|" + linkage.getComponentID()))); + if (element instanceof ComplexElement) { + ComplexElement complex = (ComplexElement) element; + logger.warn("----Complex Element size=" + complex.size()); + } + + return; + } + + if (!txFeaturesContext.containsKey(feature.getFeatureType())) { + txFeaturesContext.put(feature.getFeatureType(), new ArrayList()); + } + ArrayList arrayList = (ArrayList) txFeaturesContext.get(feature.getFeatureType()); + arrayList.add(feature); + } + + public void startTransaction() { + assert elementDispatcher != null; + for (ElementDispatchableFilter filter : elementDispatcher.getRules()) { + if (filter instanceof TypeCompIdDispatchableFilter) { + ((TypeCompIdDispatchableFilter) filter).getCreateStrategy(); + } else if (filter instanceof TypeCompLevelIdDispatchableFilter) { + ((TypeCompIdDispatchableFilter) filter).getCreateStrategy(); + } else if (filter instanceof TypeIdDispatchableFilter) { + ((TypeCompIdDispatchableFilter) filter).getCreateStrategy(); + } + } + } + + public void commitTransaction() { + if (!txFeaturesContext.isEmpty()) { + logger.debug("Transaction size = " + txFeaturesContext.size()); + //txFeaturesContext.commitTransaction(); + } else { + logger.debug("Transaction is empty."); + } + + if (!featuresContext.isEmpty()) { + updateDataStore(); + } + } + + public void rollbackTransaction() { + //txFeaturesContext.rollbackTransaction(); + if (!featuresContext.isEmpty()) { + updateDataStore(); + } + } + + private void updateDataStore() { + Iterator it = featuresContext.keySet().iterator(); + + try { + while (it.hasNext()) { + SimpleFeatureType featureType = (SimpleFeatureType) it.next(); + logger.debug("Begin Save EdbGeo:" + featureType.getTypeName()); + + FeatureWriter writer; + if (featuresWriterContext.containsKey(featureType.getTypeName())) { + writer = featuresWriterContext.get(featureType.getTypeName()); + } else { + if (!isExistFeature(featureType)) { + getTargetDataStore().createSchema(featureType); + writer = getTargetDataStore().getFeatureWriter(featureType.getTypeName(), Transaction.AUTO_COMMIT); + } else { + writer = getTargetDataStore().getFeatureWriterAppend(featureType.getTypeName(), Transaction.AUTO_COMMIT); + } + featuresWriterContext.put(featureType.getTypeName(), writer); + } + + ArrayList<SimpleFeature> features = featuresContext.get(featureType); + Iterator itFeature = features.iterator(); + while (itFeature.hasNext()) { + SimpleFeature feature = (SimpleFeature) itFeature.next(); + ((SimpleFeature) writer.next()).setAttributes(feature.getAttributes()); + } + //writer.close(); + logger.debug("End Save EdbGeo:" + featureType.getTypeName()); + } + featuresContext.clear(); + } catch (MalformedURLException e) { + logger.error(e.getMessage(), e); + } catch (IllegalAttributeException e) { + logger.error(e.getMessage(), e); + } catch (IOException e) { + logger.error(e.getMessage(), e); + } + } + + public void closeFeatureWriter() throws IOException { + + for (FeatureWriter featureWriter : this.featuresWriterContext.values()) { + featureWriter.close(); + } + + this.featuresWriterContext.clear(); + } + + protected FrammeAttributeData getFeatureLinkage(Element element) { + if (!element.hasUserAttributeData()) + return null; + + List<UserAttributeData> usrDatas = element.getUserAttributeData(); + for (UserAttributeData anUsrData : usrDatas) { + if (anUsrData instanceof FrammeAttributeData) { + return (FrammeAttributeData) anUsrData; + } + } + return null; + } + + + public boolean isWithIndex() { + return withIndex; + } + + public void setWithIndex(boolean withIndex) { + this.withIndex = withIndex; + } + + public Log getLogger() { + return logger; + } +} diff --git a/xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/jobs/context/edbgeo/FeatureDgnConvertEdbGeoJobContext.java b/xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/jobs/context/edbgeo/FeatureDgnConvertEdbGeoJobContext.java new file mode 100644 index 0000000..826253b --- /dev/null +++ b/xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/jobs/context/edbgeo/FeatureDgnConvertEdbGeoJobContext.java @@ -0,0 +1,227 @@ +package com.ximple.eofms.jobs.context.edbgeo; + +import java.io.File; +import java.io.IOException; +import java.io.UnsupportedEncodingException; +import java.net.MalformedURLException; +import java.net.URL; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.Iterator; +import java.util.List; + +import org.apache.commons.digester.Digester; +import org.apache.commons.digester.xmlrules.DigesterLoader; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.apache.commons.transaction.memory.PessimisticMapWrapper; +import org.apache.commons.transaction.util.CommonsLoggingLogger; +import org.apache.commons.transaction.util.LoggerFacade; +import org.geotools.data.DataStore; +import org.geotools.data.FeatureWriter; +import org.geotools.data.Transaction; +import org.geotools.feature.IllegalAttributeException; +import org.geotools.feature.SchemaException; +import org.opengis.feature.simple.SimpleFeature; +import org.opengis.feature.simple.SimpleFeatureType; +import org.xml.sax.SAXException; + +import com.ximple.eofms.filter.AbstractFLinkageDispatchableFilter; +import com.ximple.eofms.filter.ElementDispatcher; +import com.ximple.io.dgn7.ComplexElement; +import com.ximple.io.dgn7.Element; +import com.ximple.io.dgn7.FrammeAttributeData; +import com.ximple.io.dgn7.UserAttributeData; + +public class FeatureDgnConvertEdbGeoJobContext extends AbstractDgnToEdbGeoJobContext { + static final Log logger = LogFactory.getLog(FeatureDgnConvertEdbGeoJobContext.class); + static final LoggerFacade sLogger = new CommonsLoggingLogger(logger); + + private HashMap<String, ArrayList<SimpleFeature>> featuresContext = new HashMap<String, ArrayList<SimpleFeature>>(); + private HashMap<String, FeatureWriter> featuresWriterContext = new HashMap<String, FeatureWriter>(); + + private PessimisticMapWrapper txFeaturesContext; + + private ElementDispatcher elementDispatcher; + private String _filterConfig; + private boolean withIndex = false; + + public FeatureDgnConvertEdbGeoJobContext(String dataPath, DataStore targetDataStore, String targetSchema, + String filterConfig, boolean profileMode, + boolean useTransform) { + super(dataPath, targetDataStore, targetSchema, profileMode, useTransform); + txFeaturesContext = new PessimisticMapWrapper(featuresContext, sLogger); + _filterConfig = filterConfig; + elementDispatcher = createElementDispatcher(); + } + + private ElementDispatcher createElementDispatcher() { + try { + URL rulesURL = ElementDispatcher.class.getResource("ElementDispatcherRules.xml"); + assert rulesURL != null; + Digester digester = DigesterLoader.createDigester(rulesURL); + URL filterURL = null; + if (_filterConfig != null) { + File config = new File(_filterConfig); + if (config.exists()) { + filterURL = config.toURI().toURL(); + } + } + if (filterURL == null) { + // config = new File("conf/DefaultConvertShpFilter.xml"); + filterURL = this.getClass().getResource("/conf/DefaultConvertShpFilter.xml"); + // filterURL = this.getClass().getResource("/conf/ConvertShpFilterForLevel.xml"); + } + assert filterURL != null; + return (ElementDispatcher) digester.parse(filterURL); + } catch (UnsupportedEncodingException e) { + logger.info(e.getMessage(), e); + throw new RuntimeException(e.getMessage(), e); + } catch (MalformedURLException e) { + logger.info(e.getMessage(), e); + throw new RuntimeException(e.getMessage(), e); + } catch (IOException e) { + logger.info(e.getMessage(), e); + throw new RuntimeException(e.getMessage(), e); + } catch (SAXException e) { + logger.info(e.getMessage(), e); + throw new RuntimeException(e.getMessage(), e); + } + } + + public void putFeatureCollection(Element element) throws IllegalAttributeException, SchemaException { + assert elementDispatcher != null; + + if (element == null) { + logger.warn("Unknown Element:" + null); + return; + } + + // �P�_�O�_�ũM��� + SimpleFeature feature = elementDispatcher.execute(element, isTransformed()); + if (feature == null) { + FrammeAttributeData linkage = + AbstractFLinkageDispatchableFilter.getFeatureLinkage(element); + logger.warn("Unknown Element:" + element.getElementType().toString() + + ":type=" + element.getType() + ":lv=" + element.getLevelIndex() + ":id=" + + (linkage == null ? "NULL" : (linkage.getFsc() + "|" + linkage.getComponentID()))); + if (element instanceof ComplexElement) { + ComplexElement complex = (ComplexElement) element; + logger.warn("----Complex Element size=" + complex.size()); + } + + return; + } + + if (!txFeaturesContext.containsKey(feature.getFeatureType())) { + txFeaturesContext.put(feature.getFeatureType(), new ArrayList()); + } + ArrayList<SimpleFeature> arrayList = (ArrayList<SimpleFeature>) txFeaturesContext.get(feature.getFeatureType()); + arrayList.add(feature); + } + + public void startTransaction() { + } + + public void commitTransaction() { + if (!txFeaturesContext.isEmpty()) { + logger.debug("Transaction size = " + txFeaturesContext.size()); + //txFeaturesContext.commitTransaction(); + } else { + logger.debug("Transaction is empty."); + } + + if (!featuresContext.isEmpty()) { + updateDataStore(); + } + } + + public void rollbackTransaction() { + //txFeaturesContext.rollbackTransaction(); + if (!featuresContext.isEmpty()) { + updateDataStore(); + } + } + + private void updateDataStore() { + Iterator it = featuresContext.keySet().iterator(); + + try { + while (it.hasNext()) { + SimpleFeatureType featureType = (SimpleFeatureType) it.next(); + logger.debug("Begin Save EdbGeo:" + featureType.getTypeName()); + + FeatureWriter writer; + if (featuresWriterContext.containsKey(featureType.getTypeName())) { + writer = featuresWriterContext.get(featureType.getTypeName()); + } else { + if (!isExistFeature(featureType)) { + getTargetDataStore().createSchema(featureType); + writer = getTargetDataStore().getFeatureWriter(featureType.getTypeName(), + Transaction.AUTO_COMMIT); + } else { + writer = getTargetDataStore().getFeatureWriterAppend(featureType.getTypeName(), + Transaction.AUTO_COMMIT); + } + featuresWriterContext.put(featureType.getTypeName(), writer); + } + + ArrayList<SimpleFeature> features = featuresContext.get(featureType); + Iterator itFeature = features.iterator(); + while (itFeature.hasNext()) { + SimpleFeature feature = (SimpleFeature) itFeature.next(); + ((SimpleFeature) writer.next()).setAttributes(feature.getAttributes()); + } + //writer.close(); + logger.debug("End Save EdbGeo:" + featureType.getTypeName()); + } + featuresContext.clear(); + } catch (MalformedURLException e) { + logger.error(e.getMessage(), e); + } catch (IllegalAttributeException e) { + logger.error(e.getMessage(), e); + } catch (IOException e) { + logger.error(e.getMessage(), e); + } + } + + public void closeFeatureWriter() { + this.featuresWriterContext.clear(); + + try { + for (FeatureWriter featureWriter : this.featuresWriterContext.values()) { + featureWriter.close(); + } + } catch (IOException e) { + logger.warn(e.getMessage(), e); + } + + this.featuresWriterContext.clear(); + } + + protected FrammeAttributeData getFeatureLinkage(Element element) { + if (!element.hasUserAttributeData()) + return null; + + List<UserAttributeData> usrDatas = element.getUserAttributeData(); + for (UserAttributeData anUsrData : usrDatas) { + if (anUsrData instanceof FrammeAttributeData) { + return (FrammeAttributeData) anUsrData; + } + } + return null; + } + + + public boolean isWithIndex() { + return withIndex; + } + + public void setWithIndex(boolean withIndex) { + this.withIndex = withIndex; + } + + public Log getLogger() { + return logger; + } +} diff --git a/xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/jobs/context/edbgeo/GeneralDgnConvertEdbGeoJobContext.java b/xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/jobs/context/edbgeo/GeneralDgnConvertEdbGeoJobContext.java new file mode 100644 index 0000000..3fa04e7 --- /dev/null +++ b/xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/jobs/context/edbgeo/GeneralDgnConvertEdbGeoJobContext.java @@ -0,0 +1,574 @@ +package com.ximple.eofms.jobs.context.edbgeo; + +import java.io.IOException; +import java.math.BigDecimal; +import java.math.RoundingMode; +import java.sql.Connection; +import java.sql.PreparedStatement; +import java.sql.SQLException; +import java.sql.Statement; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.Iterator; +import java.util.List; +import java.util.TreeMap; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.apache.commons.transaction.util.CommonsLoggingLogger; +import org.apache.commons.transaction.util.LoggerFacade; +import org.geotools.data.DataStore; +import org.geotools.data.Transaction; +import org.geotools.data.jdbc.JDBCUtils; +import org.geotools.feature.IllegalAttributeException; +import org.geotools.feature.SchemaException; +import org.geotools.feature.simple.SimpleFeatureBuilder; +import org.geotools.feature.simple.SimpleFeatureTypeBuilder; +import org.geotools.feature.type.FeatureTypeImpl; +import org.geotools.geometry.jts.JTSFactoryFinder; +import org.opengis.feature.simple.SimpleFeature; +import org.opengis.feature.simple.SimpleFeatureType; +import com.edb.util.PSQLException; + +import com.vividsolutions.jts.geom.Geometry; +import com.vividsolutions.jts.geom.GeometryFactory; + +import com.ximple.eofms.util.DefaultColorTable; +import com.ximple.eofms.util.FeatureTypeBuilderUtil; +import com.ximple.eofms.util.GeometryConverterDecorator; +import com.ximple.io.dgn7.ArcElement; +import com.ximple.io.dgn7.ComplexChainElement; +import com.ximple.io.dgn7.Element; +import com.ximple.io.dgn7.EllipseElement; +import com.ximple.io.dgn7.FrammeAttributeData; +import com.ximple.io.dgn7.LineElement; +import com.ximple.io.dgn7.LineStringElement; +import com.ximple.io.dgn7.ShapeElement; +import com.ximple.io.dgn7.TextElement; +import com.ximple.io.dgn7.TextNodeElement; +import com.ximple.io.dgn7.UserAttributeData; + +public class GeneralDgnConvertEdbGeoJobContext extends AbstractDgnToEdbGeoJobContext { + static final Log logger = LogFactory.getLog(GeneralDgnConvertEdbGeoJobContext.class); + static final LoggerFacade sLogger = new CommonsLoggingLogger(logger); + static final GeometryFactory geometryFactory = JTSFactoryFinder.getGeometryFactory(null); + + private HashMap<SimpleFeatureType, ArrayList<SimpleFeature>> txFeaturesContext = new HashMap<SimpleFeatureType, ArrayList<SimpleFeature>>(); + + private TreeMap<String, SimpleFeatureType> featureTypes = new TreeMap<String, SimpleFeatureType>(); + + private GeometryConverterDecorator convertDecorator = null; + private String featureBaseName = null; + private boolean dropTableMode = true; + + private int accumulate = 0; + + public GeneralDgnConvertEdbGeoJobContext(String dataPath, DataStore targetDataStore, String targetSchema, + boolean profileMode, boolean useTransform) { + super(dataPath, targetDataStore, targetSchema, profileMode, useTransform); + } + + public void putFeatureCollection(Element element) throws IllegalAttributeException, SchemaException { + SimpleFeatureType ft = lookupFeatureType(element); + if (ft != null) { + boolean canLog = true; + SimpleFeature feature = null; + try { + feature = createFeature(ft, element); + } catch (ArrayIndexOutOfBoundsException e) { + getLogger().warn(e.getMessage(), e); + canLog = false; + } catch (ClassCastException e) { + getLogger().warn(e.getMessage(), e); + } + + if (feature == null) { + if (!canLog) return; + + if (element instanceof TextElement) + logger.info("cannot craete feature." + element.toString() + "'" + + ((TextElement) element).getText() + "'"); + else if (element instanceof ShapeElement) + logger.info("cannot craete feature." + element.toString() + "'" + + ((ShapeElement) element).getVerticeSize() + "'" + + ((ShapeElement) element).getStartPoint()); + else if (element instanceof LineStringElement) + logger.info("cannot craete feature." + element.toString() + "'" + + ((LineStringElement) element).getVerticeSize() + "'" + + ((LineStringElement) element).getStartPoint()); + else if (element instanceof ArcElement) + logger.info("cannot craete feature." + element.toString() + "'" + + ((ArcElement) element).getOrigin().toString() + "'" + + ((ArcElement) element).getRotationAngle()); + + return; + } + + if (!txFeaturesContext.containsKey(feature.getFeatureType())) { + txFeaturesContext.put(feature.getFeatureType(), new ArrayList<SimpleFeature>()); + } + ArrayList<SimpleFeature> arrayList = txFeaturesContext.get(feature.getFeatureType()); + if (feature.getDefaultGeometry() != null && !((Geometry)feature.getDefaultGeometry()).isEmpty()) { + arrayList.add(feature); + accumulate++; + } + } else { + logger.info("Unknown Element :" + element.getType() + ", lv=" + element.getLevelIndex()); + } + + if (accumulate > BATCHSIZE) { + commitTransaction(); + } + } + + // private Transaction transaction; + + public void startTransaction() { + } + + public void commitTransaction() { + if (!txFeaturesContext.isEmpty()) { + logger.debug("Transaction size = " + txFeaturesContext.size()); + //txFeaturesContext.commitTransaction(); + } else { + logger.debug("Transaction is empty."); + } + + if (!txFeaturesContext.isEmpty()) { + updateDataStore(); + } + } + + public void rollbackTransaction() { + } + + private void updateDataStore() { + if (isProfileMode()) markUpdateTime(); + Iterator<SimpleFeatureType> it = txFeaturesContext.keySet().iterator(); + Connection conn = null; + try { + conn = getConnection(); + boolean autoCommit = conn.getAutoCommit(); + conn.setAutoCommit(false); + + while (it.hasNext()) { + SimpleFeatureType featureType = it.next(); + logger.debug("Begin Save into EdbGeo:" + featureType.getTypeName()); + + String bindingStmt = makePrepareInsertSql(featureType); + ArrayList<SimpleFeature> features = txFeaturesContext.get(featureType); + PreparedStatement pstmt = conn.prepareStatement(bindingStmt); + + for (SimpleFeature feature : features) { + // currentStmt = feature; + // Statement stmt = conn.createStatement(); + try { + // stmt.execute(feature); + bindFeatureParameters(pstmt, feature); + // pstmt.execute(); + pstmt.addBatch(); + } catch (PSQLException e) { + if (bindingStmt != null) { + logger.error("Execute:" + bindingStmt); + } + logger.error(e.getServerErrorMessage()); + logger.error(e.getMessage(), e); + } + } + + int[] numUpdates = pstmt.executeBatch(); + for (int i = 0; i < numUpdates.length; i++) { + if (numUpdates[i] == -2) + logger.warn("Execution " + i + ": unknown number of rows updated"); + } + conn.commit(); + + JDBCUtils.close(pstmt); + features.clear(); + logger.debug("End Save into EdbGeo:" + featureType.getTypeName()); + } + conn.setAutoCommit(autoCommit); + JDBCUtils.close(conn, Transaction.AUTO_COMMIT, null); + accumulate = 0; + } catch (SQLException e) { + JDBCUtils.close(conn, Transaction.AUTO_COMMIT, e); + logger.error(e.getMessage(), e); + } finally { + if (isProfileMode()) accumulateUpdateTime(); + } + } + + public void closeFeatureWriter() { + txFeaturesContext.clear(); + /* + for (FeatureWriter featureWriter : this.featuresWriterContext.values()) + { + featureWriter.close(); + } + + this.featuresWriterContext.clear(); + */ + } + + public SimpleFeatureType createPointFeatureElement(String featureName) throws SchemaException { + if (!featureTypes.containsKey(featureName)) { + SimpleFeatureTypeBuilder typeBuilder = FeatureTypeBuilderUtil.createNormalPointFeatureTypeBuilder(featureName); + SimpleFeatureType featureType = typeBuilder.buildFeatureType(); + featureTypes.put(featureName, featureType); + clearFeatureData(typeBuilder); + } + return featureTypes.get(featureName); + } + + public SimpleFeatureType createPolygonFeatureElement(String featureName) throws SchemaException { + if (!featureTypes.containsKey(featureName)) { + SimpleFeatureTypeBuilder typeBuilder = FeatureTypeBuilderUtil.createNormalPolygonFeatureTypeBuilder(featureName); + SimpleFeatureType featureType = typeBuilder.buildFeatureType(); + featureTypes.put(featureName, featureType); + clearFeatureData(typeBuilder); + } + return featureTypes.get(featureName); + } + + public SimpleFeatureType createLineFeatureElement(String featureName) throws SchemaException { + if (!featureTypes.containsKey(featureName)) { + SimpleFeatureTypeBuilder typeBuilder = FeatureTypeBuilderUtil.createNormalLineFeatureTypeBuilder(featureName); + SimpleFeatureType featureType = typeBuilder.buildFeatureType(); + featureTypes.put(featureName, featureType); + clearFeatureData(typeBuilder); + } + return featureTypes.get(featureName); + } + + public SimpleFeatureType createMultiLineFeatureElement(String featureName) throws SchemaException { + if (!featureTypes.containsKey(featureName)) { + SimpleFeatureTypeBuilder typeBuilder = FeatureTypeBuilderUtil.createNormalMultiLineFeatureTypeBuilder(featureName); + SimpleFeatureType featureType = typeBuilder.buildFeatureType(); + featureTypes.put(featureName, featureType); + clearFeatureData(typeBuilder); + } + return featureTypes.get(featureName); + } + + public SimpleFeatureType createArcFeatureElement(String featureName) throws SchemaException { + if (!featureTypes.containsKey(featureName)) { + SimpleFeatureTypeBuilder typeBuilder = FeatureTypeBuilderUtil.createNormalArcFeatureTypeBuilder(featureName); + SimpleFeatureType featureType = typeBuilder.buildFeatureType(); + featureTypes.put(featureName, featureType); + clearFeatureData(typeBuilder); + } + return featureTypes.get(featureName); + } + + public SimpleFeatureType createEllipseFeatureElement(String featureName) throws SchemaException { + if (!featureTypes.containsKey(featureName)) { + SimpleFeatureTypeBuilder typeBuilder = FeatureTypeBuilderUtil.createNormalEllipseFeatureTypeBuilder(featureName); + SimpleFeatureType featureType = typeBuilder.buildFeatureType(); + featureTypes.put(featureName, featureType); + clearFeatureData(typeBuilder); + } + return featureTypes.get(featureName); + } + + public SimpleFeature createFeature(SimpleFeatureType featureType, Element element) throws IllegalAttributeException { + DefaultColorTable colorTable = (DefaultColorTable) DefaultColorTable.getInstance(); + if (element instanceof TextElement) { + TextElement textElement = (TextElement) element; + convertDecorator.setConverter(textElement); + + Geometry geom = convertDecorator.toGeometry(geometryFactory); + double angle = textElement.getRotationAngle(); + String content = textElement.getText(); + content = content.replace('\u0000', ' '); + angle = BigDecimal.valueOf(angle).setScale(3, RoundingMode.HALF_UP).doubleValue(); + if (geom != null) { + return SimpleFeatureBuilder.build(featureType, new Object[]{ + geom, + colorTable.getColorCode(textElement.getColorIndex()), + textElement.getFontIndex(), + textElement.getJustification(), + textElement.getTextHeight(), + textElement.getTextWidth(), + angle, + content + }, null); + } else { + logger.info("geometry is null." + element.toString()); + } + return null; + } else if (element instanceof TextNodeElement) { + TextNodeElement textNodeElement = (TextNodeElement) element; + convertDecorator.setConverter(textNodeElement); + + Geometry geom = convertDecorator.toGeometry(geometryFactory); + double angle = textNodeElement.getRotationAngle(); + angle = BigDecimal.valueOf(angle).setScale(3, RoundingMode.HALF_UP).doubleValue(); + String[] texts = textNodeElement.getTextArray(); + StringBuilder sb = new StringBuilder(); + for (String text : texts) { + if (sb.length() != 0) + sb.append("\n"); + String content = text.replace('\u0000', ' '); + sb.append(content); + } + + if (geom != null) { + return SimpleFeatureBuilder.build(featureType, new Object[]{ + geom, + colorTable.getColorCode(textNodeElement.getColorIndex()), + textNodeElement.getFontIndex(), + textNodeElement.getJustification(), + textNodeElement.getTextNodeHeight(), + textNodeElement.getTextNodeLength(), + angle, + sb.toString() + }, null); + } else { + logger.info("geometry is null." + element.toString()); + } + return null; + } else if (element instanceof ShapeElement) { + ShapeElement shapeElement = (ShapeElement) element; + convertDecorator.setConverter(shapeElement); + Geometry geom = convertDecorator.toGeometry(geometryFactory); + if (geom != null) { + return SimpleFeatureBuilder.build(featureType, new Object[]{ + geom, + colorTable.getColorCode(shapeElement.getColorIndex()), + shapeElement.getWeight(), + shapeElement.getLineStyle() + }, null); + } else { + logger.info("geometry is null." + element.toString()); + } + return null; + } else if (element instanceof LineStringElement) { + LineStringElement linestring = (LineStringElement) element; + convertDecorator.setConverter(linestring); + Geometry geom = convertDecorator.toGeometry(geometryFactory); + if (geom != null) { + return SimpleFeatureBuilder.build(featureType, new Object[]{ + geom, + colorTable.getColorCode(linestring.getColorIndex()), + linestring.getWeight(), + linestring.getLineStyle() + }, null); + } + return null; + } else if (element instanceof LineElement) { + LineElement line = (LineElement) element; + convertDecorator.setConverter(line); + Geometry geom = convertDecorator.toGeometry(geometryFactory); + if (geom != null) { + return SimpleFeatureBuilder.build(featureType, new Object[]{ + geom, + colorTable.getColorCode(line.getColorIndex()), + line.getWeight(), + line.getLineStyle() + }, null); + } + return null; + } else if (element instanceof ArcElement) { + ArcElement arcElement = (ArcElement) element; + /* + logger.fatal("" + arcElement.getPrimary() + ":" + arcElement.getSecondary() + + "-" + arcElement.getStartAngle() + ":" + arcElement.getSweepAngle() + ":" + + arcElement.getRotationAngle() + ":" + arcElement.getOrigin()); + */ + convertDecorator.setConverter(arcElement); + Geometry geom = convertDecorator.toGeometry(geometryFactory); + if (geom != null) { + return SimpleFeatureBuilder.build(featureType, new Object[]{ + geom, + colorTable.getColorCode(arcElement.getColorIndex()), + arcElement.getWeight(), + arcElement.getLineStyle() + }, null); + } + return null; + } else if (element instanceof EllipseElement) { + EllipseElement arcElement = (EllipseElement) element; + convertDecorator.setConverter(arcElement); + Geometry geom = convertDecorator.toGeometry(geometryFactory); + if (geom != null) { + return SimpleFeatureBuilder.build(featureType, new Object[]{ + geom, + colorTable.getColorCode(arcElement.getColorIndex()), + arcElement.getWeight(), + arcElement.getLineStyle() + }, null); + } + return null; + } else if (element instanceof ComplexChainElement) { + ComplexChainElement complexChainElement = (ComplexChainElement) element; + convertDecorator.setConverter(complexChainElement); + Geometry geom = convertDecorator.toGeometry(geometryFactory); + if (geom != null) { + return SimpleFeatureBuilder.build(featureType, new Object[]{ + geom, + colorTable.getColorCode(complexChainElement.getColorIndex()), + complexChainElement.getWeight(), + complexChainElement.getLineStyle() + }, null); + } + return null; + } + return null; + } + + private String getFeatureBaseName() { + if (featureBaseName == null) { + String dgnname = getFilename().toLowerCase(); + int i = dgnname.lastIndexOf("."); + if (i != -1) { + dgnname = dgnname.substring(0, i); + } + featureBaseName = dgnname; + } + return featureBaseName; + } + + private SimpleFeatureType lookupFeatureType(Element element) throws SchemaException, IllegalAttributeException { + String typeName; + if (element instanceof TextElement) { + typeName = getFeatureBaseName() + "_P"; + typeName = typeName.toLowerCase(); + if (!featureTypes.containsKey(typeName)) { + featureTypes.put(typeName, createPointFeatureElement(typeName)); + } + return featureTypes.get(typeName); + } else if (element instanceof TextNodeElement) { + typeName = getFeatureBaseName() + "_P"; + typeName = typeName.toLowerCase(); + if (!featureTypes.containsKey(typeName)) { + featureTypes.put(typeName, createPointFeatureElement(typeName)); + } + return featureTypes.get(typeName); + } else if (element instanceof LineStringElement) { + if (element instanceof ShapeElement) { + typeName = getFeatureBaseName() + "_R"; + typeName = typeName.toLowerCase(); + if (!featureTypes.containsKey(typeName)) { + featureTypes.put(typeName, createPolygonFeatureElement(typeName)); + } + return featureTypes.get(typeName); + } else { + typeName = getFeatureBaseName() + "_L"; + typeName = typeName.toLowerCase(); + if (!featureTypes.containsKey(typeName)) { + featureTypes.put(typeName, createLineFeatureElement(typeName)); + } + return featureTypes.get(typeName); + } + } else if (element instanceof LineElement) { + typeName = getFeatureBaseName() + "_L"; + typeName = typeName.toLowerCase(); + if (!featureTypes.containsKey(typeName)) { + featureTypes.put(typeName, createLineFeatureElement(typeName)); + } + return featureTypes.get(typeName); + } else if (element instanceof ComplexChainElement) { + typeName = getFeatureBaseName() + "_ML"; + typeName = typeName.toLowerCase(); + if (!featureTypes.containsKey(typeName)) { + featureTypes.put(typeName, createMultiLineFeatureElement(typeName)); + } + return featureTypes.get(typeName); + } else if (element instanceof ArcElement) { + typeName = getFeatureBaseName() + "_A"; + typeName = typeName.toLowerCase(); + if (!featureTypes.containsKey(typeName)) { + featureTypes.put(typeName, createArcFeatureElement(typeName)); + } + return featureTypes.get(typeName); + } else if (element instanceof EllipseElement) { + typeName = getFeatureBaseName() + "_R"; + typeName = typeName.toLowerCase(); + if (!featureTypes.containsKey(typeName)) { + featureTypes.put(typeName, createEllipseFeatureElement(typeName)); + } + return featureTypes.get(typeName); + } + + return null; + } + + protected FrammeAttributeData getFeatureLinkage(Element element) { + if (!element.hasUserAttributeData()) + return null; + + List<UserAttributeData> usrDatas = element.getUserAttributeData(); + for (UserAttributeData anUsrData : usrDatas) { + if (anUsrData instanceof FrammeAttributeData) { + return (FrammeAttributeData) anUsrData; + } + } + return null; + } + + public Log getLogger() { + return logger; + } + + public boolean isDropTableMode() { + return dropTableMode; + } + + public void setDropTableMode(boolean dropTableMode) { + this.dropTableMode = dropTableMode; + } + + protected void clearFeatureData(SimpleFeatureTypeBuilder typeBuilder) throws SchemaException { + if (isProfileMode()) markUpdateTime(); + + String featureName = typeBuilder.getName(); + Connection conn = null; + if (isExistFeature(typeBuilder.buildFeatureType())) { + try { + conn = getConnection(); + if (dropTableMode) { + dropGeometryColumn(conn, featureName, + ((FeatureTypeImpl)typeBuilder.buildFeatureType()).getGeometryDescriptor().getLocalName()); + dropTable(conn, featureName); + + ArrayList<String> schemaTexts = createNewSchemaTexts(conn, typeBuilder.buildFeatureType()); + for (String stmtText : schemaTexts) { + Statement stmt = conn.createStatement(); + stmt.execute(stmtText); + JDBCUtils.close(stmt); + } + } else { + deleteTable(conn, featureName); + } + JDBCUtils.close(conn, Transaction.AUTO_COMMIT, null); + } catch (IOException e) { + JDBCUtils.close(conn, Transaction.AUTO_COMMIT, null); + logger.warn(e.getMessage(), e); + } catch (SQLException e) { + JDBCUtils.close(conn, Transaction.AUTO_COMMIT, e); + logger.warn(e.getMessage(), e); + } finally { + if (isProfileMode()) accumulateUpdateTime(); + } + } else { + try { + conn = getConnection(); + ArrayList<String> schemaTexts = createNewSchemaTexts(conn, typeBuilder.buildFeatureType()); + for (String stmtText : schemaTexts) { + Statement stmt = conn.createStatement(); + stmt.execute(stmtText); + JDBCUtils.close(stmt); + } + JDBCUtils.close(conn, Transaction.AUTO_COMMIT, null); + } catch (IOException e) { + JDBCUtils.close(conn, Transaction.AUTO_COMMIT, null); + logger.warn(e.getMessage(), e); + } catch (SQLException e) { + JDBCUtils.close(conn, Transaction.AUTO_COMMIT, e); + logger.warn(e.getMessage(), e); + } finally { + if (isProfileMode()) accumulateUpdateTime(); + } + } + } +} diff --git a/xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/jobs/context/edbgeo/IndexDgnConvertEdbGeoJobContext.java b/xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/jobs/context/edbgeo/IndexDgnConvertEdbGeoJobContext.java new file mode 100644 index 0000000..441b340 --- /dev/null +++ b/xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/jobs/context/edbgeo/IndexDgnConvertEdbGeoJobContext.java @@ -0,0 +1,838 @@ +package com.ximple.eofms.jobs.context.edbgeo; + +import java.io.IOException; +import java.math.BigDecimal; +import java.math.RoundingMode; +import java.sql.Connection; +import java.sql.PreparedStatement; +import java.sql.SQLException; +import java.sql.Statement; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.HashMap; +import java.util.Iterator; +import java.util.List; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.apache.commons.transaction.util.CommonsLoggingLogger; +import org.apache.commons.transaction.util.LoggerFacade; +import org.geotools.data.DataStore; +import org.geotools.data.Transaction; +import org.geotools.data.jdbc.JDBCUtils; +import org.geotools.feature.IllegalAttributeException; +import org.geotools.feature.SchemaException; +import org.geotools.feature.simple.SimpleFeatureBuilder; +import org.geotools.feature.simple.SimpleFeatureTypeBuilder; +import org.geotools.feature.type.FeatureTypeImpl; +import org.geotools.geometry.jts.JTSFactoryFinder; +import org.opengis.feature.simple.SimpleFeature; +import org.opengis.feature.simple.SimpleFeatureType; +import com.edb.util.PSQLException; + +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.Polygon; + +import com.ximple.eofms.util.DefaultColorTable; +import com.ximple.eofms.util.FeatureTypeBuilderUtil; +import com.ximple.eofms.util.GeometryConverterDecorator; +import com.ximple.eofms.util.TPCLIDConverter; +import com.ximple.eofms.util.TWDDatumConverter; +import com.ximple.io.dgn7.Element; +import com.ximple.io.dgn7.FrammeAttributeData; +import com.ximple.io.dgn7.ShapeElement; +import com.ximple.io.dgn7.TextElement; +import com.ximple.io.dgn7.UserAttributeData; + +public class IndexDgnConvertEdbGeoJobContext extends AbstractDgnToEdbGeoJobContext { + static final Log logger = LogFactory.getLog(IndexDgnConvertEdbGeoJobContext.class); + static final LoggerFacade sLogger = new CommonsLoggingLogger(logger); + static final GeometryFactory geometryFactory = JTSFactoryFinder.getGeometryFactory(null); + + private HashMap<SimpleFeatureType, ArrayList<SimpleFeature>> txFeaturesContext = + new HashMap<SimpleFeatureType, ArrayList<SimpleFeature>>(); + + private SimpleFeatureTypeBuilder typeBuilderPnt = null; + private SimpleFeatureTypeBuilder typeBuilderRect = null; + private SimpleFeatureTypeBuilder typeBuilderSmallRect = null; + + private SimpleFeatureType featureType = null; + private SimpleFeatureType featureType2 = null; + private SimpleFeatureType featureType3 = null; + + private boolean dropTableMode = true; + private int accumulate = 0; + + public IndexDgnConvertEdbGeoJobContext(String dataPath, DataStore targetDataStore, String targetSchema, + boolean profileMode, boolean useTransform) { + super(dataPath, targetDataStore, targetSchema, profileMode, useTransform); + } + + public void putFeatureCollection(Element element) throws IllegalAttributeException, SchemaException { + if ((!(element instanceof TextElement)) && (!(element instanceof ShapeElement))) { + return; + } + + if ((element instanceof TextElement)) { + putTextFeatureCollection((TextElement) element); + } + + if ((element instanceof ShapeElement)) { + putShapeFeatureCollection((ShapeElement) element); + } + } + + protected void putTextFeatureCollection(TextElement element) throws SchemaException, IllegalAttributeException { + SimpleFeature feature = createFeature(element); + if (feature == null) { + logger.info("cannot craete feature." + element.toString() + "'" + + element.getText() + "'"); + return; + } + + if (!txFeaturesContext.containsKey(feature.getFeatureType())) { + txFeaturesContext.put(feature.getFeatureType(), new ArrayList<SimpleFeature>()); + } + ArrayList<SimpleFeature> arrayList = txFeaturesContext.get(feature.getFeatureType()); + arrayList.add(feature); + + feature = createFeature2(element); + if (feature == null) { + logger.info("cannot craete feature2." + element.toString() + "'" + + element.getText() + "'"); + return; + } + + if (!txFeaturesContext.containsKey(feature.getFeatureType())) { + txFeaturesContext.put(feature.getFeatureType(), new ArrayList<SimpleFeature>()); + } + arrayList = txFeaturesContext.get(feature.getFeatureType()); + arrayList.add(feature); + + SimpleFeature[] features = createFeature3(element); + if (features == null) { + logger.info("cannot craete feature3." + element.toString() + "'" + + element.getText() + "'"); + return; + } + if (!txFeaturesContext.containsKey(features[0].getFeatureType())) { + txFeaturesContext.put(features[0].getFeatureType(), new ArrayList<SimpleFeature>()); + } + arrayList = txFeaturesContext.get(features[0].getFeatureType()); + arrayList.addAll(Arrays.asList(features)); + + accumulate++; + + if (accumulate > BATCHSIZE) { + commitTransaction(); + } + } + + protected void putShapeFeatureCollection(ShapeElement element) throws SchemaException, IllegalAttributeException { + SimpleFeature feature = createFeature(element); + if (feature == null) { + Polygon polygon = (Polygon) element.toGeometry(geometryFactory); + if (polygon == null) { + logger.info("cannot craete feature." + element.toString() + "'" + + "linear is null" + "'"); + } else { + Coordinate pt = polygon.getEnvelopeInternal().centre(); + String id = TPCLIDConverter.CoordinateToTpclId(pt); + logger.info("cannot craete feature." + element.toString() + "'" + + id + "'- from pt=" + pt); + } + return; + } + + if (!txFeaturesContext.containsKey(feature.getFeatureType())) { + txFeaturesContext.put(feature.getFeatureType(), new ArrayList<SimpleFeature>()); + } + ArrayList<SimpleFeature> arrayList = txFeaturesContext.get(feature.getFeatureType()); + arrayList.add(feature); + + feature = createFeature2(element); + if (feature == null) { + Polygon polygon = (Polygon) element.toGeometry(geometryFactory); + if (polygon == null) { + logger.info("cannot craete feature2." + element.toString() + "'" + + "linear is null" + "'"); + } else { + Coordinate pt = polygon.getEnvelopeInternal().centre(); + String id = TPCLIDConverter.CoordinateToTpclId(pt); + logger.info("cannot craete feature2." + element.toString() + "'" + + id + "'- from pt=" + pt); + } + return; + } + + if (!txFeaturesContext.containsKey(feature.getFeatureType())) { + txFeaturesContext.put(feature.getFeatureType(), new ArrayList<SimpleFeature>()); + } + arrayList = txFeaturesContext.get(feature.getFeatureType()); + arrayList.add(feature); + + SimpleFeature[] features = createFeature3(element); + if (features == null) { + Polygon polygon = (Polygon) element.toGeometry(geometryFactory); + if (polygon == null) { + logger.info("cannot craete feature3." + element.toString() + "'" + + "linear is null" + "'"); + } else { + Coordinate pt = polygon.getEnvelopeInternal().centre(); + String id = TPCLIDConverter.CoordinateToTpclId(pt); + logger.info("cannot craete feature3." + element.toString() + "'" + + id + "'- from pt=" + pt); + } + return; + } + if (!txFeaturesContext.containsKey(features[0].getFeatureType())) { + txFeaturesContext.put(features[0].getFeatureType(), new ArrayList<SimpleFeature>()); + } + arrayList = txFeaturesContext.get(features[0].getFeatureType()); + arrayList.addAll(Arrays.asList(features)); + + accumulate++; + + if (accumulate > BATCHSIZE) { + commitTransaction(); + } + } + + public void startTransaction() { + } + + public void commitTransaction() { + if (!txFeaturesContext.isEmpty()) { + logger.debug("Transaction size = " + txFeaturesContext.size()); + } else { + logger.debug("Transaction is empty."); + } + + if (!txFeaturesContext.isEmpty()) { + updateDataStore(); + } + } + + public void rollbackTransaction() { + } + + private void updateDataStore() { + if (isProfileMode()) markUpdateTime(); + + Iterator<SimpleFeatureType> it = txFeaturesContext.keySet().iterator(); + Connection conn = null; + try { + conn = getConnection(); + boolean autoCommit = conn.getAutoCommit(); + conn.setAutoCommit(false); + + while (it.hasNext()) { + SimpleFeatureType featureType = it.next(); + logger.debug("Begin Save EdbGeo:" + featureType.getTypeName()); + + String bindingStmt = makePrepareInsertSql(featureType); + ArrayList<SimpleFeature> features = txFeaturesContext.get(featureType); + PreparedStatement pstmt = conn.prepareStatement(bindingStmt); + + for (SimpleFeature feature : features) { + // currentStmt = feature; + // Statement stmt = conn.createStatement(); + try { + // stmt.execute(feature); + bindFeatureParameters(pstmt, feature); + // pstmt.execute(); + pstmt.addBatch(); + } catch (PSQLException e) { + if (bindingStmt != null) { + logger.error("Execute:" + bindingStmt); + } + logger.error(e.getServerErrorMessage()); + logger.error(e.getMessage(), e); + /* + } finally { + stmt.close(); + */ + } + } + /* + if ((i % BATCHSIZE) != 0) + { + stmt.executeBatch(); + } + stmt.close(); + */ + int[] numUpdates = pstmt.executeBatch(); + for (int i = 0; i < numUpdates.length; i++) { + if (numUpdates[i] == -2) + logger.warn("Execution " + i + ": unknown number of rows updated"); + } + conn.commit(); + + pstmt.close(); + features.clear(); + + logger.debug("End Save EdbGeo:" + featureType.getTypeName()); + } + accumulate = 0; + conn.setAutoCommit(autoCommit); + JDBCUtils.close(conn, Transaction.AUTO_COMMIT, null); + } catch (PSQLException e) { + JDBCUtils.close(conn, Transaction.AUTO_COMMIT, e); + logger.error(e.getServerErrorMessage()); + logger.error(e.getMessage(), e); + } catch (SQLException e) { + JDBCUtils.close(conn, Transaction.AUTO_COMMIT, e); + logger.error(e.getMessage(), e); + } finally { + if (isProfileMode()) this.accumulateUpdateTime(); + } + } + + public void closeFeatureWriter() { + txFeaturesContext.clear(); + /* + for (FeatureWriter featureWriter : this.featuresWriterContext.values()) + { + featureWriter.close(); + } + + this.featuresWriterContext.clear(); + */ + } + + public SimpleFeatureType createFeatureElement(String featureName) throws SchemaException { + if (typeBuilderRect == null) { + Connection conn = null; + typeBuilderRect = FeatureTypeBuilderUtil.createNormalIndexFeatureTypeBuilder(featureName); + if (isExistFeature(typeBuilderRect.buildFeatureType())) { + try { + conn = getConnection(); + if (dropTableMode) { + try { + dropGeometryColumn(conn, featureName, + ((FeatureTypeImpl)typeBuilderRect.buildFeatureType()).getGeometryDescriptor().getLocalName()); + } catch (PSQLException e) { + logger.debug(e.getMessage(), e); + } + try { + dropTable(conn, featureName); + } catch (PSQLException e) { + logger.debug(e.getMessage(), e); + } + ArrayList<String> schemaTexts = createNewSchemaTexts(conn, + typeBuilderRect.buildFeatureType()); + for (String stmtText : schemaTexts) { + Statement stmt = conn.createStatement(); + stmt.execute(stmtText); + JDBCUtils.close(stmt); + } + } else { + deleteTable(conn, featureName); + } + JDBCUtils.close(conn, Transaction.AUTO_COMMIT, null); + } catch (IOException e) { + JDBCUtils.close(conn, Transaction.AUTO_COMMIT, null); + logger.warn(e.getMessage(), e); + } catch (SQLException e) { + JDBCUtils.close(conn, Transaction.AUTO_COMMIT, e); + logger.warn(e.getMessage(), e); + } + } else { + try { + conn = getConnection(); + ArrayList<String> schemaTexts = createNewSchemaTexts(conn, + typeBuilderRect.buildFeatureType()); + for (String stmtText : schemaTexts) { + Statement stmt = conn.createStatement(); + stmt.execute(stmtText); + JDBCUtils.close(stmt); + } + JDBCUtils.close(conn, Transaction.AUTO_COMMIT, null); + } catch (IOException e) { + JDBCUtils.close(conn, Transaction.AUTO_COMMIT, null); + logger.warn(e.getMessage(), e); + } catch (SQLException e) { + JDBCUtils.close(conn, Transaction.AUTO_COMMIT, e); + logger.warn(e.getMessage(), e); + } + } + } + return typeBuilderRect.buildFeatureType(); + } + + public SimpleFeatureType createFeatureElement2(String featureName) throws SchemaException { + if (typeBuilderPnt == null) { + Connection conn = null; + typeBuilderPnt = FeatureTypeBuilderUtil.createNormalIndexTextFeatureTypeBuilder(featureName); + if (isExistFeature(typeBuilderPnt.buildFeatureType())) { + try { + conn = getConnection(); + if (dropTableMode) { + dropGeometryColumn(conn, featureName, + ((FeatureTypeImpl)typeBuilderPnt.buildFeatureType()).getGeometryDescriptor().getLocalName()); + dropTable(conn, featureName); + + ArrayList<String> schemaTexts = createNewSchemaTexts(conn, + typeBuilderPnt.buildFeatureType()); + for (String stmtText : schemaTexts) { + Statement stmt = conn.createStatement(); + stmt.execute(stmtText); + JDBCUtils.close(stmt); + } + } else { + deleteTable(conn, featureName); + } + JDBCUtils.close(conn, Transaction.AUTO_COMMIT, null); + } catch (IOException e) { + JDBCUtils.close(conn, Transaction.AUTO_COMMIT, null); + logger.warn(e.getMessage(), e); + } catch (SQLException e) { + JDBCUtils.close(conn, Transaction.AUTO_COMMIT, e); + logger.warn(e.getMessage(), e); + } + } else { + try { + conn = getConnection(); + ArrayList<String> schemaTexts = createNewSchemaTexts(conn, + typeBuilderPnt.buildFeatureType()); + for (String stmtText : schemaTexts) { + Statement stmt = conn.createStatement(); + stmt.execute(stmtText); + JDBCUtils.close(stmt); + } + JDBCUtils.close(conn, Transaction.AUTO_COMMIT, null); + } catch (IOException e) { + JDBCUtils.close(conn, Transaction.AUTO_COMMIT, null); + logger.warn(e.getMessage(), e); + } catch (SQLException e) { + JDBCUtils.close(conn, Transaction.AUTO_COMMIT, e); + logger.warn(e.getMessage(), e); + } + } + } + return typeBuilderPnt.buildFeatureType(); + } + + public SimpleFeatureType createFeatureElement3(String featureName) throws SchemaException { + if (typeBuilderSmallRect == null) { + Connection conn = null; + typeBuilderSmallRect = FeatureTypeBuilderUtil.createNormalIndexFeatureTypeBuilder(featureName); + if (isExistFeature(typeBuilderSmallRect.buildFeatureType())) { + try { + conn = getConnection(); + if (dropTableMode) { + try { + dropGeometryColumn(conn, featureName, + ((FeatureTypeImpl)typeBuilderSmallRect.buildFeatureType()).getGeometryDescriptor().getLocalName()); + } catch (PSQLException e) { + logger.debug(e.getMessage(), e); + } + try { + dropTable(conn, featureName); + } catch (PSQLException e) { + logger.debug(e.getMessage(), e); + } + ArrayList<String> schemaTexts = createNewSchemaTexts(conn, typeBuilderSmallRect.buildFeatureType()); + for (String stmtText : schemaTexts) { + Statement stmt = conn.createStatement(); + stmt.execute(stmtText); + JDBCUtils.close(stmt); + } + } else { + deleteTable(conn, featureName); + } + JDBCUtils.close(conn, Transaction.AUTO_COMMIT, null); + } catch (IOException e) { + JDBCUtils.close(conn, Transaction.AUTO_COMMIT, null); + logger.warn(e.getMessage(), e); + } catch (SQLException e) { + JDBCUtils.close(conn, Transaction.AUTO_COMMIT, e); + logger.warn(e.getMessage(), e); + } + } else { + try { + conn = getConnection(); + ArrayList<String> schemaTexts = createNewSchemaTexts(conn, + typeBuilderSmallRect.buildFeatureType()); + for (String stmtText : schemaTexts) { + Statement stmt = conn.createStatement(); + stmt.execute(stmtText); + JDBCUtils.close(stmt); + } + JDBCUtils.close(conn, Transaction.AUTO_COMMIT, null); + } catch (IOException e) { + JDBCUtils.close(conn, Transaction.AUTO_COMMIT, null); + logger.warn(e.getMessage(), e); + } catch (SQLException e) { + JDBCUtils.close(conn, Transaction.AUTO_COMMIT, e); + logger.warn(e.getMessage(), e); + } + } + } + return typeBuilderSmallRect.buildFeatureType(); + } + + public SimpleFeature createFeature(SimpleFeatureType featureType, Element element) throws IllegalAttributeException { + DefaultColorTable colorTable = (DefaultColorTable) DefaultColorTable.getInstance(); + if (element instanceof TextElement) { + TextElement textElement = (TextElement) element; + String tpclid = textElement.getText(); + + if(tpclid.trim().endsWith("")) + { + return null; + } + + Envelope extent = TPCLIDConverter.convertTpclIdToEnvelope(tpclid); + Geometry geom; + if (FeatureTypeBuilderUtil.getDefaultFeatureSRID() == 3826) { + geom = geometryFactory.createPolygon(geometryFactory.createLinearRing(new Coordinate[] + { + TWDDatumConverter.fromTM2ToEPSG3826(new Coordinate(extent.getMinX(), extent.getMinY())), + TWDDatumConverter.fromTM2ToEPSG3826(new Coordinate(extent.getMaxX(), extent.getMinY())), + TWDDatumConverter.fromTM2ToEPSG3826(new Coordinate(extent.getMaxX(), extent.getMaxY())), + TWDDatumConverter.fromTM2ToEPSG3826(new Coordinate(extent.getMinX(), extent.getMaxY())), + TWDDatumConverter.fromTM2ToEPSG3826(new Coordinate(extent.getMinX(), extent.getMinY())), + }), null); + } else { + geom = geometryFactory.createPolygon(geometryFactory.createLinearRing(new Coordinate[] + { + TWDDatumConverter.fromTM2ToEPSG3825(new Coordinate(extent.getMinX(), extent.getMinY())), + TWDDatumConverter.fromTM2ToEPSG3825(new Coordinate(extent.getMaxX(), extent.getMinY())), + TWDDatumConverter.fromTM2ToEPSG3825(new Coordinate(extent.getMaxX(), extent.getMaxY())), + TWDDatumConverter.fromTM2ToEPSG3825(new Coordinate(extent.getMinX(), extent.getMaxY())), + TWDDatumConverter.fromTM2ToEPSG3825(new Coordinate(extent.getMinX(), extent.getMinY())), + }), null); + } + return SimpleFeatureBuilder.build(featureType, new Object[]{ + geom, + extent.getMinX(), + extent.getMinY(), + extent.getMaxX(), + extent.getMaxY(), + tpclid, + colorTable.getColorCode(textElement.getColorIndex()), + textElement.getWeight(), + textElement.getLineStyle() + }, null); + } else if (element instanceof ShapeElement) { + ShapeElement shapeElement = (ShapeElement) element; + Geometry geomShape = shapeElement.toGeometry(geometryFactory); + Polygon polygon = (Polygon) geomShape; + if (polygon.isRectangle()) { + Envelope bounds = polygon.getEnvelopeInternal(); + if (bounds.getWidth() == TPCLIDConverter.SX1200) { + Coordinate center = bounds.centre(); + String tpclid = TPCLIDConverter.CoordinateToTpclId(center); + if ((tpclid == null) || (tpclid.length() == 0)) { + logger.warn("Cannot convert coordinate to tpclid-[" + center.toString() + "]"); + return null; + } + if (tpclid.length() > 5) { + tpclid = tpclid.substring(0, 5); + } + Envelope extent = TPCLIDConverter.convertTpclIdToEnvelope(tpclid); + Geometry geom = null; + try { + geom = (FeatureTypeBuilderUtil.getDefaultFeatureSRID() == 3826 ? + geometryFactory.createPolygon(geometryFactory.createLinearRing(new Coordinate[] + { + TWDDatumConverter.fromTM2ToEPSG3826(new Coordinate(extent.getMinX(), extent.getMinY())), + TWDDatumConverter.fromTM2ToEPSG3826(new Coordinate(extent.getMaxX(), extent.getMinY())), + TWDDatumConverter.fromTM2ToEPSG3826(new Coordinate(extent.getMaxX(), extent.getMaxY())), + TWDDatumConverter.fromTM2ToEPSG3826(new Coordinate(extent.getMinX(), extent.getMaxY())), + TWDDatumConverter.fromTM2ToEPSG3826(new Coordinate(extent.getMinX(), extent.getMinY())), + }), null) : + geometryFactory.createPolygon(geometryFactory.createLinearRing(new Coordinate[] + { + TWDDatumConverter.fromTM2ToEPSG3825(new Coordinate(extent.getMinX(), extent.getMinY())), + TWDDatumConverter.fromTM2ToEPSG3825(new Coordinate(extent.getMaxX(), extent.getMinY())), + TWDDatumConverter.fromTM2ToEPSG3825(new Coordinate(extent.getMaxX(), extent.getMaxY())), + TWDDatumConverter.fromTM2ToEPSG3825(new Coordinate(extent.getMinX(), extent.getMaxY())), + TWDDatumConverter.fromTM2ToEPSG3825(new Coordinate(extent.getMinX(), extent.getMinY())), + }), null)); + } catch (NullPointerException e) { + logger.warn("TPCLIDConverter has error at [" + tpclid + "]"); + logger.warn(e.getMessage(), e); + return null; + } + + return (geom == null ? null : + SimpleFeatureBuilder.build(featureType, new Object[]{ + geom, + extent.getMinX(), + extent.getMinY(), + extent.getMaxX(), + extent.getMaxY(), + tpclid, + colorTable.getColorCode(shapeElement.getColorIndex()), + shapeElement.getWeight(), + shapeElement.getLineStyle() + }, null)); + } + } + } + return null; + } + + public SimpleFeature createFeature2(SimpleFeatureType featureType, Element element) throws IllegalAttributeException { + DefaultColorTable colorTable = (DefaultColorTable) DefaultColorTable.getInstance(); + if (element instanceof TextElement) { + SimpleFeature feature = null; + TextElement txtElement = (TextElement) element; + double angle = txtElement.getRotationAngle(); + angle = BigDecimal.valueOf(angle).setScale(3, RoundingMode.HALF_UP).doubleValue(); + GeometryConverterDecorator convertDecorator = FeatureTypeBuilderUtil.lookupDefaultGeometryConverter(); + convertDecorator.setConverter(txtElement); + Geometry gobj = convertDecorator.toGeometry(geometryFactory); + if (gobj != null) + feature = SimpleFeatureBuilder.build(featureType, new Object[]{ + gobj, + colorTable.getColorCode(txtElement.getColorIndex()), + txtElement.getWeight(), + txtElement.getLineStyle(), + txtElement.getJustification(), + txtElement.getTextHeight(), + txtElement.getTextWidth(), + angle, + txtElement.getText() + }, null); + return feature; + } else if (element instanceof ShapeElement) { + SimpleFeature feature = null; + ShapeElement shapeElement = (ShapeElement) element; + double angle = 0.0; + Geometry geomShape = shapeElement.toGeometry(geometryFactory); + Polygon polygon = (Polygon) geomShape; + if (polygon.isRectangle()) { + Envelope bounds = polygon.getEnvelopeInternal(); + if (bounds.getWidth() == TPCLIDConverter.SX1200) { + Coordinate center = bounds.centre(); + String tpclid = TPCLIDConverter.CoordinateToTpclId(center); + if (tpclid.length() > 5) { + tpclid = tpclid.substring(0, 5); + Coordinate pos = (FeatureTypeBuilderUtil.getDefaultFeatureSRID() == 3826 ? + TWDDatumConverter.fromTM2ToEPSG3826(new Coordinate(center.x, center.y)) : + TWDDatumConverter.fromTM2ToEPSG3825(new Coordinate(center.x, center.y))); + Geometry gobj = geometryFactory.createPoint(pos); + + if (gobj != null) + feature = SimpleFeatureBuilder.build(featureType, new Object[]{ + gobj, + colorTable.getColorCode(shapeElement.getColorIndex()), + shapeElement.getWeight(), + shapeElement.getLineStyle(), + 0, + 15.0, + 15 * 5, + angle, + tpclid + }, null); + return feature; + } + + } + } + } + return null; + } + + public SimpleFeature[] createFeature3(SimpleFeatureType featureType, Element element) throws IllegalAttributeException { + DefaultColorTable colorTable = (DefaultColorTable) DefaultColorTable.getInstance(); + if (element instanceof TextElement) { + TextElement textElement = (TextElement) element; + String tpclid = textElement.getText(); + SimpleFeature[] result = new SimpleFeature[4]; + + Envelope extent = TPCLIDConverter.convertTpclIdToEnvelope(tpclid); + + for (int i = 0; i < 4; i++) { + char mapSubId = TPCLIDConverter.intToAscii(65 + i); + int dx = (i % 2) * TPCLIDConverter.SX600; + int dy = (i / 2) * TPCLIDConverter.SY600; + + Geometry geom; + + if (FeatureTypeBuilderUtil.getDefaultFeatureSRID() == 3826) { + geom = geometryFactory.createPolygon(geometryFactory.createLinearRing(new Coordinate[] + { + TWDDatumConverter.fromTM2ToEPSG3826(new Coordinate( + extent.getMinX() + dx, extent.getMaxY() - TPCLIDConverter.SY600 - dy)), + TWDDatumConverter.fromTM2ToEPSG3826(new Coordinate( + extent.getMinX() + TPCLIDConverter.SX600 + dx, extent.getMaxY() - TPCLIDConverter.SY600 - dy)), + TWDDatumConverter.fromTM2ToEPSG3826(new Coordinate( + extent.getMinX() + TPCLIDConverter.SX600 + dx, extent.getMaxY() - dy)), + TWDDatumConverter.fromTM2ToEPSG3826(new Coordinate( + extent.getMinX() + dx, extent.getMaxY() - dy)), + TWDDatumConverter.fromTM2ToEPSG3826(new Coordinate( + extent.getMinX() + dx, extent.getMaxY() - TPCLIDConverter.SY600 - dy)), + }), null); + } else { + geom = geometryFactory.createPolygon(geometryFactory.createLinearRing(new Coordinate[] + { + TWDDatumConverter.fromTM2ToEPSG3825(new Coordinate( + extent.getMinX() + dx, extent.getMaxY() - TPCLIDConverter.SY600 - dy)), + TWDDatumConverter.fromTM2ToEPSG3825(new Coordinate( + extent.getMinX() + TPCLIDConverter.SX600 + dx, extent.getMaxY() - TPCLIDConverter.SY600 - dy)), + TWDDatumConverter.fromTM2ToEPSG3825(new Coordinate( + extent.getMinX() + TPCLIDConverter.SX600 + dx, extent.getMaxY() - dy)), + TWDDatumConverter.fromTM2ToEPSG3825(new Coordinate( + extent.getMinX() + dx, extent.getMaxY() - dy)), + TWDDatumConverter.fromTM2ToEPSG3825(new Coordinate( + extent.getMinX() + dx, extent.getMaxY() - TPCLIDConverter.SY600 - dy)), + }), null); + } + Envelope innerExtent = geom.getEnvelopeInternal(); + + result[i] = SimpleFeatureBuilder.build(featureType, new Object[]{ + geom, + innerExtent.getMinX(), + innerExtent.getMinY(), + innerExtent.getMaxX(), + innerExtent.getMaxY(), + tpclid + mapSubId, + colorTable.getColorCode(textElement.getColorIndex()), + textElement.getWeight(), + textElement.getLineStyle() + }, null); + + } + return result; + } else if (element instanceof ShapeElement) { + ShapeElement shapeElement = (ShapeElement) element; + Geometry geomShape = shapeElement.toGeometry(geometryFactory); + Polygon polygon = (Polygon) geomShape; + if (polygon.isRectangle()) { + Envelope extent = polygon.getEnvelopeInternal(); + if (extent.getWidth() == TPCLIDConverter.SX1200) { + SimpleFeature[] result = new SimpleFeature[4]; + Coordinate center = extent.centre(); + String tpclid = TPCLIDConverter.CoordinateToTpclId(center); + if (tpclid.length() > 5) { + tpclid = tpclid.substring(0, 5); + } + for (int i = 0; i < 4; i++) { + char mapSubId = TPCLIDConverter.intToAscii(65 + i); + int dx = (i % 2) * TPCLIDConverter.SX600; + int dy = (i / 2) * TPCLIDConverter.SY600; + + Geometry geom = (FeatureTypeBuilderUtil.getDefaultFeatureSRID() == 3826 ? + geometryFactory.createPolygon(geometryFactory.createLinearRing(new Coordinate[] + { + TWDDatumConverter.fromTM2ToEPSG3826(new Coordinate( + extent.getMinX() + dx, extent.getMaxY() - TPCLIDConverter.SY600 - dy)), + TWDDatumConverter.fromTM2ToEPSG3826(new Coordinate( + extent.getMinX() + TPCLIDConverter.SX600 + dx, extent.getMaxY() - TPCLIDConverter.SY600 - dy)), + TWDDatumConverter.fromTM2ToEPSG3826(new Coordinate( + extent.getMinX() + TPCLIDConverter.SX600 + dx, extent.getMaxY() - dy)), + TWDDatumConverter.fromTM2ToEPSG3826(new Coordinate( + extent.getMinX() + dx, extent.getMaxY() - dy)), + TWDDatumConverter.fromTM2ToEPSG3826(new Coordinate( + extent.getMinX() + dx, extent.getMaxY() - TPCLIDConverter.SY600 - dy)), + }), null) : + geometryFactory.createPolygon(geometryFactory.createLinearRing(new Coordinate[] + { + TWDDatumConverter.fromTM2ToEPSG3825(new Coordinate( + extent.getMinX() + dx, extent.getMaxY() - TPCLIDConverter.SY600 - dy)), + TWDDatumConverter.fromTM2ToEPSG3825(new Coordinate( + extent.getMinX() + TPCLIDConverter.SX600 + dx, extent.getMaxY() - TPCLIDConverter.SY600 - dy)), + TWDDatumConverter.fromTM2ToEPSG3825(new Coordinate( + extent.getMinX() + TPCLIDConverter.SX600 + dx, extent.getMaxY() - dy)), + TWDDatumConverter.fromTM2ToEPSG3825(new Coordinate( + extent.getMinX() + dx, extent.getMaxY() - dy)), + TWDDatumConverter.fromTM2ToEPSG3825(new Coordinate( + extent.getMinX() + dx, extent.getMaxY() - TPCLIDConverter.SY600 - dy)), + }), null)); + + Envelope innerExtent = geom.getEnvelopeInternal(); + + result[i] = SimpleFeatureBuilder.build(featureType, new Object[]{ + geom, + innerExtent.getMinX(), + innerExtent.getMinY(), + innerExtent.getMaxX(), + innerExtent.getMaxY(), + tpclid + mapSubId, + colorTable.getColorCode(shapeElement.getColorIndex()), + shapeElement.getWeight(), + shapeElement.getLineStyle() + }, null); + } + + return result; + } + } + } + + return null; + } + + private SimpleFeature createFeature(Element element) throws SchemaException, IllegalAttributeException { + if (featureType == null) { + String dgnname = getFilename().toLowerCase(); + int i = dgnname.lastIndexOf("."); + if (i != -1) { + dgnname = dgnname.substring(0, i); + } + featureType = createFeatureElement(dgnname.toLowerCase()); + } + return createFeature(featureType, element); + } + + private SimpleFeature createFeature2(Element element) throws SchemaException, IllegalAttributeException { + if (featureType2 == null) { + String dgnname = getFilename().toLowerCase(); + int i = dgnname.lastIndexOf("."); + if (i != -1) { + dgnname = dgnname.substring(0, i); + } + dgnname = dgnname + "_p"; + featureType2 = createFeatureElement2(dgnname.toLowerCase()); + } + return createFeature2(featureType2, element); + } + + private SimpleFeature[] createFeature3(Element element) throws SchemaException, IllegalAttributeException { + if (featureType3 == null) { + String dgnname = getFilename().toLowerCase(); + int i = dgnname.lastIndexOf("."); + if (i != -1) { + dgnname = dgnname.substring(0, i); + } + dgnname = dgnname + "_s"; + featureType3 = createFeatureElement3(dgnname.toLowerCase()); + } + return createFeature3(featureType3, element); + } + + protected FrammeAttributeData getFeatureLinkage(Element element) { + if (!element.hasUserAttributeData()) + return null; + + List<UserAttributeData> usrDatas = element.getUserAttributeData(); + for (UserAttributeData anUsrData : usrDatas) { + if (anUsrData instanceof FrammeAttributeData) { + return (FrammeAttributeData) anUsrData; + } + } + return null; + } + + public Log getLogger() { + return logger; + } + + public boolean isDropTableMode() { + return dropTableMode; + } + + public void setDropTableMode(boolean dropTableMode) { + this.dropTableMode = dropTableMode; + } + + public void clearOutputDatabase() { + } +} diff --git a/xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/jobs/context/edbgeo/OracleConvertEdbGeoJobContext.java b/xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/jobs/context/edbgeo/OracleConvertEdbGeoJobContext.java new file mode 100644 index 0000000..9191594 --- /dev/null +++ b/xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/jobs/context/edbgeo/OracleConvertEdbGeoJobContext.java @@ -0,0 +1,387 @@ +package com.ximple.eofms.jobs.context.edbgeo; + +import java.io.File; +import java.io.IOException; +import java.io.UnsupportedEncodingException; +import java.net.MalformedURLException; +import java.net.URL; +import java.sql.BatchUpdateException; +import java.sql.Connection; +import java.sql.DriverManager; +import java.sql.PreparedStatement; +import java.sql.SQLException; +import java.sql.Statement; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.Iterator; + +import com.vividsolutions.jts.geom.Geometry; +import org.apache.commons.digester.Digester; +import org.apache.commons.digester.xmlrules.DigesterLoader; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.apache.commons.transaction.util.CommonsLoggingLogger; +import org.apache.commons.transaction.util.LoggerFacade; +import org.geotools.data.DataStore; +import org.geotools.data.Transaction; +import org.geotools.data.jdbc.JDBCUtils; +import org.geotools.data.edbgeo.PostgisDataStoreFactory; +import org.geotools.feature.SchemaException; +import org.geotools.feature.type.FeatureTypeImpl; +import org.opengis.feature.simple.SimpleFeature; +import org.opengis.feature.simple.SimpleFeatureType; +import com.edb.util.PSQLException; +import org.quartz.JobExecutionContext; +import org.xml.sax.SAXException; + +import com.vividsolutions.jts.util.Assert; + +import com.ximple.eofms.filter.AbstractFLinkageDispatchableFilter; +import com.ximple.eofms.filter.CreateFeatureTypeEventListener; +import com.ximple.eofms.filter.ElementDispatcher; +import com.ximple.eofms.filter.FeatureTypeEvent; +import com.ximple.eofms.jobs.OracleElementLogger; +import com.ximple.io.dgn7.ComplexElement; +import com.ximple.io.dgn7.Element; +import com.ximple.io.dgn7.FrammeAttributeData; + +public class OracleConvertEdbGeoJobContext extends AbstractOracleToEdbGeoJobContext + implements CreateFeatureTypeEventListener { + static Log logger = LogFactory.getLog(OracleConvertEdbGeoJobContext.class); + static final LoggerFacade sLogger = new CommonsLoggingLogger(logger); + + static PostgisDataStoreFactory dataStoreFactory = new PostgisDataStoreFactory(); + + private OracleElementLogger elmLogger = null; + + static { + try { + DriverManager.registerDriver(new oracle.jdbc.driver.OracleDriver()); + } catch (SQLException e) { + Assert.shouldNeverReachHere(e.getMessage()); + } + } + + private String _filterConfig; + + private ElementDispatcher elementDispatcher; + + private HashMap<SimpleFeatureType, ArrayList<SimpleFeature>> txFeaturesContext = new HashMap<SimpleFeatureType, ArrayList<SimpleFeature>>(); + + private JobExecutionContext executionContext; + + private String currentSchema = null; + private boolean schemaChanged = false; + private boolean dropTableMode = true; + private int accumulate = 0; + + public OracleConvertEdbGeoJobContext(String dataPath, DataStore pgDS, String targetSchema, String filterConfig, + boolean profileMode, boolean useTransform) { + super(dataPath, pgDS, targetSchema, profileMode, useTransform); + _filterConfig = filterConfig; + elementDispatcher = createElementDispatcher(); + elementDispatcher.addCreateFeatureTypeEventListener(this); + // txFeaturesContext = new PessimisticMapWrapper(featuresContext, sLogger); + } + + private ElementDispatcher createElementDispatcher() { + try { + URL rulesURL = ElementDispatcher.class.getResource("ElementDispatcherRules.xml"); + assert rulesURL != null; + Digester digester = DigesterLoader.createDigester(rulesURL); + URL filterURL = null; + if (_filterConfig != null) { + File config = new File(_filterConfig); + if (config.exists()) { + filterURL = config.toURI().toURL(); + } + } + if (filterURL == null) { + // config = new File("conf/DefaultConvertShpFilter.xml"); + filterURL = this.getClass().getResource("/conf/DefaultConvertShpFilter.xml"); + // filterURL = this.getClass().getResource("/conf/ConvertShpFilterForLevel.xml"); + } + assert filterURL != null; + return (ElementDispatcher) digester.parse(filterURL); + } catch (UnsupportedEncodingException e) { + logger.info(e.getMessage(), e); + throw new RuntimeException(e.getMessage(), e); + } catch (MalformedURLException e) { + logger.info(e.getMessage(), e); + throw new RuntimeException(e.getMessage(), e); + } catch (IOException e) { + logger.info(e.getMessage(), e); + throw new RuntimeException(e.getMessage(), e); + } catch (SAXException e) { + logger.info(e.getMessage(), e); + throw new RuntimeException(e.getMessage(), e); + } + } + + public void putFeatureCollection(Element element) { + assert elementDispatcher != null; + // 判斷是否符和條件 + SimpleFeature feature = elementDispatcher.execute(element, isTransformed()); + if (feature == null) { + boolean isEmptySize = false; + FrammeAttributeData linkage = + AbstractFLinkageDispatchableFilter.getFeatureLinkage(element); + logger.warn("Unknown Element:" + element.getElementType().toString() + + ":type=" + element.getType() + ":lv=" + element.getLevelIndex() + ":id=" + + (linkage == null ? "NULL" : (linkage.getFsc() + "|" + linkage.getComponentID()))); + + if (element instanceof ComplexElement) { + ComplexElement complex = (ComplexElement) element; + logger.warn("----Complex Element size=" + complex.size() + ":" + + (linkage == null ? "NULL" : (linkage.getUfid()))); + if (complex.size() == 0) + isEmptySize = true; + } + + if (getElementLogging() && (!isEmptySize)) { + getElementLogger().logElement(element, getCurrentSchema()); + } + return; + } + + if (((Geometry)feature.getDefaultGeometry()).isEmpty()) { + boolean isEmptySize = false; + FrammeAttributeData linkage = + AbstractFLinkageDispatchableFilter.getFeatureLinkage(element); + logger.warn("Empty Geom Element:" + element.getElementType().toString() + + ":type=" + element.getType() + ":lv=" + element.getLevelIndex() + ":id=" + + (linkage == null ? "NULL" : (linkage.getFsc() + "|" + linkage.getComponentID()))); + + if (element instanceof ComplexElement) { + ComplexElement complex = (ComplexElement) element; + logger.warn("----Complex Element size=" + complex.size() + ":" + + (linkage == null ? "NULL" : (linkage.getUfid()))); + if (complex.size() == 0) + isEmptySize = true; + } + + if (getElementLogging() && (!isEmptySize)) { + getElementLogger().logElement(element, getCurrentSchema()); + } + return; + } + + if (!txFeaturesContext.containsKey(feature.getFeatureType())) { + txFeaturesContext.put(feature.getFeatureType(), new ArrayList<SimpleFeature>()); + } + ArrayList<SimpleFeature> arrayList = txFeaturesContext.get(feature.getFeatureType()); + arrayList.add(feature); + accumulate++; + if (accumulate > BATCHSIZE) { + commitTransaction(); + } + } + + public void startTransaction() { + } + + public void commitTransaction() { + if (!txFeaturesContext.isEmpty()) { + logger.debug("Transaction size = " + txFeaturesContext.size()); + //txFeaturesContext.commitTransaction(); + } else { + logger.debug("Transaction is empty."); + } + + if (!txFeaturesContext.isEmpty()) { + updateDataStore(); + } + + if (this.getElementLogger() != null) + this.getElementLogger().flashLogging(); + } + + public void rollbackTransaction() { + } + + public void resetFeatureContext() { + txFeaturesContext.clear(); + } + + private void updateDataStore() { + if (isProfileMode()) markUpdateTime(); + Iterator<SimpleFeatureType> it = txFeaturesContext.keySet().iterator(); + Connection conn = null; + try { + conn = getConnection(); + boolean autoCommit = conn.getAutoCommit(); + conn.setAutoCommit(false); + + while (it.hasNext()) { + SimpleFeatureType featureType = it.next(); + logger.debug("Begin Save into EdbGeo:" + featureType.getTypeName()); + + int batchCount = 0; + String bindingStmt = makePrepareInsertSql(featureType); + ArrayList<SimpleFeature> features = txFeaturesContext.get(featureType); + PreparedStatement pstmt = conn.prepareStatement(bindingStmt); + + for (SimpleFeature feature : features) { + try { + // stmt.execute(feature); + bindFeatureParameters(pstmt, feature); + // pstmt.executeUpdate(); + pstmt.addBatch(); + } catch (PSQLException e) { + if (bindingStmt != null) { + logger.error("Execute:" + bindingStmt); + } + logger.error(e.getServerErrorMessage()); + logger.error(e.getMessage(), e); + } catch (ClassCastException e) { + if (bindingStmt != null) { + logger.error("Execute:" + bindingStmt); + } + for (int i = 0; i < feature.getAttributeCount(); i++) { + logger.info("attr[" + i + "]-" + ((feature.getAttribute(i) == null) ? " NULL" : + feature.getAttribute(i).toString())); + } + logger.error(e.getMessage(), e); + } + batchCount++; + } + + int[] numUpdates = pstmt.executeBatch(); + for (int i = 0; i < numUpdates.length; i++) { + if (numUpdates[i] == -2) + logger.warn("Execution " + i + ": unknown number of rows updated"); + } + conn.commit(); + + pstmt.close(); + features.clear(); + logger.debug("End Save into EdbGeo:" + featureType.getTypeName()); + } + conn.setAutoCommit(autoCommit); + JDBCUtils.close(conn, Transaction.AUTO_COMMIT, null); + accumulate = 0; + } catch (BatchUpdateException e) { + JDBCUtils.close(conn, Transaction.AUTO_COMMIT, e); + logger.error(e.getMessage(), e); + SQLException ex; + while ((ex = e.getNextException()) != null) { + // logger.warn(ex.getMessage(), ex); + logger.warn(ex.getMessage()); + } + } catch (SQLException e) { + JDBCUtils.close(conn, Transaction.AUTO_COMMIT, e); + logger.error(e.getMessage(), e); + } finally { + if (isProfileMode()) accumulateUpdateTime(); + } + } + + public JobExecutionContext getExecutionContext() { + return executionContext; + } + + public void setExecutionContext(JobExecutionContext context) { + executionContext = context; + } + + /** + * �����]�Ƽg�J�� + * + * @throws IOException IO�o�Ϳ�~ + */ + public void closeFeatureWriter() throws IOException { + } + + protected OracleElementLogger getElementLogger() { + if (elmLogger == null) { + elmLogger = new OracleElementLogger(getOracleConnection()); + elmLogger.setDataPath(this.getDataPath()); + } + return elmLogger; + } + + public String getCurrentSchema() { + return currentSchema; + } + + public void setCurrentSchema(String querySchema) { + this.currentSchema = querySchema; + this.schemaChanged = true; + } + + protected Log getLogger() { + return logger; + } + + public boolean isDropTableMode() { + return dropTableMode; + } + + public void setDropTableMode(boolean dropTableMode) { + this.dropTableMode = dropTableMode; + } + + public void createFeatureTypeOccurred(FeatureTypeEvent evt) { + try { + createOrClearFeatureDataTable(evt.getFeatureType()); + } catch (SchemaException e) { + logger.warn(e.getMessage(), e); + } + } + + protected void createOrClearFeatureDataTable(SimpleFeatureType featureType) throws SchemaException { + String featureName = featureType.getTypeName(); + Connection conn = null; + if (isExistFeature(featureType)) { + try { + conn = getConnection(); + if (dropTableMode) { + dropGeometryColumn(conn, getTargetSchema(), featureName, + ((FeatureTypeImpl)featureType).getGeometryDescriptor().getName().getLocalPart()); + dropTable(conn, getTargetSchema(), featureName); + + ArrayList<String> schemaTexts = createNewSchemaTexts(conn, featureType); + for (String stmtText : schemaTexts) { + Statement stmt = conn.createStatement(); + stmt.execute(stmtText); + JDBCUtils.close(stmt); + } + } else { + deleteTable(conn, getTargetSchema(), featureName); + } + JDBCUtils.close(conn, Transaction.AUTO_COMMIT, null); + } catch (IOException e) { + JDBCUtils.close(conn, Transaction.AUTO_COMMIT, null); + logger.warn(e.getMessage(), e); + } catch (SQLException e) { + JDBCUtils.close(conn, Transaction.AUTO_COMMIT, e); + logger.warn(e.getMessage(), e); + } + } else { + String tempStmt = null; + try { + conn = getConnection(); + ArrayList<String> schemaTexts = createNewSchemaTexts(conn, featureType); + for (String stmtText : schemaTexts) { + Statement stmt = conn.createStatement(); + tempStmt = stmtText; + stmt.execute(stmtText); + stmt.close(); + } + JDBCUtils.close(conn, Transaction.AUTO_COMMIT, null); + } catch (IOException e) { + JDBCUtils.close(conn, Transaction.AUTO_COMMIT, null); + logger.warn("RUN--" + tempStmt); + logger.warn(e.getMessage(), e); + } catch (SQLException e) { + JDBCUtils.close(conn, Transaction.AUTO_COMMIT, e); + logger.warn("RUN--" + tempStmt); + logger.warn(e.getMessage(), e); + } + } + } + + public boolean isSchemaChanged() { + return schemaChanged; + } +} diff --git a/xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/jobs/context/mysql/GeneralDgnConvertMySQLJobContext.java b/xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/jobs/context/mysql/GeneralDgnConvertMySQLJobContext.java index d4c0e97..f9d7653 100644 --- a/xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/jobs/context/mysql/GeneralDgnConvertMySQLJobContext.java +++ b/xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/jobs/context/mysql/GeneralDgnConvertMySQLJobContext.java @@ -227,7 +227,6 @@ String content = textElement.getText(); angle = BigDecimal.valueOf(angle).setScale(3, RoundingMode.HALF_UP).doubleValue(); if (geom != null) { - geom.setSRID(FeatureTypeBuilderUtil.getDefaultFeatureSRID()); return SimpleFeatureBuilder.build(featureType, new Object[]{ geom, colorTable.getColorCode(textElement.getColorIndex()), @@ -258,7 +257,6 @@ } if (geom != null) { - geom.setSRID(FeatureTypeBuilderUtil.getDefaultFeatureSRID()); return SimpleFeatureBuilder.build(featureType, new Object[]{ geom, colorTable.getColorCode(textNodeElement.getColorIndex()), @@ -278,7 +276,6 @@ convertDecorator.setConverter(shapeElement); Geometry geom = convertDecorator.toGeometry(geometryFactory); if (geom != null) { - geom.setSRID(FeatureTypeBuilderUtil.getDefaultFeatureSRID()); return SimpleFeatureBuilder.build(featureType, new Object[]{ geom, colorTable.getColorCode(shapeElement.getColorIndex()), @@ -294,7 +291,6 @@ convertDecorator.setConverter(linestring); Geometry geom = convertDecorator.toGeometry(geometryFactory); if (geom != null) { - geom.setSRID(FeatureTypeBuilderUtil.getDefaultFeatureSRID()); return SimpleFeatureBuilder.build(featureType, new Object[]{ geom, colorTable.getColorCode(linestring.getColorIndex()), @@ -308,7 +304,6 @@ convertDecorator.setConverter(line); Geometry geom = convertDecorator.toGeometry(geometryFactory); if (geom != null) { - geom.setSRID(FeatureTypeBuilderUtil.getDefaultFeatureSRID()); return SimpleFeatureBuilder.build(featureType, new Object[]{ geom, colorTable.getColorCode(line.getColorIndex()), @@ -327,7 +322,6 @@ convertDecorator.setConverter(arcElement); Geometry geom = convertDecorator.toGeometry(geometryFactory); if (geom != null) { - geom.setSRID(FeatureTypeBuilderUtil.getDefaultFeatureSRID()); return SimpleFeatureBuilder.build(featureType, new Object[]{ geom, colorTable.getColorCode(arcElement.getColorIndex()), @@ -341,7 +335,6 @@ convertDecorator.setConverter(arcElement); Geometry geom = convertDecorator.toGeometry(geometryFactory); if (geom != null) { - geom.setSRID(FeatureTypeBuilderUtil.getDefaultFeatureSRID()); return SimpleFeatureBuilder.build(featureType, new Object[]{ geom, colorTable.getColorCode(arcElement.getColorIndex()), @@ -355,7 +348,6 @@ convertDecorator.setConverter(complexChainElement); Geometry geom = convertDecorator.toGeometry(geometryFactory); if (geom != null) { - geom.setSRID(FeatureTypeBuilderUtil.getDefaultFeatureSRID()); return SimpleFeatureBuilder.build(featureType, new Object[]{ geom, colorTable.getColorCode(complexChainElement.getColorIndex()), diff --git a/xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/jobs/context/mysql/IndexDgnConvertMySQLJobContext.java b/xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/jobs/context/mysql/IndexDgnConvertMySQLJobContext.java index 278197c..fc2cbc3 100644 --- a/xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/jobs/context/mysql/IndexDgnConvertMySQLJobContext.java +++ b/xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/jobs/context/mysql/IndexDgnConvertMySQLJobContext.java @@ -207,7 +207,6 @@ TWDDatumConverter.fromTM2ToEPSG3825(new Coordinate(extent.getMinX(), extent.getMinY())), })); - geom.setSRID(FeatureTypeBuilderUtil.getDefaultFeatureSRID()); return SimpleFeatureBuilder.build(featureType, new Object[]{ geom, extent.getMinX(), @@ -232,7 +231,6 @@ GeometryConverterDecorator convertDecorator = FeatureTypeBuilderUtil.lookupDefaultGeometryConverter(); convertDecorator.setConverter(txtElement); Geometry geom = convertDecorator.toGeometry(geometryFactory); - geom.setSRID(FeatureTypeBuilderUtil.getDefaultFeatureSRID()); SimpleFeature feature = SimpleFeatureBuilder.build(featureType, new Object[]{ geom, colorTable.getColorCode(txtElement.getColorIndex()), @@ -291,7 +289,6 @@ extent.getMinX() + dx, extent.getMaxY() - TPCLIDConverter.SY600 - dy)), }), null)); - geom.setSRID(FeatureTypeBuilderUtil.getDefaultFeatureSRID()); result[i] = SimpleFeatureBuilder.build(featureType, new Object[]{ geom, extent.getMinX(), diff --git a/xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/jobs/context/orasdo/GeneralDgnConvertOraSDOJobContext.java b/xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/jobs/context/orasdo/GeneralDgnConvertOraSDOJobContext.java index dbab3a8..917fe6e 100644 --- a/xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/jobs/context/orasdo/GeneralDgnConvertOraSDOJobContext.java +++ b/xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/jobs/context/orasdo/GeneralDgnConvertOraSDOJobContext.java @@ -227,7 +227,6 @@ String content = textElement.getText(); angle = BigDecimal.valueOf(angle).setScale(3, RoundingMode.HALF_UP).doubleValue(); if (geom != null) { - geom.setSRID(FeatureTypeBuilderUtil.getDefaultFeatureSRID()); return SimpleFeatureBuilder.build(featureType, new Object[]{ geom, colorTable.getColorCode(textElement.getColorIndex()), @@ -258,7 +257,6 @@ } if (geom != null) { - geom.setSRID(FeatureTypeBuilderUtil.getDefaultFeatureSRID()); return SimpleFeatureBuilder.build(featureType, new Object[]{ geom, colorTable.getColorCode(textNodeElement.getColorIndex()), @@ -278,7 +276,6 @@ convertDecorator.setConverter(shapeElement); Geometry geom = convertDecorator.toGeometry(geometryFactory); if (geom != null) { - geom.setSRID(FeatureTypeBuilderUtil.getDefaultFeatureSRID()); return SimpleFeatureBuilder.build(featureType, new Object[]{ geom, colorTable.getColorCode(shapeElement.getColorIndex()), @@ -294,7 +291,6 @@ convertDecorator.setConverter(linestring); Geometry geom = convertDecorator.toGeometry(geometryFactory); if (geom != null) { - geom.setSRID(FeatureTypeBuilderUtil.getDefaultFeatureSRID()); return SimpleFeatureBuilder.build(featureType, new Object[]{ geom, colorTable.getColorCode(linestring.getColorIndex()), @@ -308,7 +304,6 @@ convertDecorator.setConverter(line); Geometry geom = convertDecorator.toGeometry(geometryFactory); if (geom != null) { - geom.setSRID(FeatureTypeBuilderUtil.getDefaultFeatureSRID()); return SimpleFeatureBuilder.build(featureType, new Object[]{ geom, colorTable.getColorCode(line.getColorIndex()), @@ -327,7 +322,6 @@ convertDecorator.setConverter(arcElement); Geometry geom = convertDecorator.toGeometry(geometryFactory); if (geom != null) { - geom.setSRID(FeatureTypeBuilderUtil.getDefaultFeatureSRID()); return SimpleFeatureBuilder.build(featureType, new Object[]{ geom, colorTable.getColorCode(arcElement.getColorIndex()), @@ -341,7 +335,6 @@ convertDecorator.setConverter(arcElement); Geometry geom = convertDecorator.toGeometry(geometryFactory); if (geom != null) { - geom.setSRID(FeatureTypeBuilderUtil.getDefaultFeatureSRID()); return SimpleFeatureBuilder.build(featureType, new Object[]{ geom, colorTable.getColorCode(arcElement.getColorIndex()), @@ -355,7 +348,6 @@ convertDecorator.setConverter(complexChainElement); Geometry geom = convertDecorator.toGeometry(geometryFactory); if (geom != null) { - geom.setSRID(FeatureTypeBuilderUtil.getDefaultFeatureSRID()); return SimpleFeatureBuilder.build(featureType, new Object[]{ geom, colorTable.getColorCode(complexChainElement.getColorIndex()), diff --git a/xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/jobs/context/orasdo/IndexDgnConvertOraSDOJobContext.java b/xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/jobs/context/orasdo/IndexDgnConvertOraSDOJobContext.java index 172e328..a44df88 100644 --- a/xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/jobs/context/orasdo/IndexDgnConvertOraSDOJobContext.java +++ b/xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/jobs/context/orasdo/IndexDgnConvertOraSDOJobContext.java @@ -207,7 +207,6 @@ TWDDatumConverter.fromTM2ToEPSG3825(new Coordinate(extent.getMinX(), extent.getMinY())), })); - geom.setSRID(FeatureTypeBuilderUtil.getDefaultFeatureSRID()); return SimpleFeatureBuilder.build(featureType, new Object[]{ geom, extent.getMinX(), @@ -232,7 +231,6 @@ angle = BigDecimal.valueOf(angle).setScale(3, RoundingMode.HALF_UP).doubleValue(); convertDecorator.setConverter(txtElement); Geometry geom = convertDecorator.toGeometry(geometryFactory); - geom.setSRID(FeatureTypeBuilderUtil.getDefaultFeatureSRID()); SimpleFeature feature = SimpleFeatureBuilder.build(featureType, new Object[]{ geom, colorTable.getColorCode(txtElement.getColorIndex()), @@ -291,7 +289,6 @@ extent.getMinX() + dx, extent.getMaxY() - TPCLIDConverter.SY600 - dy)), }), null)); - geom.setSRID(FeatureTypeBuilderUtil.getDefaultFeatureSRID()); result[i] = SimpleFeatureBuilder.build(featureType, new Object[]{ geom, extent.getMinX(), diff --git a/xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/jobs/context/postgis/AbstractDgnToPostGISJobContext.java b/xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/jobs/context/postgis/AbstractDgnToPostGISJobContext.java index e451024..17aa358 100644 --- a/xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/jobs/context/postgis/AbstractDgnToPostGISJobContext.java +++ b/xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/jobs/context/postgis/AbstractDgnToPostGISJobContext.java @@ -10,6 +10,7 @@ import java.sql.Statement; import java.util.*; +import com.ximple.eofms.util.FeatureTypeBuilderUtil; import org.geotools.data.DataSourceException; import org.geotools.data.DataStore; import org.geotools.data.SchemaNotFoundException; @@ -532,6 +533,7 @@ // String geomName = descriptors[i].getLocalName(); // int srid = ftInfo.getSRID(geomName); Geometry geometry = (Geometry) attributes.get(i); + geometry.setSRID(FeatureTypeBuilderUtil.getDefaultFeatureSRID()); if (geometry == null) { attrValue = "NULL"; diff --git a/xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/jobs/context/postgis/GeneralDgnConvertPostGISJobContext.java b/xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/jobs/context/postgis/GeneralDgnConvertPostGISJobContext.java index e786d63..0ad49bb 100644 --- a/xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/jobs/context/postgis/GeneralDgnConvertPostGISJobContext.java +++ b/xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/jobs/context/postgis/GeneralDgnConvertPostGISJobContext.java @@ -285,7 +285,6 @@ content = content.replace('\u0000', ' '); angle = BigDecimal.valueOf(angle).setScale(3, RoundingMode.HALF_UP).doubleValue(); if (geom != null) { - geom.setSRID(FeatureTypeBuilderUtil.getDefaultFeatureSRID()); return SimpleFeatureBuilder.build(featureType, new Object[]{ geom, colorTable.getColorCode(textElement.getColorIndex()), @@ -317,7 +316,6 @@ } if (geom != null) { - geom.setSRID(FeatureTypeBuilderUtil.getDefaultFeatureSRID()); return SimpleFeatureBuilder.build(featureType, new Object[]{ geom, colorTable.getColorCode(textNodeElement.getColorIndex()), @@ -337,7 +335,6 @@ convertDecorator.setConverter(shapeElement); Geometry geom = convertDecorator.toGeometry(geometryFactory); if (geom != null) { - geom.setSRID(FeatureTypeBuilderUtil.getDefaultFeatureSRID()); return SimpleFeatureBuilder.build(featureType, new Object[]{ geom, colorTable.getColorCode(shapeElement.getColorIndex()), @@ -353,7 +350,6 @@ convertDecorator.setConverter(linestring); Geometry geom = convertDecorator.toGeometry(geometryFactory); if (geom != null) { - geom.setSRID(FeatureTypeBuilderUtil.getDefaultFeatureSRID()); return SimpleFeatureBuilder.build(featureType, new Object[]{ geom, colorTable.getColorCode(linestring.getColorIndex()), @@ -367,7 +363,6 @@ convertDecorator.setConverter(line); Geometry geom = convertDecorator.toGeometry(geometryFactory); if (geom != null) { - geom.setSRID(FeatureTypeBuilderUtil.getDefaultFeatureSRID()); return SimpleFeatureBuilder.build(featureType, new Object[]{ geom, colorTable.getColorCode(line.getColorIndex()), @@ -386,7 +381,6 @@ convertDecorator.setConverter(arcElement); Geometry geom = convertDecorator.toGeometry(geometryFactory); if (geom != null) { - geom.setSRID(FeatureTypeBuilderUtil.getDefaultFeatureSRID()); return SimpleFeatureBuilder.build(featureType, new Object[]{ geom, colorTable.getColorCode(arcElement.getColorIndex()), @@ -400,7 +394,6 @@ convertDecorator.setConverter(arcElement); Geometry geom = convertDecorator.toGeometry(geometryFactory); if (geom != null) { - geom.setSRID(FeatureTypeBuilderUtil.getDefaultFeatureSRID()); return SimpleFeatureBuilder.build(featureType, new Object[]{ geom, colorTable.getColorCode(arcElement.getColorIndex()), @@ -414,7 +407,6 @@ convertDecorator.setConverter(complexChainElement); Geometry geom = convertDecorator.toGeometry(geometryFactory); if (geom != null) { - geom.setSRID(FeatureTypeBuilderUtil.getDefaultFeatureSRID()); return SimpleFeatureBuilder.build(featureType, new Object[]{ geom, colorTable.getColorCode(complexChainElement.getColorIndex()), diff --git a/xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/jobs/context/postgis/IndexDgnConvertPostGISJobContext.java b/xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/jobs/context/postgis/IndexDgnConvertPostGISJobContext.java index bd907d0..774ba91 100644 --- a/xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/jobs/context/postgis/IndexDgnConvertPostGISJobContext.java +++ b/xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/jobs/context/postgis/IndexDgnConvertPostGISJobContext.java @@ -509,7 +509,6 @@ TWDDatumConverter.fromTM2ToEPSG3825(new Coordinate(extent.getMinX(), extent.getMinY())), }), null); } - geom.setSRID(FeatureTypeBuilderUtil.getDefaultFeatureSRID()); return SimpleFeatureBuilder.build(featureType, new Object[]{ geom, extent.getMinX(), @@ -563,8 +562,6 @@ return null; } - if (geom != null) geom.setSRID(FeatureTypeBuilderUtil.getDefaultFeatureSRID()); - return (geom == null ? null : SimpleFeatureBuilder.build(featureType, new Object[]{ geom, @@ -594,7 +591,6 @@ convertDecorator.setConverter(txtElement); Geometry gobj = convertDecorator.toGeometry(geometryFactory); if (gobj != null) - gobj.setSRID(FeatureTypeBuilderUtil.getDefaultFeatureSRID()); feature = SimpleFeatureBuilder.build(featureType, new Object[]{ gobj, colorTable.getColorCode(txtElement.getColorIndex()), @@ -626,7 +622,6 @@ Geometry gobj = geometryFactory.createPoint(pos); if (gobj != null) - gobj.setSRID(FeatureTypeBuilderUtil.getDefaultFeatureSRID()); feature = SimpleFeatureBuilder.build(featureType, new Object[]{ gobj, colorTable.getColorCode(shapeElement.getColorIndex()), @@ -694,7 +689,6 @@ } Envelope innerExtent = geom.getEnvelopeInternal(); - geom.setSRID(FeatureTypeBuilderUtil.getDefaultFeatureSRID()); result[i] = SimpleFeatureBuilder.build(featureType, new Object[]{ geom, innerExtent.getMinX(), @@ -757,7 +751,6 @@ Envelope innerExtent = geom.getEnvelopeInternal(); - geom.setSRID(FeatureTypeBuilderUtil.getDefaultFeatureSRID()); result[i] = SimpleFeatureBuilder.build(featureType, new Object[]{ geom, innerExtent.getMinX(), diff --git a/xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/jobs/context/shapefile/GeneralDgnConvertShpJobContext.java b/xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/jobs/context/shapefile/GeneralDgnConvertShpJobContext.java index 41b36c6..a7df08f 100644 --- a/xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/jobs/context/shapefile/GeneralDgnConvertShpJobContext.java +++ b/xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/jobs/context/shapefile/GeneralDgnConvertShpJobContext.java @@ -257,7 +257,6 @@ String content = textElement.getText(); angle = BigDecimal.valueOf(angle).setScale(3, RoundingMode.HALF_UP).doubleValue(); if (geom != null) { - geom.setSRID(FeatureTypeBuilderUtil.getDefaultFeatureSRID()); return SimpleFeatureBuilder.build(featureType, new Object[]{ geom, colorTable.getColorCode(textElement.getColorIndex()), @@ -288,7 +287,6 @@ } if (geom != null) { - geom.setSRID(FeatureTypeBuilderUtil.getDefaultFeatureSRID()); return SimpleFeatureBuilder.build(featureType, new Object[]{ geom, colorTable.getColorCode(textNodeElement.getColorIndex()), @@ -308,7 +306,6 @@ convertDecorator.setConverter(shapeElement); Geometry geom = convertDecorator.toGeometry(geometryFactory); if (geom != null) { - geom.setSRID(FeatureTypeBuilderUtil.getDefaultFeatureSRID()); return SimpleFeatureBuilder.build(featureType, new Object[]{ geom, colorTable.getColorCode(shapeElement.getColorIndex()), @@ -324,7 +321,6 @@ convertDecorator.setConverter(linestring); Geometry geom = convertDecorator.toGeometry(geometryFactory); if (geom != null) { - geom.setSRID(FeatureTypeBuilderUtil.getDefaultFeatureSRID()); return SimpleFeatureBuilder.build(featureType, new Object[]{ geom, colorTable.getColorCode(linestring.getColorIndex()), @@ -338,7 +334,6 @@ convertDecorator.setConverter(line); Geometry geom = convertDecorator.toGeometry(geometryFactory); if (geom != null) { - geom.setSRID(FeatureTypeBuilderUtil.getDefaultFeatureSRID()); return SimpleFeatureBuilder.build(featureType, new Object[]{ geom, colorTable.getColorCode(line.getColorIndex()), @@ -357,7 +352,6 @@ convertDecorator.setConverter(arcElement); Geometry geom = convertDecorator.toGeometry(geometryFactory); if (geom != null) { - geom.setSRID(FeatureTypeBuilderUtil.getDefaultFeatureSRID()); return SimpleFeatureBuilder.build(featureType, new Object[]{ geom, colorTable.getColorCode(arcElement.getColorIndex()), @@ -371,7 +365,6 @@ convertDecorator.setConverter(arcElement); Geometry geom = convertDecorator.toGeometry(geometryFactory); if (geom != null) { - geom.setSRID(FeatureTypeBuilderUtil.getDefaultFeatureSRID()); return SimpleFeatureBuilder.build(featureType, new Object[]{ geom, colorTable.getColorCode(arcElement.getColorIndex()), @@ -385,7 +378,6 @@ convertDecorator.setConverter(complexChainElement); Geometry geom = convertDecorator.toGeometry(geometryFactory); if (geom != null) { - geom.setSRID(FeatureTypeBuilderUtil.getDefaultFeatureSRID()); return SimpleFeatureBuilder.build(featureType, new Object[]{ geom, colorTable.getColorCode(complexChainElement.getColorIndex()), diff --git a/xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/jobs/context/shapefile/IndexDgnConvertShpJobContext.java b/xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/jobs/context/shapefile/IndexDgnConvertShpJobContext.java index 62adef3..21ef699 100644 --- a/xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/jobs/context/shapefile/IndexDgnConvertShpJobContext.java +++ b/xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/jobs/context/shapefile/IndexDgnConvertShpJobContext.java @@ -249,7 +249,6 @@ TWDDatumConverter.fromTM2ToEPSG3825(new Coordinate(extent.getMinX(), extent.getMinY())), }); } - geom.setSRID(FeatureTypeBuilderUtil.getDefaultFeatureSRID()); return SimpleFeatureBuilder.build(featureType, new Object[]{ geom, extent.getMinX(), @@ -274,7 +273,6 @@ GeometryConverterDecorator convertDecorator = FeatureTypeBuilderUtil.lookupDefaultGeometryConverter(); convertDecorator.setConverter(txtElement); Geometry geom = convertDecorator.toGeometry(geometryFactory); - geom.setSRID(FeatureTypeBuilderUtil.getDefaultFeatureSRID()); SimpleFeature feature = SimpleFeatureBuilder.build(featureType, new Object[]{ geom, colorTable.getColorCode(txtElement.getColorIndex()), @@ -335,7 +333,6 @@ extent.getMinX() + dx, extent.getMaxY() - TPCLIDConverter.SY600 - dy)), }), null); } - geom.setSRID(FeatureTypeBuilderUtil.getDefaultFeatureSRID()); result[i] = SimpleFeatureBuilder.build(featureType, new Object[]{ geom, extent.getMinX(), -- Gitblit v0.0.0-SNAPSHOT