From c335918811ddc282a5e182b2e89878ca258c94f2 Mon Sep 17 00:00:00 2001 From: ?? ? <ulysseskao@ximple.com.tw> Date: Tue, 03 Jun 2008 19:18:20 +0800 Subject: [PATCH] update for EOFM-111, EOFM-112 --- xdgnjobs/ximple-jobcarrier/pom.xml | 6 xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/jobs/context/DummyFeatureConvertJobContext.java | 95 + xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/jobs/AbstractOracleDatabaseJob.java | 14 xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/filter/ElementDispatcher.java | 19 xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/jobs/context/AbstractOracleJobContext.java | 12 .gitattributes | 26 xdgnjobs/ximple-dgnio/pom.xml | 4 xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/filter/CreateShapeStrategy.java | 2 xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/collector/FeatureTypeCollector.java | 48 + xdgnjobs/ximple-jobcarrier/src/main/resources/quartz_jobs_shapefiles.xml | 99 ++ xdgnjobs/ximple-spatialjob/pom.xml | 6 xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/filter/CreateEllipseShapeStrategy.java | 2 xdgnjobs/pom.xml | 23 xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/filter/CreateArcLineStringStrategy.java | 2 xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/util/TWD97GeometryConverterDecorator.java | 2 xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/filter/CreateTextStrategy.java | 2 xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/jobs/context/OracleUpgradeJobContext.java | 4 xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/filter/CreateLineTextStrategy.java | 2 xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/jobs/OracleUpgradeBlob2UDTJob.java | 3 xdgnjobs/ximple-spatialjob/src/main/resources/conf/DefaultMapGroups.xml | 91 + xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/jobs/OracleConvertDgn2OraSDOJob.java | 978 ++++++++++++++++++++ xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/jobs/OracleConvertDgn2ShpJob.java | 28 xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/jobs/context/OracleConvertPostGISJobContext.java | 5 xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/filter/TypeIdDispatchableFilter.java | 22 xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/jobs/context/FeatureDgnConvertJobContext.java | 37 xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/jobs/context/IndexDgnConvertJobContext.java | 6 xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/filter/CreateSymbolStrategy.java | 2 xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/filter/TypeCompLevelIdDispatchableFilter.java | 23 xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/filter/CreateLineStringStrategy.java | 2 xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/jobs/OracleConvertDgn2PostGISJob.java | 1025 +++++++++++++++++++++ xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/jobs/context/OracleConvertOraSDOJobContext.java | 5 xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/jobs/context/OracleConvertShapefilesJobContext.java | 44 xdgnjobs/ximple-jobcarrier/src/main/resources/quartz_jobs.xml | 40 xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/jobs/context/AbstractDgnFileJobContext.java | 2 xdgnjobs/ximple-spatialjob/src/main/resources/com/ximple/eofms/filter/FeatureClassificationRules.xml | 16 xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/jobs/context/GeneralDgnConvertJobContext.java | 43 xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/collector/FeatureClassification.java | 28 xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/filter/ElementDispatchableFilter.java | 2 xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/filter/TypeCompIdDispatchableFilter.java | 21 39 files changed, 2,654 insertions(+), 137 deletions(-) diff --git a/.gitattributes b/.gitattributes index 47b69e9..a1340d3 100644 --- a/.gitattributes +++ b/.gitattributes @@ -42,8 +42,11 @@ 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_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 +xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/collector/FeatureClassification.java svneol=native#text/plain +xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/collector/FeatureTypeCollector.java svneol=native#text/plain xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/filter/AbstractDispatchableFilter.java svneol=native#text/plain xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/filter/AbstractFLinkageDispatchableFilter.java svneol=native#text/plain xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/filter/CreateArcLineStringStrategy.java svneol=native#text/plain @@ -61,19 +64,23 @@ xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/filter/TypeCompIdDispatchableFilter.java svneol=native#text/plain xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/filter/TypeCompLevelIdDispatchableFilter.java svneol=native#text/plain xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/filter/TypeIdDispatchableFilter.java svneol=native#text/plain -xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/jobs/AbstractDgnFileJobContext.java svneol=native#text/plain 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/AbstractOracleJobContext.java svneol=native#text/plain 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/FeatureDgnConvertJobContext.java svneol=native#text/plain -xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/jobs/GeneralDgnConvertJobContext.java svneol=native#text/plain -xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/jobs/IndexDgnConvertJobContext.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 xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/jobs/OracleConvertDgn2ShpJob.java svneol=native#text/plain -xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/jobs/OracleConvertJobContext.java svneol=native#text/plain xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/jobs/OracleElementLogger.java svneol=native#text/plain xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/jobs/OracleUpgradeBlob2UDTJob.java svneol=native#text/plain -xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/jobs/OracleUpgradeJobContext.java svneol=native#text/plain -xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/jobs/TWD97GeometryConverterDecorator.java svneol=native#text/plain +xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/jobs/context/AbstractDgnFileJobContext.java svneol=native#text/plain +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/DummyFeatureConvertJobContext.java svneol=native#text/plain +xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/jobs/context/FeatureDgnConvertJobContext.java svneol=native#text/plain +xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/jobs/context/GeneralDgnConvertJobContext.java svneol=native#text/plain +xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/jobs/context/IndexDgnConvertJobContext.java svneol=native#text/plain +xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/jobs/context/OracleConvertOraSDOJobContext.java svneol=native#text/plain +xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/jobs/context/OracleConvertPostGISJobContext.java svneol=native#text/plain +xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/jobs/context/OracleConvertShapefilesJobContext.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/util/Base64.java svneol=native#text/plain xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/util/BinConverter.java svneol=native#text/plain xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/util/Bits.java svneol=native#text/plain @@ -85,10 +92,13 @@ xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/util/PrintfFormat.java svneol=native#text/plain xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/util/StringUtils.java svneol=native#text/plain xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/util/TPCLIDConverter.java svneol=native#text/plain +xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/util/TWD97GeometryConverterDecorator.java svneol=native#text/plain xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/util/TWDDatumConverter.java svneol=native#text/plain xdgnjobs/ximple-spatialjob/src/main/resources/com/ximple/eofms/filter/ElementDispatcherRules.xml svneol=native#text/xml +xdgnjobs/ximple-spatialjob/src/main/resources/com/ximple/eofms/filter/FeatureClassificationRules.xml svneol=native#text/xml xdgnjobs/ximple-spatialjob/src/main/resources/conf/ConvertShpFilterForLayer.xml svneol=native#text/xml xdgnjobs/ximple-spatialjob/src/main/resources/conf/DefaultConvertShpFilter.xml svneol=native#text/xml +xdgnjobs/ximple-spatialjob/src/main/resources/conf/DefaultMapGroups.xml svneol=native#text/xml xdgnjobs/ximple-spatialjob/src/test/java/com/ximple/eofms/filter/ElementDispatcherTest.java svneol=native#text/plain xdgnjobs/ximple-spatialjob/src/test/resources/com/ximple/eofms/filter/test-data/testElementFilter.xml svneol=native#text/xml xdgnjobs/ximple-spatialjob/src/test/resources/com/ximple/eofms/filter/test-data/testRules.xml svneol=native#text/xml diff --git a/xdgnjobs/pom.xml b/xdgnjobs/pom.xml index cd8219d..c469eb0 100644 --- a/xdgnjobs/pom.xml +++ b/xdgnjobs/pom.xml @@ -18,8 +18,8 @@ <test.maxHeapSize>512M</test.maxHeapSize> <src.output>${basedir}/target</src.output> <java5>1.5</java5> - <xdgnio.version>0.3.0</xdgnio.version> - <gt.version>2.4.2</gt.version> + <xdgnio.version>0.6.0</xdgnio.version> + <gt.version>2.4.4</gt.version> <failIfNoTests>false</failIfNoTests> </properties> @@ -60,7 +60,7 @@ <groupId>com.ximple.eofms</groupId> <artifactId>ximple-dgnjobs</artifactId> <packaging>pom</packaging> - <version>0.3.0</version> + <version>0.6.0</version> <name>ximple-dgnjobs</name> <url>http://www.ximple.com.tw</url> @@ -204,6 +204,21 @@ <artifactId>gt2-data</artifactId> <version>${gt.version}</version> </dependency> + <dependency> + <groupId>org.geotools</groupId> + <artifactId>gt2-oracle-spatial</artifactId> + <version>${gt.version}</version> + </dependency> + <dependency> + <groupId>org.geotools</groupId> + <artifactId>gt2-postgis</artifactId> + <version>${gt.version}</version> + </dependency> + <dependency> + <groupId>org.geotools</groupId> + <artifactId>gt2-mysql</artifactId> + <version>${gt.version}</version> + </dependency> <!-- because main and sample-data depend on referencing we need a tie breaker --> <dependency> @@ -258,7 +273,7 @@ <dependency> <groupId>org.testng</groupId> <artifactId>testng</artifactId> - <version>5.7</version> + <version>5.8</version> <scope>test</scope> </dependency> </dependencies> diff --git a/xdgnjobs/ximple-dgnio/pom.xml b/xdgnjobs/ximple-dgnio/pom.xml index 8140195..c3aaf17 100644 --- a/xdgnjobs/ximple-dgnio/pom.xml +++ b/xdgnjobs/ximple-dgnio/pom.xml @@ -7,7 +7,7 @@ <parent> <groupId>com.ximple.eofms</groupId> <artifactId>ximple-dgnjobs</artifactId> - <version>0.3.0</version> + <version>0.6.0</version> </parent> <!-- =========================================================== --> @@ -15,7 +15,7 @@ <!-- =========================================================== --> <groupId>com.ximple.eofms</groupId> <artifactId>ximple-dgnio</artifactId> - <version>0.3.0</version> + <version>0.6.0</version> <packaging>jar</packaging> <name>ximple-dgnio-1.0.x</name> <url>http://www.ximple.com.tw</url> diff --git a/xdgnjobs/ximple-jobcarrier/pom.xml b/xdgnjobs/ximple-jobcarrier/pom.xml index 62822cf..832c76c 100644 --- a/xdgnjobs/ximple-jobcarrier/pom.xml +++ b/xdgnjobs/ximple-jobcarrier/pom.xml @@ -6,19 +6,19 @@ <parent> <groupId>com.ximple.eofms</groupId> <artifactId>ximple-dgnjobs</artifactId> - <version>0.3.0</version> + <version>0.6.0</version> </parent> <groupId>com.ximple.eofms</groupId> <artifactId>ximple-jobcarrier</artifactId> - <version>0.3.0</version> + <version>0.6.0</version> <packaging>jar</packaging> <name>ximple-jobcarrier</name> <url>http://maven.apache.org</url> <properties> - <xdgnio.version>0.3.0</xdgnio.version> + <xdgnio.version>0.6.0</xdgnio.version> </properties> <scm> diff --git a/xdgnjobs/ximple-jobcarrier/src/main/resources/quartz_jobs.xml b/xdgnjobs/ximple-jobcarrier/src/main/resources/quartz_jobs.xml index be5a288..70a7bdf 100644 --- a/xdgnjobs/ximple-jobcarrier/src/main/resources/quartz_jobs.xml +++ b/xdgnjobs/ximple-jobcarrier/src/main/resources/quartz_jobs.xml @@ -8,24 +8,48 @@ <job> <job-detail> - <name>ConvertDgn2ShpIntoDirectory</name> + <name>ConvertDgn2PostGisIntoPostgre</name> <group>DEFAULT</group> <description>A job that convert dgn to shapefiles</description> - <job-class>com.ximple.eofms.jobs.OracleConvertDgn2ShpJob</job-class> + <job-class>com.ximple.eofms.jobs.OracleConvertDgn2PostGISJob</job-class> <volatility>false</volatility> <durability>false</durability> <recover>false</recover> <job-data-map allows-transient-data="true"> <entry> - <key>SHPDATA_DIR</key> + <key>JOBDATA_DIR</key> <value>g:\temp\data</value> </entry> <!-- <entry> - <key>SHPFILTER_CONF</key> + <key>ELMSFILTER_CONF</key> <value></value> </entry> --> + <entry> + <key>PGHOST</key> + <value>192.168.11.200</value> + </entry> + <entry> + <key>PGDDATBASE</key> + <value>nstpc</value> + </entry> + <entry> + <key>PGPORT</key> + <value>5432</value> + </entry> + <entry> + <key>PGSCHEMA</key> + <value>public</value> + </entry> + <entry> + <key>PGUSER</key> + <value>spatialdb</value> + </entry> + <entry> + <key>PGPASS</key> + <value>spatialdb000</value> + </entry> <entry> <key>ORAHOST</key> <value>192.168.11.200</value> @@ -71,8 +95,12 @@ <value>true</value> </entry> <entry> + <key>USEWKB</key> + <value>true</value> + </entry> + <entry> <key>TESTMODE</key> - <value>FALSE</value> + <value>false</value> </entry> <entry> <key>TESTCOUNT</key> @@ -85,7 +113,7 @@ <simple> <name>convertTrigger</name> <group>DEFAULT</group> - <job-name>ConvertDgn2ShpIntoDirectory</job-name> + <job-name>ConvertDgn2PostGisIntoPostgre</job-name> <job-group>DEFAULT</job-group> <start-time>2008-03-01T18:10:00</start-time> <!-- repeat indefinitely every 10 seconds --> diff --git a/xdgnjobs/ximple-jobcarrier/src/main/resources/quartz_jobs_shapefiles.xml b/xdgnjobs/ximple-jobcarrier/src/main/resources/quartz_jobs_shapefiles.xml new file mode 100644 index 0000000..f03ace3 --- /dev/null +++ b/xdgnjobs/ximple-jobcarrier/src/main/resources/quartz_jobs_shapefiles.xml @@ -0,0 +1,99 @@ +<?xml version='1.0' encoding='utf-8'?> + +<quartz xmlns="http://www.opensymphony.com/quartz/JobSchedulingData" + xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:schemaLocation="http://www.opensymphony.com/quartz/JobSchedulingData + http://www.opensymphony.com/quartz/xml/job_scheduling_data_1_5.xsd" + version="1.5"> + + <job> + <job-detail> + <name>ConvertDgn2ShpIntoDirectory</name> + <group>DEFAULT</group> + <description>A job that convert dgn to shapefiles</description> + <job-class>com.ximple.eofms.jobs.OracleConvertDgn2ShpJob</job-class> + <volatility>false</volatility> + <durability>false</durability> + <recover>false</recover> + <job-data-map allows-transient-data="true"> + <entry> + <key>SHPDATA_DIR</key> + <value>g:\temp\data</value> + </entry> + <!-- + <entry> + <key>ELMSFILTER_CONF</key> + <value></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>false</value> + </entry> + <entry> + <key>CONVERTFILE</key> + <value>false</value> + </entry> + <entry> + <key>CONVERTELEMIN</key> + <value>false</value> + </entry> + <entry> + <key>CREATEDUMMY</key> + <value>true</value> + </entry> + <entry> + <key>ELEMLOG</key> + <value>true</value> + </entry> + <entry> + <key>TESTMODE</key> + <value>FALSE</value> + </entry> + <entry> + <key>TESTCOUNT</key> + <value>2</value> + </entry> + </job-data-map> + </job-detail> + + <trigger> + <simple> + <name>convertTrigger</name> + <group>DEFAULT</group> + <job-name>ConvertDgn2ShpIntoDirectory</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> + + </job> +</quartz> diff --git a/xdgnjobs/ximple-spatialjob/pom.xml b/xdgnjobs/ximple-spatialjob/pom.xml index a3fd413..46fd81b 100644 --- a/xdgnjobs/ximple-spatialjob/pom.xml +++ b/xdgnjobs/ximple-spatialjob/pom.xml @@ -7,18 +7,18 @@ <parent> <groupId>com.ximple.eofms</groupId> <artifactId>ximple-dgnjobs</artifactId> - <version>0.3.0</version> + <version>0.6.0</version> </parent> <groupId>com.ximple.eofms</groupId> <artifactId>ximple-spatialjob</artifactId> - <version>0.3.0</version> + <version>0.6.0</version> <packaging>jar</packaging> <name>ximple-spatialjob</name> <url>http://www.ximple.com.tw</url> <properties> - <xdgnio.version>0.3.0</xdgnio.version> + <xdgnio.version>0.6.0</xdgnio.version> </properties> <description> diff --git a/xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/collector/FeatureClassification.java b/xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/collector/FeatureClassification.java new file mode 100644 index 0000000..e4024ec --- /dev/null +++ b/xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/collector/FeatureClassification.java @@ -0,0 +1,28 @@ +package com.ximple.eofms.collector; + +import java.util.TreeMap; + +public class FeatureClassification +{ + private TreeMap<String, FeatureTypeCollector> clasificationRules; + + public FeatureClassification() + { + clasificationRules = new TreeMap<String, FeatureTypeCollector>(); + } + + public void addCollector(FeatureTypeCollector collector) + { + collector.getName(); + } + + public boolean containsKey(String typeName) + { + return clasificationRules.containsKey(typeName); + } + + public TreeMap<String, FeatureTypeCollector> getClasificationRules() + { + return clasificationRules; + } +} diff --git a/xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/collector/FeatureTypeCollector.java b/xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/collector/FeatureTypeCollector.java new file mode 100644 index 0000000..7309b3f --- /dev/null +++ b/xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/collector/FeatureTypeCollector.java @@ -0,0 +1,48 @@ +package com.ximple.eofms.collector; + +import java.util.ArrayList; + +import com.ximple.eofms.util.StringUtils; + +public class FeatureTypeCollector +{ + private String name; + private String description; + private String featuretypeList; + private ArrayList<String> featureTypeNameList; + + public FeatureTypeCollector() + { + } + + public String getName() + { + return name; + } + + public void setName(String name) + { + this.name = name; + } + + public String getDescription() + { + return description; + } + + public void setDescription(String description) + { + this.description = description; + } + + public String getFeaturetypeList() + { + return featuretypeList; + } + + public void setFeaturetypeList(String featuretypeList) + { + featureTypeNameList = StringUtils.split(featuretypeList, ","); + this.featuretypeList = featuretypeList; + } +} 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 6cc80e7..6fc37b6 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 @@ -15,7 +15,7 @@ import com.vividsolutions.jts.geom.Geometry; import com.vividsolutions.jts.geom.GeometryFactory; -import com.ximple.eofms.jobs.TWD97GeometryConverterDecorator; +import com.ximple.eofms.util.TWD97GeometryConverterDecorator; import com.ximple.eofms.util.DefaultColorTable; import com.ximple.io.dgn7.ArcElement; import com.ximple.io.dgn7.Element; 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 12e32d4..25b6210 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 @@ -15,7 +15,7 @@ import com.vividsolutions.jts.geom.Geometry; import com.vividsolutions.jts.geom.GeometryFactory; -import com.ximple.eofms.jobs.TWD97GeometryConverterDecorator; +import com.ximple.eofms.util.TWD97GeometryConverterDecorator; import com.ximple.eofms.util.DefaultColorTable; import com.ximple.io.dgn7.Element; import com.ximple.io.dgn7.EllipseElement; 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 3df0256..a6fe3c9 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 @@ -15,7 +15,7 @@ import com.vividsolutions.jts.geom.Geometry; import com.vividsolutions.jts.geom.GeometryFactory; -import com.ximple.eofms.jobs.TWD97GeometryConverterDecorator; +import com.ximple.eofms.util.TWD97GeometryConverterDecorator; import com.ximple.eofms.util.DefaultColorTable; import com.ximple.io.dgn7.ComplexChainElement; import com.ximple.io.dgn7.Element; 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 3d5c47f..0823ce1 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 @@ -17,7 +17,7 @@ import com.vividsolutions.jts.geom.GeometryFactory; import com.vividsolutions.jts.geom.LineString; -import com.ximple.eofms.jobs.TWD97GeometryConverterDecorator; +import com.ximple.eofms.util.TWD97GeometryConverterDecorator; import com.ximple.eofms.util.DefaultColorTable; import com.ximple.eofms.util.TWDDatumConverter; import com.ximple.io.dgn7.ComplexChainElement; 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 2d0d165..44701ef 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 @@ -15,7 +15,7 @@ import com.vividsolutions.jts.geom.Geometry; import com.vividsolutions.jts.geom.GeometryFactory; -import com.ximple.eofms.jobs.TWD97GeometryConverterDecorator; +import com.ximple.eofms.util.TWD97GeometryConverterDecorator; import com.ximple.eofms.util.DefaultColorTable; import com.ximple.io.dgn7.ComplexShapeElement; import com.ximple.io.dgn7.Element; 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 4e27822..b6007a3 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 @@ -17,7 +17,7 @@ import com.vividsolutions.jts.geom.Geometry; import com.vividsolutions.jts.geom.GeometryFactory; -import com.ximple.eofms.jobs.TWD97GeometryConverterDecorator; +import com.ximple.eofms.util.TWD97GeometryConverterDecorator; import com.ximple.eofms.util.DefaultColorTable; import com.ximple.io.dgn7.Element; import com.ximple.io.dgn7.FrammeAttributeData; 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 98a9d75..229373a 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 @@ -17,7 +17,7 @@ import com.vividsolutions.jts.geom.Geometry; import com.vividsolutions.jts.geom.GeometryFactory; -import com.ximple.eofms.jobs.TWD97GeometryConverterDecorator; +import com.ximple.eofms.util.TWD97GeometryConverterDecorator; import com.ximple.eofms.util.DefaultColorTable; import com.ximple.io.dgn7.Element; import com.ximple.io.dgn7.FrammeAttributeData; diff --git a/xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/filter/ElementDispatchableFilter.java b/xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/filter/ElementDispatchableFilter.java index 9ed97d1..ed3f5ba 100644 --- a/xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/filter/ElementDispatchableFilter.java +++ b/xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/filter/ElementDispatchableFilter.java @@ -9,4 +9,6 @@ public boolean isDispatchable(Element element); public Feature execute(Element element); + + void setUseLongName(boolean useLongName); } diff --git a/xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/filter/ElementDispatcher.java b/xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/filter/ElementDispatcher.java index 48df964..38e3e9e 100644 --- a/xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/filter/ElementDispatcher.java +++ b/xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/filter/ElementDispatcher.java @@ -9,6 +9,7 @@ public class ElementDispatcher { private LinkedList<ElementDispatchableFilter> rules; + private boolean useLongName = false; public ElementDispatcher() { @@ -22,9 +23,27 @@ public void addRule(ElementDispatchableFilter rule) { + rule.setUseLongName(useLongName); rules.add(rule); } + public boolean isUseLongName() + { + return useLongName; + } + + public void setUseLongName(boolean useLongName) + { + if (this.useLongName != useLongName) + { + this.useLongName = useLongName; + for (ElementDispatchableFilter filter : rules) + { + filter.setUseLongName(useLongName); + } + } + } + public Feature execute(Element element) { for (ElementDispatchableFilter rule : rules) diff --git a/xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/filter/TypeCompIdDispatchableFilter.java b/xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/filter/TypeCompIdDispatchableFilter.java index 3731d86..d43c849 100644 --- a/xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/filter/TypeCompIdDispatchableFilter.java +++ b/xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/filter/TypeCompIdDispatchableFilter.java @@ -13,6 +13,7 @@ private int tid; private int cid; private CreateFeatureTypeStrategy createStrategy; + private boolean useLongName = false; public TypeCompIdDispatchableFilter() { @@ -58,6 +59,15 @@ this.createStrategy = createStrategy; } + public boolean isUseLongName() + { + return useLongName; + } + + public void setUseLongName(boolean useLongName) + { + this.useLongName = useLongName; + } //�P�_�O�_�ũM���� public boolean isDispatchable(Element element) @@ -92,10 +102,13 @@ { StringBuilder sb= new StringBuilder(); sb.append(getName()); - sb.append("_"); - sb.append(element.getLevelIndex()); - sb.append("_"); - sb.append(element.getWeight()); + if (useLongName) + { + sb.append("_"); + sb.append(element.getLevelIndex()); + sb.append("_"); + sb.append(element.getWeight()); + } return sb.toString(); } } diff --git a/xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/filter/TypeCompLevelIdDispatchableFilter.java b/xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/filter/TypeCompLevelIdDispatchableFilter.java index a26c19c..9b4109f 100644 --- a/xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/filter/TypeCompLevelIdDispatchableFilter.java +++ b/xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/filter/TypeCompLevelIdDispatchableFilter.java @@ -14,6 +14,7 @@ private int cid; private int lid; private CreateFeatureTypeStrategy createStrategy; + private boolean useLongName = false; public TypeCompLevelIdDispatchableFilter() { @@ -70,6 +71,17 @@ this.createStrategy = createStrategy; } + + public boolean isUseLongName() + { + return useLongName; + } + + public void setUseLongName(boolean useLongName) + { + this.useLongName = useLongName; + } + public boolean isDispatchable(Element element) { FrammeAttributeData featureLinkage = getFeatureLinkage(element); @@ -99,10 +111,13 @@ { StringBuilder sb= new StringBuilder(); sb.append(getName()); - sb.append("_"); - sb.append(element.getLevelIndex()); - sb.append("_"); - sb.append(element.getWeight()); + if (useLongName) + { + sb.append("_"); + sb.append(element.getLevelIndex()); + sb.append("_"); + sb.append(element.getWeight()); + } return sb.toString(); } } diff --git a/xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/filter/TypeIdDispatchableFilter.java b/xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/filter/TypeIdDispatchableFilter.java index 4a50da9..9ab6756 100644 --- a/xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/filter/TypeIdDispatchableFilter.java +++ b/xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/filter/TypeIdDispatchableFilter.java @@ -12,6 +12,7 @@ { private int tid; private CreateFeatureTypeStrategy createStrategy; + private boolean useLongName = false; public TypeIdDispatchableFilter() { @@ -69,14 +70,27 @@ return null; } + public boolean isUseLongName() + { + return useLongName; + } + + public void setUseLongName(boolean useLongName) + { + this.useLongName = useLongName; + } + public String getFeatureTypeName(Element element) { StringBuilder sb= new StringBuilder(); sb.append(getName()); - sb.append("_"); - sb.append(element.getLevelIndex()); - sb.append("_"); - sb.append(element.getWeight()); + if (useLongName) + { + sb.append("_"); + sb.append(element.getLevelIndex()); + sb.append("_"); + sb.append(element.getWeight()); + } return sb.toString(); } } diff --git a/xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/jobs/AbstractOracleDatabaseJob.java b/xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/jobs/AbstractOracleDatabaseJob.java index fff760a..3e68794 100644 --- a/xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/jobs/AbstractOracleDatabaseJob.java +++ b/xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/jobs/AbstractOracleDatabaseJob.java @@ -19,10 +19,12 @@ import oracle.sql.BLOB; +import com.ximple.eofms.jobs.context.AbstractOracleJobContext; + public abstract class AbstractOracleDatabaseJob implements Job { - private static final String SHPDATA_DIR = "SHPDATA_DIR"; - private static final String CONFSHPFILTER = "SHPFILTER_CONF"; + private static final String JOBDATA_DIR = "JOBDATA_DIR"; + private static final String CONFELMSFILTER = "ELMSFILTER_CONF"; private static final String SPATAILSCHEMA = "ORGSCHEMA"; private static final String CONVERTDB = "CONVERTDB"; private static final String CONVERTFILE = "CONVERTFILE"; @@ -61,8 +63,8 @@ { // The directory to scan is stored in the job map JobDataMap dataMap = jobDetail.getJobDataMap(); - _dataPath = dataMap.getString(SHPDATA_DIR); - _filterPath = dataMap.getString(CONFSHPFILTER); + _dataPath = dataMap.getString(JOBDATA_DIR); + _filterPath = dataMap.getString(CONFELMSFILTER); _oracleHost = dataMap.getString(ORAHOST); _oracleInstance = dataMap.getString(ORAINST); _oraclePort = dataMap.getString(ORAPORT); @@ -75,8 +77,8 @@ _createDummy = dataMap.getString(CREATEDUMMY); Log logger = getLogger(); - logger.info("SHPDATA_DIR=" + _dataPath); - logger.info("CONFSHPFILTER=" + _filterPath); + logger.info("JOBDATA_DIR=" + _dataPath); + logger.info("CONFELMSFILTER=" + _filterPath); logger.info("ORAHOST=" + _oracleHost); logger.info("ORAINST=" + _oracleInstance); logger.info("ORAPORT=" + _oraclePort); diff --git a/xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/jobs/OracleConvertDgn2OraSDOJob.java b/xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/jobs/OracleConvertDgn2OraSDOJob.java new file mode 100644 index 0000000..3f6e681 --- /dev/null +++ b/xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/jobs/OracleConvertDgn2OraSDOJob.java @@ -0,0 +1,978 @@ +package com.ximple.eofms.jobs; + +import java.util.Date; +import java.sql.SQLException; +import java.sql.Statement; +import java.sql.ResultSet; +import java.sql.Types; +import java.io.IOException; +import java.io.File; +import java.io.FilenameFilter; +import java.io.FileInputStream; +import java.io.FileNotFoundException; +import java.math.BigDecimal; +import java.nio.ByteBuffer; +import java.nio.ByteOrder; +import java.nio.channels.FileChannel; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.apache.commons.collections.OrderedMap; +import org.apache.commons.collections.OrderedMapIterator; +import org.apache.commons.collections.map.LinkedMap; +import org.quartz.JobExecutionContext; +import org.quartz.JobExecutionException; +import org.quartz.JobDetail; +import org.geotools.feature.IllegalAttributeException; +import org.geotools.feature.SchemaException; + +import com.vividsolutions.jts.geom.GeometryFactory; + +import oracle.jdbc.OracleConnection; +import oracle.jdbc.OracleResultSet; +import oracle.sql.BLOB; +import oracle.sql.ARRAY; + +import com.ximple.util.PrintfFormat; +import com.ximple.io.dgn7.Element; +import com.ximple.io.dgn7.Dgn7fileException; +import com.ximple.io.dgn7.ElementType; +import com.ximple.io.dgn7.IElementHandler; +import com.ximple.io.dgn7.ComplexElement; +import com.ximple.io.dgn7.Dgn7fileReader; +import com.ximple.io.dgn7.Lock; +import com.ximple.io.dgn7.TextElement; +import com.ximple.eofms.util.BinConverter; +import com.ximple.eofms.util.ByteArrayCompressor; +import com.ximple.eofms.util.StringUtils; +import com.ximple.eofms.jobs.context.AbstractOracleJobContext; +import com.ximple.eofms.jobs.context.FeatureDgnConvertJobContext; +import com.ximple.eofms.jobs.context.GeneralDgnConvertJobContext; +import com.ximple.eofms.jobs.context.IndexDgnConvertJobContext; +import com.ximple.eofms.jobs.context.OracleConvertShapefilesJobContext; + +public class OracleConvertDgn2OraSDOJob extends AbstractOracleDatabaseJob +{ + final static Log logger = LogFactory.getLog(OracleConvertDgn2OraSDOJob.class); + + /** The Oracle driver class name */ + private static final String JDBC_DRIVER = "oracle.jdbc.driver.OracleDriver"; + + private static final int FETCHSIZE = 30; + private static final int BATCHSIZE = 25; + private static final int COMMITSIZE = 20; + + class Pair + { + Object first; + Object second; + + public Pair(Object first, Object second) + { + this.first = first; + this.second = second; + } + } + + GeometryFactory _geomFactory = new GeometryFactory(); + + public Log getLogger() + { + return logger; + } + + // OracleDataStoreFactory factory = new OracleDataStoreFactory(); + /* + Map map = new HashMap(); + map.put("host", fixture.getProperty("host")); + map.put("port", fixture.getProperty("port")); + map.put("instance", fixture.getProperty("instance")); + map.put("user", fixture.getProperty("user")); + map.put("passwd", fixture.getProperty("passwd")); + map.put("dbtype", "oracle"); + map.put("alias", fixture.getProperty("instance")); + map.put("namespace", null); + + assertTrue(factory.canProcess(map)); + + OracleDataStore store = (OracleDataStore) factory.createDataStore(map); + assertNull(store.getNameSpace()); + + map.put("schema", fixture.getProperty("user").toUpperCase()); + store = (OracleDataStore) factory.createDataStore(map); + assertNull(store.getNameSpace()); + + map.put("namespace", "topp"); + store = (OracleDataStore) factory.createDataStore(map); + assertEquals(new URI("topp"), store.getNameSpace()); + */ + + /* + FeatureWriter writer = dstore.getFeatureWriter("ORA_TEST_POINTS", Filter.INCLUDE, + Transaction.AUTO_COMMIT); + assertNotNull(writer); + + Feature feature = writer.next(); + System.out.println(feature); + feature.setAttribute(0, "Changed Feature"); + System.out.println(feature); + writer.write(); + writer.close(); + */ + + /* + Map fidGen = new HashMap(); + fidGen.put("ORA_TEST_POINTS", JDBCDataStoreConfig.FID_GEN_MANUAL_INC); + + JDBCDataStoreConfig config = JDBCDataStoreConfig.createWithSchemaNameAndFIDGenMap(schemaName, + fidGen); + + String name = "add_name"; + BigDecimal intval = new BigDecimal(70); + Point point = jtsFactory.createPoint(new Coordinate(-15.0, -25)); + Feature feature = dstore.getSchema("ORA_TEST_POINTS") + .create(new Object[] { name, intval, point }); + + FeatureStore fs = (FeatureStore) dstore.getFeatureSource("ORA_TEST_POINTS"); + fs.addFeatures(DataUtilities.collection(feature)); + */ + + protected AbstractOracleJobContext prepareJobContext(String filterPath) + { + return new OracleConvertShapefilesJobContext(filterPath); + } + + 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); + + try + { + logger.info("-- step:clearOutputDirectory --"); + clearOutputDirectory(); + boolean bFirst = true; + if (checkConvertDB()) + { + logger.info("-- step:convertOracleDB --"); + + for (String orgSchema : _orgSchema) + { + OracleConvertShapefilesJobContext jobContext = (OracleConvertShapefilesJobContext) prepareJobContext(_filterPath); + jobContext.setConnectionInfo(_oracleHost, _oraclePort, _oracleInstance); + jobContext.setLogin(_username, _password); + jobContext.setShapeData(_dataPath); + jobContext.setConvertDB(_convertDB); + jobContext.setConvertFile(_convertFile); + jobContext.setConvertElementIn(_convertElementIn); + jobContext.setElementLogging(checkElementLogging()); + jobContext.setExecutionContext(context); + + if (bFirst) + copyConnectivity(jobContext); + else + bFirst = false; + + logger.info("----- start schema:" + orgSchema + " -----"); + exetcuteConvert(jobContext, orgSchema, _dataPath); + + //close all open filewriter instance + jobContext.closeFeatureWriter(); + } + } + + if (checkConvertFile()) + { + logger.info("-- step:convertIndexDesignFile --"); + convertIndexDesignFile(context); + logger.info("-- step:convertOtherDesignFile --"); + convertOtherDesignFile(context); + } + + if (checkConvertElementIn()) + { + logger.info("-- step:convertFeatureDesignFile --"); + convertFeatureDesignFile(context); + } + + if (checkCreateDummy()) + { + logger.info("-- step:createDummyFeatureFile --"); + createDummyFeatureFile(context); + } + } catch (SQLException e) + { + logger.warn(e.getMessage(), e); + throw new JobExecutionException("Database error. " + e.getMessage(), e); + } catch (IOException ex) + { + logger.warn(ex.getMessage(), ex); + throw new JobExecutionException("IO error. " + ex.getMessage(), ex); + } + logger.info(jobName + " end at " + new Date()); + } + + /** + * Connectivity�ƻs�@�Ӫ����A�b�d�߹q�y��V�ɥΨӤ��OMS��Ʈw���q���s����(Connectivity) + * + * @param jobContext job context + * @throws SQLException sql exception + */ + private void copyConnectivity(OracleConvertShapefilesJobContext jobContext) throws SQLException + { + OracleConnection connection = jobContext.getOracleConnection(); + Statement stmt = connection.createStatement(); + stmt.execute(OracleConvertShapefilesJobContext.TRUNCATE_CONNECTIVITY_WEBCHECK); + stmt.execute(OracleConvertShapefilesJobContext.COPY_CONNECTIVITY_TO_WEBCHECK); + } + + private void exetcuteConvert(OracleConvertShapefilesJobContext jobContext, + String querySchema, String dataPath) 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; + + //jobContext.startTransaction(); + jobContext.setCurrentSchema(querySchema); + jobContext.getExecutionContext().put("ConvertDgn2ShpJobProgress", 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(); + } + + int now = order % step; + if (now != current) + { + current = now; + jobContext.getExecutionContext().put("ConvertDgn2ShpJobProgress", current); + + } + } + jobContext.getExecutionContext().put("ConvertDgn2ShpJobProgress", 100); + + jobContext.commitTransaction(); + + logger.info("end convert job:[" + order + "]"); + System.gc(); + } + + protected OrderedMap getBlobStorageList(OracleConnection 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); + + while (rs.next()) + { + int size = rs.getMetaData().getColumnCount(); + 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 + { + if (rs != null) rs.close(); + stmt.close(); + } + + 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); + + while (rs.next()) + { + int size = rs.getMetaData().getColumnCount(); + 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; + } + + rs.close(); + stmt.close(); + + return orderedMap; + } + + protected void queryIgsetElement(OracleConvertShapefilesJobContext jobContext, + String srcschema, String srctable) throws SQLException + { + OracleConnection connection = jobContext.getOracleConnection(); + String fetchSrcStmtFmt = "SELECT IGDSELM FROM \"%s\".\"%s\" 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); + + while (rsSrc.next()) + { + byte[] raw = null; + + if (rsSrc.getMetaData().getColumnType(1) == Types.BLOB) + { + BLOB blob = (BLOB) rsSrc.getBlob(1); + + raw = getBytesFromBLOB(blob); + blob.close(); + } else + { + raw = rsSrc.getBytes(1); + } + + try + { + Element element = fetchBinaryElement(raw); + jobContext.putFeatureCollection(element); + } catch (Dgn7fileException e) + { + logger.warn("Dgn7Exception", e); + } + } + + rsSrc.close(); + stmtSrc.close(); + } + + protected void queryRawElement(OracleConvertShapefilesJobContext jobContext, + String srcschema, String srctable) throws SQLException + { + OracleConnection 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); + + 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); + } + } + + rsDest.close(); + stmtDest.close(); + } + + // 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)) + { + System.out.println("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]); + System.out.println("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) throws JobExecutionException + { + File indexDir = new File(getDataPath(), "index"); + if (!indexDir.exists()) + { + logger.info("index dir=" + indexDir + " not exist."); + return; + } + + if (!indexDir.isDirectory()) + { + logger.info("index dir=" + indexDir + " is not a directory."); + } + + File[] dgnFiles = indexDir.listFiles(new FilenameFilter() + { + public boolean accept(File dir, String name) + { + return name.toLowerCase().endsWith(".dgn"); + } + }); + + for (File dgnFile : dgnFiles) + { + IndexDgnConvertJobContext convertContext = new IndexDgnConvertJobContext(getDataPath()); + logger.debug("--- start dgnfile-" + dgnFile.toString() + " ---"); + try + { + convertContext.setExecutionContext(context); + String dgnPaths[] = StringUtils.splitToArray(dgnFile.toString(), File.separator); + convertContext.setFilename(dgnPaths[dgnPaths.length - 1]); + + FileInputStream fs = new FileInputStream(dgnFile); + FileChannel fc = fs.getChannel(); + Dgn7fileReader reader = new Dgn7fileReader(fc, new Lock()); + convertContext.setReader(reader); + + scanIndexDgnElement(convertContext); + + convertContext.commitTransaction(); + convertContext.closeFeatureWriter(); + System.gc(); + } 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); + } + } + } + + protected void scanIndexDgnElement(IndexDgnConvertJobContext convertContext) + throws Dgn7fileException, IOException, IllegalAttributeException, SchemaException + { + Dgn7fileReader reader = convertContext.getReader(); + int count = 0; + Element lastComplex = null; + while (reader.hasNext()) + { + Dgn7fileReader.Record record = reader.nextElement(); + if (record.element() != null) + { + Element element = (Element) record.element(); + ElementType type = element.getElementType(); + + if ((!type.isComplexElement()) && (!element.isComponentElement())) + { + lastComplex = null; + + processIndexElement(element, convertContext); + } else if (element.isComponentElement()) + { + if (lastComplex != null) + { + ((ComplexElement) lastComplex).add(element); + } + } else if (type.isComplexElement()) + { + if (lastComplex == null) + { + lastComplex = element; + } else + { + processIndexElement(element, convertContext); + lastComplex = element; + } + } + } + count++; + } + + logger.debug("ElementRecord Count=" + count); + } + + private void processIndexElement(Element element, IndexDgnConvertJobContext convertContext) throws IllegalAttributeException, SchemaException + { + if (element instanceof TextElement) + { + convertContext.putFeatureCollection(element); + } + } + + + /** + * �����ഫ��L�]�p���ɪ��u�@ + * + * @param context jobContext + * @throws org.quartz.JobExecutionException exception + */ + private void convertOtherDesignFile(JobExecutionContext context) throws JobExecutionException + { + File otherDir = new File(getDataPath(), "other"); + if (!otherDir.exists()) + { + logger.info("other dir=" + otherDir + " not exist."); + return; + } + + if (!otherDir.isDirectory()) + { + logger.info("other dir=" + otherDir + " is not a directory."); + } + + File[] dgnFiles = otherDir.listFiles(new FilenameFilter() + { + public boolean accept(File dir, String name) + { + return name.toLowerCase().endsWith(".dgn"); + } + }); + + for (File dgnFile : dgnFiles) + { + GeneralDgnConvertJobContext convertContext = new GeneralDgnConvertJobContext(getDataPath()); + logger.info("--- start dgnfile-" + dgnFile.toString() + " ---"); + try + { + convertContext.setExecutionContext(context); + String dgnPaths[] = StringUtils.splitToArray(dgnFile.toString(), File.separator); + convertContext.setFilename(dgnPaths[dgnPaths.length - 1]); + + FileInputStream fs = new FileInputStream(dgnFile); + FileChannel fc = fs.getChannel(); + Dgn7fileReader reader = new Dgn7fileReader(fc, new Lock()); + convertContext.setReader(reader); + + scanOtherDgnElement(convertContext); + + convertContext.commitTransaction(); + convertContext.closeFeatureWriter(); + System.gc(); + } 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); + } + } + } + + public void scanOtherDgnElement(GeneralDgnConvertJobContext convertContext) + throws Dgn7fileException, IOException, IllegalAttributeException, SchemaException + { + Dgn7fileReader reader = convertContext.getReader(); + int count = 0; + Element lastComplex = null; + while (reader.hasNext()) + { + Dgn7fileReader.Record record = reader.nextElement(); + if (record.element() != null) + { + Element element = (Element) record.element(); + ElementType type = element.getElementType(); + + if ((!type.isComplexElement()) && (!element.isComponentElement())) + { + lastComplex = null; + + processOtherElement(element, convertContext); + } else if (element.isComponentElement()) + { + if (lastComplex != null) + { + ((ComplexElement) lastComplex).add(element); + } + } else if (type.isComplexElement()) + { + if (lastComplex == null) + { + lastComplex = element; + } else + { + processOtherElement(element, convertContext); + lastComplex = element; + } + } + } + count++; + } + + logger.debug("ElementRecord Count=" + count); + } + + private void processOtherElement(Element element, GeneralDgnConvertJobContext convertContext) + throws IllegalAttributeException, SchemaException + { + convertContext.putFeatureCollection(element); + } + + private void clearOutputDirectory() + { + File outDataPath = new File(getDataPath(), OracleConvertShapefilesJobContext.SHPOUTPATH); + if (outDataPath.exists() && outDataPath.isDirectory()) + { + deleteFilesInPath(outDataPath); + } + outDataPath = new File(getDataPath(), IndexDgnConvertJobContext.SHPOUTPATH); + if (outDataPath.exists() && outDataPath.isDirectory()) + { + deleteFilesInPath(outDataPath); + } + outDataPath = new File(getDataPath(), GeneralDgnConvertJobContext.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) 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) + { + FeatureDgnConvertJobContext convertContext = new FeatureDgnConvertJobContext(getDataPath(), _filterPath); + logger.info("--- start dgnfile-" + dgnFile.toString() + " ---"); + try + { + convertContext.setExecutionContext(context); + String dgnPaths[] = StringUtils.splitToArray(dgnFile.toString(), File.separator); + convertContext.setFilename(dgnPaths[dgnPaths.length - 1]); + + 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(); + } 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); + } + } + } + + public void scanFeatureDgnElement(FeatureDgnConvertJobContext convertContext) + throws Dgn7fileException, IOException, IllegalAttributeException, SchemaException + { + Dgn7fileReader reader = convertContext.getReader(); + int count = 0; + Element lastComplex = null; + while (reader.hasNext()) + { + Dgn7fileReader.Record record = reader.nextElement(); + if (record.element() != null) + { + Element element = (Element) record.element(); + ElementType type = element.getElementType(); + + if ((!type.isComplexElement()) && (!element.isComponentElement())) + { + lastComplex = null; + + processFeatureElement(element, convertContext); + } else if (element.isComponentElement()) + { + if (lastComplex != null) + { + ((ComplexElement) lastComplex).add(element); + } + } else if (type.isComplexElement()) + { + if (lastComplex == null) + { + lastComplex = element; + } else + { + processFeatureElement(element, convertContext); + lastComplex = element; + } + } + } + count++; + } + + logger.debug("ElementRecord Count=" + count); + } + + private void processFeatureElement(Element element, FeatureDgnConvertJobContext convertContext) + throws IllegalAttributeException, SchemaException + { + convertContext.putFeatureCollection(element); + } + + private void createDummyFeatureFile(JobExecutionContext context) throws JobExecutionException + { + /* + DummyFeatureConvertJobContext convertContext = new DummyFeatureConvertJobContext(getDataPath(), _filterPath); + try { + convertContext.startTransaction(); + convertContext.commitTransaction(); + convertContext.closeFeatureWriter(); + } catch (IOException e) + { + logger.warn(e.getMessage(), e); + throw new JobExecutionException(e.getMessage(), e); + } + */ + } +} 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 new file mode 100644 index 0000000..cefb476 --- /dev/null +++ b/xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/jobs/OracleConvertDgn2PostGISJob.java @@ -0,0 +1,1025 @@ +package com.ximple.eofms.jobs; + +import java.util.Date; +import java.sql.SQLException; +import java.sql.Statement; +import java.sql.ResultSet; +import java.sql.Types; +import java.io.IOException; +import java.io.File; +import java.io.FilenameFilter; +import java.io.FileInputStream; +import java.io.FileNotFoundException; +import java.math.BigDecimal; +import java.nio.ByteBuffer; +import java.nio.ByteOrder; +import java.nio.channels.FileChannel; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.apache.commons.collections.OrderedMap; +import org.apache.commons.collections.OrderedMapIterator; +import org.apache.commons.collections.map.LinkedMap; +import org.quartz.JobExecutionContext; +import org.quartz.JobExecutionException; +import org.quartz.JobDetail; +import org.quartz.JobDataMap; +import org.geotools.feature.IllegalAttributeException; +import org.geotools.feature.SchemaException; + +import com.vividsolutions.jts.geom.GeometryFactory; + +import oracle.jdbc.OracleConnection; +import oracle.jdbc.OracleResultSet; +import oracle.sql.BLOB; +import oracle.sql.ARRAY; + +import com.ximple.util.PrintfFormat; +import com.ximple.io.dgn7.Element; +import com.ximple.io.dgn7.Dgn7fileException; +import com.ximple.io.dgn7.ElementType; +import com.ximple.io.dgn7.IElementHandler; +import com.ximple.io.dgn7.ComplexElement; +import com.ximple.io.dgn7.Dgn7fileReader; +import com.ximple.io.dgn7.Lock; +import com.ximple.io.dgn7.TextElement; +import com.ximple.eofms.util.BinConverter; +import com.ximple.eofms.util.ByteArrayCompressor; +import com.ximple.eofms.util.StringUtils; +import com.ximple.eofms.jobs.context.AbstractOracleJobContext; +import com.ximple.eofms.jobs.context.FeatureDgnConvertJobContext; +import com.ximple.eofms.jobs.context.GeneralDgnConvertJobContext; +import com.ximple.eofms.jobs.context.IndexDgnConvertJobContext; +import com.ximple.eofms.jobs.context.OracleConvertShapefilesJobContext; + +public class OracleConvertDgn2PostGISJob extends AbstractOracleDatabaseJob +{ + final static Log logger = LogFactory.getLog(OracleConvertDgn2PostGISJob.class); + + private static final String PGHOST = "PGHOST"; + private static final String PGDDATBASE = "PGDDATBASE"; + private static final String PGPORT = "PGPORT"; + private static final String PGSCHEMA = "PGSCHEMA"; + private static final String PGUSER = "PGUSER"; + private static final String PGPASS = " PGPASS"; + private static final String USEWKB = "USEWKB"; + + private static final int FETCHSIZE = 30; + private static final int BATCHSIZE = 25; + private static final int COMMITSIZE = 20; + + class Pair + { + Object first; + Object second; + + public Pair(Object first, Object second) + { + this.first = first; + this.second = second; + } + } + + GeometryFactory _geomFactory = new GeometryFactory(); + protected String _pgHost; + protected String _pgDatabase; + protected String _pgPort; + protected String _pgSchema; + protected String _pgUsername; + protected String _pgPassword; + protected String _pgUseWKB; + + // static PostgisDataStoreFactory factory = new PostgisDataStoreFactory(); + /* + f = PostgisTests.newFixture(); + remote = new HashMap(); + remote.put("dbtype", "postgis"); + remote.put("charset", ""); + remote.put("host", f.host); + remote.put("port", f.port); + remote.put("database", f.database); + remote.put("user", f.user); + remote.put("passwd", f.password); + remote.put("namespace", f.namespace); + */ + /* + PostgisDataStore pg = new PostgisDataStore(pool, f.schema, getName(), + PostgisDataStore.OPTIMIZE_SQL); + pg.setWKBEnabled(WKB_ENABLED); + pg.setEstimatedExtent(true); + pg.setFIDMapper("road", new TypedFIDMapper(new BasicFIDMapper("fid", 255, false), "road")); + pg.setFIDMapper("river", new TypedFIDMapper(new BasicFIDMapper("fid", 255, false), "river")); + pg.setFIDMapper("testset", + new TypedFIDMapper(new BasicFIDMapper("gid", 255, true), "testset")); + + */ + /* + Transaction transaction = new DefaultTransaction("attemptWriteFW"); + FeatureWriter writer = ds.getFeatureWriter(table, transaction); + Feature feature; + + while (writer.hasNext()) { + feature = (Feature) writer.next(); + } + + feature = (Feature) writer.next(); + feature.setAttribute(0, "test"); + writer.write(); + + String id = feature.getID(); + transaction.commit(); + transaction.close(); + + */ + + public Log getLogger() + { + return logger; + } + + protected AbstractOracleJobContext prepareJobContext(String filterPath) + { + return new OracleConvertShapefilesJobContext(filterPath); + } + + protected void extractJobConfiguration(JobDetail jobDetail) throws JobExecutionException + { + super.extractJobConfiguration(jobDetail); + JobDataMap dataMap = jobDetail.getJobDataMap(); + _pgHost = dataMap.getString(PGHOST); + _pgDatabase = dataMap.getString(PGDDATBASE); + _pgPort = dataMap.getString(PGPORT); + _pgSchema = dataMap.getString(PGSCHEMA); + _pgUsername = dataMap.getString(PGUSER); + _pgPassword = dataMap.getString(PGPASS); + _pgUseWKB = dataMap.getString(USEWKB); + + Log logger = getLogger(); + logger.info("PGHOST=" + _pgHost); + logger.info("PGDDATBASE=" + _pgDatabase); + logger.info("PGPORT=" + _pgPort); + logger.info("PGSCHEMA=" + _pgSchema); + logger.info("PGUSER=" + _pgUsername); + logger.info("PGPASS=" + _pgPassword); + logger.info("USEWKB=" + _pgUseWKB); + + if (_pgHost == null) + { + throw new JobExecutionException("Unknown PostGIS host."); + } + if (_pgDatabase == null) + { + throw new JobExecutionException("Unknown PostGIS database."); + } + if (_pgPort == null) + { + throw new JobExecutionException("Unknown PostGIS port."); + } + if (_pgSchema == null) + { + throw new JobExecutionException("Unknown PostGIS schema."); + } + if (_pgUsername == null) + { + throw new JobExecutionException("Unknown PostGIS username."); + } + if (_pgPassword == null) + { + throw new JobExecutionException("Unknown PostGIS password."); + } + } + + 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); + + try + { + logger.info("-- step:clearOutputDirectory --"); + clearOutputDirectory(); + boolean bFirst = true; + if (checkConvertDB()) + { + logger.info("-- step:convertOracleDB --"); + + for (String orgSchema : _orgSchema) + { + OracleConvertShapefilesJobContext jobContext = (OracleConvertShapefilesJobContext) prepareJobContext(_filterPath); + jobContext.setConnectionInfo(_oracleHost, _oraclePort, _oracleInstance); + jobContext.setLogin(_username, _password); + jobContext.setShapeData(_dataPath); + jobContext.setConvertDB(_convertDB); + jobContext.setConvertFile(_convertFile); + jobContext.setConvertElementIn(_convertElementIn); + jobContext.setElementLogging(checkElementLogging()); + jobContext.setExecutionContext(context); + + if (bFirst) + copyConnectivity(jobContext); + else + bFirst = false; + + logger.info("----- start schema:" + orgSchema + " -----"); + exetcuteConvert(jobContext, orgSchema, _dataPath); + + //close all open filewriter instance + jobContext.closeFeatureWriter(); + } + } + + if (checkConvertFile()) + { + logger.info("-- step:convertIndexDesignFile --"); + convertIndexDesignFile(context); + logger.info("-- step:convertOtherDesignFile --"); + convertOtherDesignFile(context); + } + + if (checkConvertElementIn()) + { + logger.info("-- step:convertFeatureDesignFile --"); + convertFeatureDesignFile(context); + } + + if (checkCreateDummy()) + { + logger.info("-- step:createDummyFeatureFile --"); + createDummyFeatureFile(context); + } + } catch (SQLException e) + { + logger.warn(e.getMessage(), e); + throw new JobExecutionException("Database error. " + e.getMessage(), e); + } catch (IOException ex) + { + logger.warn(ex.getMessage(), ex); + throw new JobExecutionException("IO error. " + ex.getMessage(), ex); + } + logger.info(jobName + " end at " + new Date()); + } + + /** + * Connectivity�ƻs�@�Ӫ����A�b�d�߹q�y��V�ɥΨӤ��OMS��Ʈw���q���s����(Connectivity) + * + * @param jobContext job context + * @throws SQLException sql exception + */ + private void copyConnectivity(OracleConvertShapefilesJobContext jobContext) throws SQLException + { + OracleConnection connection = jobContext.getOracleConnection(); + Statement stmt = connection.createStatement(); + stmt.execute(OracleConvertShapefilesJobContext.TRUNCATE_CONNECTIVITY_WEBCHECK); + stmt.execute(OracleConvertShapefilesJobContext.COPY_CONNECTIVITY_TO_WEBCHECK); + } + + private void exetcuteConvert(OracleConvertShapefilesJobContext jobContext, + String querySchema, String dataPath) 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; + + //jobContext.startTransaction(); + jobContext.setCurrentSchema(querySchema); + jobContext.getExecutionContext().put("ConvertDgn2PostGISJobProgress", 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(); + } + + int now = order % step; + if (now != current) + { + current = now; + jobContext.getExecutionContext().put("ConvertDgn2PostGISJobProgress", current); + + } + } + jobContext.getExecutionContext().put("ConvertDgn2PostGISJobProgress", 100); + + jobContext.commitTransaction(); + + logger.info("end convert job:[" + order + "]"); + System.gc(); + } + + protected OrderedMap getBlobStorageList(OracleConnection 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); + + while (rs.next()) + { + int size = rs.getMetaData().getColumnCount(); + 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 + { + if (rs != null) rs.close(); + stmt.close(); + } + + 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); + + while (rs.next()) + { + int size = rs.getMetaData().getColumnCount(); + 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; + } + + rs.close(); + stmt.close(); + + return orderedMap; + } + + protected void queryIgsetElement(OracleConvertShapefilesJobContext jobContext, + String srcschema, String srctable) throws SQLException + { + OracleConnection connection = jobContext.getOracleConnection(); + String fetchSrcStmtFmt = "SELECT IGDSELM FROM \"%s\".\"%s\" 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); + + while (rsSrc.next()) + { + byte[] raw = null; + + if (rsSrc.getMetaData().getColumnType(1) == Types.BLOB) + { + BLOB blob = (BLOB) rsSrc.getBlob(1); + + raw = getBytesFromBLOB(blob); + blob.close(); + } else + { + raw = rsSrc.getBytes(1); + } + + try + { + Element element = fetchBinaryElement(raw); + jobContext.putFeatureCollection(element); + } catch (Dgn7fileException e) + { + logger.warn("Dgn7Exception", e); + } + } + + rsSrc.close(); + stmtSrc.close(); + } + + protected void queryRawElement(OracleConvertShapefilesJobContext jobContext, + String srcschema, String srctable) throws SQLException + { + OracleConnection 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); + + 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); + } + } + + rsDest.close(); + stmtDest.close(); + } + + // 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)) + { + System.out.println("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]); + System.out.println("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) throws JobExecutionException + { + File indexDir = new File(getDataPath(), "index"); + if (!indexDir.exists()) + { + logger.info("index dir=" + indexDir + " not exist."); + return; + } + + if (!indexDir.isDirectory()) + { + logger.info("index dir=" + indexDir + " is not a directory."); + } + + File[] dgnFiles = indexDir.listFiles(new FilenameFilter() + { + public boolean accept(File dir, String name) + { + return name.toLowerCase().endsWith(".dgn"); + } + }); + + for (File dgnFile : dgnFiles) + { + IndexDgnConvertJobContext convertContext = new IndexDgnConvertJobContext(getDataPath()); + logger.debug("--- start dgnfile-" + dgnFile.toString() + " ---"); + try + { + convertContext.setExecutionContext(context); + String dgnPaths[] = StringUtils.splitToArray(dgnFile.toString(), File.separator); + convertContext.setFilename(dgnPaths[dgnPaths.length - 1]); + + FileInputStream fs = new FileInputStream(dgnFile); + FileChannel fc = fs.getChannel(); + Dgn7fileReader reader = new Dgn7fileReader(fc, new Lock()); + convertContext.setReader(reader); + + scanIndexDgnElement(convertContext); + + convertContext.commitTransaction(); + convertContext.closeFeatureWriter(); + System.gc(); + } 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); + } + } + } + + protected void scanIndexDgnElement(IndexDgnConvertJobContext convertContext) + throws Dgn7fileException, IOException, IllegalAttributeException, SchemaException + { + Dgn7fileReader reader = convertContext.getReader(); + int count = 0; + Element lastComplex = null; + while (reader.hasNext()) + { + Dgn7fileReader.Record record = reader.nextElement(); + if (record.element() != null) + { + Element element = (Element) record.element(); + ElementType type = element.getElementType(); + + if ((!type.isComplexElement()) && (!element.isComponentElement())) + { + lastComplex = null; + + processIndexElement(element, convertContext); + } else if (element.isComponentElement()) + { + if (lastComplex != null) + { + ((ComplexElement) lastComplex).add(element); + } + } else if (type.isComplexElement()) + { + if (lastComplex == null) + { + lastComplex = element; + } else + { + processIndexElement(element, convertContext); + lastComplex = element; + } + } + } + count++; + } + + logger.debug("ElementRecord Count=" + count); + } + + private void processIndexElement(Element element, IndexDgnConvertJobContext convertContext) throws IllegalAttributeException, SchemaException + { + if (element instanceof TextElement) + { + convertContext.putFeatureCollection(element); + } + } + + + /** + * �����ഫ��L�]�p���ɪ��u�@ + * + * @param context jobContext + * @throws org.quartz.JobExecutionException exception + */ + private void convertOtherDesignFile(JobExecutionContext context) throws JobExecutionException + { + File otherDir = new File(getDataPath(), "other"); + if (!otherDir.exists()) + { + logger.info("other dir=" + otherDir + " not exist."); + return; + } + + if (!otherDir.isDirectory()) + { + logger.info("other dir=" + otherDir + " is not a directory."); + } + + File[] dgnFiles = otherDir.listFiles(new FilenameFilter() + { + public boolean accept(File dir, String name) + { + return name.toLowerCase().endsWith(".dgn"); + } + }); + + for (File dgnFile : dgnFiles) + { + GeneralDgnConvertJobContext convertContext = new GeneralDgnConvertJobContext(getDataPath()); + logger.info("--- start dgnfile-" + dgnFile.toString() + " ---"); + try + { + convertContext.setExecutionContext(context); + String dgnPaths[] = StringUtils.splitToArray(dgnFile.toString(), File.separator); + convertContext.setFilename(dgnPaths[dgnPaths.length - 1]); + + FileInputStream fs = new FileInputStream(dgnFile); + FileChannel fc = fs.getChannel(); + Dgn7fileReader reader = new Dgn7fileReader(fc, new Lock()); + convertContext.setReader(reader); + + scanOtherDgnElement(convertContext); + + convertContext.commitTransaction(); + convertContext.closeFeatureWriter(); + System.gc(); + } 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); + } + } + } + + public void scanOtherDgnElement(GeneralDgnConvertJobContext convertContext) + throws Dgn7fileException, IOException, IllegalAttributeException, SchemaException + { + Dgn7fileReader reader = convertContext.getReader(); + int count = 0; + Element lastComplex = null; + while (reader.hasNext()) + { + Dgn7fileReader.Record record = reader.nextElement(); + if (record.element() != null) + { + Element element = (Element) record.element(); + ElementType type = element.getElementType(); + + if ((!type.isComplexElement()) && (!element.isComponentElement())) + { + lastComplex = null; + + processOtherElement(element, convertContext); + } else if (element.isComponentElement()) + { + if (lastComplex != null) + { + ((ComplexElement) lastComplex).add(element); + } + } else if (type.isComplexElement()) + { + if (lastComplex == null) + { + lastComplex = element; + } else + { + processOtherElement(element, convertContext); + lastComplex = element; + } + } + } + count++; + } + + logger.debug("ElementRecord Count=" + count); + } + + private void processOtherElement(Element element, GeneralDgnConvertJobContext convertContext) + throws IllegalAttributeException, SchemaException + { + convertContext.putFeatureCollection(element); + } + + private void clearOutputDirectory() + { + File outDataPath = new File(getDataPath(), OracleConvertShapefilesJobContext.SHPOUTPATH); + if (outDataPath.exists() && outDataPath.isDirectory()) + { + deleteFilesInPath(outDataPath); + } + outDataPath = new File(getDataPath(), IndexDgnConvertJobContext.SHPOUTPATH); + if (outDataPath.exists() && outDataPath.isDirectory()) + { + deleteFilesInPath(outDataPath); + } + outDataPath = new File(getDataPath(), GeneralDgnConvertJobContext.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) 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) + { + FeatureDgnConvertJobContext convertContext = new FeatureDgnConvertJobContext(getDataPath(), _filterPath); + logger.info("--- start dgnfile-" + dgnFile.toString() + " ---"); + try + { + convertContext.setExecutionContext(context); + String dgnPaths[] = StringUtils.splitToArray(dgnFile.toString(), File.separator); + convertContext.setFilename(dgnPaths[dgnPaths.length - 1]); + + 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(); + } 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); + } + } + } + + public void scanFeatureDgnElement(FeatureDgnConvertJobContext convertContext) + throws Dgn7fileException, IOException, IllegalAttributeException, SchemaException + { + Dgn7fileReader reader = convertContext.getReader(); + int count = 0; + Element lastComplex = null; + while (reader.hasNext()) + { + Dgn7fileReader.Record record = reader.nextElement(); + if (record.element() != null) + { + Element element = (Element) record.element(); + ElementType type = element.getElementType(); + + if ((!type.isComplexElement()) && (!element.isComponentElement())) + { + lastComplex = null; + + processFeatureElement(element, convertContext); + } else if (element.isComponentElement()) + { + if (lastComplex != null) + { + ((ComplexElement) lastComplex).add(element); + } + } else if (type.isComplexElement()) + { + if (lastComplex == null) + { + lastComplex = element; + } else + { + processFeatureElement(element, convertContext); + lastComplex = element; + } + } + } + count++; + } + + logger.debug("ElementRecord Count=" + count); + } + + private void processFeatureElement(Element element, FeatureDgnConvertJobContext convertContext) + throws IllegalAttributeException, SchemaException + { + convertContext.putFeatureCollection(element); + } + + private void createDummyFeatureFile(JobExecutionContext context) throws JobExecutionException + { + /* + DummyFeatureConvertJobContext convertContext = new DummyFeatureConvertJobContext(getDataPath(), _filterPath); + try { + convertContext.startTransaction(); + convertContext.commitTransaction(); + convertContext.closeFeatureWriter(); + } catch (IOException e) + { + logger.warn(e.getMessage(), e); + throw new JobExecutionException(e.getMessage(), e); + } + */ + } +} diff --git a/xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/jobs/OracleConvertDgn2ShpJob.java b/xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/jobs/OracleConvertDgn2ShpJob.java index 95f104c..ae243c6 100644 --- a/xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/jobs/OracleConvertDgn2ShpJob.java +++ b/xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/jobs/OracleConvertDgn2ShpJob.java @@ -36,6 +36,11 @@ import com.ximple.eofms.util.BinConverter; import com.ximple.eofms.util.ByteArrayCompressor; import com.ximple.eofms.util.StringUtils; +import com.ximple.eofms.jobs.context.AbstractOracleJobContext; +import com.ximple.eofms.jobs.context.FeatureDgnConvertJobContext; +import com.ximple.eofms.jobs.context.GeneralDgnConvertJobContext; +import com.ximple.eofms.jobs.context.IndexDgnConvertJobContext; +import com.ximple.eofms.jobs.context.OracleConvertShapefilesJobContext; import com.ximple.io.dgn7.ComplexElement; import com.ximple.io.dgn7.Dgn7fileException; import com.ximple.io.dgn7.Dgn7fileReader; @@ -78,7 +83,12 @@ protected AbstractOracleJobContext prepareJobContext(String filterPath) { - return new OracleConvertJobContext(filterPath); + return new OracleConvertShapefilesJobContext(filterPath); + } + + protected void extractJobConfiguration(JobDetail jobDetail) throws JobExecutionException + { + super.extractJobConfiguration(jobDetail); } public void execute(JobExecutionContext context) throws JobExecutionException @@ -104,7 +114,7 @@ for (String orgSchema : _orgSchema) { - OracleConvertJobContext jobContext = (OracleConvertJobContext) prepareJobContext(_filterPath); + OracleConvertShapefilesJobContext jobContext = (OracleConvertShapefilesJobContext) prepareJobContext(_filterPath); jobContext.setConnectionInfo(_oracleHost, _oraclePort, _oracleInstance); jobContext.setLogin(_username, _password); jobContext.setShapeData(_dataPath); @@ -164,15 +174,15 @@ * @param jobContext job context * @throws SQLException sql exception */ - private void copyConnectivity(OracleConvertJobContext jobContext) throws SQLException + private void copyConnectivity(OracleConvertShapefilesJobContext jobContext) throws SQLException { OracleConnection connection = jobContext.getOracleConnection(); Statement stmt = connection.createStatement(); - stmt.execute(OracleConvertJobContext.TRUNCATE_CONNECTIVITY_WEBCHECK); - stmt.execute(OracleConvertJobContext.COPY_CONNECTIVITY_TO_WEBCHECK); + stmt.execute(OracleConvertShapefilesJobContext.TRUNCATE_CONNECTIVITY_WEBCHECK); + stmt.execute(OracleConvertShapefilesJobContext.COPY_CONNECTIVITY_TO_WEBCHECK); } - private void exetcuteConvert(OracleConvertJobContext jobContext, + private void exetcuteConvert(OracleConvertShapefilesJobContext jobContext, String querySchema, String dataPath) throws SQLException { int order = 0; @@ -321,7 +331,7 @@ return orderedMap; } - protected void queryIgsetElement(OracleConvertJobContext jobContext, + protected void queryIgsetElement(OracleConvertShapefilesJobContext jobContext, String srcschema, String srctable) throws SQLException { OracleConnection connection = jobContext.getOracleConnection(); @@ -363,7 +373,7 @@ stmtSrc.close(); } - protected void queryRawElement(OracleConvertJobContext jobContext, + protected void queryRawElement(OracleConvertShapefilesJobContext jobContext, String srcschema, String srctable) throws SQLException { OracleConnection connection = jobContext.getOracleConnection(); @@ -728,7 +738,7 @@ private void clearOutputDirectory() { - File outDataPath = new File(getDataPath(), OracleConvertJobContext.SHPOUTPATH); + File outDataPath = new File(getDataPath(), OracleConvertShapefilesJobContext.SHPOUTPATH); if (outDataPath.exists() && outDataPath.isDirectory()) { deleteFilesInPath(outDataPath); diff --git a/xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/jobs/OracleUpgradeBlob2UDTJob.java b/xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/jobs/OracleUpgradeBlob2UDTJob.java index 1ba97a3..adb35c2 100644 --- a/xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/jobs/OracleUpgradeBlob2UDTJob.java +++ b/xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/jobs/OracleUpgradeBlob2UDTJob.java @@ -13,6 +13,9 @@ import oracle.jdbc.OracleDatabaseMetaData; import oracle.jdbc.OracleStatement; +import com.ximple.eofms.jobs.context.AbstractOracleJobContext; +import com.ximple.eofms.jobs.context.OracleUpgradeJobContext; + public class OracleUpgradeBlob2UDTJob extends AbstractOracleDatabaseJob { static Log logger = LogFactory.getLog(OracleUpgradeBlob2UDTJob.class); diff --git a/xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/jobs/AbstractDgnFileJobContext.java b/xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/jobs/context/AbstractDgnFileJobContext.java similarity index 97% rename from xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/jobs/AbstractDgnFileJobContext.java rename to xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/jobs/context/AbstractDgnFileJobContext.java index c7feace..b040fdd 100644 --- a/xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/jobs/AbstractDgnFileJobContext.java +++ b/xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/jobs/context/AbstractDgnFileJobContext.java @@ -1,4 +1,4 @@ -package com.ximple.eofms.jobs; +package com.ximple.eofms.jobs.context; import java.util.Properties; diff --git a/xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/jobs/AbstractOracleJobContext.java b/xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/jobs/context/AbstractOracleJobContext.java similarity index 96% rename from xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/jobs/AbstractOracleJobContext.java rename to xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/jobs/context/AbstractOracleJobContext.java index f1d867c..5895786 100644 --- a/xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/jobs/AbstractOracleJobContext.java +++ b/xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/jobs/context/AbstractOracleJobContext.java @@ -1,10 +1,12 @@ -package com.ximple.eofms.jobs; +package com.ximple.eofms.jobs.context; import java.sql.DriverManager; import java.sql.SQLException; import java.util.Properties; import oracle.jdbc.OracleConnection; + +import com.ximple.eofms.jobs.context.OracleConvertShapefilesJobContext; public abstract class AbstractOracleJobContext { @@ -174,7 +176,7 @@ /** * copy connectivity to connectivity_webcheck sql */ - protected static final String TRUNCATE_CONNECTIVITY_WEBCHECK = "TRUNCATE TABLE BASEDB.CONNECTIVITY_WEBCHECK"; + public static final String TRUNCATE_CONNECTIVITY_WEBCHECK = "TRUNCATE TABLE BASEDB.CONNECTIVITY_WEBCHECK"; protected static final String CREATE_CONNECTIVITY_WEBCHECK = "CREATE TABLE BASEDB.CONNECTIVITY_WEBCHECK\n" + "( FSC NUMBER(5) NOT NULL," + " UFID NUMBER(10) NOT NULL," + @@ -194,7 +196,7 @@ "PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT )\n" + "LOGGING NOCOMPRESS NOCACHE NOPARALLEL MONITORING;"; - protected static final String COPY_CONNECTIVITY_TO_WEBCHECK = "INSERT /*+ APPEND */ INTO BASEDB.CONNECTIVITY_WEBCHECK\n" + + public static final String COPY_CONNECTIVITY_TO_WEBCHECK = "INSERT /*+ APPEND */ INTO BASEDB.CONNECTIVITY_WEBCHECK\n" + "(FSC, UFID, N1, N2, FDR1, FDR2, DIR, OHUG,OSTATUS, PHASE, X, Y)\n" + "SELECT FSC, UFID, N1, N2, FDR1, FDR2, DIR, OHUG, OSTATUS, PHASE, X, Y FROM BASEDB.CONNECTIVITY "; @@ -258,7 +260,7 @@ return oracleConnection; } catch (SQLException e) { - OracleConvertJobContext.logger.warn(e.getMessage(), e); + OracleConvertShapefilesJobContext.logger.warn(e.getMessage(), e); } oracleConnection = null; @@ -277,7 +279,7 @@ } } catch (SQLException e) { - OracleConvertJobContext.logger.warn(e.getMessage(), e); + OracleConvertShapefilesJobContext.logger.warn(e.getMessage(), e); } } diff --git a/xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/jobs/FeatureDgnConvertJobContext.java b/xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/jobs/context/DummyFeatureConvertJobContext.java similarity index 82% copy from xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/jobs/FeatureDgnConvertJobContext.java copy to xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/jobs/context/DummyFeatureConvertJobContext.java index 5b730ca..86fe4b7 100644 --- a/xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/jobs/FeatureDgnConvertJobContext.java +++ b/xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/jobs/context/DummyFeatureConvertJobContext.java @@ -1,46 +1,50 @@ -package com.ximple.eofms.jobs; +package com.ximple.eofms.jobs.context; -import java.io.File; -import java.io.IOException; -import java.io.UnsupportedEncodingException; -import java.net.MalformedURLException; -import java.net.URL; -import java.nio.charset.Charset; import java.util.ArrayList; import java.util.HashMap; import java.util.Iterator; import java.util.List; +import java.net.URL; +import java.net.MalformedURLException; +import java.io.File; +import java.io.UnsupportedEncodingException; +import java.io.IOException; +import java.nio.charset.Charset; -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.apache.commons.transaction.util.CommonsLoggingLogger; +import org.apache.commons.transaction.memory.PessimisticMapWrapper; +import org.apache.commons.digester.Digester; +import org.apache.commons.digester.xmlrules.DigesterLoader; +import org.geotools.feature.Feature; +import org.geotools.feature.IllegalAttributeException; +import org.geotools.feature.SchemaException; +import org.geotools.feature.FeatureType; +import org.geotools.feature.SimpleFeature; import org.geotools.data.FeatureWriter; import org.geotools.data.Transaction; import org.geotools.data.shapefile.ShapefileDataStore; import org.geotools.data.shapefile.indexed.IndexedShapefileDataStore; -import org.geotools.feature.Feature; -import org.geotools.feature.FeatureType; -import org.geotools.feature.IllegalAttributeException; -import org.geotools.feature.SchemaException; -import org.geotools.feature.SimpleFeature; import org.xml.sax.SAXException; import com.vividsolutions.jts.geom.GeometryFactory; -import com.ximple.eofms.filter.AbstractFLinkageDispatchableFilter; import com.ximple.eofms.filter.ElementDispatcher; +import com.ximple.eofms.filter.AbstractFLinkageDispatchableFilter; +import com.ximple.eofms.filter.ElementDispatchableFilter; +import com.ximple.eofms.filter.TypeCompIdDispatchableFilter; +import com.ximple.eofms.filter.TypeCompLevelIdDispatchableFilter; +import com.ximple.eofms.filter.TypeIdDispatchableFilter; import com.ximple.io.dgn7.Element; import com.ximple.io.dgn7.FrammeAttributeData; -import com.ximple.io.dgn7.UserAttributeData; import com.ximple.io.dgn7.ComplexElement; +import com.ximple.io.dgn7.UserAttributeData; -public class FeatureDgnConvertJobContext extends AbstractDgnFileJobContext +public class DummyFeatureConvertJobContext extends AbstractDgnFileJobContext { - static final Log logger = LogFactory.getLog(FeatureDgnConvertJobContext.class); + static final Log logger = LogFactory.getLog(DummyFeatureConvertJobContext.class); static final LoggerFacade sLogger = new CommonsLoggingLogger(logger); static final GeometryFactory geometryFactory = new GeometryFactory(); static final String SHPOUTPATH = "shpout"; @@ -54,8 +58,9 @@ private ElementDispatcher elementDispatcher; private String _filterConfig; + private boolean withIndex = false; - public FeatureDgnConvertJobContext(String dataPath, String filterConfig) + public DummyFeatureConvertJobContext(String dataPath, String filterConfig) { super(dataPath); txFeaturesContext = new PessimisticMapWrapper(featuresContext, sLogger); @@ -144,6 +149,20 @@ 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() @@ -190,21 +209,25 @@ writer = featuresWriterContext.get(featureType.getTypeName()); } else { - // ShapefileDataStore shapefileDataStore = new ShapefileDataStore(sfile.toURI().toURL()); - /* - ShapefileDataStore shapefileDataStore = new ShapefileDataStore(sfile.toURI().toURL(), - true, Charset.forName("UTF-8")); - */ - if (!sfile.exists()) + ShapefileDataStore shapefileDataStore = null; + boolean existFile = sfile.exists(); + + if (!withIndex) { - ShapefileDataStore shapefileDataStore = new IndexedShapefileDataStore(sfile.toURI().toURL(), + shapefileDataStore = new ShapefileDataStore(sfile.toURI().toURL(), + true, Charset.forName("UTF-8")); + } else + { + shapefileDataStore = new IndexedShapefileDataStore(sfile.toURI().toURL(), null, true, true, IndexedShapefileDataStore.TREE_QIX, Charset.forName("UTF-8")); + } + + if (!existFile) + { shapefileDataStore.createSchema(featureType); writer = shapefileDataStore.getFeatureWriter(featureType.getTypeName(), Transaction.AUTO_COMMIT); } else { - ShapefileDataStore shapefileDataStore = new IndexedShapefileDataStore(sfile.toURI().toURL(), - null, true, true, IndexedShapefileDataStore.TREE_QIX, Charset.forName("UTF-8")); writer = shapefileDataStore.getFeatureWriterAppend(featureType.getTypeName(), Transaction.AUTO_COMMIT); } @@ -276,5 +299,15 @@ } return null; } -} + + public boolean isWithIndex() + { + return withIndex; + } + + public void setWithIndex(boolean withIndex) + { + this.withIndex = withIndex; + } +} diff --git a/xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/jobs/FeatureDgnConvertJobContext.java b/xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/jobs/context/FeatureDgnConvertJobContext.java similarity index 91% rename from xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/jobs/FeatureDgnConvertJobContext.java rename to xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/jobs/context/FeatureDgnConvertJobContext.java index 5b730ca..ca370dd 100644 --- a/xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/jobs/FeatureDgnConvertJobContext.java +++ b/xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/jobs/context/FeatureDgnConvertJobContext.java @@ -1,4 +1,4 @@ -package com.ximple.eofms.jobs; +package com.ximple.eofms.jobs.context; import java.io.File; import java.io.IOException; @@ -33,6 +33,7 @@ import com.ximple.eofms.filter.AbstractFLinkageDispatchableFilter; import com.ximple.eofms.filter.ElementDispatcher; +import com.ximple.eofms.jobs.context.AbstractDgnFileJobContext; import com.ximple.io.dgn7.Element; import com.ximple.io.dgn7.FrammeAttributeData; import com.ximple.io.dgn7.UserAttributeData; @@ -54,6 +55,7 @@ private ElementDispatcher elementDispatcher; private String _filterConfig; + private boolean withIndex = false; public FeatureDgnConvertJobContext(String dataPath, String filterConfig) { @@ -190,21 +192,25 @@ writer = featuresWriterContext.get(featureType.getTypeName()); } else { - // ShapefileDataStore shapefileDataStore = new ShapefileDataStore(sfile.toURI().toURL()); - /* - ShapefileDataStore shapefileDataStore = new ShapefileDataStore(sfile.toURI().toURL(), - true, Charset.forName("UTF-8")); - */ - if (!sfile.exists()) + ShapefileDataStore shapefileDataStore = null; + boolean existFile = sfile.exists(); + + if (!withIndex) { - ShapefileDataStore shapefileDataStore = new IndexedShapefileDataStore(sfile.toURI().toURL(), + shapefileDataStore = new ShapefileDataStore(sfile.toURI().toURL(), + true, Charset.forName("UTF-8")); + } else + { + shapefileDataStore = new IndexedShapefileDataStore(sfile.toURI().toURL(), null, true, true, IndexedShapefileDataStore.TREE_QIX, Charset.forName("UTF-8")); + } + + if (!existFile) + { shapefileDataStore.createSchema(featureType); writer = shapefileDataStore.getFeatureWriter(featureType.getTypeName(), Transaction.AUTO_COMMIT); } else { - ShapefileDataStore shapefileDataStore = new IndexedShapefileDataStore(sfile.toURI().toURL(), - null, true, true, IndexedShapefileDataStore.TREE_QIX, Charset.forName("UTF-8")); writer = shapefileDataStore.getFeatureWriterAppend(featureType.getTypeName(), Transaction.AUTO_COMMIT); } @@ -276,5 +282,16 @@ } return null; } + + + public boolean isWithIndex() + { + return withIndex; + } + + public void setWithIndex(boolean withIndex) + { + this.withIndex = withIndex; + } } diff --git a/xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/jobs/GeneralDgnConvertJobContext.java b/xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/jobs/context/GeneralDgnConvertJobContext.java similarity index 95% rename from xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/jobs/GeneralDgnConvertJobContext.java rename to xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/jobs/context/GeneralDgnConvertJobContext.java index 26fd457..27aaad3 100644 --- a/xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/jobs/GeneralDgnConvertJobContext.java +++ b/xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/jobs/context/GeneralDgnConvertJobContext.java @@ -1,4 +1,4 @@ -package com.ximple.eofms.jobs; +package com.ximple.eofms.jobs.context; import java.io.File; import java.io.IOException; @@ -33,6 +33,8 @@ import com.vividsolutions.jts.geom.GeometryFactory; import com.ximple.eofms.util.DefaultColorTable; +import com.ximple.eofms.util.TWD97GeometryConverterDecorator; +import com.ximple.eofms.jobs.context.AbstractDgnFileJobContext; import com.ximple.io.dgn7.ArcElement; import com.ximple.io.dgn7.ComplexChainElement; import com.ximple.io.dgn7.Element; @@ -50,7 +52,7 @@ static final Log logger = LogFactory.getLog(GeneralDgnConvertJobContext.class); static final LoggerFacade sLogger = new CommonsLoggingLogger(logger); static final GeometryFactory geometryFactory = new GeometryFactory(); - static final String SHPOUTPATH = "shpout"; + public static final String SHPOUTPATH = "shpout"; private String dataOut = null; @@ -63,6 +65,7 @@ private TWD97GeometryConverterDecorator convertDecorator = null; private String featureBaseName = null; + private boolean withIndex = false; public GeneralDgnConvertJobContext(String dataPath) { @@ -158,22 +161,25 @@ writer = featuresWriterContext.get(featureType.getTypeName()); } else { - // ShapefileDataStore shapefileDataStore = new ShapefileDataStore(sfile.toURI().toURL()); - /* - ShapefileDataStore shapefileDataStore = new ShapefileDataStore(sfile.toURI().toURL(), - true, Charset.forName("UTF-8")); - */ - if (!sfile.exists()) + ShapefileDataStore shapefileDataStore = null; + boolean existFile = sfile.exists(); + + if (!withIndex) { - ShapefileDataStore shapefileDataStore = new IndexedShapefileDataStore(sfile.toURI().toURL(), + shapefileDataStore = new ShapefileDataStore(sfile.toURI().toURL(), + true, Charset.forName("UTF-8")); + } else + { + shapefileDataStore = new IndexedShapefileDataStore(sfile.toURI().toURL(), null, true, true, IndexedShapefileDataStore.TREE_QIX, Charset.forName("UTF-8")); + } + + if (!existFile) + { shapefileDataStore.createSchema(featureType); writer = shapefileDataStore.getFeatureWriter(featureType.getTypeName(), Transaction.AUTO_COMMIT); - } else - { - ShapefileDataStore shapefileDataStore = new IndexedShapefileDataStore(sfile.toURI().toURL(), - null, true, true, IndexedShapefileDataStore.TREE_QIX, Charset.forName("UTF-8")); + } else { writer = shapefileDataStore.getFeatureWriterAppend(featureType.getTypeName(), Transaction.AUTO_COMMIT); } @@ -551,4 +557,15 @@ } return null; } + + + public boolean isWithIndex() + { + return withIndex; + } + + public void setWithIndex(boolean withIndex) + { + this.withIndex = withIndex; + } } diff --git a/xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/jobs/IndexDgnConvertJobContext.java b/xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/jobs/context/IndexDgnConvertJobContext.java similarity index 98% rename from xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/jobs/IndexDgnConvertJobContext.java rename to xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/jobs/context/IndexDgnConvertJobContext.java index ae3d42f..efda8c5 100644 --- a/xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/jobs/IndexDgnConvertJobContext.java +++ b/xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/jobs/context/IndexDgnConvertJobContext.java @@ -1,4 +1,4 @@ -package com.ximple.eofms.jobs; +package com.ximple.eofms.jobs.context; import java.io.File; import java.io.IOException; @@ -36,6 +36,8 @@ import com.ximple.eofms.util.DefaultColorTable; import com.ximple.eofms.util.TPCLIDConverter; import com.ximple.eofms.util.TWDDatumConverter; +import com.ximple.eofms.util.TWD97GeometryConverterDecorator; +import com.ximple.eofms.jobs.context.AbstractDgnFileJobContext; import com.ximple.io.dgn7.Element; import com.ximple.io.dgn7.FrammeAttributeData; import com.ximple.io.dgn7.TextElement; @@ -47,7 +49,7 @@ static final LoggerFacade sLogger = new CommonsLoggingLogger(logger); static final GeometryFactory geometryFactory = new GeometryFactory(); TWD97GeometryConverterDecorator convertDecorator = new TWD97GeometryConverterDecorator(); - static final String SHPOUTPATH = "shpout"; + public static final String SHPOUTPATH = "shpout"; private String dataOut = null; diff --git a/xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/jobs/context/OracleConvertOraSDOJobContext.java b/xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/jobs/context/OracleConvertOraSDOJobContext.java new file mode 100644 index 0000000..940a8b6 --- /dev/null +++ b/xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/jobs/context/OracleConvertOraSDOJobContext.java @@ -0,0 +1,5 @@ +package com.ximple.eofms.jobs.context; + +public class OracleConvertOraSDOJobContext +{ +} diff --git a/xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/jobs/context/OracleConvertPostGISJobContext.java b/xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/jobs/context/OracleConvertPostGISJobContext.java new file mode 100644 index 0000000..a3606f6 --- /dev/null +++ b/xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/jobs/context/OracleConvertPostGISJobContext.java @@ -0,0 +1,5 @@ +package com.ximple.eofms.jobs.context; + +public class OracleConvertPostGISJobContext +{ +} diff --git a/xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/jobs/OracleConvertJobContext.java b/xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/jobs/context/OracleConvertShapefilesJobContext.java similarity index 89% rename from xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/jobs/OracleConvertJobContext.java rename to xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/jobs/context/OracleConvertShapefilesJobContext.java index 0ede50b..fbb6be6 100644 --- a/xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/jobs/OracleConvertJobContext.java +++ b/xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/jobs/context/OracleConvertShapefilesJobContext.java @@ -1,4 +1,4 @@ -package com.ximple.eofms.jobs; +package com.ximple.eofms.jobs.context; import java.io.File; import java.io.IOException; @@ -35,17 +35,19 @@ import com.ximple.eofms.filter.AbstractFLinkageDispatchableFilter; import com.ximple.eofms.filter.ElementDispatcher; +import com.ximple.eofms.jobs.context.AbstractOracleJobContext; +import com.ximple.eofms.jobs.OracleElementLogger; import com.ximple.io.dgn7.Element; import com.ximple.io.dgn7.FrammeAttributeData; import com.ximple.io.dgn7.ComplexElement; -public class OracleConvertJobContext extends AbstractOracleJobContext +public class OracleConvertShapefilesJobContext extends AbstractOracleJobContext { - static Log logger = LogFactory.getLog(OracleConvertJobContext.class); + static Log logger = LogFactory.getLog(OracleConvertShapefilesJobContext.class); static final LoggerFacade sLogger = new CommonsLoggingLogger(logger); - static final String SHPOUTPATH = "shpout"; + public static final String SHPOUTPATH = "shpout"; private OracleElementLogger elmLogger = null; @@ -76,8 +78,9 @@ private String currentSchema = null; private boolean schemaChanged = false; private String _convertElementIn = null; + private boolean withIndex = false; - public OracleConvertJobContext(String filterConfig) + public OracleConvertShapefilesJobContext(String filterConfig) { properties = new Properties(); _filterConfig = filterConfig; @@ -217,20 +220,25 @@ writer = featuresWriterContext.get(featureType.getTypeName()); } else { - /* - ShapefileDataStore shapefileDataStore = new ShapefileDataStore(sfile.toURI().toURL(), - true, Charset.forName("UTF-8")); - */ - if (!sfile.exists()) + ShapefileDataStore shapefileDataStore = null; + boolean existFile = sfile.exists(); + + if (!withIndex) { - ShapefileDataStore shapefileDataStore = new IndexedShapefileDataStore(sfile.toURI().toURL(), + shapefileDataStore = new ShapefileDataStore(sfile.toURI().toURL(), + true, Charset.forName("UTF-8")); + } else + { + shapefileDataStore = new IndexedShapefileDataStore(sfile.toURI().toURL(), null, true, true, IndexedShapefileDataStore.TREE_QIX, Charset.forName("UTF-8")); + } + + if (!existFile) + { shapefileDataStore.createSchema(featureType); writer = shapefileDataStore.getFeatureWriter(featureType.getTypeName(), Transaction.AUTO_COMMIT); } else { - ShapefileDataStore shapefileDataStore = new IndexedShapefileDataStore(sfile.toURI().toURL(), - null, true, true, IndexedShapefileDataStore.TREE_QIX, Charset.forName("UTF-8")); writer = shapefileDataStore.getFeatureWriterAppend(featureType.getTypeName(), Transaction.AUTO_COMMIT); } @@ -344,4 +352,14 @@ { _convertElementIn = convertElementIn; } + + public boolean isWithIndex() + { + return withIndex; + } + + public void setWithIndex(boolean withIndex) + { + this.withIndex = withIndex; + } } diff --git a/xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/jobs/OracleUpgradeJobContext.java b/xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/jobs/context/OracleUpgradeJobContext.java similarity index 68% rename from xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/jobs/OracleUpgradeJobContext.java rename to xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/jobs/context/OracleUpgradeJobContext.java index 54cf900..66a97a6 100644 --- a/xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/jobs/OracleUpgradeJobContext.java +++ b/xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/jobs/context/OracleUpgradeJobContext.java @@ -1,4 +1,6 @@ -package com.ximple.eofms.jobs; +package com.ximple.eofms.jobs.context; + +import com.ximple.eofms.jobs.context.AbstractOracleJobContext; public class OracleUpgradeJobContext extends AbstractOracleJobContext { diff --git a/xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/jobs/TWD97GeometryConverterDecorator.java b/xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/util/TWD97GeometryConverterDecorator.java similarity index 98% rename from xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/jobs/TWD97GeometryConverterDecorator.java rename to xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/util/TWD97GeometryConverterDecorator.java index 3bf59cf..72f9537 100644 --- a/xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/jobs/TWD97GeometryConverterDecorator.java +++ b/xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/util/TWD97GeometryConverterDecorator.java @@ -1,4 +1,4 @@ -package com.ximple.eofms.jobs; +package com.ximple.eofms.util; import com.vividsolutions.jts.geom.Coordinate; import com.vividsolutions.jts.geom.CoordinateSequence; diff --git a/xdgnjobs/ximple-spatialjob/src/main/resources/com/ximple/eofms/filter/FeatureClassificationRules.xml b/xdgnjobs/ximple-spatialjob/src/main/resources/com/ximple/eofms/filter/FeatureClassificationRules.xml new file mode 100644 index 0000000..e925ce6 --- /dev/null +++ b/xdgnjobs/ximple-spatialjob/src/main/resources/com/ximple/eofms/filter/FeatureClassificationRules.xml @@ -0,0 +1,16 @@ +<?xml version='1.0' encoding="big5"?> +<!DOCTYPE digester-rules PUBLIC "-//Jakarta Apache //DTD digester-rules XML V1.0//EN" "digester-rules.dtd"> +<digester-rules> + <pattern value="FeatureClassificationRules"> + <object-create-rule classname="com.ximple.eofms.collector.FeatureClassification"/> + <set-properties-rule/> + <pattern value="FeatureTypeCollector"> + <object-create-rule classname="com.ximple.eofms.collector.FeatureTypeCollector"/> + <set-next-rule methodname="addCollector" paramtype="com.ximple.eofms.collector.FeatureTypeCollector"/> + <set-properties-rule/> + <bean-property-setter-rule pattern="name"/> + <bean-property-setter-rule pattern="description"/> + <bean-property-setter-rule pattern="featuretypeList"/> + </pattern> + </pattern> +</digester-rules> \ No newline at end of file diff --git a/xdgnjobs/ximple-spatialjob/src/main/resources/conf/DefaultMapGroups.xml b/xdgnjobs/ximple-spatialjob/src/main/resources/conf/DefaultMapGroups.xml new file mode 100644 index 0000000..27626b3 --- /dev/null +++ b/xdgnjobs/ximple-spatialjob/src/main/resources/conf/DefaultMapGroups.xml @@ -0,0 +1,91 @@ +<FeatureClassificationRules> + <FeatureTypeCollector name="22KVSUBHV"> + <featuretypeList> + tpc:FSC-502.C-1_2_1,tpc:FSC-502.C-0_1_1,tpc:FSC-501.C-1_2_1,tpc:FSC-501.C-0_1_1,tpc:FSC-999.C-0_62_1,tpc:FSC-503.C-0_1_2,tpc:FSC-411.C-0_27_1,tpc:FSC-411.C-1_37_1,tpc:FSC-114.C-3_60_1,tpc:FSC-114.C-2_24_1,tpc:FSC-114.C-0_24_1,tpc:FSC-114.C-1_34_1,tpc:FSC-106.C-2_4_1,tpc:FSC-106.C-0_4_1,tpc:FSC-115.C-6_48_1,tpc:FSC-115.C-0_48_1,tpc:FSC-122.C-0_24_1,tpc:FSC-122.C-1_34_1,tpc:FSC-105.C-0_39_1,tpc:FSC-106.C-0_3_1,tpc:FSC-115.C-6_48_1,tpc:FSC-115.C-0_56_1,tpc:FSC-115.C-1_56_1,tpc:FSC-411.C-0_8_1,tpc:FSC-411.C-1_18_1,tpc:FSC-107.C-0_26_1,tpc:FSC-107.C-2_36_1,tpc:FSC-120.C-0_52_1,tpc:FSC-101.C-0_51_0,tpc:FSC-407.C-0_10_1,tpc:FSC-407.C-1_20_1,tpc:FSC-407.C-9_10_1</featuretypeList> + <featuretypeList/> + </FeatureTypeCollector> + <FeatureTypeCollector name="11KVHVOH"> + <featuretypeList>tpc:FSC-115.C-0_46_1,tpc:FSC-115.C-0_46_2,tpc:FSC-115.C-1_46_1,tpc:FSC-115.C-1_46_2,tpc:FSC-106.C-2_1_1,tpc:FSC-106.C-2_1_2,tpc:FSC-106.C-4_1_1,tpc:FSC-106.C-4_1_2,tpc:FSC-106.C-0_1_1,tpc:FSC-106.C-0_1_2,tpc:FSC-140.C-2_51_1,tpc:FSC-140.C-2_51_2,tpc:FSC-140.C-0_51_1,tpc:FSC-140.C-0_51_2,tpc:FSC-130.C-0_11_1,tpc:FSC-130.C-0_11_2,tpc:FSC-402.C-2_15_2,tpc:FSC-402.C-0_5_2,tpc:FSC-402.C-1_15_2,tpc:FSC-402.C-2_37_2,tpc:FSC-402.C-0_27_2,tpc:FSC-402.C-1_37_2,tpc:FSC-108.C-0_44_2,tpc:FSC-108.C-1_54_2,tpc:FSC-119.C-0_61_2,tpc:FSC-118.C-0_49_2,tpc:FSC-407.C-0_9_1,tpc:FSC-407.C-0_9_2,tpc:FSC-407.C-1_19_1,tpc:FSC-407.C-1_19_2,tpc:FSC-407.C-8_9_1,tpc:FSC-407.C-8_9_2,tpc:FSC-407.C-9_9_1,tpc:FSC-407.C-9_9_2,tpc:FSC-407.C-10_9_1,tpc:FSC-407.C-11_9_1,tpc:FSC-114.C-0_21_1,tpc:FSC-114.C-0_21_2,tpc:FSC-114.C-2_21_0,tpc:FSC-114.C-2_21_1,tpc:FSC-114.C-2_21_2,tpc:FSC-107.C-2_37_1,tpc:FSC-107.C-0_27_1,tpc:FSC-117.C-0_27_2,tpc:FSC-120.C-0_42_1,tpc:FSC-120.C-0_42_2,tpc:FSC-131.C-0_12_1,tpc:FSC-131.C-0_12_2,tpc:FSC-109.C-0_13_1,tpc:FSC-109.C-0_13_2,tpc:FSC-109.C-0_13_3,tpc:FSC-116.C-0_14_1,tpc:FSC-116.C-0_14_2,tpc:FSC-102.C-0_30_2,tpc:FSC-102.C-0_40_1,tpc:FSC-100.C-0_59_1,tpc:FSC-502.C-1_2_1,tpc:FSC-502.C-0_1_1,tpc:FSC-501.C-1_2_1,tpc:FSC-501.C-0_1_1,tpc:FSC-999.C-0_62_1,tpc:FSC-503.C-0_1_2</featuretypeList> + <featuretypeList/> + </FeatureTypeCollector> + <FeatureTypeCollector name="CLS"> + <featuretypeList>tpc:FSC-203.C-1_37_1,tpc:FSC-203.C-0_37_1,tpc:FSC-203.C-1_38_1,tpc:FSC-203.C-0_38_1,tpc:FSC-311.C-0_45_1,tpc:FSC-311.C-1_45_0,tpc:FSC-311.C-1_45_1,tpc:FSC-503.C-0_1_2,tpc:FSC-999.C-0_62_1,tpc:FSC-502.C-1_2_1,tpc:FSC-502.C-0_1_1,tpc:FSC-501.C-1_2_1,tpc:FSC-501.C-0_1_1</featuretypeList> + <featuretypeList/> + </FeatureTypeCollector> + <FeatureTypeCollector name="LVOH"> + <featuretypeList>tpc:FSC-402.C-2_15_2,tpc:FSC-402.C-0_5_2,tpc:FSC-402.C-1_15_2,tpc:FSC-402.C-2_37_2,tpc:FSC-402.C-0_27_2,tpc:FSC-402.C-1_37_2,tpc:FSC-402.C-2_16_2,tpc:FSC-402.C-0_6_2,tpc:FSC-402.C-1_16_2,tpc:FSC-407.C-0_10_1,tpc:FSC-407.C-0_9_1,tpc:FSC-407.C-0_9_2,tpc:FSC-407.C-1_19_1,tpc:FSC-407.C-1_19_2,tpc:FSC-407.C-1_20_1,tpc:FSC-407.C-1_9_1,tpc:FSC-407.C-1_9_2,tpc:FSC-407.C-8_9_1,tpc:FSC-407.C-8_9_2,tpc:FSC-407.C-9_10_1,tpc:FSC-407.C-9_9_1,tpc:FSC-407.C-9_9_2,tpc:FSC-115.C-2_50_2,tpc:FSC-115.C-3_50_1,tpc:FSC-115.C-7_58_1,tpc:FSC-200.C-0_28_1,tpc:FSC-200.C-0_30_1,tpc:FSC-202.C-1_36_0,tpc:FSC-202.C-0_36_1,tpc:FSC-203.C-1_38_1,tpc:FSC-204.C-0_49_1,tpc:FSC-205.C-2_41_1,tpc:FSC-205.C-0_39_1,tpc:FSC-208.C-0_44_1,tpc:FSC-209.C-0_46_1,tpc:FSC-211.C-0_32_1,tpc:FSC-212.C-1_34_0,tpc:FSC-303.C-0_29_1,tpc:FSC-305.C-0_34_1,tpc:FSC-306.C-0_36_1,tpc:FSC-307.C-0_38_1,tpc:FSC-308.C-0_40_1,tpc:FSC-314.C-0_26_1,tpc:FSC-314.C-1_28_0,tpc:FSC-315.C-0_26_1,tpc:FSC-315.C-1_28_0,tpc:FSC-316.C-0_54_1,tpc:FSC-317.C-0_32_1,tpc:FSC-317.C-1_32_1,tpc:FSC-318.C-0_54_4,tpc:FSC-503.C-0_1_2,tpc:FSC-502.C-0_1_1,tpc:FSC-502.C-1_2_1,tpc:FSC-501.C-0_1_1,tpc:FSC-501.C-1_2_1,tpc:FSC-999.C-0_62_1</featuretypeList> + <featuretypeList/> + </FeatureTypeCollector> + <FeatureTypeCollector name="HICUSTOMER"> + <featuretypeList>tpc:FSC-107.C-0_25_1,tpc:FSC-107.C-0_25_2,tpc:FSC-107.C-0_26_1,tpc:FSC-107.C-0_26_2,tpc:FSC-107.C-0_27_1,tpc:FSC-107.C-2_0_1,tpc:FSC-107.C-2_25_1,tpc:FSC-107.C-2_26_1,tpc:FSC-107.C-2_35_1,tpc:FSC-107.C-2_35_2,tpc:FSC-107.C-2_36_1,tpc:FSC-107.C-2_36_2,tpc:FSC-107.C-2_37_1</featuretypeList> + <featuretypeList/> + </FeatureTypeCollector> + <FeatureTypeCollector name="22KVHVUG"> + <featuretypeList>tpc:FSC-113.C-0_4_1,tpc:FSC-403.C-2_14_1,tpc:FSC-403.C-2_15_1,tpc:FSC-403.C-1_22_1,tpc:FSC-403.C-1_23_1,tpc:FSC-403.C-1_24_1,tpc:FSC-403.C-1_4_1,tpc:FSC-403.C-1_13_1,tpc:FSC-503.C-0_1_2,tpc:FSC-999.C-0_62_1,tpc:FSC-502.C-1_2_1,tpc:FSC-502.C-0_1_1,tpc:FSC-501.C-1_2_1,tpc:FSC-501.C-0_1_1,tpc:FSC-101.C-0_51_0,tpc:FSC-101.C-0_51_1,tpc:FSC-140.C-1_54_0,tpc:FSC-140.C-1_54_1,tpc:FSC-140.C-2_54_1,tpc:FSC-140.C-2_54_2,tpc:FSC-140.C-0_54_1,tpc:FSC-140.C-0_54_2,tpc:FSC-140.C-3_54_0,tpc:FSC-140.C-4_54_1,tpc:FSC-402.C-2_37_2,tpc:FSC-402.C-0_27_2,tpc:FSC-402.C-1_37_2,tpc:FSC-402.C-2_16_2,tpc:FSC-402.C-0_6_2,tpc:FSC-402.C-1_16_2,tpc:FSC-411.C-0_27_1,tpc:FSC-411.C-0_27_2,tpc:FSC-411.C-0_8_1,tpc:FSC-411.C-0_8_2,tpc:FSC-411.C-1_37_1,tpc:FSC-411.C-1_37_2,tpc:FSC-411.C-1_18_1,tpc:FSC-411.C-1_18_2,tpc:FSC-118.C-0_50_2,tpc:FSC-115.C-0_48_1,tpc:FSC-115.C-0_48_2,tpc:FSC-114.C-3_60_1,tpc:FSC-114.C-3_60_2,tpc:FSC-114.C-2_24_1,tpc:FSC-114.C-2_24_2,tpc:FSC-114.C-0_24_1,tpc:FSC-114.C-0_24_2,tpc:FSC-114.C-1_34_1,tpc:FSC-114.C-1_34_2,tpc:FSC-122.C-0_24_1,tpc:FSC-122.C-1_34_1,tpc:FSC-107.C-0_26_1,tpc:FSC-107.C-0_26_2,tpc:FSC-117.C-0_27_2,tpc:FSC-105.C-0_39_1,tpc:FSC-105.C-0_39_2,tpc:FSC-120.C-0_52_1,tpc:FSC-120.C-0_52_2,tpc:FSC-108.C-0_45_2,tpc:FSC-108.C-1_55_2,tpc:FSC-119.C-0_62_2</featuretypeList> + <featuretypeList/> + </FeatureTypeCollector> + <FeatureTypeCollector name="11KVSUBHV"> + <featuretypeList>tpc:FSC-502.C-1_2_1,tpc:FSC-502.C-0_1_1,tpc:FSC-501.C-1_2_1,tpc:FSC-501.C-0_1_1,tpc:FSC-999.C-0_62_1,tpc:FSC-503.C-0_1_2,tpc:FSC-114.C-3_60_1,tpc:FSC-114.C-2_23_1,tpc:FSC-114.C-0_23_1,tpc:FSC-114.C-1_33_1,tpc:FSC-106.C-2_2_1,tpc:FSC-106.C-0_2_1,tpc:FSC-106.C-2_1_1,tpc:FSC-106.C-0_1_1,tpc:FSC-106.C-4_1_1,tpc:FSC-115.C-0_47_1,tpc:FSC-115.C-1_57_1,tpc:FSC-122.C-0_23_1,tpc:FSC-122.C-1_33_1,tpc:FSC-105.C-0_29_1,tpc:FSC-114.C-0_21_1,tpc:FSC-115.C-6_47_1,tpc:FSC-115.C-0_46_1,tpc:FSC-115.C-1_46_1,tpc:FSC-411.C-0_7_1,tpc:FSC-411.C-1_17_1,tpc:FSC-107.C-2_35_1,tpc:FSC-107.C-0_25_1,tpc:FSC-107.C-2_37_1,tpc:FSC-107.C-0_27_1,tpc:FSC-116.C-0_14_1,tpc:FSC-120.C-0_42_1,tpc:FSC-101.C-0_41_0,tpc:FSC-109.C-0_13_1,tpc:FSC-102.C-0_40_1,tpc:FSC-407.C-0_9_1,tpc:FSC-407.C-1_19_1,tpc:FSC-407.C-8_9_1,tpc:FSC-407.C-9_9_1,tpc:FSC-407.C-10_9_1,tpc:FSC-407.C-11_9_1,tpc:FSC-130.C-0_11_1,tpc:FSC-131.C-0_12_1,tpc:FSC-411.C-0_27_1,tpc:FSC-411.C-1_37_1</featuretypeList> + <featuretypeList/> + </FeatureTypeCollector> + <FeatureTypeCollector name="FIBER"> + <featuretypeList>tpc:FSC-402.C-0_5_2,tpc:FSC-402.C-0_27_2,tpc:FSC-402.C-0_6_2,tpc:FSC-402.C-1_15_2,tpc:FSC-402.C-1_37_2,tpc:FSC-402.C-1_16_2,tpc:FSC-300.C-3_11_1,tpc:FSC-300.C-2_11_1,tpc:FSC-300.C-0_10_2,tpc:FSC-319.C-0_12_1,tpc:FSC-320.C-0_13_1,tpc:FSC-323.C-0_1_1,tpc:FSC-324.C-1_2_1,tpc:FSC-324.C-0_1_1,tpc:FSC-403.C-6_45_1,tpc:FSC-403.C-7_45_1,tpc:FSC-503.C-0_1_2,tpc:FSC-999.C-0_62_1,tpc:FSC-502.C-1_2_1,tpc:FSC-502.C-0_1_1,tpc:FSC-501.C-1_2_1,tpc:FSC-501.C-0_1_1</featuretypeList> + <featuretypeList/> + </FeatureTypeCollector> + <FeatureTypeCollector name="LINEFEATURE"> + <featuretypeList>tpc:FSC-115.C-0_46_1,tpc:FSC-115.C-0_46_2,tpc:FSC-115.C-0_56_1,tpc:FSC-115.C-1_46_1,tpc:FSC-115.C-1_46_2,tpc:FSC-115.C-1_56_1,tpc:FSC-115.C-0_47_1,tpc:FSC-115.C-0_47_2,tpc:FSC-115.C-0_48_1,tpc:FSC-115.C-0_48_2,tpc:FSC-102.C-0_30_2,tpc:FSC-102.C-0_40_1,tpc:FSC-117.C-0_27_2</featuretypeList> + <featuretypeList/> + </FeatureTypeCollector> + <FeatureTypeCollector name="22KVMAINHV"> + <featuretypeList>tpc:FSC-117.C-0_27_2,tpc:FSC-502.C-1_2_1,tpc:FSC-502.C-0_1_1,tpc:FSC-501.C-1_2_1,tpc:FSC-501.C-0_1_1,tpc:FSC-999.C-0_62_1,tpc:FSC-503.C-0_1_2,tpc:FSC-118.C-0_50_2,tpc:FSC-114.C-3_60_2,tpc:FSC-114.C-2_24_2,tpc:FSC-114.C-0_24_2,tpc:FSC-114.C-1_34_2,tpc:FSC-106.C-0_4_2,tpc:FSC-115.C-0_48_2,tpc:FSC-105.C-0_39_2,tpc:FSC-411.C-0_8_2,tpc:FSC-411.C-1_18_2,tpc:FSC-107.C-0_26_2,tpc:FSC-107.C-2_36_2,tpc:FSC-120.C-0_52_2,tpc:FSC-101.C-0_51_1,tpc:FSC-119.C-0_62_2,tpc:FSC-108.C-0_45_2,tpc:FSC-108.C-1_55_2,tpc:FSC-402.C-2_16_2,tpc:FSC-402.C-0_6_2,tpc:FSC-402.C-1_16_2,tpc:FSC-402.C-2_37_2,tpc:FSC-402.C-1_37_2,tpc:FSC-100.C-0_60_2</featuretypeList> + <featuretypeList/> + </FeatureTypeCollector> + <FeatureTypeCollector name="SLS"> + <featuretypeList>tpc:FSC-402.C-2_15_2,tpc:FSC-402.C-0_5_2,tpc:FSC-402.C-1_15_2,tpc:FSC-402.C-2_37_2,tpc:FSC-402.C-0_27_2,tpc:FSC-402.C-1_37_2,tpc:FSC-402.C-2_16_2,tpc:FSC-402.C-0_6_2,tpc:FSC-402.C-1_16_2,tpc:FSC-115.C-3_50_1,tpc:FSC-115.C-3_51_1,tpc:FSC-115.C-2_50_2,tpc:FSC-115.C-2_51_2,tpc:FSC-115.C-7_55_1,tpc:FSC-115.C-7_58_1,tpc:FSC-407.C-0_9_1,tpc:FSC-407.C-0_9_2,tpc:FSC-407.C-0_10_1,tpc:FSC-407.C-1_19_1,tpc:FSC-407.C-1_19_2,tpc:FSC-407.C-1_20_1,tpc:FSC-407.C-8_9_1,tpc:FSC-407.C-8_9_2,tpc:FSC-203.C-0_37_1,tpc:FSC-203.C-0_38_1,tpc:FSC-203.C-1_37_1,tpc:FSC-203.C-1_38_1,tpc:FSC-303.C-0_29_1,tpc:FSC-303.C-1_43_0,tpc:FSC-303.C-3_43_0,tpc:FSC-301.C-0_21_1,tpc:FSC-301.C-1_23_0,tpc:FSC-301.C-3_23_0,tpc:FSC-305.C-0_33_1,tpc:FSC-305.C-0_34_1,tpc:FSC-306.C-0_35_1,tpc:FSC-306.C-0_36_1,tpc:FSC-307.C-0_46_1,tpc:FSC-307.C-0_37_1,tpc:FSC-307.C-0_38_1,tpc:FSC-308.C-0_39_1,tpc:FSC-308.C-0_40_1,tpc:FSC-314.C-0_26_1,tpc:FSC-314.C-1_28_0,tpc:FSC-315.C-0_26_1,tpc:FSC-315.C-1_28_0,tpc:FSC-316.C-0_53_1,tpc:FSC-316.C-0_54_1,tpc:FSC-317.C-0_31_1,tpc:FSC-317.C-0_32_1,tpc:FSC-318.C-0_53_4,tpc:FSC-318.C-0_54_4,tpc:FSC-302.C-0_25_1,tpc:FSC-302.C-1_27_0,tpc:FSC-317.C-1_31_1,tpc:FSC-317.C-1_32_1,tpc:FSC-403.C-4_44_1,tpc:FSC-403.C-5_44_1,tpc:FSC-503.C-0_1_2,tpc:FSC-999.C-0_62_1,tpc:FSC-502.C-0_1_1,tpc:FSC-502.C-1_2_1,tpc:FSC-501.C-0_1_1,tpc:FSC-501.C-1_2_1</featuretypeList> + <featuretypeList/> + </FeatureTypeCollector> + <FeatureTypeCollector name="OMS"> + <featuretypeList>tpc:FSC-101.C-0_41_0,tpc:FSC-503.C-0_1_2,tpc:FSC-502.C-1_2_1,tpc:FSC-502.C-0_1_1,tpc:FSC-501.C-0_1_1,tpc:FSC-411.C-1_37_2,tpc:FSC-411.C-1_37_1,tpc:FSC-411.C-1_18_2,tpc:FSC-411.C-1_18_1,tpc:FSC-411.C-1_17_2,tpc:FSC-411.C-1_17_1,tpc:FSC-411.C-0_8_2,tpc:FSC-411.C-0_8_1,tpc:FSC-411.C-0_7_2,tpc:FSC-411.C-0_7_1,tpc:FSC-411.C-0_27_2,tpc:FSC-411.C-0_27_1,tpc:FSC-407.C-8_9_2,tpc:FSC-407.C-8_9_1,tpc:FSC-407.C-1_20_1,tpc:FSC-407.C-1_19_2,tpc:FSC-407.C-1_19_1,tpc:FSC-407.C-0_9_2,tpc:FSC-407.C-0_9_1,tpc:FSC-407.C-0_10_1,tpc:FSC-402.C-2_16_2,tpc:FSC-402.C-2_15_2,tpc:FSC-402.C-1_27_2,tpc:FSC-402.C-1_16_2,tpc:FSC-402.C-1_15_2,tpc:FSC-402.C-0_6_2,tpc:FSC-402.C-0_5_2,tpc:FSC-402.C-0_27_2,tpc:FSC-131.C-0_12_2,tpc:FSC-131.C-0_12_1,tpc:FSC-130.C-0_11_2,tpc:FSC-130.C-0_11_1,tpc:FSC-122.C-1_34_1,tpc:FSC-122.C-1_33_2,tpc:FSC-122.C-1_33_1,tpc:FSC-122.C-0_24_1,tpc:FSC-122.C-0_23_2,tpc:FSC-122.C-0_23_1,tpc:FSC-120.C-0_52_2,tpc:FSC-120.C-0_52_1,tpc:FSC-120.C-0_42_2,tpc:FSC-120.C-0_42_1,tpc:FSC-119.C-0_62_2,tpc:FSC-119.C-0_61_2,tpc:FSC-118.C-0_50_2,tpc:FSC-118.C-0_49_2,tpc:FSC-115.C-0_56_1,tpc:FSC-115.C-0_56_1,tpc:FSC-115.C-0_48_2,tpc:FSC-115.C-0_48_1,tpc:FSC-115.C-0_47_2,tpc:FSC-115.C-0_47_1,tpc:FSC-115.C-0_46_2,tpc:FSC-115.C-0_46_1,tpc:FSC-114.C-3_60_2,tpc:FSC-114.C-3_60_1,tpc:FSC-114.C-2_24_2,tpc:FSC-114.C-2_24_1,tpc:FSC-114.C-2_23_2,tpc:FSC-114.C-2_23_1,tpc:FSC-114.C-2_21_2,tpc:FSC-114.C-2_21_1,tpc:FSC-114.C-2_21_0,tpc:FSC-114.C-1_34_2,tpc:FSC-114.C-1_34_1,tpc:FSC-114.C-1_33_2,tpc:FSC-114.C-1_33_1,tpc:FSC-114.C-0_24_2,tpc:FSC-114.C-0_24_1,tpc:FSC-114.C-0_23_2,tpc:FSC-114.C-0_23_1,tpc:FSC-114.C-0_21_2,tpc:FSC-114.C-0_21_1,tpc:FSC-109.C-0_13_3,tpc:FSC-109.C-0_13_2,tpc:FSC-109.C-0_13_1,tpc:FSC-108.C-1_55_2,tpc:FSC-108.C-1_54_2,tpc:FSC-108.C-0_45_2,tpc:FSC-108.C-0_44_2,tpc:FSC-107.C-2_36_2,tpc:FSC-107.C-2_36_1,tpc:FSC-107.C-2_35_2,tpc:FSC-107.C-2_35_1,tpc:FSC-107.C-0_27_1,tpc:FSC-107.C-0_26_2,tpc:FSC-107.C-0_26_1,tpc:FSC-107.C-0_25_2,tpc:FSC-107.C-0_25_1,tpc:FSC-106.C-0_4_1,tpc:FSC-106.C-0_3_1,tpc:FSC-106.C-0_2_2,tpc:FSC-106.C-0_2_1,tpc:FSC-106.C-0_1_2,tpc:FSC-106.C-0_1_1,tpc:FSC-102.C-0_40_1,tpc:FSC-102.C-0_30_2,tpc:FSC-101.C-0_51_1,tpc:FSC-101.C-0_51_0,tpc:FSC-101.C-0_41_1</featuretypeList> + <featuretypeList/> + </FeatureTypeCollector> + <FeatureTypeCollector name="LVPIPE"> + <featuretypeList>tpc:FSC-402.C-2_15_2,tpc:FSC-402.C-0_5_2,tpc:FSC-402.C-1_15_2,tpc:FSC-402.C-2_37_2,tpc:FSC-402.C-0_27_2,tpc:FSC-402.C-1_37_2,tpc:FSC-402.C-2_16_2,tpc:FSC-402.C-0_6_2,tpc:FSC-402.C-1_16_2,tpc:FSC-411.C-2_7_1,tpc:FSC-411.C-2_7_2,tpc:FSC-411.C-2_8_1,tpc:FSC-411.C-2_8_2,tpc:FSC-411.C-3_17_1,tpc:FSC-411.C-3_17_2,tpc:FSC-411.C-3_37_1,tpc:FSC-411.C-3_37_2,tpc:FSC-411.C-3_18_1,tpc:FSC-411.C-3_18_2,tpc:FSC-411.C-7_7_1,tpc:FSC-411.C-7_7_2,tpc:FSC-411.C-7_8_1,tpc:FSC-407.C-2_9_1,tpc:FSC-407.C-2_9_2,tpc:FSC-407.C-2_10_1,tpc:FSC-407.C-2_10_1,tpc:FSC-407.C-3_19_1,tpc:FSC-407.C-3_19_2,tpc:FSC-407.C-3_20_1,tpc:FSC-407.C-7_10_1,tpc:FSC-407.C-7_9_1,tpc:FSC-407.C-7_9_2,tpc:FSC-202.C-1_35_0,tpc:FSC-202.C-0_35_1,tpc:FSC-203.C-1_37_1,tpc:FSC-203.C-0_37_1,tpc:FSC-206.C-2_1_0,tpc:FSC-206.C-1_1_1,tpc:FSC-206.C-0_1_1,tpc:FSC-207.C-1_1_0,tpc:FSC-207.C-0_1_1,tpc:FSC-209.C-0_45_1,tpc:FSC-216.C-2_1_0,tpc:FSC-216.C-1_1_1,tpc:FSC-216.C-0_1_1,tpc:FSC-401.C-1_11_0,tpc:FSC-401.C-0_11_1,tpc:FSC-401.C-2_11_1,tpc:FSC-401.C-3_11_0,tpc:FSC-403.C-0_11_1,tpc:FSC-403.C-1_11_1,tpc:FSC-403.C-0_3_1,tpc:FSC-403.C-1_3_1,tpc:FSC-403.C-0_22_1,tpc:FSC-403.C-0_23_1,tpc:FSC-403.C-0_24_1,tpc:FSC-403.C-1_22_1,tpc:FSC-403.C-1_23_1,tpc:FSC-403.C-1_24_1,tpc:FSC-420.C-0_54_3,tpc:FSC-420.C-1_2_1,tpc:FSC-421.C-1_2_1,tpc:FSC-421.C-0_1_3,tpc:FSC-424.C-0_1_1,tpc:FSC-503.C-0_1_2,tpc:FSC-502.C-1_2_1,tpc:FSC-502.C-0_1_1,tpc:FSC-501.C-1_2_1,tpc:FSC-501.C-0_1_1,tpc:FSC-999.C-0_62_1</featuretypeList> + <featuretypeList/> + </FeatureTypeCollector> + <FeatureTypeCollector name="POLE"> + <featuretypeList>tpc:FSC-407.C-0_10_1,tpc:FSC-407.C-0_9_1,tpc:FSC-407.C-0_9_2,tpc:FSC-407.C-1_19_1,tpc:FSC-407.C-1_19_2,tpc:FSC-407.C-1_20_1,tpc:FSC-407.C-1_9_1,tpc:FSC-407.C-1_9_2</featuretypeList> + <featuretypeList/> + </FeatureTypeCollector> + <FeatureTypeCollector name="22KVHVOH"> + <featuretypeList>tpc:FSC-115.C-0_56_1,tpc:FSC-115.C-1_56_1,tpc:FSC-402.C-2_37_2,tpc:FSC-402.C-0_27_2,tpc:FSC-402.C-1_37_2,tpc:FSC-402.C-2_16_2,tpc:FSC-402.C-0_6_2,tpc:FSC-402.C-1_16_2,tpc:FSC-407.C-0_10_1,tpc:FSC-407.C-1_20_1,tpc:FSC-407.C-9_10_1,tpc:FSC-117.C-0_27_2,tpc:FSC-118.C-0_50_2,tpc:FSC-108.C-1_55_2,tpc:FSC-119.C-0_62_2,tpc:FSC-100.C-0_60_2,tpc:FSC-503.C-0_1_2,tpc:FSC-999.C-0_62_1,tpc:FSC-502.C-1_2_1,tpc:FSC-502.C-0_1_1,tpc:FSC-501.C-1_2_1,tpc:FSC-501.C-0_1_1</featuretypeList> + <featuretypeList/> + </FeatureTypeCollector> + <FeatureTypeCollector name="11KVHVUG"> + <featuretypeList>tpc:FSC-113.C-0_4_1,tpc:FSC-122.C-0_23_1,tpc:FSC-122.C-0_23_2,tpc:FSC-122.C-1_33_1,tpc:FSC-122.C-1_33_2,tpc:FSC-140.C-1_52_0,tpc:FSC-140.C-1_52_1,tpc:FSC-140.C-2_52_2,tpc:FSC-140.C-2_52_1,tpc:FSC-140.C-0_52_2,tpc:FSC-140.C-0_52_1,tpc:FSC-402.C-0_5_2,tpc:FSC-402.C-1_15_2,tpc:FSC-402.C-2_37_2,tpc:FSC-402.C-0_27_2,tpc:FSC-402.C-1_37_2,tpc:FSC-411.C-1_17_1,tpc:FSC-411.C-1_17_2,tpc:FSC-411.C-1_37_1,tpc:FSC-411.C-1_37_2,tpc:FSC-411.C-0_7_1,tpc:FSC-411.C-0_7_1,tpc:FSC-107.C-2_35_1,tpc:FSC-107.C-2_35_2,tpc:FSC-107.C-0_25_1,tpc:FSC-107.C-0_25_2,tpc:FSC-107.C-0_27_1,tpc:FSC-105.C-0_29_1,tpc:FSC-105.C-0_29_2,tpc:FSC-101.C-0_41_0,tpc:FSC-101.C-0_41_1,tpc:FSC-130.C-0_11_1,tpc:FSC-130.C-0_11_2,tpc:FSC-108.C-0_44_2,tpc:FSC-108.C-1_54_2,tpc:FSC-119.C-0_61_2,tpc:FSC-115.C-0_47_1,tpc:FSC-115.C-0_47_2,tpc:FSC-118.C-0_49_2,tpc:FSC-403.C-2_14_1,tpc:FSC-403.C-2_15_1,tpc:FSC-403.C-1_22_1,tpc:FSC-403.C-1_23_1,tpc:FSC-403.C-1_24_1,tpc:FSC-403.C-1_4_1,tpc:FSC-403.C-1_13_1,tpc:FSC-503.C-0_1_2,tpc:FSC-999.C-0_62_1,tpc:FSC-502.C-1_2_1,tpc:FSC-502.C-0_1_1,tpc:FSC-501.C-1_2_1,tpc:FSC-501.C-0_1_1,tpc:FSC-114.C-1_33_1,tpc:FSC-114.C-1_33_2,tpc:FSC-114.C-3_60_1,tpc:FSC-114.C-3_60_2,tpc:FSC-114.C-2_23_1,tpc:FSC-114.C-0_23_1,tpc:FSC-114.C-0_23_2</featuretypeList> + <featuretypeList/> + </FeatureTypeCollector> + <FeatureTypeCollector name="11KVMAINHV"> + <featuretypeList>tpc:FSC-117.C-0_27_2,tpc:FSC-502.C-1_2_1,tpc:FSC-502.C-0_1_1,tpc:FSC-501.C-1_2_1,tpc:FSC-501.C-0_1_1,tpc:FSC-999.C-0_62_1,tpc:FSC-503.C-0_1_2,tpc:FSC-118.C-0_49_2,tpc:FSC-114.C-3_60_2,tpc:FSC-114.C-2_23_2,tpc:FSC-114.C-1_33_2,tpc:FSC-106.C-2_2_2,tpc:FSC-106.C-0_2_2,tpc:FSC-115.C-0_47_2,tpc:FSC-122.C-0_23_2,tpc:FSC-122.C-1_33_2,tpc:FSC-105.C-0_29_2,tpc:FSC-114.C-2_21_2,tpc:FSC-114.C-0_21_2,tpc:FSC-106.C-2_1_2,tpc:FSC-106.C-0_1_2,tpc:FSC-106.C-4_1_2,tpc:FSC-115.C-6_47_2,tpc:FSC-115.C-0_46_2,tpc:FSC-115.C-1_46_2,tpc:FSC-411.C-0_7_2,tpc:FSC-411.C-1_17_2,tpc:FSC-107.C-2_35_2,tpc:FSC-107.C-0_25_2,tpc:FSC-116.C-0_14_2,tpc:FSC-120.C-0_42_2,tpc:FSC-101.C-0_41_1,tpc:FSC-109.C-0_13_2,tpc:FSC-102.C-0_30_2,tpc:FSC-407.C-0_9_2,tpc:FSC-407.C-1_19_2,tpc:FSC-407.C-8_9_2,tpc:FSC-407.C-9_9_2,tpc:FSC-119.C-0_61_2,tpc:FSC-130.C-0_11_2,tpc:FSC-131.C-0_12_2,tpc:FSC-108.C-0_44_2,tpc:FSC-108.C-1_54_2,tpc:FSC-402.C-2_15_2,tpc:FSC-402.C-0_5_2,tpc:FSC-402.C-1_15_2,tpc:FSC-100.C-0_59_1,tpc:FSC-411.C-0_27_2,tpc:FSC-411.C-1_37_2,tpc:FSC-402.C-2_37_2,tpc:FSC-402.C-0_27_2,tpc:FSC-402.C-1_37_2</featuretypeList> + <featuretypeList/> + </FeatureTypeCollector> + <FeatureTypeCollector name="ALL"> + <featuretypeList>tpc:FSC-100.C-0_59_1,tpc:FSC-100.C-0_60_2,tpc:FSC-101.C-0_41_0,tpc:FSC-101.C-0_41_1,tpc:FSC-101.C-0_51_0,tpc:FSC-101.C-0_51_1,tpc:FSC-102.C-0_30_2,tpc:FSC-102.C-0_40_1,tpc:FSC-105.C-0_29_1,tpc:FSC-105.C-0_29_2,tpc:FSC-105.C-0_39_1,tpc:FSC-105.C-0_39_2,tpc:FSC-105.C-0_60_2,tpc:FSC-106.C-0_19_2,tpc:FSC-106.C-0_1_1,tpc:FSC-106.C-0_1_2,tpc:FSC-106.C-0_24_2,tpc:FSC-106.C-0_2_1,tpc:FSC-106.C-0_2_2,tpc:FSC-106.C-0_3_1,tpc:FSC-106.C-0_4_1,tpc:FSC-106.C-0_4_2,tpc:FSC-106.C-2_1_1,tpc:FSC-106.C-2_1_2,tpc:FSC-106.C-2_2_1,tpc:FSC-106.C-2_2_2,tpc:FSC-106.C-2_3_1,tpc:FSC-106.C-2_4_1,tpc:FSC-106.C-4_1_1,tpc:FSC-106.C-4_1_2,tpc:FSC-107.C-0_25_1,tpc:FSC-107.C-0_25_2,tpc:FSC-107.C-0_26_1,tpc:FSC-107.C-0_26_2,tpc:FSC-107.C-0_27_1,tpc:FSC-107.C-2_0_1,tpc:FSC-107.C-2_25_1,tpc:FSC-107.C-2_26_1,tpc:FSC-107.C-2_35_1,tpc:FSC-107.C-2_35_2,tpc:FSC-107.C-2_36_1,tpc:FSC-107.C-2_36_2,tpc:FSC-107.C-2_37_1,tpc:FSC-108.C-0_44_2,tpc:FSC-108.C-0_45_2,tpc:FSC-108.C-1_0_2,tpc:FSC-108.C-1_54_2,tpc:FSC-108.C-1_55_2,tpc:FSC-109.C-0_13_1,tpc:FSC-109.C-0_13_2,tpc:FSC-109.C-0_13_3,tpc:FSC-113.C-0_4_1,tpc:FSC-114.C-0_21_1,tpc:FSC-114.C-0_21_2,tpc:FSC-114.C-0_23_1,tpc:FSC-114.C-0_23_2,tpc:FSC-114.C-0_24_1,tpc:FSC-114.C-0_24_2,tpc:FSC-114.C-1_23_1,tpc:FSC-114.C-1_23_2,tpc:FSC-114.C-1_24_1,tpc:FSC-114.C-1_24_2,tpc:FSC-114.C-1_33_1,tpc:FSC-114.C-1_33_2,tpc:FSC-114.C-1_34_1,tpc:FSC-114.C-1_34_2,tpc:FSC-114.C-2_21_0,tpc:FSC-114.C-2_21_1,tpc:FSC-114.C-2_21_2,tpc:FSC-114.C-2_23_1,tpc:FSC-114.C-2_23_2,tpc:FSC-114.C-2_24_1,tpc:FSC-114.C-2_24_2,tpc:FSC-114.C-2_60_1,tpc:FSC-114.C-2_60_2,tpc:FSC-114.C-3_33_1,tpc:FSC-114.C-3_33_2,tpc:FSC-114.C-3_34_1,tpc:FSC-114.C-3_34_2,tpc:FSC-114.C-3_60_1,tpc:FSC-114.C-3_60_2,tpc:FSC-115.C-0_46_1,tpc:FSC-115.C-0_46_2,tpc:FSC-115.C-0_47_1,tpc:FSC-115.C-0_47_2,tpc:FSC-115.C-0_48_1,tpc:FSC-115.C-0_48_2,tpc:FSC-115.C-0_56_1,tpc:FSC-115.C-1_46_1,tpc:FSC-115.C-1_46_2,tpc:FSC-115.C-1_56_1,tpc:FSC-115.C-1_57_1,tpc:FSC-115.C-2_50_2,tpc:FSC-115.C-2_51_2,tpc:FSC-115.C-3_50_1,tpc:FSC-115.C-3_51_1,tpc:FSC-115.C-4_13_2,tpc:FSC-115.C-4_14_2,tpc:FSC-115.C-4_51_2,tpc:FSC-115.C-4_60_2,tpc:FSC-115.C-5_13_1,tpc:FSC-115.C-5_14_1,tpc:FSC-115.C-5_51_1,tpc:FSC-115.C-5_60_1,tpc:FSC-115.C-6_13_1,tpc:FSC-115.C-6_14_1,tpc:FSC-115.C-6_47_1,tpc:FSC-115.C-6_47_2,tpc:FSC-115.C-6_48_1,tpc:FSC-115.C-6_51_1,tpc:FSC-115.C-6_56_1,tpc:FSC-115.C-6_58_1,tpc:FSC-115.C-6_60_1,tpc:FSC-115.C-7_55_1,tpc:FSC-115.C-7_58_1,tpc:FSC-115.C-8_47_1,tpc:FSC-115.C-8_47_2,tpc:FSC-115.C-8_48_1,tpc:FSC-116.C-0_14_1,tpc:FSC-116.C-0_14_2,tpc:FSC-117.C-0_27_2,tpc:FSC-118.C-0_49_2,tpc:FSC-118.C-0_50_2,tpc:FSC-119.C-0_61_2,tpc:FSC-119.C-0_62_2,tpc:FSC-120.C-0_42_1,tpc:FSC-120.C-0_42_2,tpc:FSC-120.C-0_52_1,tpc:FSC-120.C-0_52_2,tpc:FSC-122.C-0_23_1,tpc:FSC-122.C-0_23_2,tpc:FSC-122.C-0_24_1,tpc:FSC-122.C-1_23_1,tpc:FSC-122.C-1_24_1,tpc:FSC-122.C-1_33_1,tpc:FSC-122.C-1_33_2,tpc:FSC-122.C-1_34_1,tpc:FSC-130.C-0_11_1,tpc:FSC-130.C-0_11_2,tpc:FSC-131.C-0_12_1,tpc:FSC-131.C-0_12_2,tpc:FSC-140.C-0_51_1,tpc:FSC-140.C-0_51_2,tpc:FSC-140.C-0_52_1,tpc:FSC-140.C-0_52_2,tpc:FSC-140.C-0_54_1,tpc:FSC-140.C-0_54_2,tpc:FSC-140.C-0_60_1,tpc:FSC-140.C-0_60_2,tpc:FSC-140.C-1_52_0,tpc:FSC-140.C-1_52_1,tpc:FSC-140.C-1_54_0,tpc:FSC-140.C-1_54_1,tpc:FSC-140.C-2_51_1,tpc:FSC-140.C-2_51_2,tpc:FSC-140.C-2_52_1,tpc:FSC-140.C-2_52_2,tpc:FSC-140.C-2_54_1,tpc:FSC-140.C-2_54_2,tpc:FSC-140.C-3_54_0,tpc:FSC-140.C-4_54_1,tpc:FSC-200.C-0_28_1,tpc:FSC-200.C-0_29_1,tpc:FSC-200.C-0_30_1,tpc:FSC-200.C-0_60_1,tpc:FSC-201.C-0_31_1,tpc:FSC-201.C-0_40_1,tpc:FSC-201.C-1_33_0,tpc:FSC-201.C-1_40_0,tpc:FSC-202.C-0_35_1,tpc:FSC-202.C-0_36_1,tpc:FSC-202.C-0_56_1,tpc:FSC-202.C-1_13_0,tpc:FSC-202.C-1_35_0,tpc:FSC-202.C-1_36_0,tpc:FSC-202.C-1_53_0,tpc:FSC-202.C-1_56_0,tpc:FSC-202.C-1_60_0,tpc:FSC-203.C-0_37_1,tpc:FSC-203.C-0_38_1,tpc:FSC-203.C-1_13_1,tpc:FSC-203.C-1_37_1,tpc:FSC-203.C-1_38_1,tpc:FSC-204.C-0_49_1,tpc:FSC-205.C-0_39_1,tpc:FSC-205.C-2_41_1,tpc:FSC-206.C-0_1_1,tpc:FSC-206.C-1_1_1,tpc:FSC-206.C-2_1_0,tpc:FSC-207.C-0_1_1,tpc:FSC-207.C-1_1_0,tpc:FSC-207.C-2_1_1,tpc:FSC-208.C-0_43_1,tpc:FSC-208.C-0_44_1,tpc:FSC-209.C-0_45_1,tpc:FSC-209.C-0_46_1,tpc:FSC-209.C-1_45_1,tpc:FSC-209.C-1_46_1,tpc:FSC-210.C-4_42_0,tpc:FSC-211.C-0_32_1,tpc:FSC-212.C-1_34_0,tpc:FSC-213.C-0_31_1,tpc:FSC-213.C-1_33_0,tpc:FSC-215.C-0_45_1,tpc:FSC-216.C-0_1_1,tpc:FSC-216.C-1_1_1,tpc:FSC-216.C-2_1_0,tpc:FSC-217.C-0_11_1,tpc:FSC-300.C-0_10_2,tpc:FSC-300.C-2_11_1,tpc:FSC-300.C-3_11_1,tpc:FSC-301.C-0_21_1,tpc:FSC-301.C-0_60_1,tpc:FSC-301.C-1_23_0,tpc:FSC-301.C-1_60_0,tpc:FSC-301.C-3_23_0,tpc:FSC-301.C-3_60_0,tpc:FSC-302.C-0_25_1,tpc:FSC-302.C-1_27_0,tpc:FSC-303.C-0_29_1,tpc:FSC-303.C-1_43_0,tpc:FSC-303.C-3_43_0,tpc:FSC-305.C-0_33_1,tpc:FSC-305.C-0_34_1,tpc:FSC-306.C-0_35_1,tpc:FSC-306.C-0_36_1,tpc:FSC-307.C-0_37_1,tpc:FSC-307.C-0_38_1,tpc:FSC-307.C-0_46_1,tpc:FSC-308.C-0_39_1,tpc:FSC-308.C-0_40_1,tpc:FSC-311.C-0_45_1,tpc:FSC-311.C-0_60_1,tpc:FSC-311.C-0_63_1,tpc:FSC-311.C-1_45_0,tpc:FSC-311.C-1_45_1,tpc:FSC-311.C-1_60_1,tpc:FSC-311.C-1_63_1,tpc:FSC-314.C-0_26_1,tpc:FSC-314.C-1_28_0,tpc:FSC-315.C-0_26_1,tpc:FSC-315.C-1_28_0,tpc:FSC-316.C-0_53_1,tpc:FSC-316.C-0_54_1,tpc:FSC-317.C-0_31_1,tpc:FSC-317.C-0_32_1,tpc:FSC-317.C-1_31_1,tpc:FSC-317.C-1_32_1,tpc:FSC-318.C-0_53_4,tpc:FSC-318.C-0_54_4,tpc:FSC-319.C-0_12_1,tpc:FSC-320.C-0_13_1,tpc:FSC-323.C-0_1_1,tpc:FSC-324.C-0_1_1,tpc:FSC-324.C-1_2_1,tpc:FSC-401.C-0_11_1,tpc:FSC-401.C-0_4_2,tpc:FSC-401.C-0_60_1,tpc:FSC-401.C-1_11_0,tpc:FSC-401.C-1_4_0,tpc:FSC-401.C-2_11_1,tpc:FSC-401.C-2_4_1,tpc:FSC-401.C-3_11_0,tpc:FSC-401.C-3_4_1,tpc:FSC-401.C-5_4_1,tpc:FSC-402.C-0_27_2,tpc:FSC-402.C-0_5_2,tpc:FSC-402.C-0_6_2,tpc:FSC-402.C-1_15_2,tpc:FSC-402.C-1_16_2,tpc:FSC-402.C-1_27_2,tpc:FSC-402.C-1_37_2,tpc:FSC-402.C-1_5_2,tpc:FSC-402.C-1_6_2,tpc:FSC-402.C-2_15_2,tpc:FSC-402.C-2_16_2,tpc:FSC-402.C-2_37_2,tpc:FSC-403.C-0_11_1,tpc:FSC-403.C-0_13_1,tpc:FSC-403.C-0_22_1,tpc:FSC-403.C-0_23_1,tpc:FSC-403.C-0_24_1,tpc:FSC-403.C-0_3_1,tpc:FSC-403.C-0_4_1,tpc:FSC-403.C-1_11_1,tpc:FSC-403.C-1_13_1,tpc:FSC-403.C-1_14_1,tpc:FSC-403.C-1_22_1,tpc:FSC-403.C-1_23_1,tpc:FSC-403.C-1_24_1,tpc:FSC-403.C-1_3_1,tpc:FSC-403.C-1_4_1,tpc:FSC-403.C-1_60_1,tpc:FSC-403.C-2_13_1,tpc:FSC-403.C-2_14_1,tpc:FSC-403.C-2_15_1,tpc:FSC-403.C-2_20_1,tpc:FSC-403.C-2_60_1,tpc:FSC-403.C-4_11_1,tpc:FSC-403.C-4_44_1,tpc:FSC-403.C-5_11_1,tpc:FSC-403.C-5_44_1,tpc:FSC-403.C-5_60_1,tpc:FSC-403.C-6_45_1,tpc:FSC-403.C-7_45_1,tpc:FSC-407.C-0_10_1,tpc:FSC-407.C-0_9_1,tpc:FSC-407.C-0_9_2,tpc:FSC-407.C-10_9_1,tpc:FSC-407.C-11_9_1,tpc:FSC-407.C-1_19_1,tpc:FSC-407.C-1_19_2,tpc:FSC-407.C-1_20_1,tpc:FSC-407.C-1_9_1,tpc:FSC-407.C-1_9_2,tpc:FSC-407.C-2_10_1,tpc:FSC-407.C-2_9_1,tpc:FSC-407.C-2_9_2,tpc:FSC-407.C-3_19_1,tpc:FSC-407.C-3_19_2,tpc:FSC-407.C-3_20_1,tpc:FSC-407.C-7_10_1,tpc:FSC-407.C-7_9_1,tpc:FSC-407.C-7_9_2,tpc:FSC-407.C-8_9_1,tpc:FSC-407.C-8_9_2,tpc:FSC-407.C-9_10_1,tpc:FSC-407.C-9_9_1,tpc:FSC-407.C-9_9_2,tpc:FSC-411.C-0_27_1,tpc:FSC-411.C-0_27_2,tpc:FSC-411.C-0_7_1,tpc:FSC-411.C-0_7_2,tpc:FSC-411.C-0_8_1,tpc:FSC-411.C-0_8_2,tpc:FSC-411.C-1_17_1,tpc:FSC-411.C-1_17_2,tpc:FSC-411.C-1_18_1,tpc:FSC-411.C-1_18_2,tpc:FSC-411.C-1_37_1,tpc:FSC-411.C-1_37_2,tpc:FSC-411.C-1_7_1,tpc:FSC-411.C-1_7_2,tpc:FSC-411.C-1_8_1,tpc:FSC-411.C-1_8_2,tpc:FSC-411.C-2_27_1,tpc:FSC-411.C-2_27_2,tpc:FSC-411.C-2_7_1,tpc:FSC-411.C-2_7_2,tpc:FSC-411.C-2_8_1,tpc:FSC-411.C-2_8_2,tpc:FSC-411.C-3_17_1,tpc:FSC-411.C-3_17_2,tpc:FSC-411.C-3_18_1,tpc:FSC-411.C-3_18_2,tpc:FSC-411.C-3_37_1,tpc:FSC-411.C-3_37_2,tpc:FSC-411.C-7_7_1,tpc:FSC-411.C-7_7_2,tpc:FSC-411.C-7_8_1,tpc:FSC-420.C-0_54_3,tpc:FSC-420.C-1_2_1,tpc:FSC-421.C-0_1_3,tpc:FSC-421.C-1_2_1,tpc:FSC-423.C-1_4_1,tpc:FSC-424.C-0_1_1,tpc:FSC-501.C-0_1_1,tpc:FSC-501.C-1_2_1,tpc:FSC-502.C-0_1_1,tpc:FSC-502.C-1_2_1,tpc:FSC-503.C-0_1_2,tpc:FSC-999.C-0_62_1</featuretypeList> + <featuretypeList/> + </FeatureTypeCollector> + <FeatureTypeCollector name="LVUG"> + <featuretypeList>tpc:FSC-217.C-0_11_1,tpc:FSC-402.C-2_15_2,tpc:FSC-402.C-0_5_2,tpc:FSC-402.C-1_15_2,tpc:FSC-402.C-2_37_2,tpc:FSC-402.C-0_27_2,tpc:FSC-402.C-1_37_2,tpc:FSC-402.C-2_16_2,tpc:FSC-402.C-0_6_2,tpc:FSC-402.C-1_16_2,tpc:FSC-407.C-2_10_1,tpc:FSC-407.C-2_9_1,tpc:FSC-407.C-2_9_2,tpc:FSC-407.C-3_19_1,tpc:FSC-407.C-3_19_2,tpc:FSC-407.C-3_20_1,tpc:FSC-407.C-7_10_1,tpc:FSC-407.C-7_9_1,tpc:FSC-407.C-7_9_2,tpc:FSC-411.C-7_7_1,tpc:FSC-411.C-7_7_2,tpc:FSC-411.C-7_8_1,tpc:FSC-115.C-8_47_1,tpc:FSC-115.C-8_47_2,tpc:FSC-115.C-8_48_1,tpc:FSC-115.C-6_47_1,tpc:FSC-115.C-6_47_2,tpc:FSC-115.C-2_51_2,tpc:FSC-115.C-3_51_1,tpc:FSC-115.C-4_51_2,tpc:FSC-115.C-5_51_1,tpc:FSC-115.C-6_56_1,tpc:FSC-115.C-7_55_1,tpc:FSC-200.C-0_28_1,tpc:FSC-200.C-0_29_1,tpc:FSC-201.C-0_31_1,tpc:FSC-201.C-1_33_0,tpc:FSC-202.C-1_35_0,tpc:FSC-202.C-0_35_1,tpc:FSC-203.C-1_37_1,tpc:FSC-203.C-0_37_1,tpc:FSC-206.C-2_1_0,tpc:FSC-206.C-1_1_1,tpc:FSC-206.C-0_1_1,tpc:FSC-207.C-1_1_0,tpc:FSC-207.C-0_1_1,tpc:FSC-208.C-0_43_1,tpc:FSC-209.C-0_45_1,tpc:FSC-210.C-4_42_0,tpc:FSC-213.C-0_31_1,tpc:FSC-213.C-1_33_0,tpc:FSC-215.C-0_45_1,tpc:FSC-216.C-2_1_0,tpc:FSC-216.C-0_1_1,tpc:FSC-216.C-1_1_1,tpc:FSC-301.C-1_23_0,tpc:FSC-301.C-0_21_1,tpc:FSC-301.C-1_23_0,tpc:FSC-301.C-3_23_0,tpc:FSC-303.C-0_29_1,tpc:FSC-303.C-1_43_0,tpc:FSC-303.C-3_43_0,tpc:FSC-307.C-0_46_1,tpc:FSC-307.C-0_37_1,tpc:FSC-302.C-0_25_1,tpc:FSC-302.C-1_27_0,tpc:FSC-305.C-0_33_1,tpc:FSC-306.C-0_35_1,tpc:FSC-308.C-0_39_1,tpc:FSC-316.C-0_53_1,tpc:FSC-317.C-1_31_1,tpc:FSC-318.C-0_53_4,tpc:FSC-403.C-2_20_1,tpc:FSC-403.C-2_15_1,tpc:FSC-403.C-1_22_1,tpc:FSC-403.C-1_23_1,tpc:FSC-403.C-1_24_1,tpc:FSC-503.C-0_1_2,tpc:FSC-999.C-0_62_1,tpc:FSC-502.C-1_2_1,tpc:FSC-502.C-0_1_1,tpc:FSC-501.C-1_2_1,tpc:FSC-501.C-0_1_1</featuretypeList> + <featuretypeList/> + </FeatureTypeCollector> + <FeatureTypeCollector name="OHS"> + <featuretypeList>tpc:FSC-106.C-2_1_1,tpc:FSC-106.C-2_1_2,tpc:FSC-106.C-4_1_1,tpc:FSC-106.C-4_1_2,tpc:FSC-106.C-0_1_1,tpc:FSC-106.C-0_1_2,tpc:FSC-106.C-2_3_1,tpc:FSC-106.C-0_3_1,tpc:FSC-140.C-2_51_1,tpc:FSC-140.C-2_51_2,tpc:FSC-140.C-0_51_1,tpc:FSC-140.C-0_51_2,tpc:FSC-402.C-2_15_2,tpc:FSC-403.C-2_15_1,tpc:FSC-402.C-0_5_2,tpc:FSC-402.C-1_15_2,tpc:FSC-402.C-2_37_2,tpc:FSC-402.C-0_27_2,tpc:FSC-402.C-1_37_2,tpc:FSC-402.C-2_16_2,tpc:FSC-402.C-0_6_2,tpc:FSC-402.C-1_16_2,tpc:FSC-407.C-0_9_1,tpc:FSC-407.C-0_9_2,tpc:FSC-407.C-0_10_1,tpc:FSC-407.C-1_19_1,tpc:FSC-407.C-1_19_2,tpc:FSC-407.C-1_20_1,tpc:FSC-407.C-9_9_1,tpc:FSC-407.C-9_9_2,tpc:FSC-407.C-9_10_1,tpc:FSC-407.C-10_9_1,tpc:FSC-407.C-11_9_1,tpc:FSC-118.C-0_49_2,tpc:FSC-118.C-0_50_2,tpc:FSC-407.C-8_9_1,tpc:FSC-407.C-8_9_2,tpc:FSC-114.C-0_21_1,tpc:FSC-114.C-0_21_2,tpc:FSC-114.C-2_21_0,tpc:FSC-114.C-2_21_1,tpc:FSC-114.C-2_21_2,tpc:FSC-115.C-0_46_1,tpc:FSC-115.C-0_46_2,tpc:FSC-115.C-0_56_1,tpc:FSC-115.C-1_46_1,tpc:FSC-115.C-1_46_2,tpc:FSC-115.C-1_56_1,tpc:FSC-115.C-2_50_2,tpc:FSC-115.C-2_51_2,tpc:FSC-115.C-3_51_1,tpc:FSC-115.C-3_50_1,tpc:FSC-115.C-7_58_1,tpc:FSC-115.C-7_55_1,tpc:FSC-107.C-2_35_1,tpc:FSC-107.C-2_35_2,tpc:FSC-107.C-0_25_1,tpc:FSC-107.C-0_25_2,tpc:FSC-107.C-2_36_1,tpc:FSC-107.C-2_36_2,tpc:FSC-107.C-0_26_1,tpc:FSC-107.C-0_26_2,tpc:FSC-107.C-2_37_1,tpc:FSC-107.C-0_27_1,tpc:FSC-117.C-0_27_2,tpc:FSC-120.C-0_42_1,tpc:FSC-120.C-0_42_2,tpc:FSC-120.C-0_52_1,tpc:FSC-120.C-0_52_2,tpc:FSC-130.C-0_11_1,tpc:FSC-130.C-0_11_2,tpc:FSC-131.C-0_12_1,tpc:FSC-131.C-0_12_2,tpc:FSC-109.C-0_13_1,tpc:FSC-109.C-0_13_2,tpc:FSC-109.C-0_13_3,tpc:FSC-116.C-0_14_1,tpc:FSC-116.C-0_14_2,tpc:FSC-102.C-0_30_2,tpc:FSC-100.C-0_59_1,tpc:FSC-100.C-0_60_2,tpc:FSC-502.C-0_1_1,tpc:FSC-502.C-1_2_1,tpc:FSC-501.C-0_1_1,tpc:FSC-501.C-1_2_1,tpc:FSC-503.C-0_1_2,tpc:FSC-999.C-0_62_1,tpc:FSC-200.C-0_30_1,tpc:FSC-200.C-0_28_1,tpc:FSC-202.C-1_36_0,tpc:FSC-202.C-0_36_1,tpc:FSC-203.C-1_38_1,tpc:FSC-203.C-0_38_1,tpc:FSC-205.C-2_41_1,tpc:FSC-205.C-0_39_1,tpc:FSC-208.C-0_44_1,tpc:FSC-209.C-0_46_1,tpc:FSC-211.C-0_32_1,tpc:FSC-212.C-1_34_0,tpc:FSC-303.C-1_43_0,tpc:FSC-303.C-0_29_1,tpc:FSC-303.C-3_43_0,tpc:FSC-305.C-0_34_1,tpc:FSC-306.C-0_36_1,tpc:FSC-307.C-0_46_1,tpc:FSC-307.C-0_38_1,tpc:FSC-308.C-0_40_1,tpc:FSC-314.C-0_26_1,tpc:FSC-314.C-1_28_0,tpc:FSC-315.C-0_26_1,tpc:FSC-315.C-1_28_0,tpc:FSC-316.C-0_54_1,tpc:FSC-317.C-0_32_1,tpc:FSC-317.C-1_32_1,tpc:FSC-318.C-0_54_4</featuretypeList> + <featuretypeList/> + </FeatureTypeCollector> + <FeatureTypeCollector name="HVPIPE"> + <featuretypeList>tpc:FSC-402.C-2_15_2,tpc:FSC-402.C-0_5_2,tpc:FSC-402.C-1_15_2,tpc:FSC-402.C-2_37_2,tpc:FSC-402.C-0_27_2,tpc:FSC-402.C-1_37_2,tpc:FSC-402.C-2_16_2,tpc:FSC-402.C-0_6_2,tpc:FSC-402.C-1_16_2,tpc:FSC-411.C-2_7_1,tpc:FSC-411.C-2_7_2,tpc:FSC-411.C-2_27_1,tpc:FSC-411.C-2_27_2,tpc:FSC-411.C-2_8_1,tpc:FSC-411.C-2_8_2,tpc:FSC-411.C-3_17_1,tpc:FSC-411.C-3_17_2,tpc:FSC-411.C-3_37_1,tpc:FSC-411.C-3_37_2,tpc:FSC-411.C-3_18_1,tpc:FSC-411.C-3_18_2,tpc:FSC-411.C-7_7_1,tpc:FSC-411.C-7_7_2,tpc:FSC-411.C-7_8_1,tpc:FSC-407.C-2_9_1,tpc:FSC-407.C-2_9_2,tpc:FSC-407.C-2_10_1,tpc:FSC-407.C-3_19_1,tpc:FSC-407.C-3_19_2,tpc:FSC-407.C-3_20_1,tpc:FSC-407.C-7_10_1,tpc:FSC-407.C-7_9_1,tpc:FSC-407.C-7_9_2,tpc:FSC-999.C-0_62_1,tpc:FSC-502.C-1_2_1,tpc:FSC-502.C-0_1_1,tpc:FSC-501.C-0_1_1,tpc:FSC-501.C-1_2_1,tpc:FSC-420.C-0_54_3,tpc:FSC-420.C-1_2_1,tpc:FSC-423.C-1_4_1,tpc:FSC-401.C-1_4_0,tpc:FSC-401.C-3_4_1,tpc:FSC-401.C-0_4_2,tpc:FSC-401.C-2_4_1,tpc:FSC-401.C-5_4_1,tpc:FSC-403.C-0_4_1,tpc:FSC-403.C-0_13_1,tpc:FSC-403.C-0_3_1,tpc:FSC-403.C-1_3_1,tpc:FSC-403.C-1_4_1,tpc:FSC-403.C-1_13_1,tpc:FSC-403.C-0_22_1,tpc:FSC-403.C-0_23_1,tpc:FSC-403.C-0_24_1,tpc:FSC-403.C-1_22_1,tpc:FSC-403.C-1_23_1,tpc:FSC-403.C-1_24_1,tpc:FSC-503.C-0_1_2,tpc:FSC-421.C-0_1_3,tpc:FSC-421.C-1_2_1,tpc:FSC-424.C-0_1_1</featuretypeList> + <featuretypeList/> + </FeatureTypeCollector> + <FeatureTypeCollector name="HLVPIPE"> + <featuretypeList>tpc:FSC-402.C-2_15_2,tpc:FSC-402.C-0_5_2,tpc:FSC-402.C-1_15_2,tpc:FSC-402.C-2_37_2,tpc:FSC-402.C-0_27_2,tpc:FSC-402.C-1_37_2,tpc:FSC-402.C-2_16_2,tpc:FSC-402.C-0_6_2,tpc:FSC-402.C-1_16_2,tpc:FSC-411.C-2_7_1,tpc:FSC-411.C-2_7_2,tpc:FSC-411.C-2_27_1,tpc:FSC-411.C-2_27_2,tpc:FSC-411.C-2_8_1,tpc:FSC-411.C-2_8_2,tpc:FSC-411.C-3_17_1,tpc:FSC-411.C-3_17_2,tpc:FSC-411.C-3_37_1,tpc:FSC-411.C-3_37_2,tpc:FSC-411.C-3_18_1,tpc:FSC-411.C-3_18_2,tpc:FSC-411.C-7_7_1,tpc:FSC-411.C-7_7_2,tpc:FSC-411.C-7_8_1,tpc:FSC-407.C-2_9_1,tpc:FSC-407.C-2_9_2,tpc:FSC-407.C-2_10_1,tpc:FSC-407.C-3_19_1,tpc:FSC-407.C-3_19_2,tpc:FSC-407.C-3_20_1,tpc:FSC-407.C-7_10_1,tpc:FSC-407.C-7_9_1,tpc:FSC-407.C-7_9_2,tpc:FSC-202.C-1_35_0,tpc:FSC-202.C-0_35_1,tpc:FSC-203.C-1_37_1,tpc:FSC-203.C-0_37_1,tpc:FSC-206.C-2_1_0,tpc:FSC-206.C-1_1_1,tpc:FSC-206.C-0_1_1,tpc:FSC-207.C-1_1_0,tpc:FSC-209.C-0_45_1,tpc:FSC-216.C-2_1_0,tpc:FSC-216.C-1_1_1,tpc:FSC-216.C-0_1_1,tpc:FSC-401.C-0_11_1,tpc:FSC-401.C-0_4_2,tpc:FSC-401.C-1_11_0,tpc:FSC-401.C-3_11_0,tpc:FSC-401.C-2_11_1,tpc:FSC-401.C-1_4_0,tpc:FSC-401.C-3_4_1,tpc:FSC-401.C-2_4_1,tpc:FSC-401.C-5_4_1,tpc:FSC-403.C-0_3_1,tpc:FSC-403.C-0_4_1,tpc:FSC-403.C-0_13_1,tpc:FSC-403.C-1_3_1,tpc:FSC-403.C-1_11_1,tpc:FSC-403.C-1_4_1,tpc:FSC-403.C-1_13_1,tpc:FSC-403.C-0_22_1,tpc:FSC-403.C-0_23_1,tpc:FSC-403.C-0_24_1,tpc:FSC-403.C-1_22_1,tpc:FSC-403.C-1_23_1,tpc:FSC-403.C-1_24_1,tpc:FSC-421.C-0_1_3,tpc:FSC-421.C-1_2_1,tpc:FSC-423.C-1_4_1,tpc:FSC-424.C-0_1_1,tpc:FSC-999.C-0_62_1,tpc:FSC-502.C-0_1_1,tpc:FSC-502.C-1_2_1,tpc:FSC-501.C-0_1_1,tpc:FSC-501.C-1_2_1,tpc:FSC-420.C-0_54_3,tpc:FSC-420.C-1_2_1</featuretypeList> + <featuretypeList/> + </FeatureTypeCollector> +</FeatureClassificationRules> -- Gitblit v0.0.0-SNAPSHOT