From 90e7660cac64a949ac7d4e71302ac3509e8ce5a5 Mon Sep 17 00:00:00 2001
From: Dennis Kao <ulysseskao@gmail.com>
Date: Tue, 08 Apr 2014 15:32:49 +0800
Subject: [PATCH] Merge branch 'origin/2.1.x'

---
 xdgnjobs/ximple-jobcarrier/.gitignore                                                                                    |    1 
 xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/jobs/context/postgis/OracleIncrementPostGISJobContext.java     |  293 ++
 xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/jobs/GeoserverIntegrateConfigJob.java                          |   87 
 xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/jobs/context/postgis/OracleConvertPostGISJobContext.java       |    6 
 xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/jobs/context/postgis/IndexDgnConvertPostGISJobContext.java     |    3 
 xdgnjobs/ximple-jobcarrier/quartz_jobs_colowner.xml                                                                      |  168 +
 xdgnjobs/pom.xml                                                                                                         |    4 
 xdgnjobs/ximple-jobcarrier/quartz_jobs_inc.xml                                                                           |  169 +
 xdgnjobs/ximple-jobcarrier/quartz.properties                                                                             |   68 
 xdgnjobs/ximple-jobcarrier/src/main/resources/quartz_jobs_inc.xml                                                        |  168 +
 xdgnjobs/ximple-jobcarrier/quartz_jobs_dmmsroadfee.xml                                                                   |  173 +
 xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/jobs/context/postgis/GeneralDgnConvertPostGISJobContext.java   |    1 
 xdgnjobs/ximple-jobcarrier/src/main/resources/quartz_jobs_colowner.xml                                                   |  168 +
 xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/filter/CreateTextStrategy.java                                 |    1 
 xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/filter/CreateLineTextStrategy.java                             |    2 
 xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/jobs/DummyFeatureConvertJobContext.java                        |    4 
 xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/filter/CreateMultiSymbolStrategy.java                          |   19 
 xdgnjobs/ximple-jobcarrier/src/main/resources/quartz.properties                                                          |    4 
 xdgnjobs/ximple-spatialjob/src/main/resources/conf/DefaultConvertShpFilter.xml                                           |  564 +++--
 xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/jobs/OracleClearExchangeJob.java                               |  370 +++
 xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/jobs/context/postgis/FeatureDgnConvertPostGISJobContext.java   |    4 
 xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/filter/CreateSymbolStrategy.java                               |    2 
 xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/jobs/DMMSRoadfeeCalculateJob.java                              | 1895 +++++++++++++++++++
 xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/jobs/OracleConvertDgn2PostGISJob.java                          |   56 
 xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/jobs/context/postgis/DummyFeatureConvertPostGISJobContext.java |    4 
 xdgnjobs/ximple-jobcarrier/src/main/resources/quartz_jobs.xml                                                            |   12 
 xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/jobs/context/edbgeo/GeneralDgnConvertEdbGeoJobContext.java     |    1 
 xdgnjobs/ximple-jobcarrier/src/main/resources/quartz_jobs_dmmsroadfee.xml                                                |  173 +
 xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/util/FeatureTypeBuilderUtil.java                               |    8 
 xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/jobs/OracleIncrementDgn2PostGISJob.java                        |  131 +
 xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/jobs/OracleConvertThemes2PostGISJob.java                       | 1325 +++++++++++++
 31 files changed, 5,539 insertions(+), 345 deletions(-)

diff --git a/xdgnjobs/pom.xml b/xdgnjobs/pom.xml
index 632f5e6..bb15284 100644
--- a/xdgnjobs/pom.xml
+++ b/xdgnjobs/pom.xml
@@ -19,11 +19,11 @@
     <src.output>${basedir}/target</src.output>
     <java5>1.6</java5>
     <xdgnio.version>2.1.1</xdgnio.version>
-    <gt.version>10.3.x</gt.version>
+    <gt.version>10.4.x</gt.version>
     <failIfNoTests>false</failIfNoTests>
     <stress.skip.pattern></stress.skip.pattern>
     <online.skip.pattern></online.skip.pattern>
-    <java.awt.headless>false</java.awt.headless>
+    <!--java.awt.headless>false</javaa.awt.headless-->
     <allow.test.failure.ignore>false</allow.test.failure.ignore>
   </properties>
 
diff --git a/xdgnjobs/ximple-jobcarrier/.gitignore b/xdgnjobs/ximple-jobcarrier/.gitignore
index b83d222..1ae0a1b 100644
--- a/xdgnjobs/ximple-jobcarrier/.gitignore
+++ b/xdgnjobs/ximple-jobcarrier/.gitignore
@@ -1 +1,2 @@
 /target/
+/xjobcarrier.log
diff --git a/xdgnjobs/ximple-jobcarrier/quartz.properties b/xdgnjobs/ximple-jobcarrier/quartz.properties
index e491e0d..132f0f6 100644
--- a/xdgnjobs/ximple-jobcarrier/quartz.properties
+++ b/xdgnjobs/ximple-jobcarrier/quartz.properties
@@ -1,33 +1,37 @@
-#===============================================================
-#Configure Main Scheduler Properties
-#===============================================================
-org.quartz.scheduler.instanceName = QuartzScheduler
-org.quartz.scheduler.instanceId = AUTO
-
-#===============================================================
-#Configure ThreadPool
-#===============================================================
-org.quartz.threadPool.threadCount =  5
-org.quartz.threadPool.threadPriority = 5
-org.quartz.threadPool.class = org.quartz.simpl.SimpleThreadPool
-
-#===============================================================
-#Configure JobStore
-#===============================================================
-org.quartz.jobStore.class = org.quartz.simpl.RAMJobStore
-org.quartz.jobStore.misfireThreshold = 60000
-
-#===============================================================
-#Configure Plugins
-#===============================================================
-org.quartz.plugin.triggHistory.class = org.quartz.plugins.history.LoggingJobHistoryPlugin
-
-org.quartz.plugin.jobInitializer.class: org.quartz.plugins.xml.XMLSchedulingDataProcessorPlugin
-org.quartz.plugin.jobInitializer.fileNames = quartz_jobs.xml
-#org.quartz.plugin.jobInitializer.fileNames = quartz_jobs_edb.xml
-org.quartz.plugin.jobInitializer.failOnFileNotFound = true
-org.quartz.plugin.jobInitializer.scanInterval = 10
-org.quartz.plugin.jobInitializer.wrapInUserTransaction = false
-
-org.quartz.plugin.shutdownhook.class = org.quartz.plugins.management.ShutdownHookPlugin
+#===============================================================
+#Configure Main Scheduler Properties
+#===============================================================
+org.quartz.scheduler.instanceName = QuartzScheduler
+org.quartz.scheduler.instanceId = AUTO
+
+#===============================================================
+#Configure ThreadPool
+#===============================================================
+org.quartz.threadPool.threadCount =  5
+org.quartz.threadPool.threadPriority = 5
+org.quartz.threadPool.class = org.quartz.simpl.SimpleThreadPool
+
+#===============================================================
+#Configure JobStore
+#===============================================================
+org.quartz.jobStore.class = org.quartz.simpl.RAMJobStore
+org.quartz.jobStore.misfireThreshold = 60000
+
+#===============================================================
+#Configure Plugins
+#===============================================================
+org.quartz.plugin.triggHistory.class = org.quartz.plugins.history.LoggingJobHistoryPlugin
+
+org.quartz.plugin.jobInitializer.class: org.quartz.plugins.xml.XMLSchedulingDataProcessorPlugin
+#org.quartz.plugin.jobInitializer.fileNames = quartz_jobs_dmmsroadfee.xml
+org.quartz.plugin.jobInitializer.fileNames = quartz_jobs.xml
+#org.quartz.plugin.jobInitializer.fileNames = quartz_jobs_inc.xml
+#org.quartz.plugin.jobInitializer.fileNames = quartz_jobs_edb.xml
+#org.quartz.plugin.jobInitializer.fileNames = quartz_jobs_colowner.xml
+
+org.quartz.plugin.jobInitializer.failOnFileNotFound = true
+org.quartz.plugin.jobInitializer.scanInterval = 10
+org.quartz.plugin.jobInitializer.wrapInUserTransaction = false
+
+org.quartz.plugin.shutdownhook.class = org.quartz.plugins.management.ShutdownHookPlugin
 org.quartz.plugin.shutdownhook.cleanShutdown = true
\ No newline at end of file
diff --git a/xdgnjobs/ximple-jobcarrier/quartz_jobs_colowner.xml b/xdgnjobs/ximple-jobcarrier/quartz_jobs_colowner.xml
new file mode 100644
index 0000000..30d36a9
--- /dev/null
+++ b/xdgnjobs/ximple-jobcarrier/quartz_jobs_colowner.xml
@@ -0,0 +1,168 @@
+<?xml version='1.0' encoding='utf-8'?>
+
+<job-scheduling-data xmlns="http://www.quartz-scheduler.org/xml/JobSchedulingData"
+    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+    xsi:schemaLocation="http://www.quartz-scheduler.org/xml/JobSchedulingData http://www.quartz-scheduler.org/xml/job_scheduling_data_1_8.xsd"
+    version="1.8">
+
+  <pre-processing-commands>
+    <delete-jobs-in-group>*</delete-jobs-in-group>  <!-- clear all jobs in scheduler -->
+    <delete-triggers-in-group>*</delete-triggers-in-group> <!-- clear all triggers in scheduler -->
+  </pre-processing-commands>
+
+  <processing-directives>
+    <!-- if there are any jobs/trigger in scheduler of same name (as in this file), overwrite them -->
+    <overwrite-existing-data>true</overwrite-existing-data>
+    <!-- if there are any jobs/trigger in scheduler of same name (as in this file), and over-write is false, ignore them rather then generating an error -->
+    <ignore-duplicates>false</ignore-duplicates>
+  </processing-directives>
+
+  <schedule>
+    <job>
+      <name>ConvertPowerThemesIntoPostGISJob</name>
+      <group>DEFAULT</group>
+      <description>A job that convert dgn to postgis</description>
+      <job-class>com.ximple.eofms.jobs.OracleConvertThemes2PostGISJob</job-class>
+      <!--volatility>false</volatility-->
+      <durability>false</durability>
+      <recover>false</recover>
+      <!--job-data-map allows-transient-data="true"-->
+      <job-data-map>
+        <entry>
+          <key>JOBDATA_DIR</key>
+          <value>/Users/ulysseskao/Projects/XGeoDMMS/xjobrun/tctpcjobs/jobdata</value>
+          <!--value>/mnt/hdisk/home.data/private/projects/xdcad/xjobrun/nntpcjobs/jobdata</value-->
+        </entry>
+        <entry>
+          <key>PGHOST</key>
+          <value>10.10.1.17</value>
+        </entry>
+        <entry>
+          <key>PGDATBASE</key>
+          <value>pgDMMS</value>
+        </entry>
+        <entry>
+          <key>PGPORT</key>
+          <value>5432</value>
+        </entry>
+        <entry>
+          <key>PGSCHEMA</key>
+          <value>public</value>
+        </entry>
+        <entry>
+          <key>PGUSER</key>
+          <value>tpcdb</value>
+        </entry>
+        <entry>
+          <key>PGPASS</key>
+          <value>simple000</value>
+        </entry>
+        <entry>
+          <key>ORAHOST</key>
+          <value>10.10.1.17</value>
+        </entry>
+        <entry>
+          <key>ORAINST</key>
+          <value>orcl</value>
+        </entry>
+        <entry>
+          <key>ORAPORT</key>
+          <value>1521</value>
+        </entry>
+        <entry>
+          <key>ORAUSER</key>
+          <value>system</value>
+        </entry>
+        <entry>
+          <key>ORAPASS</key>
+          <value>simple000</value>
+        </entry>
+        <entry>
+          <key>ORGSCHEMA</key>
+          <!--value>SPATIALDB</value-->
+          <value>SPATIALDB, CMMS_SPATIALDB</value>
+        </entry>
+        <entry>
+          <key>CONVERTDB</key>
+          <value>true</value>
+        </entry>
+        <entry>
+          <key>CONVERTFILE</key>
+          <value>true</value>
+        </entry>
+        <entry>
+          <key>CONVERTELEMIN</key>
+          <value>false</value>
+        </entry>
+        <entry>
+          <key>CONVERTPWTHEMES</key>
+          <value>true</value>
+        </entry>
+        <entry>
+          <key>CREATEDUMMY</key>
+          <value>false</value>
+        </entry>
+        <entry>
+          <key>ELEMLOG</key>
+          <value>true</value>
+        </entry>
+        <entry>
+          <key>USEWKB</key>
+          <value>true</value>
+        </entry>
+        <entry>
+          <key>TESTMODE</key>
+          <value>false</value>
+        </entry>
+        <entry>
+          <key>TESTCOUNT</key>
+          <value>2</value>
+        </entry>
+        <entry>
+          <key>COPYCONNECTIVITYMODE</key>
+          <value>false</value>
+        </entry>
+        <entry>
+          <key>PROFILEMODE</key>
+          <value>true</value>
+        </entry>
+        <entry>
+          <key>USEZONE121</key>
+          <value>true</value>
+        </entry>
+        <entry>
+          <key>GEOSERVER_URL</key>
+          <value>http://192.168.11.99:8080/geoserver</value>
+        </entry>
+        <entry>
+          <key>GEOSERVER_USER</key>
+          <value>admin</value>
+        </entry>
+        <entry>
+          <key>GEOSERVER_PASS</key>
+          <value>geoserver</value>
+        </entry>
+        <entry>
+          <key>IGNORE_DBETL</key>
+          <value>true</value>
+        </entry>
+      </job-data-map>
+    </job>
+
+    <trigger>
+      <simple>
+        <name>convertTrigger</name>
+        <group>DEFAULT</group>
+        <job-name>ConvertPowerThemesIntoPostGISJob</job-name>
+        <job-group>DEFAULT</job-group>
+        <start-time>2013-03-01T18:00:00</start-time>
+        <!-- repeat indefinitely every 10 seconds -->
+        <repeat-count>0</repeat-count>
+        <repeat-interval>500</repeat-interval>
+        <!-- <repeat-interval>72000000</repeat-interval> -->
+      </simple>
+    </trigger>
+
+  </schedule>
+
+</job-scheduling-data>
diff --git a/xdgnjobs/ximple-jobcarrier/quartz_jobs_dmmsroadfee.xml b/xdgnjobs/ximple-jobcarrier/quartz_jobs_dmmsroadfee.xml
new file mode 100644
index 0000000..065854c
--- /dev/null
+++ b/xdgnjobs/ximple-jobcarrier/quartz_jobs_dmmsroadfee.xml
@@ -0,0 +1,173 @@
+<?xml version='1.0' encoding='utf-8'?>
+
+<job-scheduling-data xmlns="http://www.quartz-scheduler.org/xml/JobSchedulingData"
+                     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+                     xsi:schemaLocation="http://www.quartz-scheduler.org/xml/JobSchedulingData http://www.quartz-scheduler.org/xml/job_scheduling_data_1_8.xsd"
+                     version="1.8">
+
+  <pre-processing-commands>
+    <delete-jobs-in-group>*</delete-jobs-in-group>
+    <!-- clear all jobs in scheduler -->
+    <delete-triggers-in-group>*</delete-triggers-in-group>
+    <!-- clear all triggers in scheduler -->
+  </pre-processing-commands>
+
+  <processing-directives>
+    <!-- if there are any jobs/trigger in scheduler of same name (as in this file), overwrite them -->
+    <overwrite-existing-data>true</overwrite-existing-data>
+    <!-- if there are any jobs/trigger in scheduler of same name (as in this file), and over-write is false, ignore them rather then generating an error -->
+    <ignore-duplicates>false</ignore-duplicates>
+  </processing-directives>
+
+  <schedule>
+    <job>
+      <name>ConvertDMMS2PostGisWithGeoserver</name>
+      <group>DEFAULT</group>
+      <description>A job that convert dgn to postgis</description>
+      <!--job-class>com.ximple.eofms.jobs.OracleConvertDgn2PostGISJob</job-class-->
+      <!--<job-class>com.ximple.eofms.jobs.GeoserverIntegrateConfigJob</job-class>-->
+      <job-class>com.ximple.eofms.jobs.DMMSRoadfeeCalculateJob</job-class>
+      <!--job-class>com.ximple.eofms.jobs.OracleTransformColorOwnerJob</job-class-->
+      <!--job-class>com.ximple.eofms.jobs.OracleTransformColorOwner2CSVJob</job-class-->
+      <!--volatility>false</volatility-->
+      <durability>false</durability>
+      <recover>false</recover>
+      <!--job-data-map allows-transient-data="true"-->
+      <job-data-map>
+        <entry>
+          <key>JOBDATA_DIR</key>
+          <value>/Users/Shared/Public/Projects/XGeoDMMS/xjobrun/tctpcjobs/jobdata</value>
+        </entry>
+        <entry>
+          <key>PGHOST</key>
+          <value>10.10.1.7</value>
+        </entry>
+        <entry>
+          <key>PGDATBASE</key>
+          <value>pgDMMS2</value>
+        </entry>
+        <entry>
+          <key>PGPORT</key>
+          <value>5432</value>
+        </entry>
+        <entry>
+          <key>PGSCHEMA</key>
+          <value>public</value>
+        </entry>
+        <entry>
+          <key>PGUSER</key>
+          <value>tpcdb</value>
+        </entry>
+        <entry>
+          <key>PGPASS</key>
+          <value>simple000</value>
+        </entry>
+        <entry>
+          <key>ORAHOST</key>
+          <value>10.10.1.7</value>
+        </entry>
+        <entry>
+          <key>ORAINST</key>
+          <value>orcl</value>
+        </entry>
+        <entry>
+          <key>ORAPORT</key>
+          <value>1521</value>
+        </entry>
+        <entry>
+          <key>ORAUSER</key>
+          <value>system</value>
+        </entry>
+        <entry>
+          <key>ORAPASS</key>
+          <value>simple000</value>
+        </entry>
+        <entry>
+          <key>ORGSCHEMA</key>
+          <!--value>SPATIALDB</value-->
+          <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>CONVERTPWTHEMES</key>
+          <value>true</value>
+        </entry>
+        <entry>
+          <key>CREATEDUMMY</key>
+          <value>false</value>
+        </entry>
+        <entry>
+          <key>ELEMLOG</key>
+          <value>true</value>
+        </entry>
+        <entry>
+          <key>USEWKB</key>
+          <value>true</value>
+        </entry>
+        <entry>
+          <key>TESTMODE</key>
+          <value>false</value>
+        </entry>
+        <entry>
+          <key>TESTCOUNT</key>
+          <value>2</value>
+        </entry>
+        <entry>
+          <key>COPYCONNECTIVITYMODE</key>
+          <value>true</value>
+        </entry>
+        <entry>
+          <key>PROFILEMODE</key>
+          <value>true</value>
+        </entry>
+        <entry>
+          <key>USEZONE121</key>
+          <value>true</value>
+        </entry>
+        <entry>
+          <key>GEOSERVER_URL</key>
+          <value>http://10.10.1.7:8080/geoserver</value>
+        </entry>
+        <entry>
+          <key>GEOSERVER_USER</key>
+          <value>admin</value>
+        </entry>
+        <entry>
+          <key>GEOSERVER_PASS</key>
+          <value>geoserver</value>
+        </entry>
+        <entry>
+          <key>IGNORE_DBETL</key>
+          <value>false</value>
+        </entry>
+      </job-data-map>
+    </job>
+
+    <trigger>
+      <simple>
+        <name>convertTrigger</name>
+        <group>DEFAULT</group>
+        <job-name>ConvertDMMS2PostGisWithGeoserver</job-name>
+        <job-group>DEFAULT</job-group>
+        <start-time>2013-03-01T18:00:00</start-time>
+        <!-- repeat indefinitely every 10 seconds -->
+        <repeat-count>0</repeat-count>
+        <repeat-interval>500</repeat-interval>
+        <!-- <repeat-interval>72000000</repeat-interval> -->
+      </simple>
+    </trigger>
+
+  </schedule>
+
+</job-scheduling-data>
diff --git a/xdgnjobs/ximple-jobcarrier/quartz_jobs_inc.xml b/xdgnjobs/ximple-jobcarrier/quartz_jobs_inc.xml
new file mode 100644
index 0000000..1a278e6
--- /dev/null
+++ b/xdgnjobs/ximple-jobcarrier/quartz_jobs_inc.xml
@@ -0,0 +1,169 @@
+<?xml version='1.0' encoding='utf-8'?>
+
+<job-scheduling-data xmlns="http://www.quartz-scheduler.org/xml/JobSchedulingData"
+                     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+                     xsi:schemaLocation="http://www.quartz-scheduler.org/xml/JobSchedulingData http://www.quartz-scheduler.org/xml/job_scheduling_data_1_8.xsd"
+                     version="1.8">
+
+  <pre-processing-commands>
+    <delete-jobs-in-group>*</delete-jobs-in-group>
+    <!-- clear all jobs in scheduler -->
+    <delete-triggers-in-group>*</delete-triggers-in-group>
+    <!-- clear all triggers in scheduler -->
+  </pre-processing-commands>
+
+  <processing-directives>
+    <!-- if there are any jobs/trigger in scheduler of same name (as in this file), overwrite them -->
+    <overwrite-existing-data>true</overwrite-existing-data>
+    <!-- if there are any jobs/trigger in scheduler of same name (as in this file), and over-write is false, ignore them rather then generating an error -->
+    <ignore-duplicates>false</ignore-duplicates>
+  </processing-directives>
+
+  <schedule>
+    <job>
+      <name>ConvertIncrementDMMS2PostGis</name>
+      <group>DEFAULT</group>
+      <description>A job that convert dgn to postgis</description>
+      <job-class>com.ximple.eofms.jobs.OracleIncrementDgn2PostGISJob</job-class>
+      <durability>false</durability>
+      <recover>false</recover>
+      <!--job-data-map allows-transient-data="true"-->
+      <job-data-map>
+        <entry>
+          <key>JOBDATA_DIR</key>
+          <!--value>/home/ulysseskao/projects/xgeodmms/xjobrun/nstpcjobs/jobdata</value-->
+          <value>/Users/ulysseskao/Projects/XGeoDMMS/xjobrun/nstpcjobs/jobdata</value>
+        </entry>
+        <entry>
+          <key>PGHOST</key>
+          <value>10.16.17.14</value>
+        </entry>
+        <entry>
+          <key>PGDATBASE</key>
+          <value>pgDMMS</value>
+        </entry>
+        <entry>
+          <key>PGPORT</key>
+          <value>5432</value>
+        </entry>
+        <entry>
+          <key>PGSCHEMA</key>
+          <value>public</value>
+        </entry>
+        <entry>
+          <key>PGUSER</key>
+          <value>tpcdb</value>
+        </entry>
+        <entry>
+          <key>PGPASS</key>
+          <value>tpc000</value>
+        </entry>
+        <entry>
+          <key>ORAHOST</key>
+          <value>10.16.17.14</value>
+        </entry>
+        <entry>
+          <key>ORAINST</key>
+          <value>nntpc</value>
+        </entry>
+        <entry>
+          <key>ORAPORT</key>
+          <value>1521</value>
+        </entry>
+        <entry>
+          <key>ORAUSER</key>
+          <value>system</value>
+        </entry>
+        <entry>
+          <key>ORAPASS</key>
+          <value>manager</value>
+        </entry>
+        <entry>
+          <key>ORGSCHEMA</key>
+          <!--value>SPATIALDB</value-->
+          <value>SPATIALDB, CMMS_SPATIALDB</value>
+        </entry>
+        <entry>
+          <key>CONVERTDB</key>
+          <value>true</value>
+        </entry>
+        <entry>
+          <key>CONVERTFILE</key>
+          <value>false</value>
+        </entry>
+        <entry>
+          <key>CONVERTELEMIN</key>
+          <value>true</value>
+        </entry>
+        <entry>
+          <key>CONVERTPWTHEMES</key>
+          <value>true</value>
+        </entry>
+        <entry>
+          <key>CREATEDUMMY</key>
+          <value>false</value>
+        </entry>
+        <entry>
+          <key>ELEMLOG</key>
+          <value>true</value>
+        </entry>
+        <entry>
+          <key>USEWKB</key>
+          <value>true</value>
+        </entry>
+        <entry>
+          <key>TESTMODE</key>
+          <value>false</value>
+        </entry>
+        <entry>
+          <key>TESTCOUNT</key>
+          <value>2</value>
+        </entry>
+        <entry>
+          <key>COPYCONNECTIVITYMODE</key>
+          <value>true</value>
+        </entry>
+        <entry>
+          <key>PROFILEMODE</key>
+          <value>true</value>
+        </entry>
+        <entry>
+          <key>USEZONE121</key>
+          <value>true</value>
+        </entry>
+        <entry>
+          <key>GEOSERVER_URL</key>
+          <value>http://10.10.1.7:8080/geoserver</value>
+        </entry>
+        <entry>
+          <key>GEOSERVER_USER</key>
+          <value>admin</value>
+        </entry>
+        <entry>
+          <key>GEOSERVER_PASS</key>
+          <value>geoserver</value>
+        </entry>
+        <entry>
+          <key>IGNORE_DBETL</key>
+          <value>false</value>
+        </entry>
+      </job-data-map>
+    </job>
+
+    <trigger>
+      <simple>
+        <name>convertTrigger</name>
+        <group>DEFAULT</group>
+        <job-name>ConvertIncrementDMMS2PostGis</job-name>
+        <job-group>DEFAULT</job-group>
+        <start-time>2013-03-01T18:00:00</start-time>
+        <!-- repeat indefinitely every 10 seconds -->
+        <repeat-count>0</repeat-count>
+        <repeat-interval>500</repeat-interval>
+        <!-- <repeat-interval>72000000</repeat-interval> -->
+      </simple>
+    </trigger>
+
+  </schedule>
+
+</job-scheduling-data>
diff --git a/xdgnjobs/ximple-jobcarrier/src/main/resources/quartz.properties b/xdgnjobs/ximple-jobcarrier/src/main/resources/quartz.properties
index 15de783..b638d69 100644
--- a/xdgnjobs/ximple-jobcarrier/src/main/resources/quartz.properties
+++ b/xdgnjobs/ximple-jobcarrier/src/main/resources/quartz.properties
@@ -23,8 +23,12 @@
 org.quartz.plugin.triggHistory.class = org.quartz.plugins.history.LoggingJobHistoryPlugin
 
 org.quartz.plugin.jobInitializer.class = org.quartz.plugins.xml.XMLSchedulingDataProcessorPlugin
+
 org.quartz.plugin.jobInitializer.fileNames = quartz_jobs.xml
+#org.quartz.plugin.jobInitializer.fileNames = quartz_jobs_inc.xml
 #org.quartz.plugin.jobInitializer.fileNames = quartz_jobs_edb.xml
+#org.quartz.plugin.jobInitializer.fileNames = quartz_jobs_colowner.xml
+#org.quartz.plugin.jobInitializer.fileNames = quartz_jobs_dmmsroadfee.xml
 
 org.quartz.plugin.jobInitializer.failOnFileNotFound = true
 org.quartz.plugin.jobInitializer.scanInterval = 10
diff --git a/xdgnjobs/ximple-jobcarrier/src/main/resources/quartz_jobs.xml b/xdgnjobs/ximple-jobcarrier/src/main/resources/quartz_jobs.xml
index 75420ba..dd4907a 100644
--- a/xdgnjobs/ximple-jobcarrier/src/main/resources/quartz_jobs.xml
+++ b/xdgnjobs/ximple-jobcarrier/src/main/resources/quartz_jobs.xml
@@ -35,11 +35,11 @@
       <job-data-map>
         <entry>
           <key>JOBDATA_DIR</key>
-          <value>/Users/Shared/Public/Projects/XGeoDMMS/xjobrun/tctpcjobs/jobdata</value>
+          <value>/home/ulysseskao/projects/xgeodmms/xjobrun/nntpcjobs/jobdata</value>
         </entry>
         <entry>
           <key>PGHOST</key>
-          <value>10.10.1.17</value>
+          <value>10.10.1.7</value>
         </entry>
         <entry>
           <key>PGDATBASE</key>
@@ -63,7 +63,7 @@
         </entry>
         <entry>
           <key>ORAHOST</key>
-          <value>10.10.1.17</value>
+          <value>10.10.1.7</value>
         </entry>
         <entry>
           <key>ORAINST</key>
@@ -88,7 +88,7 @@
         </entry>
         <entry>
           <key>CONVERTDB</key>
-          <value>false</value>
+          <value>true</value>
         </entry>
         <entry>
           <key>CONVERTFILE</key>
@@ -96,7 +96,7 @@
         </entry>
         <entry>
           <key>CONVERTELEMIN</key>
-          <value>false</value>
+          <value>true</value>
         </entry>
         <entry>
           <key>CONVERTPWTHEMES</key>
@@ -136,7 +136,7 @@
         </entry>
         <entry>
           <key>GEOSERVER_URL</key>
-          <value>http://10.10.1.17:8080/geoserver</value>
+          <value>http://10.10.1.7:8080/geoserver</value>
         </entry>
         <entry>
           <key>GEOSERVER_USER</key>
diff --git a/xdgnjobs/ximple-jobcarrier/src/main/resources/quartz_jobs_colowner.xml b/xdgnjobs/ximple-jobcarrier/src/main/resources/quartz_jobs_colowner.xml
new file mode 100644
index 0000000..30d36a9
--- /dev/null
+++ b/xdgnjobs/ximple-jobcarrier/src/main/resources/quartz_jobs_colowner.xml
@@ -0,0 +1,168 @@
+<?xml version='1.0' encoding='utf-8'?>
+
+<job-scheduling-data xmlns="http://www.quartz-scheduler.org/xml/JobSchedulingData"
+    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+    xsi:schemaLocation="http://www.quartz-scheduler.org/xml/JobSchedulingData http://www.quartz-scheduler.org/xml/job_scheduling_data_1_8.xsd"
+    version="1.8">
+
+  <pre-processing-commands>
+    <delete-jobs-in-group>*</delete-jobs-in-group>  <!-- clear all jobs in scheduler -->
+    <delete-triggers-in-group>*</delete-triggers-in-group> <!-- clear all triggers in scheduler -->
+  </pre-processing-commands>
+
+  <processing-directives>
+    <!-- if there are any jobs/trigger in scheduler of same name (as in this file), overwrite them -->
+    <overwrite-existing-data>true</overwrite-existing-data>
+    <!-- if there are any jobs/trigger in scheduler of same name (as in this file), and over-write is false, ignore them rather then generating an error -->
+    <ignore-duplicates>false</ignore-duplicates>
+  </processing-directives>
+
+  <schedule>
+    <job>
+      <name>ConvertPowerThemesIntoPostGISJob</name>
+      <group>DEFAULT</group>
+      <description>A job that convert dgn to postgis</description>
+      <job-class>com.ximple.eofms.jobs.OracleConvertThemes2PostGISJob</job-class>
+      <!--volatility>false</volatility-->
+      <durability>false</durability>
+      <recover>false</recover>
+      <!--job-data-map allows-transient-data="true"-->
+      <job-data-map>
+        <entry>
+          <key>JOBDATA_DIR</key>
+          <value>/Users/ulysseskao/Projects/XGeoDMMS/xjobrun/tctpcjobs/jobdata</value>
+          <!--value>/mnt/hdisk/home.data/private/projects/xdcad/xjobrun/nntpcjobs/jobdata</value-->
+        </entry>
+        <entry>
+          <key>PGHOST</key>
+          <value>10.10.1.17</value>
+        </entry>
+        <entry>
+          <key>PGDATBASE</key>
+          <value>pgDMMS</value>
+        </entry>
+        <entry>
+          <key>PGPORT</key>
+          <value>5432</value>
+        </entry>
+        <entry>
+          <key>PGSCHEMA</key>
+          <value>public</value>
+        </entry>
+        <entry>
+          <key>PGUSER</key>
+          <value>tpcdb</value>
+        </entry>
+        <entry>
+          <key>PGPASS</key>
+          <value>simple000</value>
+        </entry>
+        <entry>
+          <key>ORAHOST</key>
+          <value>10.10.1.17</value>
+        </entry>
+        <entry>
+          <key>ORAINST</key>
+          <value>orcl</value>
+        </entry>
+        <entry>
+          <key>ORAPORT</key>
+          <value>1521</value>
+        </entry>
+        <entry>
+          <key>ORAUSER</key>
+          <value>system</value>
+        </entry>
+        <entry>
+          <key>ORAPASS</key>
+          <value>simple000</value>
+        </entry>
+        <entry>
+          <key>ORGSCHEMA</key>
+          <!--value>SPATIALDB</value-->
+          <value>SPATIALDB, CMMS_SPATIALDB</value>
+        </entry>
+        <entry>
+          <key>CONVERTDB</key>
+          <value>true</value>
+        </entry>
+        <entry>
+          <key>CONVERTFILE</key>
+          <value>true</value>
+        </entry>
+        <entry>
+          <key>CONVERTELEMIN</key>
+          <value>false</value>
+        </entry>
+        <entry>
+          <key>CONVERTPWTHEMES</key>
+          <value>true</value>
+        </entry>
+        <entry>
+          <key>CREATEDUMMY</key>
+          <value>false</value>
+        </entry>
+        <entry>
+          <key>ELEMLOG</key>
+          <value>true</value>
+        </entry>
+        <entry>
+          <key>USEWKB</key>
+          <value>true</value>
+        </entry>
+        <entry>
+          <key>TESTMODE</key>
+          <value>false</value>
+        </entry>
+        <entry>
+          <key>TESTCOUNT</key>
+          <value>2</value>
+        </entry>
+        <entry>
+          <key>COPYCONNECTIVITYMODE</key>
+          <value>false</value>
+        </entry>
+        <entry>
+          <key>PROFILEMODE</key>
+          <value>true</value>
+        </entry>
+        <entry>
+          <key>USEZONE121</key>
+          <value>true</value>
+        </entry>
+        <entry>
+          <key>GEOSERVER_URL</key>
+          <value>http://192.168.11.99:8080/geoserver</value>
+        </entry>
+        <entry>
+          <key>GEOSERVER_USER</key>
+          <value>admin</value>
+        </entry>
+        <entry>
+          <key>GEOSERVER_PASS</key>
+          <value>geoserver</value>
+        </entry>
+        <entry>
+          <key>IGNORE_DBETL</key>
+          <value>true</value>
+        </entry>
+      </job-data-map>
+    </job>
+
+    <trigger>
+      <simple>
+        <name>convertTrigger</name>
+        <group>DEFAULT</group>
+        <job-name>ConvertPowerThemesIntoPostGISJob</job-name>
+        <job-group>DEFAULT</job-group>
+        <start-time>2013-03-01T18:00:00</start-time>
+        <!-- repeat indefinitely every 10 seconds -->
+        <repeat-count>0</repeat-count>
+        <repeat-interval>500</repeat-interval>
+        <!-- <repeat-interval>72000000</repeat-interval> -->
+      </simple>
+    </trigger>
+
+  </schedule>
+
+</job-scheduling-data>
diff --git a/xdgnjobs/ximple-jobcarrier/src/main/resources/quartz_jobs_dmmsroadfee.xml b/xdgnjobs/ximple-jobcarrier/src/main/resources/quartz_jobs_dmmsroadfee.xml
new file mode 100644
index 0000000..065854c
--- /dev/null
+++ b/xdgnjobs/ximple-jobcarrier/src/main/resources/quartz_jobs_dmmsroadfee.xml
@@ -0,0 +1,173 @@
+<?xml version='1.0' encoding='utf-8'?>
+
+<job-scheduling-data xmlns="http://www.quartz-scheduler.org/xml/JobSchedulingData"
+                     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+                     xsi:schemaLocation="http://www.quartz-scheduler.org/xml/JobSchedulingData http://www.quartz-scheduler.org/xml/job_scheduling_data_1_8.xsd"
+                     version="1.8">
+
+  <pre-processing-commands>
+    <delete-jobs-in-group>*</delete-jobs-in-group>
+    <!-- clear all jobs in scheduler -->
+    <delete-triggers-in-group>*</delete-triggers-in-group>
+    <!-- clear all triggers in scheduler -->
+  </pre-processing-commands>
+
+  <processing-directives>
+    <!-- if there are any jobs/trigger in scheduler of same name (as in this file), overwrite them -->
+    <overwrite-existing-data>true</overwrite-existing-data>
+    <!-- if there are any jobs/trigger in scheduler of same name (as in this file), and over-write is false, ignore them rather then generating an error -->
+    <ignore-duplicates>false</ignore-duplicates>
+  </processing-directives>
+
+  <schedule>
+    <job>
+      <name>ConvertDMMS2PostGisWithGeoserver</name>
+      <group>DEFAULT</group>
+      <description>A job that convert dgn to postgis</description>
+      <!--job-class>com.ximple.eofms.jobs.OracleConvertDgn2PostGISJob</job-class-->
+      <!--<job-class>com.ximple.eofms.jobs.GeoserverIntegrateConfigJob</job-class>-->
+      <job-class>com.ximple.eofms.jobs.DMMSRoadfeeCalculateJob</job-class>
+      <!--job-class>com.ximple.eofms.jobs.OracleTransformColorOwnerJob</job-class-->
+      <!--job-class>com.ximple.eofms.jobs.OracleTransformColorOwner2CSVJob</job-class-->
+      <!--volatility>false</volatility-->
+      <durability>false</durability>
+      <recover>false</recover>
+      <!--job-data-map allows-transient-data="true"-->
+      <job-data-map>
+        <entry>
+          <key>JOBDATA_DIR</key>
+          <value>/Users/Shared/Public/Projects/XGeoDMMS/xjobrun/tctpcjobs/jobdata</value>
+        </entry>
+        <entry>
+          <key>PGHOST</key>
+          <value>10.10.1.7</value>
+        </entry>
+        <entry>
+          <key>PGDATBASE</key>
+          <value>pgDMMS2</value>
+        </entry>
+        <entry>
+          <key>PGPORT</key>
+          <value>5432</value>
+        </entry>
+        <entry>
+          <key>PGSCHEMA</key>
+          <value>public</value>
+        </entry>
+        <entry>
+          <key>PGUSER</key>
+          <value>tpcdb</value>
+        </entry>
+        <entry>
+          <key>PGPASS</key>
+          <value>simple000</value>
+        </entry>
+        <entry>
+          <key>ORAHOST</key>
+          <value>10.10.1.7</value>
+        </entry>
+        <entry>
+          <key>ORAINST</key>
+          <value>orcl</value>
+        </entry>
+        <entry>
+          <key>ORAPORT</key>
+          <value>1521</value>
+        </entry>
+        <entry>
+          <key>ORAUSER</key>
+          <value>system</value>
+        </entry>
+        <entry>
+          <key>ORAPASS</key>
+          <value>simple000</value>
+        </entry>
+        <entry>
+          <key>ORGSCHEMA</key>
+          <!--value>SPATIALDB</value-->
+          <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>CONVERTPWTHEMES</key>
+          <value>true</value>
+        </entry>
+        <entry>
+          <key>CREATEDUMMY</key>
+          <value>false</value>
+        </entry>
+        <entry>
+          <key>ELEMLOG</key>
+          <value>true</value>
+        </entry>
+        <entry>
+          <key>USEWKB</key>
+          <value>true</value>
+        </entry>
+        <entry>
+          <key>TESTMODE</key>
+          <value>false</value>
+        </entry>
+        <entry>
+          <key>TESTCOUNT</key>
+          <value>2</value>
+        </entry>
+        <entry>
+          <key>COPYCONNECTIVITYMODE</key>
+          <value>true</value>
+        </entry>
+        <entry>
+          <key>PROFILEMODE</key>
+          <value>true</value>
+        </entry>
+        <entry>
+          <key>USEZONE121</key>
+          <value>true</value>
+        </entry>
+        <entry>
+          <key>GEOSERVER_URL</key>
+          <value>http://10.10.1.7:8080/geoserver</value>
+        </entry>
+        <entry>
+          <key>GEOSERVER_USER</key>
+          <value>admin</value>
+        </entry>
+        <entry>
+          <key>GEOSERVER_PASS</key>
+          <value>geoserver</value>
+        </entry>
+        <entry>
+          <key>IGNORE_DBETL</key>
+          <value>false</value>
+        </entry>
+      </job-data-map>
+    </job>
+
+    <trigger>
+      <simple>
+        <name>convertTrigger</name>
+        <group>DEFAULT</group>
+        <job-name>ConvertDMMS2PostGisWithGeoserver</job-name>
+        <job-group>DEFAULT</job-group>
+        <start-time>2013-03-01T18:00:00</start-time>
+        <!-- repeat indefinitely every 10 seconds -->
+        <repeat-count>0</repeat-count>
+        <repeat-interval>500</repeat-interval>
+        <!-- <repeat-interval>72000000</repeat-interval> -->
+      </simple>
+    </trigger>
+
+  </schedule>
+
+</job-scheduling-data>
diff --git a/xdgnjobs/ximple-jobcarrier/src/main/resources/quartz_jobs_inc.xml b/xdgnjobs/ximple-jobcarrier/src/main/resources/quartz_jobs_inc.xml
new file mode 100644
index 0000000..94ae77b
--- /dev/null
+++ b/xdgnjobs/ximple-jobcarrier/src/main/resources/quartz_jobs_inc.xml
@@ -0,0 +1,168 @@
+<?xml version='1.0' encoding='utf-8'?>
+
+<job-scheduling-data xmlns="http://www.quartz-scheduler.org/xml/JobSchedulingData"
+                     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+                     xsi:schemaLocation="http://www.quartz-scheduler.org/xml/JobSchedulingData http://www.quartz-scheduler.org/xml/job_scheduling_data_1_8.xsd"
+                     version="1.8">
+
+  <pre-processing-commands>
+    <delete-jobs-in-group>*</delete-jobs-in-group>
+    <!-- clear all jobs in scheduler -->
+    <delete-triggers-in-group>*</delete-triggers-in-group>
+    <!-- clear all triggers in scheduler -->
+  </pre-processing-commands>
+
+  <processing-directives>
+    <!-- if there are any jobs/trigger in scheduler of same name (as in this file), overwrite them -->
+    <overwrite-existing-data>true</overwrite-existing-data>
+    <!-- if there are any jobs/trigger in scheduler of same name (as in this file), and over-write is false, ignore them rather then generating an error -->
+    <ignore-duplicates>false</ignore-duplicates>
+  </processing-directives>
+
+  <schedule>
+    <job>
+      <name>ConvertIncrementDMMS2PostGis</name>
+      <group>DEFAULT</group>
+      <description>A job that convert dgn to postgis</description>
+      <job-class>com.ximple.eofms.jobs.OracleIncrementDgn2PostGISJob</job-class>
+      <durability>false</durability>
+      <recover>false</recover>
+      <!--job-data-map allows-transient-data="true"-->
+      <job-data-map>
+        <entry>
+          <key>JOBDATA_DIR</key>
+          <value>/home/ulysseskao/projects/xgeodmms/xjobrun/nstpcjobs/jobdata</value>
+        </entry>
+        <entry>
+          <key>PGHOST</key>
+          <value>10.10.1.9</value>
+        </entry>
+        <entry>
+          <key>PGDATBASE</key>
+          <value>pgDMMS</value>
+        </entry>
+        <entry>
+          <key>PGPORT</key>
+          <value>5432</value>
+        </entry>
+        <entry>
+          <key>PGSCHEMA</key>
+          <value>public</value>
+        </entry>
+        <entry>
+          <key>PGUSER</key>
+          <value>tpcdb</value>
+        </entry>
+        <entry>
+          <key>PGPASS</key>
+          <value>simple000</value>
+        </entry>
+        <entry>
+          <key>ORAHOST</key>
+          <value>10.10.1.9</value>
+        </entry>
+        <entry>
+          <key>ORAINST</key>
+          <value>orcl</value>
+        </entry>
+        <entry>
+          <key>ORAPORT</key>
+          <value>1521</value>
+        </entry>
+        <entry>
+          <key>ORAUSER</key>
+          <value>system</value>
+        </entry>
+        <entry>
+          <key>ORAPASS</key>
+          <value>SYSTEM000</value>
+        </entry>
+        <entry>
+          <key>ORGSCHEMA</key>
+          <!--value>SPATIALDB</value-->
+          <value>SPATIALDB, CMMS_SPATIALDB</value>
+        </entry>
+        <entry>
+          <key>CONVERTDB</key>
+          <value>true</value>
+        </entry>
+        <entry>
+          <key>CONVERTFILE</key>
+          <value>false</value>
+        </entry>
+        <entry>
+          <key>CONVERTELEMIN</key>
+          <value>true</value>
+        </entry>
+        <entry>
+          <key>CONVERTPWTHEMES</key>
+          <value>true</value>
+        </entry>
+        <entry>
+          <key>CREATEDUMMY</key>
+          <value>false</value>
+        </entry>
+        <entry>
+          <key>ELEMLOG</key>
+          <value>true</value>
+        </entry>
+        <entry>
+          <key>USEWKB</key>
+          <value>true</value>
+        </entry>
+        <entry>
+          <key>TESTMODE</key>
+          <value>false</value>
+        </entry>
+        <entry>
+          <key>TESTCOUNT</key>
+          <value>2</value>
+        </entry>
+        <entry>
+          <key>COPYCONNECTIVITYMODE</key>
+          <value>true</value>
+        </entry>
+        <entry>
+          <key>PROFILEMODE</key>
+          <value>true</value>
+        </entry>
+        <entry>
+          <key>USEZONE121</key>
+          <value>true</value>
+        </entry>
+        <entry>
+          <key>GEOSERVER_URL</key>
+          <value>http://10.10.1.7:8080/geoserver</value>
+        </entry>
+        <entry>
+          <key>GEOSERVER_USER</key>
+          <value>admin</value>
+        </entry>
+        <entry>
+          <key>GEOSERVER_PASS</key>
+          <value>geoserver</value>
+        </entry>
+        <entry>
+          <key>IGNORE_DBETL</key>
+          <value>false</value>
+        </entry>
+      </job-data-map>
+    </job>
+
+    <trigger>
+      <simple>
+        <name>convertTrigger</name>
+        <group>DEFAULT</group>
+        <job-name>ConvertDMMS2PostGisWithGeoserver</job-name>
+        <job-group>DEFAULT</job-group>
+        <start-time>2013-03-01T18:00:00</start-time>
+        <!-- repeat indefinitely every 10 seconds -->
+        <repeat-count>0</repeat-count>
+        <repeat-interval>500</repeat-interval>
+        <!-- <repeat-interval>72000000</repeat-interval> -->
+      </simple>
+    </trigger>
+
+  </schedule>
+
+</job-scheduling-data>
diff --git a/xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/filter/CreateLineTextStrategy.java b/xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/filter/CreateLineTextStrategy.java
index 100bb1b..ad23e85 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
@@ -85,7 +85,7 @@
             Coordinate ptOrigin = txtElement.getUserOrigin();
             Coordinate ptEnd = new Coordinate();
             ptEnd.x = ptOrigin.x;
-            ptEnd.y = ptOrigin.y + txtElement.getTextHeight();
+            ptEnd.y = ptOrigin.y - txtElement.getTextHeight();
             Coordinate[] vect = new Coordinate[2];
             if (useTransform) {
                 vect[0] = (FeatureTypeBuilderUtil.getDefaultFeatureSRID() == 3826) ?
diff --git a/xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/filter/CreateMultiSymbolStrategy.java b/xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/filter/CreateMultiSymbolStrategy.java
index 2454a37..0ef9504 100644
--- a/xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/filter/CreateMultiSymbolStrategy.java
+++ b/xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/filter/CreateMultiSymbolStrategy.java
@@ -113,7 +113,7 @@
             double angle = nodeElement.getRotationAngle();
             angle = BigDecimal.valueOf(angle).setScale(3, RoundingMode.HALF_UP).doubleValue();
             if (nodeElement.size() == 0) {
-                logger.info("CreateMultiSymbolStrategy cannot conver " + element.toString() +
+                logger.info("CreateMultiSymbolStrategy cannot convert " + element.toString() +
                         "to Feature - getText() is empty.");
                 return null;
             }
@@ -127,9 +127,10 @@
 
 
                     if (charArray.length == 0) {
-                        logger.info("CreateMultiSymbolStrategy cannot conver " + element.toString() +
+                        logger.info("CreateMultiSymbolStrategy cannot convert " + element.toString() +
                                 "to Feature - getText() is empty.");
-                        return null;
+                        // return null;
+                        continue;
                     }
 
 
@@ -170,13 +171,19 @@
                                 sb.toString()
                             }, null);
                     }
+
+                    break;
+                } else if (txtElement instanceof TextNodeElement) {
+                    // logger.info("CreateMultiSymbolStrategy cannot convert " + element.toString() + "to Feature");
                 } else {
-                    logger.info("CreateMultiSymbolStrategy cannot conver " + element.toString() + "to Feature");
-                    return null;
+                    // TODO: Ximple
+                    // logger.info("CreateMultiSymbolStrategy cannot convert " + element.toString() + "to Feature");
+                    continue;
                 }
+                txtElement.next();
             }
         } else {
-            logger.info("CreateMultiSymbolStrategy cannot conver " + element.toString() + "to Feature");
+            logger.info("CreateMultiSymbolStrategy cannot convert " + element.toString() + "to Feature");
             return null;
         }
         return feature;
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 62daf9b..2c9b73c 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
@@ -118,7 +118,7 @@
                     (float) txtElement.getTextHeight(),
                     (float) txtElement.getTextWidth(),
                     (float) angle,
-                    sb.toString(),
+                    sb.toString().trim(),
                     geomOrigin
                 }, null);
         } else {
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 826019d..37f11f3 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
@@ -66,6 +66,7 @@
             angle = BigDecimal.valueOf(angle).setScale(3, RoundingMode.HALF_UP).doubleValue();
             String content = txtElement.getText();
             content = content.replace('\u0000', ' ');
+            content = content.trim();
             Geometry gobj;
             if (useTransform) {
                 GeometryConverterDecorator convertDecorator = FeatureTypeBuilderUtil.lookupDefaultGeometryConverter();
diff --git a/xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/jobs/DMMSRoadfeeCalculateJob.java b/xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/jobs/DMMSRoadfeeCalculateJob.java
new file mode 100644
index 0000000..a613352
--- /dev/null
+++ b/xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/jobs/DMMSRoadfeeCalculateJob.java
@@ -0,0 +1,1895 @@
+package com.ximple.eofms.jobs;
+
+import com.ximple.eofms.jobs.context.AbstractOracleJobContext;
+import com.ximple.eofms.jobs.context.postgis.FeatureDgnConvertPostGISJobContext;
+import com.ximple.eofms.jobs.context.postgis.GeneralDgnConvertPostGISJobContext;
+import com.ximple.eofms.jobs.context.postgis.IndexDgnConvertPostGISJobContext;
+import com.ximple.eofms.jobs.context.postgis.OracleConvertPostGISJobContext;
+import com.ximple.eofms.util.*;
+import com.ximple.io.dgn7.*;
+import com.ximple.util.PrintfFormat;
+import oracle.jdbc.OracleConnection;
+import oracle.jdbc.OracleResultSet;
+import oracle.sql.ARRAY;
+import oracle.sql.BLOB;
+import org.apache.commons.collections.OrderedMap;
+import org.apache.commons.collections.OrderedMapIterator;
+import org.apache.commons.collections.map.LinkedMap;
+import org.apache.commons.dbcp.DelegatingConnection;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.geotools.data.DataStore;
+import org.geotools.data.Transaction;
+import org.geotools.data.jdbc.JDBCUtils;
+import org.geotools.data.postgis.PostgisNGDataStoreFactory;
+import org.geotools.feature.SchemaException;
+import org.geotools.jdbc.JDBCDataStore;
+import org.opengis.feature.IllegalAttributeException;
+import org.postgresql.PGConnection;
+import org.postgresql.copy.CopyManager;
+import org.quartz.JobDataMap;
+import org.quartz.JobDetail;
+import org.quartz.JobExecutionContext;
+import org.quartz.JobExecutionException;
+
+import java.io.*;
+import java.math.BigDecimal;
+import java.nio.BufferOverflowException;
+import java.nio.ByteBuffer;
+import java.nio.ByteOrder;
+import java.nio.channels.FileChannel;
+import java.sql.*;
+import java.util.*;
+import java.util.Date;
+
+public class DMMSRoadfeeCalculateJob extends AbstractOracleDatabaseJob {
+    final static Log logger = LogFactory.getLog(DMMSRoadfeeCalculateJob.class);
+
+    private static final String PGHOST = "PGHOST";
+    private static final String PGDATBASE = "PGDATBASE";
+    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 boolean useTpclidText = false;
+
+    private static final int FETCHSIZE = 30;
+    private static final int COMMITSIZE = 100;
+    private static final String INDEXPATHNAME = "index";
+    private static final String OTHERPATHNAME = "other";
+    public static final String FORWARDFLOW_MARK = "shape://ccarrow";
+    public static final String BACKFLOW_MARK = "shape://rccarrow";
+    public static final String UNFLOW_MARK = "shape://backslash";
+    public static final String NONFLOW_MARK = "shape://slash";
+
+    private static String FETCH_CONNFDR = "SELECT FSC, UFID, FDR1, DIR FROM BASEDB.CONNECTIVITY ORDER BY FSC";
+    private static String FETCH_COLORTAB = "SELECT TAG_SFSC, TAG_LUFID, COLOR FROM OCSDB.COLOR ORDER BY TAG_SFSC";
+
+    private static String CREATE_OWNERTABLE = "CREATE TABLE s (tid smallint not null, oid int not null, owner smallint not null)";
+    private static String CREATE_COLORTABLE = "CREATE TABLE s (tid smallint not null, oid int not null, dyncolor varchar(10) not null)";
+
+    public static final String FDYNCOLOR_SUFFIX = "_fdyncolor";
+    public static final String FOWNER_SUFFIX = "_fowner";
+
+    protected static class Pair {
+        Object first;
+        Object second;
+
+        public Pair(Object first, Object second) {
+            this.first = first;
+            this.second = second;
+        }
+    }
+
+    protected static PostgisNGDataStoreFactory dataStoreFactory = new PostgisNGDataStoreFactory();
+
+    protected String _pgHost;
+    protected String _pgDatabase;
+    protected String _pgPort;
+    protected String _pgSchema;
+    protected String _pgUsername;
+    protected String _pgPassword;
+    protected String _pgUseWKB;
+
+    protected Map<String, String> pgProperties;
+    protected JDBCDataStore targetDataStore;
+    // protected OracleConvertEdbGeoJobContext oracleJobContext;
+
+    private long queryTime = 0;
+    private long queryTimeStart = 0;
+
+    public Log getLogger() {
+        return logger;
+    }
+
+    protected AbstractOracleJobContext prepareJobContext(String targetSchemaName, String filterPath,
+                                                         boolean profileMode,
+                                                         boolean useTransform) {
+        return new OracleConvertPostGISJobContext(getDataPath(),
+                getTargetDataStore(), targetSchemaName, filterPath, profileMode, useTransform);
+    }
+
+    protected void extractJobConfiguration(JobDetail jobDetail) throws JobExecutionException {
+        super.extractJobConfiguration(jobDetail);
+        JobDataMap dataMap = jobDetail.getJobDataMap();
+        _pgHost = dataMap.getString(PGHOST);
+        _pgDatabase = dataMap.getString(PGDATBASE);
+        _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=" + _myHost);
+        logger.info("PGDATBASE=" + _myDatabase);
+        logger.info("PGPORT=" + _myPort);
+        logger.info("PGSCHEMA=" + _mySchema);
+        logger.info("PGUSER=" + _myUsername);
+        logger.info("PGPASS=" + _myPassword);
+        logger.info("USEWKB=" + _myUseWKB);
+        */
+
+        if (_pgHost == null) {
+            logger.warn("PGHOST is null");
+            throw new JobExecutionException("Unknown PostGIS host.");
+        }
+        if (_pgDatabase == null) {
+            logger.warn("PGDATABASE is null");
+            throw new JobExecutionException("Unknown PostGIS database.");
+        }
+        if (_pgPort == null) {
+            logger.warn("PGPORT is null");
+            throw new JobExecutionException("Unknown PostGIS port.");
+        }
+        if (_pgSchema == null) {
+            logger.warn("PGSCHEMA is null");
+            throw new JobExecutionException("Unknown PostGIS schema.");
+        }
+        if (_pgUsername == null) {
+            logger.warn("PGUSERNAME is null");
+            throw new JobExecutionException("Unknown PostGIS username.");
+        }
+        if (_pgPassword == null) {
+            logger.warn("PGPASSWORD is null");
+            throw new JobExecutionException("Unknown PostGIS password.");
+        }
+
+        Map<String, String> remote = new TreeMap<String, String>();
+        remote.put(PostgisNGDataStoreFactory.DBTYPE.key, "postgis");
+        // remote.put("charset", "UTF-8");
+        remote.put(PostgisNGDataStoreFactory.HOST.key, _pgHost);
+        remote.put(PostgisNGDataStoreFactory.PORT.key, _pgPort);
+        remote.put(PostgisNGDataStoreFactory.DATABASE.key, _pgDatabase);
+        remote.put(PostgisNGDataStoreFactory.USER.key, _pgUsername);
+        remote.put(PostgisNGDataStoreFactory.PASSWD.key, _pgPassword);
+        // remote.put( "namespace", null);
+        pgProperties = remote;
+    }
+
+
+
+    private List<String[]> sqlExecQuery(Connection connection,String strSQLIn,String[] params) throws SQLException {
+
+        String strSQL=strSQLIn;
+        for(int i=0;i<params.length;i++)
+        {
+            if(params[i]==null)params[i]="";
+            strSQL=strSQL.replace("%s"+String.valueOf(i+1),params[i]);
+        }
+        List<String[]> result=new ArrayList<String[]>();
+        List<String> temp = new  ArrayList<String>();
+        String strTemp="";
+        // String result = null;
+        Statement stmt = null;
+        ResultSet rs = null;
+
+
+        try {
+            stmt = connection.createStatement();
+            rs = stmt.executeQuery(strSQL.toString());
+            // get first result
+            // temp.clear();
+
+            ResultSetMetaData rsmd = rs.getMetaData();
+            int NumOfCol = rsmd.getColumnCount();
+
+            while (rs.next()) {
+                for (int idx = 0; idx < NumOfCol; idx++) {
+                    strTemp = rs.getString(idx + 1);
+                    temp.add(strTemp);
+                }
+                result.add(temp.toArray(new String[0]));
+                temp.clear();
+            }
+            return result;
+        } finally {
+            JDBCUtils.close(rs);
+            JDBCUtils.close(stmt);
+        }
+    }
+    private void sqlExec(Connection connection,String strSQLIn,String[] params) throws SQLException {
+
+        String strSQL=strSQLIn;
+        for(int i=0;i<params.length;i++)
+        {
+            if(params[i]==null)params[i]="";
+            strSQL=strSQL.replace("%s"+String.valueOf(i+1),params[i]);
+        }
+        List<String[]> result=new ArrayList<String[]>();
+        List<String> temp = new  ArrayList<String>();
+        String strTemp="";
+        // String result = null;
+        Statement stmt = null;
+        ResultSet rs = null;
+
+
+        try {
+            stmt = connection.createStatement();
+            stmt.execute( strSQL.toString());
+            // get first result
+            // temp.clear();
+
+
+        } finally {
+          //  JDBCUtils.close(rs);
+            JDBCUtils.close(stmt);
+        }
+    }
+
+
+    private void doJob(Connection postsql,Connection orcl)  throws  SQLException
+    {
+        String strSQLGetTask="select proc_id,procname,datastore,name,step,src,dest,txtsql from roadfee_proc where rowstatus=1 and procname like 'STEP%' order by procname,step" ;
+        List<String[]> joblist=null;
+        Connection inConnection;
+        int idOfJob=0;
+
+        List<String[]> nodata= new ArrayList<String[]>();
+        List<String[]> lista= new ArrayList<String[]>();
+        List<String[]> list1= new ArrayList<String[]>();
+        List<String[]> listIn= new ArrayList<String[]>();
+        List<String[]> temp;//= new ArrayList<String[]>();
+        nodata.add(new String[]{""});
+        //  proc_id[0],procname[1],datastore[2\,name[3],step[4],  src[5],des[6]t,txtsql[7]
+        try{
+        logger.info("getJoblist");
+        joblist=sqlExecQuery(postsql, strSQLGetTask, new String[]{});
+
+        for ( idOfJob=0;idOfJob<joblist.size();idOfJob++)
+        {
+            logger.info("begin "+joblist.get(idOfJob)[1]+"-"+joblist.get(idOfJob)[3]+"("+joblist.get(idOfJob)[0]+")");
+            if(joblist.get(idOfJob)[5].equals("nodata"))
+            {
+                listIn=nodata;
+            }
+            else if(joblist.get(idOfJob)[5].equals("list1"))
+            {
+                listIn=list1;
+            }
+            else if(joblist.get(idOfJob)[5].equals("lista"))
+            {
+                listIn=lista;
+            }
+
+            if(joblist.get(idOfJob)[2].equals("psql"))
+            {
+                inConnection= postsql;
+            }
+            else if(joblist.get(idOfJob)[2].equals("orcl"))
+            {
+                inConnection= orcl;
+            }
+            else
+                return ; //connection failed
+
+            if( joblist.get(idOfJob)[6].equals("list1")) list1.clear();
+            if( joblist.get(idOfJob)[6].equals("lista")) lista.clear();
+            //runsql
+            logger.info("process data count: "+String.valueOf(listIn.size()));
+
+            for( int idxOfListIn=0;idxOfListIn< listIn.size();idxOfListIn++)
+            {
+
+                if( joblist.get(idOfJob)[6].equals("nodata"))
+                {
+                    sqlExec(inConnection, joblist.get(idOfJob)[7], listIn.get(idxOfListIn));
+                    //logger.info("finish  "+joblist.get(idOfJob)[1]+"-"+joblist.get(idOfJob)[3]+"("+joblist.get(idOfJob)[0]+")")
+
+                    continue;
+                }else
+                {
+                    temp=sqlExecQuery(inConnection, joblist.get(idOfJob)[7], listIn.get(idxOfListIn));
+
+                }
+
+
+                for(int j=0;j<temp.size();j++)
+                {
+                    if( joblist.get(idOfJob)[6].equals("list1"))
+                    {
+                        list1.add(temp.get(j));
+                    }
+                    else if( joblist.get(idOfJob)[6].equals("lista"))
+                    {
+                        lista.add(temp.get(j));
+                    }
+                }
+            }
+
+
+        }
+
+        }catch(SQLException sqlex)
+        {
+            logger.warn("ERROR@ID:"+String.valueOf( joblist.get(idOfJob)[0]));
+            throw sqlex;
+        }
+
+
+    }
+
+    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.getKey().getName();
+
+        // Log the time the job started
+        logger.info(jobName + " fired at " + new Date());
+        extractJobConfiguration(jobDetail);
+
+        if (isIgnoreDBETL()) {
+            return;
+        }
+
+        createSourceDataStore();
+        createTargetDataStore();
+        if (getSourceDataStore() == null) {
+            logger.warn("Cannot connect source oracle database.");
+            throw new JobExecutionException("Cannot connect source oracle database.");
+        }
+
+        if (getTargetDataStore() == null) {
+            logger.warn("Cannot connect source postgreSQL database.");
+            throw new JobExecutionException("Cannot connect source postgreSQL database.");
+        }
+
+        if (isProfileMode()) {
+            queryTime = 0;
+        }
+
+        long t1 = System.currentTimeMillis();
+        String targetSchemaName, targetThemeTable;
+        try {
+            //logger.info("-- step:clearOutputDatabase --");
+
+             doJob( targetDataStore.getConnection(Transaction.AUTO_COMMIT),sourceDataStore.getConnection(Transaction.AUTO_COMMIT) );
+
+        } catch (IOException ex) {
+            disconnect();
+            logger.warn(ex.getMessage(), ex);
+            throw new JobExecutionException("IO error. " + ex.getMessage(), ex);
+        } catch (SQLException e) {
+            disconnect();
+            logger.warn(e.getMessage(), e);
+            throw new JobExecutionException("Database error. " + e.getMessage(), e);
+         } finally {
+            disconnect();
+        }
+        logger.warn(jobName + " end at " + new Date());
+    }
+
+    private void logTimeDiff(String message, long tBefore, long tCurrent) {
+        logger.warn(message + ":use time = " + ((int) ((tCurrent - tBefore) / 60000.0)) + " min - " +
+                (((int) ((tCurrent - tBefore) % 60000.0)) / 1000) + " sec");
+    }
+
+    private void exetcuteConvert(OracleConvertPostGISJobContext jobContext,
+                                 String querySchema, String targetSchemaName) throws SQLException {
+        int order = 0;
+        OrderedMap map = getBlobStorageList(jobContext.getOracleConnection(),
+                querySchema, "SD$SPACENODES", null);
+
+        logger.info("begin convert job:[" + map.size() + "]:testmode=" + _testMode);
+
+        int total = map.size(); //spacenodes count
+        int step = total / 100;
+        int current = 0;
+
+        if (total == 0) {
+            logger.warn("SELECT COUNT FROM " + querySchema + ".SD$SPACENODES is zero.");
+            return;
+        }
+        logger.warn("SELECT COUNT FROM " + querySchema + ".SD$SPACENODES is " + map.size());
+
+        //jobContext.startTransaction();
+        jobContext.setCurrentSchema(querySchema);
+        jobContext.getExecutionContext().put("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();
+                System.runFinalization();
+            }
+
+            if (step != 0) {
+                int now = order % step;
+                if (now != current) {
+                    current = now;
+                    jobContext.getExecutionContext().put("ConvertDgn2PostGISJobProgress", current);
+
+                }
+            } else {
+                jobContext.getExecutionContext().put("ConvertDgn2PostGISJobProgress", current);
+                current++;
+            }
+        }
+        jobContext.getExecutionContext().put("ConvertDgn2PostGISJobProgress", 100);
+
+        jobContext.commitTransaction();
+        jobContext.resetFeatureContext();
+
+        if (isProfileMode()) {
+
+        }
+
+        logger.info("end convert job:[" + order + "]");
+        System.gc();
+        System.runFinalization();
+    }
+
+    protected OrderedMap getBlobStorageList(Connection connection, String schemaSrc, String tableSrc,
+                                            OrderedMap orderedMap) throws SQLException {
+        if (orderedMap == null)
+            orderedMap = new LinkedMap(99);
+        String fetchStmtFmt = "SELECT SNID, SPACETABLE FROM \"%s\".\"%s\"";
+        PrintfFormat spf = new PrintfFormat(fetchStmtFmt);
+        String fetchStmt = spf.sprintf(new Object[]{schemaSrc, tableSrc});
+        Statement stmt = connection.createStatement(ResultSet.TYPE_FORWARD_ONLY, ResultSet.CONCUR_READ_ONLY);
+        ResultSet rs = null;
+
+        stmt.setFetchSize(FETCHSIZE);
+        try {
+            rs = stmt.executeQuery(fetchStmt);
+            int size = rs.getMetaData().getColumnCount();
+
+            while (rs.next()) {
+                Object[] values = new Object[size];
+
+                for (int i = 0; i < size; i++) {
+                    values[i] = rs.getObject(i + 1);
+                }
+
+                Integer key = ((BigDecimal) values[0]).intValue();
+                String name = (String) values[1];
+
+                Pair pair = (Pair) orderedMap.get(key);
+                if (pair == null)
+                    orderedMap.put(key, new Pair(name, null));
+                else
+                    pair.first = name;
+            }
+        } catch (SQLException e) {
+            logger.error(e.toString(), e);
+            logger.error("stmt=" + fetchStmt);
+            throw e;
+        } finally {
+            JDBCUtils.close(rs);
+            JDBCUtils.close(stmt);
+        }
+
+        return orderedMap;
+    }
+
+    protected OrderedMap getRawFormatStorageList(OracleConnection connection, String schemaSrc, String tableSrc,
+                                                 OrderedMap orderedMap) throws SQLException {
+        if (orderedMap == null)
+            orderedMap = new LinkedMap(99);
+        String fetchStmtFmt = "SELECT RNID, SPACETABLE FROM \"%s\".\"%s\"";
+        PrintfFormat spf = new PrintfFormat(fetchStmtFmt);
+        String fetchStmt = spf.sprintf(new Object[]{schemaSrc, tableSrc});
+        Statement stmt = connection.createStatement(ResultSet.TYPE_FORWARD_ONLY, ResultSet.CONCUR_READ_ONLY);
+
+        stmt.setFetchSize(FETCHSIZE);
+        ResultSet rs = stmt.executeQuery(fetchStmt);
+        try {
+            int size = rs.getMetaData().getColumnCount();
+            while (rs.next()) {
+                Object[] values = new Object[size];
+
+                for (int i = 0; i < size; i++) {
+                    values[i] = rs.getObject(i + 1);
+                }
+
+                Integer key = ((BigDecimal) values[0]).intValue();
+                String name = (String) values[1];
+
+                Pair pair = (Pair) orderedMap.get(key);
+                if (pair == null)
+                    orderedMap.put(key, new Pair(null, name));
+                else
+                    pair.second = name;
+            }
+        } finally {
+            JDBCUtils.close(rs);
+            JDBCUtils.close(stmt);
+        }
+        return orderedMap;
+    }
+
+    protected void queryIgsetElement(OracleConvertPostGISJobContext jobContext,
+                                     String srcschema, String srctable) throws SQLException {
+        Connection connection = jobContext.getOracleConnection();
+        String fetchSrcStmtFmt = "SELECT IGDSELM FROM \"%s\".\"%s\" ORDER BY ROWID";
+        //String fetchSrcStmtFmt = "SELECT IGDSELM FROM \"%s\".\"%s\" WHERE TAG_SFSC = 423 AND TAG_LUFID = 21612065 ORDER BY ROWID";
+        PrintfFormat spf = new PrintfFormat(fetchSrcStmtFmt);
+        String fetchSrcStmt = spf.sprintf(new Object[]{srcschema, srctable});
+        Statement stmtSrc = connection.createStatement(ResultSet.TYPE_FORWARD_ONLY, ResultSet.CONCUR_READ_ONLY);
+
+        stmtSrc.setFetchSize(FETCHSIZE);
+        ResultSet rsSrc = stmtSrc.executeQuery(fetchSrcStmt);
+        int igdsMetaType = rsSrc.getMetaData().getColumnType(1);
+        while (rsSrc.next()) {
+            if (isProfileMode()) {
+                markQueryTime();
+            }
+
+            byte[] raw = null;
+            if (igdsMetaType == Types.BLOB) {
+                BLOB blob = (BLOB) rsSrc.getBlob(1);
+
+                try {
+                    raw = getBytesFromBLOB(blob);
+                } catch (BufferOverflowException e) {
+                    logger.warn("Wrong Element Structure-", e);
+                } finally {
+                    // blob.close();
+                }
+            } else {
+                raw = rsSrc.getBytes(1);
+            }
+
+            try {
+                if (raw != null) {
+                    Element element = fetchBinaryElement(raw);
+                    if (isProfileMode()) {
+                        accumulateQueryTime();
+                    }
+                    jobContext.putFeatureCollection(element);
+                } else {
+                    if (isProfileMode()) {
+                        accumulateQueryTime();
+                    }
+                }
+            } catch (Dgn7fileException e) {
+                logger.warn("Dgn7Exception", e);
+            }
+        }
+
+        JDBCUtils.close(rsSrc);
+        JDBCUtils.close(stmtSrc);
+    }
+
+    protected void queryRawElement(OracleConvertPostGISJobContext jobContext,
+                                   String srcschema, String srctable) throws SQLException {
+        Connection connection = jobContext.getOracleConnection();
+        String fetchDestStmtFmt = "SELECT ELEMENT FROM \"%s\".\"%s\" ORDER BY ROWID";
+        PrintfFormat spf = new PrintfFormat(fetchDestStmtFmt);
+        String fetchDestStmt = spf.sprintf(new Object[]{srcschema, srctable});
+        Statement stmtDest = connection.createStatement(ResultSet.TYPE_FORWARD_ONLY, ResultSet.CONCUR_READ_ONLY);
+
+        stmtDest.setFetchSize(FETCHSIZE);
+        ResultSet rsDest = stmtDest.executeQuery(fetchDestStmt);
+
+        try {
+            while (rsDest.next()) {
+                ARRAY rawsValue = ((OracleResultSet) rsDest).getARRAY(1);
+                long[] rawData = rawsValue.getLongArray();
+                byte[] comparessedValue;
+
+                /*
+                if (dataMode == TransferTask.DataMode.Normal)
+                {
+                    comparessedValue = BinConverter.unmarshalByteArray(rawData, true);
+                } else
+                {
+                    comparessedValue = BinConverter.unmarshalCompactByteArray(rawData);
+                }
+                */
+                comparessedValue = BinConverter.unmarshalByteArray(rawData, true);
+
+                byte[] rawDest = ByteArrayCompressor.decompressByteArray(comparessedValue);
+
+                try {
+                    Element element = fetchBinaryElement(rawDest);
+                    jobContext.putFeatureCollection(element);
+                } catch (Dgn7fileException e) {
+                    logger.warn("Dgn7Exception:" + e.getMessage(), e);
+                }
+            }
+        } finally {
+            JDBCUtils.close(rsDest);
+            JDBCUtils.close(stmtDest);
+        }
+    }
+
+    // Binary to Element
+    private Element fetchBinaryElement(byte[] raws) throws Dgn7fileException {
+        ByteBuffer buffer = ByteBuffer.wrap(raws);
+        buffer.order(ByteOrder.LITTLE_ENDIAN);
+        short signature = buffer.getShort();
+
+        // byte type = (byte) (buffer.get() & 0x7f);
+        byte type = (byte) ((signature >>> 8) & 0x007f);
+
+        // silly Bentley say contentLength is in 2-byte words
+        // and ByteByffer uses raws.
+        // track the record location
+        int elementLength = (buffer.getShort() * 2) + 4;
+        ElementType recordType = ElementType.forID(type);
+        IElementHandler handler;
+
+        handler = recordType.getElementHandler();
+
+        Element dgnElement = (Element) handler.read(buffer, signature, elementLength);
+        if (recordType.isComplexElement() && (elementLength < raws.length)) {
+            int offset = elementLength;
+            while (offset < (raws.length - 4)) {
+                buffer.position(offset);
+                signature = buffer.getShort();
+                type = (byte) ((signature >>> 8) & 0x007f);
+                elementLength = (buffer.getShort() * 2) + 4;
+                if (raws.length < (offset + elementLength)) {
+                    logger.debug("Length not match:" + offset + ":" + buffer.position() + ":" + buffer.limit());
+                    break;
+                }
+                recordType = ElementType.forID(type);
+                handler = recordType.getElementHandler();
+                if (handler != null) {
+                    Element subElement = (Element) handler.read(buffer, signature, elementLength);
+                    ((ComplexElement) dgnElement).add(subElement);
+                    offset += elementLength;
+                } else {
+                    byte[] remain = new byte[buffer.remaining()];
+                    System.arraycopy(raws, offset, remain, 0, buffer.remaining());
+                    for (int i = 0; i < remain.length; i++) {
+                        if (remain[i] != 0) {
+                            logger.info("fetch element has some error. index=" + (offset + i) + ":value=" + remain[i]);
+                        }
+                    }
+                    break;
+                }
+            }
+        }
+
+        return dgnElement;
+    }
+
+    /**
+     * �����ഫ���޹��ɪ��u�@
+     *
+     * @param context �u�@��������
+     * @throws org.quartz.JobExecutionException
+     *          exception
+     */
+    private void convertIndexDesignFile(JobExecutionContext context, String targetSchemaName) throws JobExecutionException {
+        File indexDir = new File(getDataPath(), INDEXPATHNAME);
+        if (!indexDir.exists()) {
+            logger.info("index dir=" + indexDir + " not exist.");
+            return;
+        }
+
+        if (!indexDir.isDirectory()) {
+            logger.info("index dir=" + indexDir + " is not a directory.");
+        }
+
+        List<File> dgnFiles = FileUtils.recurseDir(indexDir, new FileFilter() {
+            public boolean accept(File pathname) {
+                return pathname.isDirectory() || pathname.getName().toLowerCase().endsWith("dgn");
+            }
+        });
+
+        for (File dgnFile : dgnFiles) {
+            if (dgnFile.isDirectory()) continue;
+            IndexDgnConvertPostGISJobContext convertContext =
+                    new IndexDgnConvertPostGISJobContext(getDataPath(), getTargetDataStore(), targetSchemaName,
+                            isProfileMode(), isTransformed());
+            logger.info("--- start index dgnfile-" + dgnFile.toString() + " ---");
+            FileInputStream fs = null;
+            FileChannel fc = null;
+            Dgn7fileReader reader = null;
+            try {
+                convertContext.clearOutputDatabase();
+                convertContext.setExecutionContext(context);
+                String dgnPaths[] = StringUtils.splitToArray(dgnFile.toString(), File.separator);
+                convertContext.setFilename(dgnPaths[dgnPaths.length - 1]);
+                convertContext.startTransaction();
+
+                fs = new FileInputStream(dgnFile);
+                fc = fs.getChannel();
+                reader = new Dgn7fileReader(fc, new Lock());
+                convertContext.setReader(reader);
+
+                scanIndexDgnElement(convertContext);
+
+                convertContext.commitTransaction();
+                convertContext.closeFeatureWriter();
+
+                System.gc();
+                System.runFinalization();
+            } catch (FileNotFoundException e) {
+                convertContext.rollbackTransaction();
+                logger.warn(e.getMessage(), e);
+                throw new JobExecutionException(e.getMessage(), e);
+            } catch (Dgn7fileException e) {
+                convertContext.rollbackTransaction();
+                logger.warn(e.getMessage(), e);
+                throw new JobExecutionException(e.getMessage(), e);
+            } catch (IOException e) {
+                convertContext.rollbackTransaction();
+                logger.warn(e.getMessage(), e);
+                throw new JobExecutionException(e.getMessage(), e);
+            } catch (IllegalAttributeException e) {
+                convertContext.rollbackTransaction();
+                logger.warn(e.getMessage(), e);
+                throw new JobExecutionException(e.getMessage(), e);
+            } catch (SchemaException e) {
+                convertContext.rollbackTransaction();
+                logger.warn(e.getMessage(), e);
+                throw new JobExecutionException(e.getMessage(), e);
+            } finally {
+                convertContext.closeFeatureWriter();
+
+                if (reader != null) {
+                    try {
+                        reader.close();
+                    } catch (IOException e) {
+                        logger.warn(e.getMessage(), e);
+                    }
+                }
+
+                if (fs != null) {
+                    try {
+                        fs.close();
+                    } catch (IOException e) {
+                        logger.warn(e.getMessage(), e);
+                    }
+                }
+
+                if (isProfileMode()) {
+                    logger.warn("Profile-Current convertContext Process Cost-" +
+                            ((int) ((convertContext.getProcessTime()) / 60000.0)) + " min - " +
+                            (((int) ((convertContext.getProcessTime()) % 60000.0)) / 1000) + " sec");
+                    logger.warn("Profile-Current convertContext Update Cost-" +
+                            ((int) ((convertContext.getUpdateTime()) / 60000.0)) + " min - " +
+                            (((int) ((convertContext.getUpdateTime()) % 60000.0)) / 1000) + " sec");
+                }
+            }
+        }
+    }
+
+    protected void scanIndexDgnElement(IndexDgnConvertPostGISJobContext convertContext)
+            throws Dgn7fileException, IOException, IllegalAttributeException, SchemaException {
+        Dgn7fileReader reader = convertContext.getReader();
+        int count = 0;
+        Element lastComplex = null;
+
+        while (reader.hasNext()) {
+            if (isProfileMode()) markProcessTime();
+            Element.FileRecord record = reader.nextElement();
+            if (record.element() != null) {
+                Element element = (Element) record.element();
+                ElementType type = element.getElementType();
+
+                if ((!type.isComplexElement()) && (!element.isComponentElement())) {
+                    if (lastComplex != null) {
+                        processIndexElement(lastComplex, convertContext);
+                        lastComplex = null;
+                    }
+
+                    processIndexElement(element, convertContext);
+                } else if (element.isComponentElement()) {
+                    if (lastComplex != null) {
+                        ((ComplexElement) lastComplex).add(element);
+                    }
+                } else if (type.isComplexElement()) {
+                    if (lastComplex != null) {
+                        processIndexElement(lastComplex, convertContext);
+                    }
+                    lastComplex = element;
+                }
+            }
+            count++;
+        }
+
+        if (lastComplex != null) {
+            processIndexElement(lastComplex, convertContext);
+        }
+        logger.debug("ElementRecord Count=" + count);
+    }
+
+    private void processIndexElement(Element element, IndexDgnConvertPostGISJobContext convertContext)
+            throws IllegalAttributeException, SchemaException {
+        //if (useTpclidText) {
+        //    if (element instanceof TextElement) {
+        //        convertContext.putFeatureCollection(element);
+        //    }
+        //} else {
+        //    if (element instanceof ShapeElement) {
+        convertContext.putFeatureCollection(element);
+        //    }
+        //}
+    }
+
+
+    /**
+     * �����ഫ��L�]�p���ɪ��u�@
+     *
+     * @param context jobContext
+     * @throws org.quartz.JobExecutionException
+     *          exception
+     */
+    private void convertOtherDesignFile(JobExecutionContext context, String targetSchemaName) throws JobExecutionException {
+        File otherDir = new File(getDataPath(), OTHERPATHNAME);
+        if (!otherDir.exists()) {
+            logger.info("other dir=" + otherDir + " not exist.");
+            return;
+        }
+
+        if (!otherDir.isDirectory()) {
+            logger.info("other dir=" + otherDir + " is not a directory.");
+        }
+
+        List<File> dgnFiles = FileUtils.recurseDir(otherDir, new FileFilter() {
+            public boolean accept(File pathname) {
+                return pathname.isDirectory() || pathname.getName().toLowerCase().endsWith("dgn");
+            }
+        });
+
+        for (File dgnFile : dgnFiles) {
+            if (dgnFile.isDirectory()) continue;
+
+            GeneralDgnConvertPostGISJobContext convertContext =
+                    new GeneralDgnConvertPostGISJobContext(getDataPath(), getTargetDataStore(), targetSchemaName,
+                            isProfileMode(), isTransformed());
+            logger.info("--- start other dgnfile-" + dgnFile.toString() + " ---");
+            FileInputStream fs = null;
+            FileChannel fc;
+            Dgn7fileReader reader = null;
+            try {
+                convertContext.setExecutionContext(context);
+                String dgnPaths[] = StringUtils.splitToArray(dgnFile.toString(), File.separator);
+                convertContext.setFilename(dgnPaths[dgnPaths.length - 1]);
+                convertContext.startTransaction();
+
+                fs = new FileInputStream(dgnFile);
+                fc = fs.getChannel();
+                reader = new Dgn7fileReader(fc, new Lock());
+                convertContext.setReader(reader);
+
+                scanOtherDgnElement(convertContext);
+
+                convertContext.commitTransaction();
+                convertContext.closeFeatureWriter();
+
+                System.gc();
+                System.runFinalization();
+            } catch (FileNotFoundException e) {
+                convertContext.rollbackTransaction();
+                logger.warn(e.getMessage(), e);
+                throw new JobExecutionException(e.getMessage(), e);
+            } catch (Dgn7fileException e) {
+                convertContext.rollbackTransaction();
+                logger.warn(e.getMessage(), e);
+                throw new JobExecutionException(e.getMessage(), e);
+            } catch (IOException e) {
+                convertContext.rollbackTransaction();
+                logger.warn(e.getMessage(), e);
+                throw new JobExecutionException(e.getMessage(), e);
+            } catch (IllegalAttributeException e) {
+                convertContext.rollbackTransaction();
+                logger.warn(e.getMessage(), e);
+                throw new JobExecutionException(e.getMessage(), e);
+            } catch (SchemaException e) {
+                convertContext.rollbackTransaction();
+                logger.warn(e.getMessage(), e);
+                throw new JobExecutionException(e.getMessage(), e);
+            } finally {
+                convertContext.closeFeatureWriter();
+
+                if (reader != null) {
+                    try {
+                        reader.close();
+                    } catch (IOException e) {
+                        logger.warn(e.getMessage(), e);
+                    }
+                }
+
+                if (fs != null) {
+                    try {
+                        fs.close();
+                    } catch (IOException e) {
+                        logger.warn(e.getMessage(), e);
+                    }
+                }
+
+                if (isProfileMode()) {
+                    logger.warn("Profile-Current convertContext Process Cost-" +
+                            ((int) ((convertContext.getProcessTime()) / 60000.0)) + " min - " +
+                            (((int) ((convertContext.getProcessTime()) % 60000.0)) / 1000) + " sec");
+                    logger.warn("Profile-Current convertContext Update Cost-" +
+                            ((int) ((convertContext.getUpdateTime()) / 60000.0)) + " min - " +
+                            (((int) ((convertContext.getUpdateTime()) % 60000.0)) / 1000) + " sec");
+                }
+            }
+        }
+    }
+
+    public void scanOtherDgnElement(GeneralDgnConvertPostGISJobContext convertContext)
+            throws Dgn7fileException, IOException, IllegalAttributeException, SchemaException {
+        Dgn7fileReader reader = convertContext.getReader();
+        int count = 0;
+        Element lastComplex = null;
+        while (reader.hasNext()) {
+            Element.FileRecord record = reader.nextElement();
+            if (record.element() != null) {
+                Element element = (Element) record.element();
+                ElementType type = element.getElementType();
+
+                if ((!type.isComplexElement()) && (!element.isComponentElement())) {
+                    if (lastComplex != null) {
+                        processOtherElement(lastComplex, convertContext);
+                        lastComplex = null;
+                    }
+
+                    processOtherElement(element, convertContext);
+                } else if (element.isComponentElement()) {
+                    if (lastComplex != null) {
+                        ((ComplexElement) lastComplex).add(element);
+                    }
+                } else if (type.isComplexElement()) {
+                    if (lastComplex != null) {
+                        processOtherElement(lastComplex, convertContext);
+                    }
+                    lastComplex = element;
+                }
+            }
+            count++;
+        }
+
+        if (lastComplex != null) {
+            processOtherElement(lastComplex, convertContext);
+        }
+        logger.debug("ElementRecord Count=" + count);
+    }
+
+    private void processOtherElement(Element element, GeneralDgnConvertPostGISJobContext convertContext)
+            throws IllegalAttributeException, SchemaException {
+        convertContext.putFeatureCollection(element);
+    }
+
+    private void clearOutputDatabase() {
+        /*
+        File outDataPath = new File(getDataPath(), OracleConvertEdbGeoJobContext.SHPOUTPATH);
+        if (outDataPath.exists() && outDataPath.isDirectory())
+        {
+            deleteFilesInPath(outDataPath);
+        }
+        outDataPath = new File(getDataPath(), IndexDgnConvertShpJobContext.SHPOUTPATH);
+        if (outDataPath.exists() && outDataPath.isDirectory())
+        {
+            deleteFilesInPath(outDataPath);
+        }
+        outDataPath = new File(getDataPath(), GeneralDgnConvertShpJobContext.SHPOUTPATH);
+        if (outDataPath.exists() && outDataPath.isDirectory())
+        {
+            deleteFilesInPath(outDataPath);
+        }
+        */
+    }
+
+    private void deleteFilesInPath(File outDataPath) {
+        deleteFilesInPath(outDataPath, true);
+    }
+
+    private void deleteFilesInPath(File outDataPath, boolean removeSubDir) {
+        if (!outDataPath.isDirectory()) {
+            return;
+        }
+        File[] files = outDataPath.listFiles();
+        for (File file : files) {
+            if (file.isFile()) {
+                if (!file.delete()) {
+                    logger.info("Cannot delete file-" + file.toString());
+                }
+            } else if (file.isDirectory()) {
+                deleteFilesInPath(file, removeSubDir);
+                if (removeSubDir) {
+                    if (file.delete()) {
+                        logger.info("Cannot delete dir-" + file.toString());
+                    }
+                }
+            }
+        }
+    }
+
+    private void convertFeatureDesignFile(JobExecutionContext context, String targetSchemaName) throws JobExecutionException {
+        File elminDir = new File(getDataPath(), "elmin");
+        if (!elminDir.exists()) {
+            logger.info("elmin dir=" + elminDir + " not exist.");
+            return;
+        }
+
+        if (!elminDir.isDirectory()) {
+            logger.info("elmin dir=" + elminDir + " is not a directory.");
+        }
+
+        File[] dgnFiles = elminDir.listFiles(new FilenameFilter() {
+            public boolean accept(File dir, String name) {
+                return name.toLowerCase().endsWith(".dgn");
+            }
+        });
+
+        for (File dgnFile : dgnFiles) {
+            FeatureDgnConvertPostGISJobContext convertContext =
+                    new FeatureDgnConvertPostGISJobContext(getDataPath(), getTargetDataStore(), targetSchemaName, _filterPath,
+                            isProfileMode(), isTransformed());
+            logger.info("--- start dgnfile-" + dgnFile.toString() + " ---");
+            try {
+                convertContext.setExecutionContext(context);
+                String dgnPaths[] = StringUtils.splitToArray(dgnFile.toString(), File.separator);
+                convertContext.setFilename(dgnPaths[dgnPaths.length - 1]);
+                convertContext.startTransaction();
+
+                FileInputStream fs = new FileInputStream(dgnFile);
+                FileChannel fc = fs.getChannel();
+                Dgn7fileReader reader = new Dgn7fileReader(fc, new Lock());
+                convertContext.setReader(reader);
+
+                scanFeatureDgnElement(convertContext);
+
+                convertContext.commitTransaction();
+                convertContext.closeFeatureWriter();
+                System.gc();
+                System.runFinalization();
+            } catch (FileNotFoundException e) {
+                convertContext.rollbackTransaction();
+                logger.warn(e.getMessage(), e);
+                throw new JobExecutionException(e.getMessage(), e);
+            } catch (Dgn7fileException e) {
+                convertContext.rollbackTransaction();
+                logger.warn(e.getMessage(), e);
+                throw new JobExecutionException(e.getMessage(), e);
+            } catch (IOException e) {
+                convertContext.rollbackTransaction();
+                logger.warn(e.getMessage(), e);
+                throw new JobExecutionException(e.getMessage(), e);
+            } catch (IllegalAttributeException e) {
+                convertContext.rollbackTransaction();
+                logger.warn(e.getMessage(), e);
+                throw new JobExecutionException(e.getMessage(), e);
+            } catch (SchemaException e) {
+                convertContext.rollbackTransaction();
+                logger.warn(e.getMessage(), e);
+                throw new JobExecutionException(e.getMessage(), e);
+            } finally {
+                convertContext.closeFeatureWriter();
+            }
+        }
+    }
+
+    public void scanFeatureDgnElement(FeatureDgnConvertPostGISJobContext convertContext)
+            throws Dgn7fileException, IOException, IllegalAttributeException, SchemaException {
+        Dgn7fileReader reader = convertContext.getReader();
+        int count = 0;
+        Element lastComplex = null;
+        while (reader.hasNext()) {
+            Element.FileRecord record = reader.nextElement();
+            if (record.element() != null) {
+                Element element = (Element) record.element();
+                ElementType type = element.getElementType();
+
+                if ((!type.isComplexElement()) && (!element.isComponentElement())) {
+                    if (lastComplex != null) {
+                        processFeatureElement(lastComplex, convertContext);
+                        lastComplex = null;
+                    }
+
+                    processFeatureElement(element, convertContext);
+                } else if (element.isComponentElement()) {
+                    if (lastComplex != null) {
+                        ((ComplexElement) lastComplex).add(element);
+                    }
+                } else if (type.isComplexElement()) {
+                    if (lastComplex != null) {
+                        processFeatureElement(lastComplex, convertContext);
+                    }
+                    lastComplex = element;
+                }
+            }
+            count++;
+        }
+
+        if (lastComplex != null) {
+            processFeatureElement(lastComplex, convertContext);
+        }
+        logger.debug("ElementRecord Count=" + count);
+    }
+
+    private void processFeatureElement(Element element, FeatureDgnConvertPostGISJobContext convertContext)
+            throws IllegalAttributeException, SchemaException {
+        convertContext.putFeatureCollection(element);
+    }
+
+    private void createDummyFeatureFile(JobExecutionContext context) throws JobExecutionException {
+        /*
+        DummyFeatureConvertShpJobContext convertContext = new DummyFeatureConvertShpJobContext(getDataPath(), _filterPath);
+        try {
+            convertContext.startTransaction();
+            convertContext.commitTransaction();
+            convertContext.closeFeatureWriter();
+        } catch (IOException e)
+        {
+            logger.warn(e.getMessage(), e);
+            throw new JobExecutionException(e.getMessage(), e);
+        }
+        */
+    }
+
+    public DataStore getTargetDataStore() {
+        return targetDataStore;
+    }
+
+    protected void createTargetDataStore() throws JobExecutionException {
+        if (targetDataStore != null) {
+            targetDataStore.dispose();
+            targetDataStore = null;
+        }
+
+        /*
+        if (!isDriverFound())
+        {
+            throw new JobExecutionException("Oracle JDBC Driver not found.-" + JDBC_DRIVER);
+        }
+        */
+
+        if (!pgProperties.containsKey(PostgisNGDataStoreFactory.MAXCONN.key)) {
+            pgProperties.put(PostgisNGDataStoreFactory.MAXCONN.key, "5");
+        }
+
+        if (!pgProperties.containsKey(PostgisNGDataStoreFactory.MINCONN.key)) {
+            pgProperties.put(PostgisNGDataStoreFactory.MINCONN.key, "1");
+        }
+
+        /*
+        if (!pgProperties.containsKey(PostgisNGDataStoreFactory.WKBENABLED.key)) {
+            pgProperties.put(PostgisNGDataStoreFactory.WKBENABLED.key, "true");
+        }
+        */
+
+        if (!dataStoreFactory.canProcess(pgProperties)) {
+            getLogger().warn("cannot process properties-");
+            throw new JobExecutionException("cannot process properties-");
+        }
+        try {
+            targetDataStore = dataStoreFactory.createDataStore(pgProperties);
+        } catch (IOException e) {
+            getLogger().warn(e.getMessage(), e);
+            throw new JobExecutionException(e.getMessage(), e);
+        }
+    }
+
+    protected void disconnect() {
+        super.disconnect();
+        if (targetDataStore != null) {
+            targetDataStore.dispose();
+            targetDataStore = null;
+        }
+    }
+
+    private String determineTargetSchemaName() throws IOException {
+        if (targetDataStore == null) return null;
+        Connection connection = null;
+        Statement stmt = null;
+        ResultSet rs = null;
+        String targetSchema = null;
+        boolean needCreate = false;
+        try {
+            connection = targetDataStore.getConnection(Transaction.AUTO_COMMIT);
+            // Create XGVERSIONTABLE_NAME
+            rs = connection.getMetaData().getTables(null, _pgSchema, DataReposVersionManager.XGVERSIONTABLE_NAME, new String[]{"TABLE"});
+            if (!rs.next()) needCreate = true;
+            if (needCreate)
+                createXGeosVersionTable(connection, _pgSchema);
+            rs.close();
+
+            StringBuilder sbSQL = new StringBuilder("SELECT ");
+            sbSQL.append("vsschema, vsstatus FROM ");
+            sbSQL.append(encodeSchemaTableName(_pgSchema, DataReposVersionManager.XGVERSIONTABLE_NAME)).append(' ');
+            sbSQL.append("ORDER BY vsid");
+            stmt = connection.createStatement();
+            rs = stmt.executeQuery(sbSQL.toString());
+            ArrayList<Object[]> tmpSchemas = new ArrayList<Object[]>();
+            int i = 0;
+            int current = -1;
+            while (rs.next()) {
+                Object[] values = new Object[2];
+                values[0] = rs.getString("vsschema");
+                values[1] = rs.getShort("vsstatus");
+                tmpSchemas.add(values);
+                if ((((Short) values[1]) & DataReposVersionManager.VSSTATUS_USING) != 0) {
+                    current = i;
+                }
+                i++;
+            }
+
+            if (current == -1) {
+                Object[] values = tmpSchemas.get(0);
+                targetSchema = (String) values[0];
+            } else if (current < (tmpSchemas.size() - 1)) {
+                Object[] values = tmpSchemas.get(current + 1);
+                targetSchema = (String) values[0];
+            } else {
+                Object[] values = tmpSchemas.get(0);
+                targetSchema = (String) values[0];
+            }
+
+            sbSQL = new StringBuilder("UPDATE ");
+            sbSQL.append(encodeSchemaTableName(_pgSchema, DataReposVersionManager.XGVERSIONTABLE_NAME)).append(' ');
+            sbSQL.append(" SET vsstatus = ");
+            sbSQL.append(DataReposVersionManager.VSSTATUS_COVERT);
+            sbSQL.append(" WHERE vsschema = '");
+            sbSQL.append(targetSchema).append("'");
+            int count = stmt.executeUpdate(sbSQL.toString());
+            if (count != 1) {
+                logger.info("update status for " + targetSchema + " update result count="
+                        + count);
+            }
+        } catch (SQLException e) {
+            logger.warn(e.getMessage(), e);
+        } finally {
+            JDBCUtils.close(rs);
+            JDBCUtils.close(stmt);
+            JDBCUtils.close(connection, Transaction.AUTO_COMMIT, null);
+        }
+        return targetSchema;
+    }
+
+    private String determineTargetThemeTableName() throws IOException {
+        if (targetDataStore == null) return null;
+        Connection connection = null;
+        Statement stmt = null;
+        ResultSet rs = null;
+        String targetTable = null;
+        boolean needCreate = false;
+        try {
+            connection = targetDataStore.getConnection(Transaction.AUTO_COMMIT);
+            // Create XPTVERSIONTABLE_NAME
+            needCreate = false;
+            rs = connection.getMetaData().getTables(null, _pgSchema, DataReposVersionManager.XPTVERSIONTABLE_NAME, new String[]{"TABLE"});
+            if (!rs.next()) needCreate = true;
+            if (needCreate)
+                createXPWThemeVersionTable(connection, _pgSchema);
+            rs.close();
+
+            rs = null;
+
+            StringBuilder sbSQL = new StringBuilder("SELECT ");
+            sbSQL.append("vptname, vptstatus FROM ");
+            sbSQL.append(encodeSchemaTableName(_pgSchema, DataReposVersionManager.XPTVERSIONTABLE_NAME)).append(' ');
+            sbSQL.append("ORDER BY vptid");
+            stmt = connection.createStatement();
+            rs = stmt.executeQuery(sbSQL.toString());
+            ArrayList<Object[]> tmpTablenames = new ArrayList<Object[]>();
+            int i = 0;
+            int current = -1;
+            while (rs.next()) {
+                Object[] values = new Object[2];
+                values[0] = rs.getString("vptname");
+                values[1] = rs.getShort("vptstatus");
+                tmpTablenames.add(values);
+                if ((((Short) values[1]) & DataReposVersionManager.VSSTATUS_USING) != 0) {
+                    current = i;
+                }
+                i++;
+            }
+
+            if (current == -1) {
+                Object[] values = tmpTablenames.get(0);
+                targetTable = (String) values[0];
+            } else if (current < (tmpTablenames.size() - 1)) {
+                Object[] values = tmpTablenames.get(current + 1);
+                targetTable = (String) values[0];
+            } else {
+                Object[] values = tmpTablenames.get(0);
+                targetTable = (String) values[0];
+            }
+
+            sbSQL = new StringBuilder("UPDATE ");
+            sbSQL.append(encodeSchemaTableName(_pgSchema, DataReposVersionManager.XPTVERSIONTABLE_NAME)).append(' ');
+            sbSQL.append(" SET vptstatus = ");
+            sbSQL.append(DataReposVersionManager.VSSTATUS_COVERT);
+            sbSQL.append(" WHERE vptname = '");
+            sbSQL.append(targetTable).append("'");
+            int count = stmt.executeUpdate(sbSQL.toString());
+            if (count != 1) {
+                logger.info("update status for " + targetTable + " update result count="
+                        + count);
+            }
+        } catch (SQLException e) {
+            logger.warn(e.getMessage(), e);
+        } finally {
+            JDBCUtils.close(rs);
+            JDBCUtils.close(stmt);
+            JDBCUtils.close(connection, Transaction.AUTO_COMMIT, null);
+        }
+        return targetTable;
+    }
+
+    public String encodeSchemaTableName(String schemaName, String tableName) {
+        if (schemaName == null)
+            return "\"" + tableName + "\"";
+        return "\"" + schemaName + "\".\"" + tableName + "\"";
+    }
+
+    private void createXGeosVersionTable(Connection connection, String pgSchema) throws SQLException {
+        Statement stmt = null;
+        StringBuilder sql = new StringBuilder("CREATE TABLE ");
+        sql.append(encodeSchemaTableName(pgSchema, DataReposVersionManager.XGVERSIONTABLE_NAME));
+        sql.append(" ( vsid serial PRIMARY KEY, ");
+        sql.append(" vsschema character varying(64) NOT NULL, ");
+        sql.append(" vsstatus smallint NOT NULL, ");
+        sql.append(" vstimestamp timestamp with time zone ) ");
+        try {
+            stmt = connection.createStatement();
+            stmt.executeUpdate(sql.toString());
+
+            sql = new StringBuilder("ALTER TABLE ");
+            sql.append(encodeSchemaTableName(pgSchema, DataReposVersionManager.XGVERSIONTABLE_NAME));
+            sql.append(" OWNER TO ").append(_pgUsername);
+            stmt.executeUpdate(sql.toString());
+
+            sql = new StringBuilder("GRANT ALL ON TABLE ");
+            sql.append(encodeSchemaTableName(pgSchema, DataReposVersionManager.XGVERSIONTABLE_NAME));
+            sql.append(" TO public");
+            stmt.executeUpdate(sql.toString());
+
+            for (String schemaName : DataReposVersionManager.DEFAULTXGVERSIONSCHEMA_NAMES) {
+                sql = new StringBuilder("INSERT INTO ");
+                sql.append(encodeSchemaTableName(pgSchema, DataReposVersionManager.XGVERSIONTABLE_NAME));
+                sql.append(" (vsschema, vsstatus) VALUES ('");
+                sql.append(schemaName).append("', ");
+                sql.append(DataReposVersionManager.VSSTATUS_AVAILABLE).append(" )");
+                stmt.executeUpdate(sql.toString());
+
+                createIfNotExistNewSchema(connection, schemaName);
+            }
+
+        } finally {
+            if (stmt != null) stmt.close();
+        }
+    }
+
+    private void createXPWThemeVersionTable(Connection connection, String pgSchema) throws SQLException {
+        Statement stmt = null;
+        StringBuilder sql = new StringBuilder("CREATE TABLE ");
+        sql.append(encodeSchemaTableName(pgSchema, DataReposVersionManager.XPTVERSIONTABLE_NAME));
+        sql.append(" ( vptid serial PRIMARY KEY, ");
+        sql.append(" vptname character varying(64) NOT NULL, ");
+        sql.append(" vptstatus smallint NOT NULL, ");
+        sql.append(" vpttimestamp timestamp with time zone ) ");
+        try {
+            stmt = connection.createStatement();
+            stmt.executeUpdate(sql.toString());
+
+            sql = new StringBuilder("ALTER TABLE ");
+            sql.append(encodeSchemaTableName(pgSchema, DataReposVersionManager.XPTVERSIONTABLE_NAME));
+            sql.append(" OWNER TO ").append(_pgUsername);
+            stmt.executeUpdate(sql.toString());
+
+            sql = new StringBuilder("GRANT ALL ON TABLE ");
+            sql.append(encodeSchemaTableName(pgSchema, DataReposVersionManager.XPTVERSIONTABLE_NAME));
+            sql.append(" TO public");
+            stmt.executeUpdate(sql.toString());
+
+            for (String schemaName : DataReposVersionManager.DEFAULTXPTVERSIONTABLE_NAMES) {
+                sql = new StringBuilder("INSERT INTO ");
+                sql.append(encodeSchemaTableName(pgSchema, DataReposVersionManager.XPTVERSIONTABLE_NAME));
+                sql.append(" (vptname, vptstatus) VALUES ('");
+                sql.append(schemaName).append("', ");
+                sql.append(DataReposVersionManager.VSSTATUS_AVAILABLE).append(" )");
+                stmt.executeUpdate(sql.toString());
+            }
+
+        } finally {
+            if (stmt != null) stmt.close();
+        }
+    }
+
+    private void updateRepoStatusToReady(String targetSchema) {
+        if (targetDataStore == null) return;
+        Connection connection = null;
+        Statement stmt = null;
+        ResultSet rs = null;
+        boolean needCreate = false;
+        try {
+            StringBuilder sbSQL = new StringBuilder("UPDATE ");
+            sbSQL.append(encodeSchemaTableName(_pgSchema, DataReposVersionManager.XGVERSIONTABLE_NAME)).append(' ');
+            sbSQL.append(" SET vsstatus = ");
+            sbSQL.append(DataReposVersionManager.VSSTATUS_READY);
+            sbSQL.append(" , vstimestamp = CURRENT_TIMESTAMP WHERE vsschema = '");
+            sbSQL.append(targetSchema).append("'");
+
+            connection = targetDataStore.getConnection(Transaction.AUTO_COMMIT);
+            stmt = connection.createStatement();
+            int count = stmt.executeUpdate(sbSQL.toString());
+            if (count != 1) {
+                logger.info("update status for " + targetSchema + " update result count="
+                        + count);
+            }
+        } catch (SQLException e) {
+            logger.warn(e.getMessage(), e);
+        } catch (IOException e) {
+            logger.warn(e.getMessage(), e);
+        } finally {
+            JDBCUtils.close(rs);
+            JDBCUtils.close(stmt);
+            JDBCUtils.close(connection, Transaction.AUTO_COMMIT, null);
+        }
+    }
+
+    private void updatePWThemeStatusToReady(String targetSchema) {
+        if (targetDataStore == null) return;
+        Connection connection = null;
+        Statement stmt = null;
+        ResultSet rs = null;
+        boolean needCreate = false;
+        try {
+            StringBuilder sbSQL = new StringBuilder("UPDATE ");
+            sbSQL.append(encodeSchemaTableName(_pgSchema, DataReposVersionManager.XPTVERSIONTABLE_NAME)).append(' ');
+            sbSQL.append(" SET vptstatus = ");
+            sbSQL.append(DataReposVersionManager.VSSTATUS_READY);
+            sbSQL.append(" , vpttimestamp = CURRENT_TIMESTAMP WHERE vptname = '");
+            sbSQL.append(targetSchema).append("'");
+
+            connection = targetDataStore.getConnection(Transaction.AUTO_COMMIT);
+            stmt = connection.createStatement();
+            int count = stmt.executeUpdate(sbSQL.toString());
+            if (count != 1) {
+                logger.info("update status for " + targetSchema + " update result count="
+                        + count);
+            }
+        } catch (SQLException e) {
+            logger.warn(e.getMessage(), e);
+        } catch (IOException e) {
+            logger.warn(e.getMessage(), e);
+        } finally {
+            JDBCUtils.close(rs);
+            JDBCUtils.close(stmt);
+            JDBCUtils.close(connection, Transaction.AUTO_COMMIT, null);
+        }
+    }
+
+    private void createIfNotExistNewSchema(Connection connection, String s) throws SQLException {
+        Statement stmt = null;
+        ResultSet rs = null;
+        try {
+            /*
+            rs = connection.getMetaData().getSchemas(null, s);
+            if (rs.next()) return;
+            rs.close();
+            rs = null;
+            */
+
+            StringBuilder sbSQL = new StringBuilder("CREATE SCHEMA ");
+            sbSQL.append(s).append(' ');
+            sbSQL.append("AUTHORIZATION ").append(_pgUsername);
+            stmt = connection.createStatement();
+            stmt.executeUpdate(sbSQL.toString());
+
+            sbSQL = new StringBuilder("GRANT ALL ON SCHEMA ");
+            sbSQL.append(s).append(' ');
+            sbSQL.append("TO public");
+            stmt.executeUpdate(sbSQL.toString());
+        } catch (SQLException e) {
+            logger.info("create schema:" + s + " has exception.");
+            logger.info(e.getMessage(), e);
+        } finally {
+            if (rs != null) rs.close();
+            if (stmt != null) stmt.close();
+        }
+    }
+
+    public final void accumulateQueryTime() {
+        queryTime += System.currentTimeMillis() - queryTimeStart;
+    }
+
+    public long getQueryTime() {
+        return queryTime;
+    }
+
+    public final void markQueryTime() {
+        queryTimeStart = System.currentTimeMillis();
+    }
+
+    public final void resetQueryTime() {
+        queryTime = 0;
+    }
+
+    private void convertDynamicColorTheme(AbstractOracleJobContext context, String targetTableBaseName) throws IOException {
+        if (context == null) {
+            getLogger().info("jobContext is null in convertDynamicColorTheme");
+            return;
+        }
+        Connection connection = context.getOracleConnection();
+        Connection connectionPG = targetDataStore.getConnection(Transaction.AUTO_COMMIT);
+
+        boolean found = false;
+        ResultSet rs = null;
+        Statement stmt = null;
+        PreparedStatement pstmt = null;
+        try {
+
+            DefaultColorTable colorTable = (DefaultColorTable) DefaultColorTable.getInstance();
+            String targetTableName = targetTableBaseName + FDYNCOLOR_SUFFIX;
+            logger.info("target table:" + targetTableName);
+            stmt = connection.createStatement(ResultSet.TYPE_FORWARD_ONLY, ResultSet.CONCUR_READ_ONLY);
+            rs = stmt.executeQuery(FETCH_COLORTAB);
+            rs.setFetchSize(50);
+
+            createOrClearTargetTable(connectionPG, targetTableName,
+                    "(tid smallint not null, oid int not null, dyncolor varchar(10) not null)");
+
+            pstmt = connectionPG.prepareStatement("INSERT INTO " +
+                    encodeSchemaTableName(_pgSchema, targetTableName) +
+                    " (tid, oid, dyncolor) VALUES (?, ?, ?)" );
+
+            final int MAX_BATCHSIZE = 50;
+            int count = 0;
+            while (rs.next()) {
+                int cid = rs.getInt(1);
+                long oid = rs.getLong(2);
+                int colorId = rs.getInt(3);
+                String colorText = colorTable.getColorCode(colorId);
+
+                pstmt.setShort(1, (short) cid);
+                pstmt.setInt(2, (int) oid);
+                pstmt.setString(3, colorText);
+                pstmt.addBatch();
+
+                if (count % MAX_BATCHSIZE == 0) {
+                    pstmt.executeBatch();
+                }
+                ++count;
+            }
+
+            pstmt.executeBatch();
+            createTargetTableIndex(connectionPG, targetTableName);
+
+            logger.info("Execute Update Count=" + count);
+        } catch (SQLException e) {
+            logger.info(e.getMessage(), e);
+            throw new IOException(e.getMessage(), e);
+        } finally {
+            JDBCUtils.close(rs);
+            JDBCUtils.close(stmt);
+            JDBCUtils.close(pstmt);
+            JDBCUtils.close(connectionPG, Transaction.AUTO_COMMIT, null);
+        }
+    }
+
+    private void convertPowerOwnerTheme(AbstractOracleJobContext context, String targetTableBaseName) throws IOException {
+        if (context == null) {
+            getLogger().info("jobContext is null in convertPowerOwnerTheme");
+            return;
+        }
+        Connection connection = context.getOracleConnection();
+        Connection connectionPG = targetDataStore.getConnection(Transaction.AUTO_COMMIT);
+
+        boolean found = false;
+        ResultSet rs = null;
+        Statement stmt = null;
+        PreparedStatement pstmt = null;
+        try {
+            connectionPG.setAutoCommit(false);
+            String targetTableName = targetTableBaseName + FOWNER_SUFFIX;
+            logger.info("target table:" + targetTableName);
+            stmt = connection.createStatement(ResultSet.TYPE_FORWARD_ONLY, ResultSet.CONCUR_READ_ONLY);
+            rs = stmt.executeQuery(FETCH_CONNFDR);
+            rs.setFetchSize(50);
+
+            createOrClearTargetTable(connectionPG, targetTableName,
+                    "(tid smallint not null, oid int not null, fowner smallint not null, flow varchar(20) not null)");
+
+            pstmt = connectionPG.prepareStatement("INSERT INTO " +
+                    encodeSchemaTableName(_pgSchema, targetTableName) +
+                    " (tid, oid, fowner, flow) VALUES (?, ?, ?, ?)" );
+
+            final int MAX_BATCHSIZE = 50;
+            int count = 0;
+            while (rs.next()) {
+                int cid = rs.getInt(1);
+                long oid = rs.getLong(2);
+                int ownerId = rs.getInt(3);
+                short dirId = (short) rs.getInt(4);
+                pstmt.setShort(1, (short) cid);
+                pstmt.setInt(2, (int) oid);
+                pstmt.setShort(3, (short) ownerId);
+                ConnectivityDirectionEnum dir = ConnectivityDirectionEnum.convertShort(dirId);
+                if ((ConnectivityDirectionEnum.ForwardflowON == dir) ||
+                        (ConnectivityDirectionEnum.ForwardFixflowON == dir)) {
+                    pstmt.setString(4, "shape://ccarrow");
+
+                } else if ((ConnectivityDirectionEnum.BackflowON == dir) ||
+                        (ConnectivityDirectionEnum.BackFixflowON == dir)) {
+                    pstmt.setString(4, "shape://rccarrow");
+                } else {
+                    pstmt.setString(4, "shape://backslash");
+                }
+                pstmt.addBatch();
+
+                if (count % MAX_BATCHSIZE == 0) {
+                    pstmt.executeBatch();
+                }
+                ++count;
+            }
+
+            pstmt.executeBatch();
+            createTargetTableIndex(connectionPG, targetTableName);
+
+            logger.info("Execute Update Count=" + count);
+        } catch (SQLException e) {
+            logger.info(e.getMessage(), e);
+            throw new IOException(e.getMessage(), e);
+        } finally {
+            JDBCUtils.close(rs);
+            JDBCUtils.close(stmt);
+            JDBCUtils.close(pstmt);
+            JDBCUtils.close(connectionPG, Transaction.AUTO_COMMIT, null);
+        }
+    }
+
+    private void createOrClearTargetTable(Connection connection, String tableName, String sql) throws SQLException {
+        Statement stmt = connection.createStatement();
+        ResultSet rs = null;
+        try {
+            rs = connection.getMetaData().getTables(null, _pgSchema, tableName, new String[]{"TABLE"});
+            if (rs.next()) {
+                stmt.execute("DROP TABLE " + encodeSchemaTableName(_pgSchema, tableName) + "CASCADE");
+            }
+
+            stmt.executeUpdate("CREATE TABLE " + encodeSchemaTableName(_pgSchema, tableName) + " " + sql);
+        } finally {
+            JDBCUtils.close(rs);
+            JDBCUtils.close(stmt);
+        }
+    }
+
+    private void createTargetTableIndex(Connection connection, String tableName) throws SQLException {
+        Statement stmt = connection.createStatement();
+        ResultSet rs = null;
+        try {
+            rs = connection.getMetaData().getTables(null, _pgSchema, tableName, new String[]{"TABLE"});
+            if (rs.next()) {
+                stmt.execute("ALTER TABLE " + encodeSchemaTableName(_pgSchema, tableName) +
+                        " ADD PRIMARY KEY (tid, oid)");
+            }
+        } finally {
+            JDBCUtils.close(rs);
+            JDBCUtils.close(stmt);
+        }
+    }
+
+    private boolean convertDynamicColorThemeWithCopyAPI(AbstractOracleJobContext context, String targetTableBaseName)
+            throws IOException {
+        if (context == null) {
+            getLogger().info("jobContext is null in convertDynamicColorThemeWithCopyAPI");
+            return false;
+        }
+        Connection connection = context.getOracleConnection();
+        Connection connectionPG = targetDataStore.getConnection(Transaction.AUTO_COMMIT);
+        while (connectionPG instanceof DelegatingConnection) {
+            connectionPG = ((DelegatingConnection) connectionPG).getDelegate();
+        }
+
+        if (!(connectionPG instanceof PGConnection)) {
+            return false;
+        }
+
+        final int MAX_BATCHSIZE = 250;
+        ResultSet rs = null;
+        Statement stmt = null;
+        try {
+            // connectionPG.setAutoCommit(false);
+            DefaultColorTable colorTable = (DefaultColorTable) DefaultColorTable.getInstance();
+            String targetTableName = targetTableBaseName + FDYNCOLOR_SUFFIX;
+            String targetTempName = "tmp_" + targetTableName;
+            logger.info("target table:" + targetTableName);
+            stmt = connection.createStatement(ResultSet.TYPE_FORWARD_ONLY, ResultSet.CONCUR_READ_ONLY);
+            rs = stmt.executeQuery(FETCH_COLORTAB);
+            rs.setFetchSize(MAX_BATCHSIZE);
+
+            createOrClearTempTargetTable(connectionPG, targetTempName,
+                    "(tid smallint not null, oid int not null, dyncolor varchar(10) not null)");
+            StringBuilder sb = new StringBuilder();
+
+            CopyManager cpMgr = ((PGConnection) connectionPG).getCopyAPI();
+            PushbackReader reader = new PushbackReader(new StringReader(""), 10240);
+
+            int count = 0;
+            while (rs.next()) {
+                int cid = rs.getInt(1);
+                long oid = rs.getLong(2);
+                int colorId = rs.getInt(3);
+                String colorText = colorTable.getColorCode(colorId);
+
+                sb.append(cid).append(',');
+                sb.append(oid).append(',');
+                sb.append(colorText).append("\n");
+
+                if (count % MAX_BATCHSIZE == 0) {
+                    reader.unread(sb.toString().toCharArray());
+                    cpMgr.copyIn("COPY " + targetTempName + " FROM STDIN WITH CSV", reader);
+                    sb.delete(0, sb.length());
+                }
+                ++count;
+            }
+
+            reader.unread(sb.toString().toCharArray());
+            cpMgr.copyIn("COPY " + targetTempName + " FROM STDIN WITH CSV", reader);
+            createTargetTableIndexAndDropTemp(connectionPG, targetTableName, targetTempName);
+
+            logger.info("Execute Copy Count=" + count);
+        } catch (SQLException e) {
+            logger.info(e.getMessage(), e);
+            throw new IOException(e.getMessage(), e);
+        } finally {
+            JDBCUtils.close(rs);
+            JDBCUtils.close(stmt);
+            JDBCUtils.close(connectionPG, Transaction.AUTO_COMMIT, null);
+        }
+        return true;
+    }
+
+    private boolean convertPowerOwnerThemeWithCopyAPI(AbstractOracleJobContext context, String targetTableBaseName)
+            throws IOException {
+        if (context == null) {
+            getLogger().info("jobContext is null in convertPowerOwnerThemeWithCopyAPI");
+            return false;
+        }
+        Connection connection = context.getOracleConnection();
+        Connection connectionPG = targetDataStore.getConnection(Transaction.AUTO_COMMIT);
+        while (connectionPG instanceof DelegatingConnection) {
+            connectionPG = ((DelegatingConnection) connectionPG).getDelegate();
+        }
+
+        if (!(connectionPG instanceof PGConnection)) {
+            return false;
+        }
+
+        final int MAX_BATCHSIZE = 250;
+        ResultSet rs = null;
+        Statement stmt = null;
+        try {
+            // connectionPG.setAutoCommit(false);
+            String targetTableName = targetTableBaseName + FOWNER_SUFFIX;
+            String targetTempName = "tmp_" + targetTableName;
+            logger.info("target table:" + targetTableName);
+            stmt = connection.createStatement(ResultSet.TYPE_FORWARD_ONLY, ResultSet.CONCUR_READ_ONLY);
+            rs = stmt.executeQuery(FETCH_CONNFDR);
+            rs.setFetchSize(MAX_BATCHSIZE);
+
+            createOrClearTempTargetTable(connectionPG, targetTempName,
+                    "(tid smallint not null, oid int not null, fowner smallint not null, flow varchar(20) not null)");
+
+            StringBuilder sb = new StringBuilder();
+
+            CopyManager cpMgr = ((PGConnection) connectionPG).getCopyAPI();
+            PushbackReader reader = new PushbackReader(new StringReader(""), 10240);
+
+            int count = 0;
+            while (rs.next()) {
+                int cid = rs.getInt(1);
+                long oid = rs.getLong(2);
+                int ownerId = rs.getInt(3);
+                short dirId = (short) rs.getInt(4);
+                String flowMark = null;
+                ConnectivityDirectionEnum dir = ConnectivityDirectionEnum.convertShort(dirId);
+                if ((ConnectivityDirectionEnum.ForwardflowON == dir) ||
+                        (ConnectivityDirectionEnum.ForwardFixflowON == dir)) {
+                    flowMark = FORWARDFLOW_MARK;
+
+                } else if ((ConnectivityDirectionEnum.BackflowON == dir) ||
+                        (ConnectivityDirectionEnum.BackFixflowON == dir)) {
+                    flowMark = BACKFLOW_MARK;
+                } else if (ConnectivityDirectionEnum.Nondeterminate == dir) {
+                    flowMark = NONFLOW_MARK;
+                } else {
+                    flowMark = UNFLOW_MARK;
+                }
+
+                sb.append(cid).append(',');
+                sb.append(oid).append(',');
+                sb.append(ownerId).append(',');
+                sb.append(flowMark).append('\n');
+
+                if (count % MAX_BATCHSIZE == 0) {
+                    reader.unread(sb.toString().toCharArray());
+                    cpMgr.copyIn("COPY " + targetTempName + " FROM STDIN WITH CSV", reader);
+                    sb.delete(0, sb.length());
+                }
+                ++count;
+            }
+
+            reader.unread(sb.toString().toCharArray());
+            cpMgr.copyIn("COPY " + targetTempName + " FROM STDIN WITH CSV", reader);
+            createTargetTableIndexAndDropTemp(connectionPG, targetTableName, targetTempName);
+
+            logger.info("Execute Copy Count=" + count);
+        } catch (SQLException e) {
+            logger.info(e.getMessage(), e);
+            throw new IOException(e.getMessage(), e);
+        } finally {
+            JDBCUtils.close(rs);
+            JDBCUtils.close(stmt);
+            JDBCUtils.close(connectionPG, Transaction.AUTO_COMMIT, null);
+        }
+        return true;
+    }
+
+    private void createOrClearTempTargetTable(Connection connection, String tableName, String sql) throws SQLException {
+        Statement stmt = connection.createStatement();
+        ResultSet rs = null;
+        try {
+            rs = connection.getMetaData().getTables(null, null, tableName, new String[]{"TABLE"});
+            if (rs.next()) {
+                stmt.execute("DROP TABLE " + encodeSchemaTableName(null, tableName) + "CASCADE");
+            }
+
+            stmt.executeUpdate("CREATE TEMP TABLE " + encodeSchemaTableName(null, tableName) + " " + sql);
+        } finally {
+            JDBCUtils.close(rs);
+            JDBCUtils.close(stmt);
+        }
+    }
+
+    private void createTargetTableIndexAndDropTemp(Connection connection, String tableName, String tempTable) throws SQLException {
+        Statement stmt = connection.createStatement();
+        ResultSet rs = null;
+        try {
+            stmt.execute("CREATE TABLE " + tableName +" AS SELECT * FROM " + tempTable);
+            rs = connection.getMetaData().getTables(null, _pgSchema, tableName, new String[]{"TABLE"});
+            if (rs.next()) {
+                stmt.execute("ALTER TABLE " + encodeSchemaTableName(_pgSchema, tableName) +
+                        " ADD PRIMARY KEY (tid, oid)");
+            }
+            stmt.execute("DROP TABLE " + tempTable);
+        } finally {
+            JDBCUtils.close(rs);
+            JDBCUtils.close(stmt);
+        }
+    }
+}
diff --git a/xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/jobs/DummyFeatureConvertJobContext.java b/xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/jobs/DummyFeatureConvertJobContext.java
index 394509b..2dcc60a 100644
--- a/xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/jobs/DummyFeatureConvertJobContext.java
+++ b/xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/jobs/DummyFeatureConvertJobContext.java
@@ -108,7 +108,9 @@
                 AbstractFLinkageDispatchableFilter.getFeatureLinkage(element);
             logger.warn("Unknown Element:" + element.getElementType().toString() +
                 ":type=" + element.getType() + ":lv=" + element.getLevelIndex() + ":id=" +
-                (linkage == null ? "NULL" : "FSC=" + (linkage.getFsc() + "|COMPID=" + linkage.getComponentID())));
+                    (linkage == null ? "NULL" : "FSC=" + (linkage.getFsc() + "|UFID=" + linkage.getUfid() +
+                            "|COMPID=" + linkage.getComponentID())));
+
             if (element instanceof ComplexElement) {
                 ComplexElement complex = (ComplexElement) element;
                 logger.warn("----Complex Element size=" + complex.size());
diff --git a/xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/jobs/GeoserverIntegrateConfigJob.java b/xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/jobs/GeoserverIntegrateConfigJob.java
index 3a7b3d8..cc2a050 100644
--- a/xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/jobs/GeoserverIntegrateConfigJob.java
+++ b/xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/jobs/GeoserverIntegrateConfigJob.java
@@ -245,6 +245,9 @@
                 String viewName = sbView.toString();
                 if (allViewNames.contains(viewName)) {
                     resetThemesPostgisDataView(connection, ownerName, null, viewName);
+                    if (tid == 106) {
+                        resetFlowThemesPostgisDataView(connection, ownerName, null, viewName);
+                    }
                 }
             }
 
@@ -454,6 +457,45 @@
         }
     }
 
+    private void resetFlowThemesPostgisDataView(Connection connection, String ownerName,
+                                            String currentSchema, String viewName) throws SQLException {
+        String themeViewName = viewName + "-flow-oms";
+        ResultSet rs = null;
+        Statement stmt = connection.createStatement();
+
+        try {
+            StringBuilder sbSQL = new StringBuilder("CREATE OR REPLACE VIEW \"");
+            sbSQL.append(themeViewName).append("\" AS SELECT ");
+
+            rs = connection.getMetaData().getColumns(null, currentSchema, viewName, "%");
+            while (rs.next()) {
+                String fieldName = rs.getString("COLUMN_NAME");
+                sbSQL.append("t." + fieldName).append(", ");
+            }
+            sbSQL.append("fc.dyncolor, fo.fowner, fo.flow FROM ");
+            if (currentSchema != null)
+                sbSQL.append("\"").append(currentSchema).append("\".\"").append(viewName).append("\" AS t,");
+            else
+                sbSQL.append("\"").append(viewName).append("\" AS t,");
+            sbSQL.append("xpwtheme").append(FDYNCOLOR_SUFFIX).append(" AS fc,");
+            sbSQL.append("xpwtheme").append(FOWNER_SUFFIX).append(" AS fo WHERE ");
+            sbSQL.append("t.tid = fc.tid AND t.oid = fc.oid AND ");
+            sbSQL.append("t.tid = fo.tid AND t.oid = fo.oid");
+
+            // sbSQL.delete(sbSQL.length() - 2, sbSQL.length());
+            String sql = sbSQL.toString();
+            stmt.execute(sql);
+            sbSQL.delete(0, sbSQL.length());
+
+            PrintfFormat pf = new PrintfFormat(ALTER_VIEWSQL + ownerName);
+            sql = pf.sprintf(themeViewName);
+            stmt.execute(sql);
+        } finally {
+            JDBCUtils.close(rs);
+            JDBCUtils.close(stmt);
+        }
+    }
+
     private HashMap<String, String> retrieveViewDef(Connection connection, String schemaName, String tablePattern) throws SQLException {
         PreparedStatement stmt = connection.prepareStatement(QUERY_VIEWDEFSQL + "'" + tablePattern + "'");
         stmt.setString(1, schemaName);
@@ -563,7 +605,7 @@
 
     private String retrieveCurrentSchemaName(Connection connection, short status) throws SQLException {
         StringBuilder sbSQL = new StringBuilder("SELECT vsschema, vstimestamp, vsstatus FROM ");
-        sbSQL.append(DataReposVersionManager.XGVERSIONTABLE_NAME);
+        sbSQL.append(encodeSchemaTableName(_pgSchema, DataReposVersionManager.XGVERSIONTABLE_NAME));
         sbSQL.append(" WHERE vsstatus = ");
         sbSQL.append(status);
         sbSQL.append(" ORDER BY vsid");
@@ -586,14 +628,14 @@
         }
     }
 
-    private void updateCurrentThemeStatus(Connection connection, String schemaName, short newStatus)
+    private void updateCurrentThemeStatus(Connection connection, String themeTableName, short newStatus)
             throws SQLException {
         StringBuilder sbSQL = new StringBuilder("UPDATE ");
         sbSQL.append(DataReposVersionManager.XPTVERSIONTABLE_NAME).append(' ');
         sbSQL.append(" SET vptstatus = ");
         sbSQL.append(newStatus);
         sbSQL.append(", vpttimestamp = CURRENT_TIMESTAMP WHERE vptname = '");
-        sbSQL.append(schemaName).append("'");
+        sbSQL.append(themeTableName).append("'");
 
         Statement stmt = null;
         try {
@@ -617,8 +659,10 @@
 
     private String retrieveCurrentThemeName(Connection connection, short status) throws SQLException {
         StringBuilder sbSQL = new StringBuilder("SELECT ");
-        sbSQL.append("vptname, vptstatus, vpttimestamp FROM ");
-        sbSQL.append(encodeSchemaTableName(_pgSchema, DataReposVersionManager.XPTVERSIONTABLE_NAME)).append(' ');
+        sbSQL.append("vptname, vpttimestamp, vptstatus FROM ");
+        sbSQL.append(encodeSchemaTableName(_pgSchema, DataReposVersionManager.XPTVERSIONTABLE_NAME));
+        sbSQL.append(" WHERE vptstatus = ");
+        sbSQL.append(status);
         sbSQL.append("ORDER BY vptid");
 
         String result = null;
@@ -661,6 +705,32 @@
         } catch (SQLException e) {
             logger.warn(e.getMessage(), e);
             throw new JobExecutionException("Update " + DataReposVersionManager.XGVERSIONTABLE_NAME +
+                " has error-", e);
+        }
+    }
+
+    protected void transferThemesVersionStatus(Connection connection,
+                                       short vsstatusBefore, short vsstatusAfter, boolean exclusive) throws JobExecutionException {
+
+        try {
+            String currentTargetTheme = retrieveCurrentThemeName(connection, vsstatusBefore);
+            if (currentTargetTheme == null) {
+                logger.info("Cannot found target schema in dataStore. status=" + vsstatusBefore);
+                return;
+            }
+            String existTargetSchema = null;
+            if (exclusive)
+                existTargetSchema = retrieveCurrentThemeName(connection, vsstatusAfter);
+
+
+            updateCurrentThemeStatus(connection, currentTargetTheme, vsstatusAfter);
+            if ((exclusive) && (existTargetSchema != null)) {
+                updateCurrentThemeStatus(connection, existTargetSchema,
+                    DataReposVersionManager.VSSTATUS_AVAILABLE);
+            }
+        } catch (SQLException e) {
+            logger.warn(e.getMessage(), e);
+            throw new JobExecutionException("Update " + DataReposVersionManager.XPTVERSIONTABLE_NAME +
                 " has error-", e);
         }
     }
@@ -827,6 +897,9 @@
             connection = targetDataStore.getConnection(Transaction.AUTO_COMMIT);
             transferXGeosVersionStatus(connection, DataReposVersionManager.VSSTATUS_LINKVIEW,
                                        DataReposVersionManager.VSSTATUS_CONFIG, false);
+            transferThemesVersionStatus(connection, DataReposVersionManager.VSSTATUS_LINKVIEW,
+                DataReposVersionManager.VSSTATUS_CONFIG, false);
+
             URL geoServerURL = new URL(_geoServerURL);
             GeoServerRESTManager manager = new GeoServerRESTManager(geoServerURL, _geoServerUser, _geoServerPass);
             GeoServerRESTReader reader = manager.getReader();
@@ -864,7 +937,9 @@
             resetWMSVirtualLayerMapping(jobExecutionContext, connection, manager, true);
 
             transferXGeosVersionStatus(connection, DataReposVersionManager.VSSTATUS_CONFIG,
-                                       DataReposVersionManager.VSSTATUS_USING, true);
+                DataReposVersionManager.VSSTATUS_USING, true);
+            transferThemesVersionStatus(connection, DataReposVersionManager.VSSTATUS_CONFIG,
+                DataReposVersionManager.VSSTATUS_USING, true);
             Date lastUpdate = Calendar.getInstance().getTime();
         } catch (IOException e) {
             logger.warn(e.getMessage(), e);
diff --git a/xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/jobs/OracleClearExchangeJob.java b/xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/jobs/OracleClearExchangeJob.java
new file mode 100644
index 0000000..9dc6d62
--- /dev/null
+++ b/xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/jobs/OracleClearExchangeJob.java
@@ -0,0 +1,370 @@
+package com.ximple.eofms.jobs;
+
+import java.io.IOException;
+import java.sql.Connection;
+import java.sql.ResultSet;
+import java.sql.SQLException;
+import java.sql.Statement;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.Map;
+import java.util.TreeMap;
+
+import com.ximple.eofms.jobs.context.AbstractOracleJobContext;
+import com.ximple.eofms.jobs.context.postgis.OracleConvertPostGISJobContext;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.geotools.data.DataStore;
+import org.geotools.data.Transaction;
+import org.geotools.data.jdbc.JDBCUtils;
+import org.geotools.data.postgis.PostgisNGDataStoreFactory;
+import org.geotools.jdbc.JDBCDataStore;
+import org.quartz.JobDataMap;
+import org.quartz.JobDetail;
+import org.quartz.JobExecutionContext;
+import org.quartz.JobExecutionException;
+
+public class OracleClearExchangeJob extends AbstractOracleDatabaseJob {
+    final static Log logger = LogFactory.getLog(OracleClearExchangeJob.class);
+
+    public static String FETCH_TPDATA = "SELECT TPID, TPNAME FROM BASEDB.TPDATA";
+
+    private static final String PGHOST = "PGHOST";
+    private static final String PGDATBASE = "PGDATBASE";
+    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 boolean useTpclidText = false;
+
+    private static final int FETCHSIZE = 100;
+    private static final int COMMITSIZE = 100;
+
+    protected static class Pair {
+        Object first;
+        Object second;
+
+        public Pair(Object first, Object second) {
+            this.first = first;
+            this.second = second;
+        }
+    }
+
+    protected static PostgisNGDataStoreFactory dataStoreFactory = new PostgisNGDataStoreFactory();
+
+    protected String _pgHost;
+    protected String _pgDatabase;
+    protected String _pgPort;
+    protected String _pgSchema;
+    protected String _pgUsername;
+    protected String _pgPassword;
+    protected String _pgUseWKB;
+
+    protected Map<String, String> pgProperties;
+    protected JDBCDataStore targetDataStore;
+
+    private long queryTime = 0;
+    private long queryTimeStart = 0;
+
+    protected void extractJobConfiguration(JobDetail jobDetail) throws JobExecutionException {
+        super.extractJobConfiguration(jobDetail);
+        JobDataMap dataMap = jobDetail.getJobDataMap();
+        _pgHost = dataMap.getString(PGHOST);
+        _pgDatabase = dataMap.getString(PGDATBASE);
+        _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=" + _myHost);
+        logger.info("PGDATBASE=" + _myDatabase);
+        logger.info("PGPORT=" + _myPort);
+        logger.info("PGSCHEMA=" + _mySchema);
+        logger.info("PGUSER=" + _myUsername);
+        logger.info("PGPASS=" + _myPassword);
+        logger.info("USEWKB=" + _myUseWKB);
+        */
+
+        if (_pgHost == null) {
+            logger.warn("PGHOST is null");
+            throw new JobExecutionException("Unknown PostGIS host.");
+        }
+        if (_pgDatabase == null) {
+            logger.warn("PGDATABASE is null");
+            throw new JobExecutionException("Unknown PostGIS database.");
+        }
+        if (_pgPort == null) {
+            logger.warn("PGPORT is null");
+            throw new JobExecutionException("Unknown PostGIS port.");
+        }
+        if (_pgSchema == null) {
+            logger.warn("PGSCHEMA is null");
+            throw new JobExecutionException("Unknown PostGIS schema.");
+        }
+        if (_pgUsername == null) {
+            logger.warn("PGUSERNAME is null");
+            throw new JobExecutionException("Unknown PostGIS username.");
+        }
+        if (_pgPassword == null) {
+            logger.warn("PGPASSWORD is null");
+            throw new JobExecutionException("Unknown PostGIS password.");
+        }
+
+        Map<String, String> remote = new TreeMap<String, String>();
+        remote.put(PostgisNGDataStoreFactory.DBTYPE.key, "postgis");
+        // remote.put("charset", "UTF-8");
+        remote.put(PostgisNGDataStoreFactory.HOST.key, _pgHost);
+        remote.put(PostgisNGDataStoreFactory.PORT.key, _pgPort);
+        remote.put(PostgisNGDataStoreFactory.DATABASE.key, _pgDatabase);
+        remote.put(PostgisNGDataStoreFactory.USER.key, _pgUsername);
+        remote.put(PostgisNGDataStoreFactory.PASSWD.key, _pgPassword);
+        // remote.put( "namespace", null);
+        pgProperties = remote;
+    }
+
+    @Override
+    public Log getLogger() {
+        return logger;
+    }
+
+    @Override
+    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.getKey().getName();
+
+        // Log the time the job started
+        logger.info(jobName + " fired at " + new Date());
+        extractJobConfiguration(jobDetail);
+
+        createSourceDataStore();
+        if (getSourceDataStore() == null) {
+            logger.warn("Cannot connect source oracle database.");
+            throw new JobExecutionException("Cannot connect source oracle database.");
+        }
+
+        if (isProfileMode()) {
+            queryTime = 0;
+        }
+
+        long t1 = System.currentTimeMillis();
+        String targetSchemaName;
+        try {
+            logger.info("-- step:clearOutputDatabase --");
+            clearOutputDatabase();
+
+            logger.info("-- step:transformOracleDMMSDB --");
+            targetSchemaName = "";
+
+            OracleConvertPostGISJobContext jobContext =
+                (OracleConvertPostGISJobContext) prepareJobContext(targetSchemaName, _filterPath,
+                    isProfileMode(), isTransformed());
+            jobContext.setSourceDataStore(getSourceDataStore());
+            jobContext.setExecutionContext(context);
+
+            long tStep = System.currentTimeMillis();
+
+            fetchTPData(jobContext);
+            logger.info("TPC DIST:" + jobContext.getDistId() + ":" +
+                ((jobContext.getDistName() == null) ? "NULL" : jobContext.getDistName()));
+
+            clearExchangeData(jobContext);
+
+            if (isProfileMode()) {
+                long tStepEnd = System.currentTimeMillis();
+                logTimeDiff("Profile-Merge Connectivity Owner", tStep, tStepEnd);
+            }
+
+            tStep = System.currentTimeMillis();
+
+            if (isProfileMode()) {
+                long tStepEnd = System.currentTimeMillis();
+                logTimeDiff("Profile-Merge ColorTable", tStep, tStepEnd);
+            }
+
+            jobContext.closeOracleConnection();
+
+            long t2 = System.currentTimeMillis();
+            // public static final String DATE_FORMAT_NOW = "yyyy-MM-dd HH:mm:ss";
+            // SimpleDateFormat sdf = new SimpleDateFormat(DATE_FORMAT_NOW);
+            logTimeDiff("Total ", t1, t2);
+
+        } catch (SQLException e) {
+            disconnect();
+            logger.warn(e.getMessage(), e);
+            throw new JobExecutionException("Database error. " + e.getMessage(), e);
+        } catch (IOException ex) {
+            disconnect();
+            logger.warn(ex.getMessage(), ex);
+            throw new JobExecutionException("IO error. " + ex.getMessage(), ex);
+        } finally {
+            disconnect();
+        }
+        logger.warn(jobName + " end at " + new Date());
+    }
+
+    private void clearExchangeData(OracleConvertPostGISJobContext jobContext) throws SQLException, IOException {
+        Connection connection = jobContext.getOracleConnection();
+
+        ResultSet rsMeta = connection.getMetaData().getTables(null, "CMMS_POSTDB", "GEO_EXCHANGE",
+            new String[]{"TABLE"});
+
+        boolean found = false;
+        try {
+            while (rsMeta.next()) {
+                found = true;
+                break;
+            }
+            // } catch (SQLException e)
+        } finally {
+            if (rsMeta != null) {
+                rsMeta.close();
+                rsMeta = null;
+            }
+        }
+
+        if (!found) {
+            logger.info("Cannot Found GEO_EXCHANGE in CMMS_POSTDB.");
+            return;
+        }
+
+        Statement stmt = null;
+        try {
+            stmt = connection.createStatement();
+            int count = stmt.executeUpdate("DELETE FROM \"CMMS_POSTDB\".\"GEO_EXCHANGE\" WHERE ISEXCHANGE=1");
+            logger.info("DELETE GEO_EXCHANGE UPDATE SIZE=" + count);
+        } finally {
+            JDBCUtils.close(stmt);
+        }
+    }
+
+    @Override
+    protected AbstractOracleJobContext prepareJobContext(String targetSchemaName, String filterPath, boolean profileMode, boolean useTransform) {
+        return new OracleConvertPostGISJobContext(getDataPath(),
+            getTargetDataStore(), targetSchemaName, filterPath, profileMode, useTransform);
+    }
+
+    private void logTimeDiff(String message, long tBefore, long tCurrent) {
+        logger.warn(message + ":use time = " + ((int) ((tCurrent - tBefore) / 60000.0)) + " min - " +
+            (((int) ((tCurrent - tBefore) % 60000.0)) / 1000) + " sec");
+    }
+
+    public DataStore getTargetDataStore() {
+        return targetDataStore;
+    }
+
+    protected void createTargetDataStore() throws JobExecutionException {
+        if (targetDataStore != null) {
+            targetDataStore.dispose();
+            targetDataStore = null;
+        }
+
+        if (!pgProperties.containsKey(PostgisNGDataStoreFactory.MAXCONN.key)) {
+            pgProperties.put(PostgisNGDataStoreFactory.MAXCONN.key, "5");
+        }
+
+        if (!pgProperties.containsKey(PostgisNGDataStoreFactory.MINCONN.key)) {
+            pgProperties.put(PostgisNGDataStoreFactory.MINCONN.key, "1");
+        }
+
+        if (!dataStoreFactory.canProcess(pgProperties)) {
+            getLogger().warn("cannot process properties-");
+            throw new JobExecutionException("cannot process properties-");
+        }
+        try {
+            targetDataStore = dataStoreFactory.createDataStore(pgProperties);
+        } catch (IOException e) {
+            getLogger().warn(e.getMessage(), e);
+            throw new JobExecutionException(e.getMessage(), e);
+        }
+    }
+
+    protected void disconnect() {
+        super.disconnect();
+        if (targetDataStore != null) {
+            targetDataStore.dispose();
+            targetDataStore = null;
+        }
+    }
+
+    private String determineTargetSchemaName() throws IOException {
+        if (targetDataStore == null) return null;
+        Connection connection = null;
+        Statement stmt = null;
+        ResultSet rs = null;
+        String targetSchema = null;
+        boolean needCreate = false;
+        try {
+            connection = targetDataStore.getConnection(Transaction.AUTO_COMMIT);
+            rs = connection.getMetaData().getTables(null, _pgSchema, DataReposVersionManager.XGVERSIONTABLE_NAME, new String[]{"TABLE"});
+            if (!rs.next()) needCreate = true;
+            if (needCreate) {
+                throw new IOException("cannot found " + DataReposVersionManager.XGVERSIONTABLE_NAME);
+            }
+            rs.close();
+            rs = null;
+
+            StringBuilder sbSQL = new StringBuilder("SELECT ");
+            sbSQL.append("vsschema, vsstatus FROM ");
+            sbSQL.append(encodeSchemaTableName(_pgSchema, DataReposVersionManager.XGVERSIONTABLE_NAME)).append(' ');
+            sbSQL.append("ORDER BY vsid");
+            stmt = connection.createStatement();
+            rs = stmt.executeQuery(sbSQL.toString());
+            ArrayList<Object[]> tmpSchemas = new ArrayList<Object[]>();
+            int i = 0;
+            int current = -1;
+            while (rs.next()) {
+                Object[] values = new Object[2];
+                values[0] = rs.getString("vsschema");
+                values[1] = rs.getShort("vsstatus");
+                tmpSchemas.add(values);
+                if ((((Short) values[1]) & DataReposVersionManager.VSSTATUS_USING) != 0) {
+                    current = i;
+                }
+                i++;
+            }
+
+            if (current != -1) {
+                Object[] values = tmpSchemas.get(current);
+                targetSchema = (String) values[0];
+            }
+        } catch (SQLException e) {
+            logger.warn(e.getMessage(), e);
+        } finally {
+            JDBCUtils.close(rs);
+            JDBCUtils.close(stmt);
+            JDBCUtils.close(connection, Transaction.AUTO_COMMIT, null);
+        }
+        return targetSchema;
+    }
+
+    public String encodeSchemaTableName(String schemaName, String tableName) {
+        return "\"" + schemaName + "\".\"" + tableName + "\"";
+    }
+
+    public final void accumulateQueryTime() {
+        queryTime += System.currentTimeMillis() - queryTimeStart;
+    }
+
+    public long getQueryTime() {
+        return queryTime;
+    }
+
+    public final void markQueryTime() {
+        queryTimeStart = System.currentTimeMillis();
+    }
+
+    public final void resetQueryTime() {
+        queryTime = 0;
+    }
+
+    private void clearOutputDatabase() {
+    }
+}
diff --git a/xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/jobs/OracleConvertDgn2PostGISJob.java b/xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/jobs/OracleConvertDgn2PostGISJob.java
index 9bbfe1c..93b1a89 100644
--- a/xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/jobs/OracleConvertDgn2PostGISJob.java
+++ b/xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/jobs/OracleConvertDgn2PostGISJob.java
@@ -317,6 +317,7 @@
                     }
                 }
 
+                clearExchangeData(jobContext);
                 jobContext.closeOracleConnection();
             }
 
@@ -386,6 +387,41 @@
     private void logTimeDiff(String message, long tBefore, long tCurrent) {
         logger.warn(message + ":use time = " + ((int) ((tCurrent - tBefore) / 60000.0)) + " min - " +
             (((int) ((tCurrent - tBefore) % 60000.0)) / 1000) + " sec");
+    }
+
+    private void clearExchangeData(OracleConvertPostGISJobContext jobContext) throws SQLException, IOException {
+        Connection connection = jobContext.getOracleConnection();
+
+        ResultSet rsMeta = connection.getMetaData().getTables(null, "CMMS_POSTDB", "GEO_EXCHANGE",
+            new String[]{"TABLE"});
+
+        boolean found = false;
+        try {
+            while (rsMeta.next()) {
+                found = true;
+                break;
+            }
+            // } catch (SQLException e)
+        } finally {
+            if (rsMeta != null) {
+                rsMeta.close();
+                rsMeta = null;
+            }
+        }
+
+        if (!found) {
+            logger.info("Cannot Found GEO_EXCHANGE in CMMS_POSTDB.");
+            return;
+        }
+
+        Statement stmt = null;
+        try {
+            stmt = connection.createStatement();
+            int count = stmt.executeUpdate("UPDATE \"CMMS_POSTDB\".\"GEO_EXCHANGE\" SET ISEXCHANGE=1 WHERE ISEXCHANGE=0");
+            logger.info("GEO_EXCHANGE UPDATE SIZE=" + count);
+        } finally {
+            JDBCUtils.close(stmt);
+        }
     }
 
     private void exetcuteConvert(OracleConvertPostGISJobContext jobContext,
@@ -1310,7 +1346,7 @@
                 values[0] = rs.getString("vptname");
                 values[1] = rs.getShort("vptstatus");
                 tmpTablenames.add(values);
-                if ((((Short) values[1]) & DataReposVersionManager.VSSTATUS_USING) != 0) {
+                if (((Short) values[1]) >= DataReposVersionManager.VSSTATUS_LINKVIEW) {
                     current = i;
                 }
                 i++;
@@ -1887,11 +1923,23 @@
         Statement stmt = connection.createStatement();
         ResultSet rs = null;
         try {
-            stmt.execute("CREATE TABLE " + tableName +" AS SELECT * FROM " + tempTable);
+            boolean found = false;
             rs = connection.getMetaData().getTables(null, _pgSchema, tableName, new String[]{"TABLE"});
             if (rs.next()) {
-                stmt.execute("ALTER TABLE " + encodeSchemaTableName(_pgSchema, tableName) +
-                    " ADD PRIMARY KEY (tid, oid)");
+                found = true;
+            }
+            JDBCUtils.close(rs);
+
+            if (!found) {
+                stmt.execute("CREATE TABLE " + tableName +" AS SELECT * FROM " + tempTable);
+                rs = connection.getMetaData().getTables(null, _pgSchema, tableName, new String[]{"TABLE"});
+                if (rs.next()) {
+                    stmt.execute("ALTER TABLE " + encodeSchemaTableName(_pgSchema, tableName) +
+                        " ADD PRIMARY KEY (tid, oid)");
+                }
+            } else {
+                stmt.execute("TRUNCATE "+ tableName + " CASCADE");
+                stmt.execute("SELECT * INTO " + tableName + " FROM " + tempTable);
             }
             stmt.execute("DROP TABLE " + tempTable);
         } finally {
diff --git a/xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/jobs/OracleConvertThemes2PostGISJob.java b/xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/jobs/OracleConvertThemes2PostGISJob.java
new file mode 100644
index 0000000..8cdc8ab
--- /dev/null
+++ b/xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/jobs/OracleConvertThemes2PostGISJob.java
@@ -0,0 +1,1325 @@
+package com.ximple.eofms.jobs;
+
+import java.io.IOException;
+import java.io.PushbackReader;
+import java.io.StringReader;
+import java.net.URL;
+import java.sql.Connection;
+import java.sql.DatabaseMetaData;
+import java.sql.PreparedStatement;
+import java.sql.ResultSet;
+import java.sql.SQLException;
+import java.sql.Statement;
+import java.sql.Timestamp;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.TreeMap;
+import java.util.TreeSet;
+
+import com.ximple.eofms.geoserver.config.XGeosDataConfig;
+import com.ximple.eofms.geoserver.config.XGeosDataConfigMapping;
+import com.ximple.eofms.jobs.context.AbstractOracleJobContext;
+import com.ximple.eofms.jobs.context.postgis.OracleConvertPostGISJobContext;
+import com.ximple.eofms.util.ConnectivityDirectionEnum;
+import com.ximple.eofms.util.DefaultColorTable;
+import com.ximple.eofms.util.PrintfFormat;
+import com.ximple.eofms.util.XGeosConfigDigesterUtils;
+import org.apache.commons.collections.MultiMap;
+import org.apache.commons.dbcp.DelegatingConnection;
+import org.apache.commons.digester3.Digester;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.geotools.data.DataStore;
+import org.geotools.data.Transaction;
+import org.geotools.data.jdbc.JDBCUtils;
+import org.geotools.data.postgis.PostgisNGDataStoreFactory;
+import org.geotools.jdbc.JDBCDataStore;
+import org.postgresql.PGConnection;
+import org.postgresql.copy.CopyManager;
+import org.quartz.JobDataMap;
+import org.quartz.JobDetail;
+import org.quartz.JobExecutionContext;
+import org.quartz.JobExecutionException;
+import org.xml.sax.SAXException;
+
+public class OracleConvertThemes2PostGISJob extends AbstractOracleDatabaseJob {
+    final static Log logger = LogFactory.getLog(GeoserverIntegrateConfigJob.class);
+
+    private static final String SKIPCONFIGJOB = "SKIPCONFIGJOB";
+    private static final String MASTERMODE = "MASTERMODE";
+    private static final String EPSG = "EPSG:";
+    private static final String XGEOSDATACONFIG_PATH = "xgeosdataconfig.xml";
+
+    // private static final int MAGIC_BLOCKSIZE = (64 * 1024 * 1024) - (32 * 1024);
+
+    private static final String QUERY_VIEWDEFSQL = "SELECT table_name, view_definition FROM information_schema.views " +
+            "WHERE table_schema = ? AND table_name LIKE ";
+
+    private static final String CREATE_VIEWSQL = "CREATE OR REPLACE VIEW \"%s\" AS SELECT * FROM \"%s\".\"%s\"";
+    private static final String EXTRAWHERE_VIEWSQL = " WHERE \"%s\".level = %s AND \"%s\".symweight = %s";
+
+    private static final String ALTER_VIEWSQL = "ALTER TABLE \"%s\" OWNER TO ";
+    // private static final String GRANT_VIEWSQL = "GRANT SELECT ON TABLE \"%s\" TO public";
+    private static final int SRSID_TWD97_ZONE119 = 3825;
+    private static final int SRSID_TWD97_ZONE121 = 3826;
+    public static final String DEFAULT_STORENAME = "pgDMMS";
+    public static final String DEFAULT_GEODMMS_NAMESPACE = "http://tpc.ximple.com.tw/geodmms";
+
+    private static final String PGHOST = "PGHOST";
+    private static final String PGDATBASE = "PGDATBASE";
+    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 boolean useTpclidText = false;
+
+    private static final int FETCHSIZE = 30;
+    private static final int COMMITSIZE = 100;
+
+    public static final String FORWARDFLOW_MARK = "shape://ccarrow";
+    public static final String BACKFLOW_MARK = "shape://rccarrow";
+    public static final String UNFLOW_MARK = "shape://backslash";
+    public static final String NONFLOW_MARK = "shape://slash";
+
+    private static String FETCH_CONNFDR = "SELECT FSC, UFID, FDR1, DIR FROM BASEDB.CONNECTIVITY ORDER BY FSC";
+    private static String FETCH_COLORTAB = "SELECT TAG_SFSC, TAG_LUFID, COLOR FROM OCSDB.COLOR WHERE TAG_BCOMPID = 0 ORDER BY TAG_SFSC";
+
+    private static String CREATE_OWNERTABLE = "CREATE TABLE s (tid smallint not null, oid int not null, owner smallint not null)";
+    private static String CREATE_COLORTABLE = "CREATE TABLE s (tid smallint not null, oid int not null, dyncolor varchar(10) not null)";
+
+    public static final String FDYNCOLOR_SUFFIX = "_fdyncolor";
+    public static final String FOWNER_SUFFIX = "_fowner";
+
+    private static XGeosDataConfigMapping xgeosDataConfigMapping = null;
+    protected JDBCDataStore targetDataStore;
+    protected Map<String, String> pgProperties;
+
+    protected static PostgisNGDataStoreFactory dataStoreFactory = new PostgisNGDataStoreFactory();
+
+    protected String _pgHost;
+    protected String _pgDatabase;
+    protected String _pgPort;
+    protected String _pgSchema;
+    protected String _pgUsername;
+    protected String _pgPassword;
+    protected String _pgUseWKB;
+
+    private long queryTime = 0;
+    private long queryTimeStart = 0;
+    private String currentThemeTable = null;
+    private Short currentThemeStatus = -1;
+
+    public Log getLogger() {
+        return logger;
+    }
+
+    protected AbstractOracleJobContext prepareJobContext(String targetSchemaName, String filterPath,
+                                                         boolean profileMode,
+                                                         boolean useTransform) {
+        return new OracleConvertPostGISJobContext(getDataPath(),
+            getTargetDataStore(), targetSchemaName, filterPath, profileMode, useTransform);
+    }
+
+    protected void extractJobConfiguration(JobDetail jobDetail) throws JobExecutionException {
+        super.extractJobConfiguration(jobDetail);
+
+        JobDataMap dataMap = jobDetail.getJobDataMap();
+        _pgHost = dataMap.getString(PGHOST);
+        _pgDatabase = dataMap.getString(PGDATBASE);
+        _pgPort = dataMap.getString(PGPORT);
+        _pgSchema = dataMap.getString(PGSCHEMA);
+        _pgUsername = dataMap.getString(PGUSER);
+        _pgPassword = dataMap.getString(PGPASS);
+        _pgUseWKB = dataMap.getString(USEWKB);
+
+        Log logger = getLogger();
+        if (_pgHost == null) {
+            logger.warn("PGHOST is null");
+            throw new JobExecutionException("Unknown PostGIS host.");
+        }
+        if (_pgDatabase == null) {
+            logger.warn("PGDATABASE is null");
+            throw new JobExecutionException("Unknown PostGIS database.");
+        }
+        if (_pgPort == null) {
+            logger.warn("PGPORT is null");
+            throw new JobExecutionException("Unknown PostGIS port.");
+        }
+        if (_pgSchema == null) {
+            logger.warn("PGSCHEMA is null");
+            throw new JobExecutionException("Unknown PostGIS schema.");
+        }
+        if (_pgUsername == null) {
+            logger.warn("PGUSERNAME is null");
+            throw new JobExecutionException("Unknown PostGIS username.");
+        }
+        if (_pgPassword == null) {
+            logger.warn("PGPASSWORD is null");
+            throw new JobExecutionException("Unknown PostGIS password.");
+        }
+
+        Map<String, String> remote = new TreeMap<String, String>();
+        remote.put(PostgisNGDataStoreFactory.DBTYPE.key, "postgis");
+        // remote.put("charset", "UTF-8");
+        remote.put(PostgisNGDataStoreFactory.HOST.key, _pgHost);
+        remote.put(PostgisNGDataStoreFactory.PORT.key, _pgPort);
+        remote.put(PostgisNGDataStoreFactory.DATABASE.key, _pgDatabase);
+        remote.put(PostgisNGDataStoreFactory.USER.key, _pgUsername);
+        remote.put(PostgisNGDataStoreFactory.PASSWD.key, _pgPassword);
+        // remote.put( "namespace", null);
+        pgProperties = remote;
+    }
+
+    protected XGeosDataConfigMapping getConfigMapping() {
+        if (xgeosDataConfigMapping == null) {
+            Digester digester = XGeosConfigDigesterUtils.getXGeosConfigDigester();
+            final URL configDataURL = XGeosDataConfigMapping.class.getResource(XGEOSDATACONFIG_PATH);
+            try {
+                xgeosDataConfigMapping = (XGeosDataConfigMapping) digester.parse(configDataURL);
+            } catch (IOException e) {
+                logger.warn(e.getMessage(), e);
+            } catch (SAXException e) {
+                logger.warn(e.getMessage(), e);
+            }
+
+        }
+        return xgeosDataConfigMapping;
+    }
+
+    private void logTimeDiff(String message, long tBefore, long tCurrent) {
+        logger.warn(message + ":use time = " + ((int) ((tCurrent - tBefore) / 60000.0)) + " min - " +
+                (((int) ((tCurrent - tBefore) % 60000.0)) / 1000) + " sec");
+    }
+
+    @Override
+    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.getKey().getName();
+
+        // Log the time the job started
+        logger.info(jobName + " fired at " + new Date());
+        extractJobConfiguration(jobDetail);
+
+        createSourceDataStore();
+        createTargetDataStore();
+        if (getSourceDataStore() == null) {
+            logger.warn("Cannot connect source oracle database.");
+            throw new JobExecutionException("Cannot connect source oracle database.");
+        }
+
+        if (getTargetDataStore() == null) {
+            logger.warn("Cannot connect source postgreSQL database.");
+            throw new JobExecutionException("Cannot connect source postgreSQL database.");
+        }
+
+        if (isProfileMode()) {
+            queryTime = 0;
+        }
+
+        long t1 = System.currentTimeMillis();
+        String targetThemeTable;
+        try {
+            logger.info("-- step:clearOutputDatabase --");
+
+            OracleConvertPostGISJobContext jobContext = null;
+
+            if (checkConvertPWThemes()) {
+                targetThemeTable = determineTargetThemeTableName();
+                jobContext = (OracleConvertPostGISJobContext) prepareJobContext("public", _filterPath,
+                        isProfileMode(), isTransformed());
+                jobContext.setSourceDataStore(getSourceDataStore());
+                jobContext.setElementLogging(checkElementLogging());
+                jobContext.setExecutionContext(context);
+
+                long tStep = System.currentTimeMillis();
+                if (!convertPowerOwnerThemeWithCopyAPI(jobContext, targetThemeTable)) {
+                    convertPowerOwnerTheme(jobContext, targetThemeTable);
+                }
+                if (isProfileMode()) {
+                    long tStepEnd = System.currentTimeMillis();
+                    logTimeDiff("Profile-convertFeatureDesignFile", tStep, tStepEnd);
+                }
+                tStep = System.currentTimeMillis();
+                if (!convertDynamicColorThemeWithCopyAPI(jobContext, targetThemeTable))
+                    convertDynamicColorTheme(jobContext, targetThemeTable);
+                if (isProfileMode()) {
+                    long tStepEnd = System.currentTimeMillis();
+                    logTimeDiff("Profile-convertFeatureDesignFile", tStep, tStepEnd);
+                }
+                jobContext.closeOracleConnection();
+
+                updatePWThemeStatusToReady(targetThemeTable);
+            }
+
+            long t2 = System.currentTimeMillis();
+            // public static final String DATE_FORMAT_NOW = "yyyy-MM-dd HH:mm:ss";
+            // SimpleDateFormat sdf = new SimpleDateFormat(DATE_FORMAT_NOW);
+            logTimeDiff("Total ", t1, t2);
+
+        } catch (IOException ex) {
+            disconnect();
+            logger.warn(ex.getMessage(), ex);
+            throw new JobExecutionException("IO error. " + ex.getMessage(), ex);
+        } finally {
+            disconnect();
+        }
+        logger.warn(jobName + " end at " + new Date());
+
+
+        createTargetDataStore();
+        if (getTargetDataStore() == null) {
+            logger.warn("Cannot connect source postgreSQL database.");
+            throw new JobExecutionException("Cannot connect source postgreSQL database.");
+        }
+
+        try {
+            logger.info("-- step:resetThemesViewMapping --");
+            long tStep = System.currentTimeMillis();
+            resetThemesViewMapping(context);
+            if (isProfileMode()) {
+                long tStepEnd = System.currentTimeMillis();
+                logTimeDiff("Profile-resetThemesViewMapping", tStep, tStepEnd);
+            }
+            logger.info("-- step:resetGeoServerConfig --");
+            tStep = System.currentTimeMillis();
+            // resetGeoServerConfig(jobExecutionContext);
+            if (isProfileMode()) {
+                long tStepEnd = System.currentTimeMillis();
+                logTimeDiff("Profile-resetGeoServerConfig", tStep, tStepEnd);
+            }
+        } finally {
+            disconnect();
+        }
+    }
+
+    /**
+     * 重新建立所有重新建立所有PostGIS中的資料庫視景
+     *
+     * @param executionContext 批次執行的關係
+     */
+    private void resetThemesViewMapping(JobExecutionContext executionContext) throws JobExecutionException {
+        assert executionContext != null;
+        Connection connection = null;
+        try {
+            connection = targetDataStore.getConnection(Transaction.AUTO_COMMIT);
+            String ownerName = _pgUsername;
+
+            String currentTargetThemesName = retrieveCurrentThemeName(connection,
+                DataReposVersionManager.VSSTATUS_READY);
+            if (currentTargetThemesName == null) {
+                logger.info("Cannot found themes that status is VSSTATUS_READY[" +
+                    DataReposVersionManager.VSSTATUS_READY + "]");
+                return;
+            }
+
+            ArrayList<String> realTableNames = new ArrayList<String>();
+            retrieveAllRealTableName(connection, currentTargetThemesName, realTableNames);
+
+            resetThemesBaseView(connection, ownerName, currentTargetThemesName);
+
+            if (currentThemeTable == null) {
+                transferThemesVersionStatus(DataReposVersionManager.VSSTATUS_READY,
+                    DataReposVersionManager.VSSTATUS_LINKVIEW, false);
+            } else {
+                transferThemesVersionStatus(DataReposVersionManager.VSSTATUS_READY,
+                    currentThemeStatus, true);
+            }
+
+            /*
+            updateCurrentThemeStatus(connection, currentTargetThemesName,
+                DataReposVersionManager.VSSTATUS_LINKVIEW);
+            */
+
+            // String[] featureNames = dataStore.getTypeNames();
+            // logger.info("featureNames[] size = " + featureNames.length);
+        } catch (IOException e) {
+            logger.warn(e.getMessage(), e);
+        } catch (SQLException e) {
+            logger.warn(e.getMessage(), e);
+        } finally {
+            if (connection != null)
+                JDBCUtils.close(connection, Transaction.AUTO_COMMIT, null);
+            // if (dataStore != null) dataStore.dispose();
+        }
+    }
+
+    private void retrieveAllRealTableName(Connection connection, String targetSchema,
+                                          ArrayList<String> realTableNames) throws SQLException {
+        ResultSet rsMeta = null;
+        try {
+            rsMeta = connection.getMetaData().getTables("", targetSchema, "fsc%", new String[]{"TABLE"});
+            while (rsMeta.next()) {
+                String tableName = rsMeta.getString(3);
+                realTableNames.add(tableName);
+            }
+            rsMeta.close();
+            rsMeta = null;
+
+            rsMeta = connection.getMetaData().getTables("", targetSchema, "index%", new String[]{"TABLE"});
+            while (rsMeta.next()) {
+                String tableName = rsMeta.getString(3);
+                realTableNames.add(tableName);
+            }
+            rsMeta.close();
+            rsMeta = null;
+
+            rsMeta = connection.getMetaData().getTables("", targetSchema, "lndtpc%", new String[]{"TABLE"});
+            while (rsMeta.next()) {
+                String tableName = rsMeta.getString(3);
+                realTableNames.add(tableName);
+            }
+        } finally {
+            if (rsMeta != null) rsMeta.close();
+        }
+    }
+
+    private void resetPostgisDataView(Connection connection, HashMap<String, String> viewDefs,
+                                      String ownerName, String schemaName, String tableName) throws SQLException {
+        String[] splits = tableName.split("-");
+        if (splits.length > 3) {
+            // feature table
+
+            StringBuilder viewBuilder = new StringBuilder();
+            viewBuilder.append(splits[0]);
+            viewBuilder.append('-');
+            viewBuilder.append(splits[1]);
+            viewBuilder.append('-');
+            viewBuilder.append(splits[2]);
+            viewBuilder.append(splits[3]);
+            String viewName = viewBuilder.toString();
+            if (viewDefs.containsKey(viewName)) {
+                String viewDef = viewDefs.get(viewName);
+                int pos = viewDef.indexOf("FROM");
+                String subView = viewDef.substring(pos + 4);
+                // String[] viewSources = subView.split("\\.");
+                String[] viewSources = subView.split("(\\.\"|\")");
+                if (!viewSources[0].equalsIgnoreCase(schemaName)) {
+                    createOrReplaceView(connection, schemaName, tableName, viewName, ownerName);
+                }
+            } else {
+                createOrReplaceView(connection, schemaName, tableName, viewName, ownerName);
+            }
+
+        } else {
+
+            splits = tableName.split("_");
+            if (splits.length > 0) {
+                StringBuilder viewBuilder = new StringBuilder();
+                viewBuilder.append(splits[0]);
+                if (splits.length > 1) viewBuilder.append(splits[1]);
+                if (splits.length > 2) viewBuilder.append(splits[2]);
+                String viewName = viewBuilder.toString();
+                if (viewDefs.containsKey(viewName)) {
+                    String viewDef = viewDefs.get(viewName);
+                    int pos = viewDef.indexOf("FROM");
+                    String subView = viewDef.substring(pos + 4);
+                    String[] viewSources = subView.split("(\\.\"|\")");
+                    if (!viewSources[0].equalsIgnoreCase(schemaName)) {
+                        createOrReplaceView(connection, schemaName, tableName, viewName, ownerName);
+                    }
+                } else {
+                    createOrReplaceView(connection, schemaName, tableName, viewName, ownerName);
+                }
+            }
+        }
+    }
+
+    private void resetThemesBaseView(Connection connection, String ownerName, String currentThemesName)
+            throws SQLException {
+        String viewName = "xpwtheme" + FDYNCOLOR_SUFFIX;
+        String tableName = currentThemesName + FDYNCOLOR_SUFFIX;
+        PrintfFormat pf = new PrintfFormat("CREATE OR REPLACE VIEW \"%s\" AS SELECT * FROM \"%s\"");
+        String sql = pf.sprintf(new Object[]{viewName, tableName});
+        Statement stmt = connection.createStatement();
+        try {
+            stmt.execute(sql);
+            pf = new PrintfFormat(ALTER_VIEWSQL + ownerName);
+            sql = pf.sprintf(viewName);
+            stmt.execute(sql);
+
+            viewName = "xpwtheme" + FOWNER_SUFFIX;
+            tableName = currentThemesName + FOWNER_SUFFIX;
+            pf = new PrintfFormat("CREATE OR REPLACE VIEW \"%s\" AS SELECT * FROM \"%s\"");
+            sql = pf.sprintf(new Object[]{viewName, tableName});
+
+            stmt.execute(sql);
+            pf = new PrintfFormat(ALTER_VIEWSQL + ownerName);
+            sql = pf.sprintf(viewName);
+            stmt.execute(sql);
+        } catch (SQLException e) {
+            // logger.warn(e.getMessage(), e);
+            logger.info(sql == null ? "SQL=NULL" : "SQL=" + sql);
+            throw e;
+        } finally {
+            stmt.close();
+        }
+    }
+
+
+    private void resetThemesPostgisDataView(Connection connection, String ownerName,
+                                            String currentSchema, String viewName) throws SQLException {
+        String themeViewName = viewName + "-oms";
+        // PrintfFormat pf = new PrintfFormat(CREATE_VIEWSQL);
+        // String sql = pf.sprintf(new Object[]{viewName, schemaName, tableName});
+        ResultSet rs = null;
+        Statement stmt = connection.createStatement();
+
+        try {
+            StringBuilder sbSQL = new StringBuilder("CREATE OR REPLACE VIEW \"");
+            sbSQL.append(themeViewName).append("\" AS SELECT ");
+
+            rs = connection.getMetaData().getColumns(null, currentSchema, viewName, "%");
+            while (rs.next()) {
+                String fieldName = rs.getString("COLUMN_NAME");
+                sbSQL.append("t." + fieldName).append(", ");
+            }
+            sbSQL.append("fc.dyncolor, fo.fowner FROM ");
+            if (currentSchema != null)
+                sbSQL.append("\"").append(currentSchema).append("\".\"").append(viewName).append("\" AS t,");
+            else
+                sbSQL.append("\"").append(viewName).append("\" AS t,");
+            sbSQL.append("xpwtheme").append(FDYNCOLOR_SUFFIX).append(" AS fc,");
+            sbSQL.append("xpwtheme").append(FOWNER_SUFFIX).append(" AS fo WHERE ");
+            sbSQL.append("t.tid = fc.tid AND t.oid = fc.oid AND ");
+            sbSQL.append("t.tid = fo.tid AND t.oid = fo.oid");
+
+            // sbSQL.delete(sbSQL.length() - 2, sbSQL.length());
+            String sql = sbSQL.toString();
+            stmt.execute(sql);
+            sbSQL.delete(0, sbSQL.length());
+
+            PrintfFormat pf = new PrintfFormat(ALTER_VIEWSQL + ownerName);
+            sql = pf.sprintf(themeViewName);
+            stmt.execute(sql);
+        } finally {
+            JDBCUtils.close(rs);
+            JDBCUtils.close(stmt);
+        }
+    }
+
+    private void resetFlowThemesPostgisDataView(Connection connection, String ownerName,
+                                            String currentSchema, String viewName) throws SQLException {
+        String themeViewName = viewName + "-flow-oms";
+        ResultSet rs = null;
+        Statement stmt = connection.createStatement();
+
+        try {
+            StringBuilder sbSQL = new StringBuilder("CREATE OR REPLACE VIEW \"");
+            sbSQL.append(themeViewName).append("\" AS SELECT ");
+
+            rs = connection.getMetaData().getColumns(null, currentSchema, viewName, "%");
+            while (rs.next()) {
+                String fieldName = rs.getString("COLUMN_NAME");
+                sbSQL.append("t." + fieldName).append(", ");
+            }
+            sbSQL.append("fc.dyncolor, fo.fowner, fo.flow FROM ");
+            if (currentSchema != null)
+                sbSQL.append("\"").append(currentSchema).append("\".\"").append(viewName).append("\" AS t,");
+            else
+                sbSQL.append("\"").append(viewName).append("\" AS t,");
+            sbSQL.append("xpwtheme").append(FDYNCOLOR_SUFFIX).append(" AS fc,");
+            sbSQL.append("xpwtheme").append(FOWNER_SUFFIX).append(" AS fo WHERE ");
+            sbSQL.append("t.tid = fc.tid AND t.oid = fc.oid AND ");
+            sbSQL.append("t.tid = fo.tid AND t.oid = fo.oid");
+
+            // sbSQL.delete(sbSQL.length() - 2, sbSQL.length());
+            String sql = sbSQL.toString();
+            stmt.execute(sql);
+            sbSQL.delete(0, sbSQL.length());
+
+            PrintfFormat pf = new PrintfFormat(ALTER_VIEWSQL + ownerName);
+            sql = pf.sprintf(themeViewName);
+            stmt.execute(sql);
+        } finally {
+            JDBCUtils.close(rs);
+            JDBCUtils.close(stmt);
+        }
+    }
+
+    private HashMap<String, String> retrieveViewDef(Connection connection, String schemaName, String tablePattern) throws SQLException {
+        PreparedStatement stmt = connection.prepareStatement(QUERY_VIEWDEFSQL + "'" + tablePattern + "'");
+        stmt.setString(1, schemaName);
+        // stmt.setString(2, tablePattern);
+        HashMap<String, String> result = new HashMap<String, String>();
+        ResultSet rs = stmt.executeQuery();
+        while (rs.next()) {
+            String tableName = rs.getString(1);
+            String viewDef = rs.getString(2);
+            result.put(tableName, viewDef);
+        }
+        rs.close();
+        stmt.close();
+        return result;
+    }
+
+    private void createOrReplaceView(Connection connection, String schemaName, String tableName, String viewName,
+                                     String ownerName) throws SQLException {
+        PrintfFormat pf = new PrintfFormat(CREATE_VIEWSQL);
+        String sql = pf.sprintf(new Object[]{viewName, schemaName, tableName});
+        Statement stmt = connection.createStatement();
+        try {
+            stmt.execute(sql);
+            pf = new PrintfFormat(ALTER_VIEWSQL + ownerName);
+            sql = pf.sprintf(viewName);
+            stmt.execute(sql);
+        } catch (SQLException e) {
+            // logger.warn(e.getMessage(), e);
+            logger.info(sql == null ? "SQL=NULL" : "SQL=" + sql);
+            throw e;
+        } finally {
+            stmt.close();
+        }
+        // connection.commit();
+    }
+
+    private void createOrReplaceExtraView(Connection connection, String schemaName, String tableName, String viewName,
+                                          String ownerName, XGeosDataConfig xgeosConfig) throws SQLException {
+        PrintfFormat pf = new PrintfFormat(CREATE_VIEWSQL);
+        String sql = pf.sprintf(new Object[]{viewName, schemaName, tableName});
+
+        PrintfFormat pfWhere = new PrintfFormat(EXTRAWHERE_VIEWSQL);
+        sql += pfWhere.sprintf(new String[]{tableName, Short.toString(xgeosConfig.getLEV()),
+                tableName, Short.toString(xgeosConfig.getWEIGHT())});
+
+        Statement stmt = connection.createStatement();
+        stmt.execute(sql);
+
+        pf = new PrintfFormat(ALTER_VIEWSQL + ownerName);
+        sql = pf.sprintf(viewName);
+        stmt.execute(sql);
+        stmt.close();
+        // connection.commit();
+    }
+
+    private Timestamp retrieveCurrentThemeTimestamp(Connection connection, short status) throws SQLException {
+        StringBuilder sbSQL = new StringBuilder("SELECT vpttimestamp, vptname, vptstatus FROM ");
+        sbSQL.append(DataReposVersionManager.XPTVERSIONTABLE_NAME);
+        sbSQL.append(" WHERE vptstatus = ");
+        sbSQL.append(status);
+        sbSQL.append(" ORDER BY vptid");
+
+        Timestamp result = null;
+        Statement stmt = null;
+        ResultSet rs = null;
+
+        try {
+            stmt = connection.createStatement();
+            rs = stmt.executeQuery(sbSQL.toString());
+            // get first result
+            if (rs.next()) {
+                result = rs.getTimestamp(1);
+            }
+            return result;
+        } finally {
+            if (rs != null) rs.close();
+            if (stmt != null) stmt.close();
+        }
+    }
+
+    private void updateCurrentThemeStatus(Connection connection, String themeTableName, short newStatus)
+            throws SQLException {
+        StringBuilder sbSQL = new StringBuilder("UPDATE ");
+        sbSQL.append(DataReposVersionManager.XPTVERSIONTABLE_NAME).append(' ');
+        sbSQL.append(" SET vptstatus = ");
+        sbSQL.append(newStatus);
+        sbSQL.append(", vpttimestamp = CURRENT_TIMESTAMP WHERE vptname = '");
+        sbSQL.append(themeTableName).append("'");
+
+        Statement stmt = null;
+        try {
+            stmt = connection.createStatement();
+            stmt.executeUpdate(sbSQL.toString());
+        } finally {
+            if (stmt != null) stmt.close();
+        }
+    }
+
+
+    private boolean checkCurrentThemeStatus(Connection connection, short status) {
+        try {
+            return (retrieveCurrentThemeName(connection, status) != null);
+        } catch (SQLException e) {
+            logger.warn(e.getMessage(), e);
+            return false;
+        }
+    }
+
+    private String retrieveCurrentThemeName(Connection connection, short status) throws SQLException {
+        StringBuilder sbSQL = new StringBuilder("SELECT ");
+        sbSQL.append("vptname, vpttimestamp, vptstatus FROM ");
+        sbSQL.append(encodeSchemaTableName(_pgSchema, DataReposVersionManager.XPTVERSIONTABLE_NAME));
+        sbSQL.append(" WHERE vptstatus = ");
+        sbSQL.append(status);
+        sbSQL.append("ORDER BY vptid");
+
+        String result = null;
+        Statement stmt = null;
+        ResultSet rs = null;
+
+        try {
+            stmt = connection.createStatement();
+            rs = stmt.executeQuery(sbSQL.toString());
+            // get first result
+            if (rs.next()) {
+                result = rs.getString(1);
+            }
+            return result;
+        } finally {
+            JDBCUtils.close(rs);
+            JDBCUtils.close(stmt);
+        }
+    }
+
+    protected String[] retrieveTargetStoreAllViewNames(Connection connection) {
+        try {
+            final int TABLE_NAME_COL = 3;
+            List<String> list = new ArrayList<String>();
+
+            DatabaseMetaData meta = connection.getMetaData();
+            // String[] tableType = { "TABLE", "VIEW" };
+            String[] tableType = { "VIEW" };
+            ResultSet tables = meta.getTables(null, _pgSchema, "%", tableType);
+
+            while (tables.next()) {
+                String tableName = tables.getString(TABLE_NAME_COL);
+                list.add(tableName);
+                /*
+                if (allowTable(tableName)) {
+                    list.add(tableName);
+                }
+                */
+            }
+            tables.close();
+            return (String[]) list.toArray(new String[list.size()]);
+        } catch (SQLException e) {
+            logger.warn(e.getMessage(), e);
+        }
+        return null;
+    }
+
+    public DataStore getTargetDataStore() {
+        return targetDataStore;
+    }
+
+    protected void createTargetDataStore() throws JobExecutionException {
+        if (targetDataStore != null) {
+            targetDataStore.dispose();
+            targetDataStore = null;
+        }
+
+        /*
+        if (!isDriverFound())
+        {
+            throw new JobExecutionException("Oracle JDBC Driver not found.-" + JDBC_DRIVER);
+        }
+        */
+
+        if (!pgProperties.containsKey(PostgisNGDataStoreFactory.MAXCONN.key)) {
+            pgProperties.put(PostgisNGDataStoreFactory.MAXCONN.key, "5");
+        }
+
+        if (!pgProperties.containsKey(PostgisNGDataStoreFactory.MINCONN.key)) {
+            pgProperties.put(PostgisNGDataStoreFactory.MINCONN.key, "1");
+        }
+
+        if (!dataStoreFactory.canProcess(pgProperties)) {
+            getLogger().warn("cannot process properties-");
+            throw new JobExecutionException("cannot process properties-");
+        }
+        try {
+            targetDataStore = dataStoreFactory.createDataStore(pgProperties);
+        } catch (IOException e) {
+            getLogger().warn(e.getMessage(), e);
+            throw new JobExecutionException(e.getMessage(), e);
+        }
+    }
+
+    protected void disconnect() {
+        super.disconnect();
+        if (targetDataStore != null) {
+            targetDataStore.dispose();
+            targetDataStore = null;
+        }
+    }
+
+    private String determineTargetThemeTableName() throws IOException {
+        if (targetDataStore == null) return null;
+        Connection connection = null;
+        Statement stmt = null;
+        ResultSet rs = null;
+        String targetTable = null;
+        boolean needCreate = false;
+        try {
+            connection = targetDataStore.getConnection(Transaction.AUTO_COMMIT);
+            // Create XPTVERSIONTABLE_NAME
+            needCreate = false;
+            rs = connection.getMetaData().getTables(null, _pgSchema, DataReposVersionManager.XPTVERSIONTABLE_NAME, new String[]{"TABLE"});
+            if (!rs.next()) needCreate = true;
+            if (needCreate) {
+                createXPWThemeVersionTable(connection, _pgSchema);
+            }
+            rs.close();
+            rs = null;
+
+            StringBuilder sbSQL = new StringBuilder("SELECT ");
+            sbSQL.append("vptname, vptstatus FROM ");
+            sbSQL.append(encodeSchemaTableName(_pgSchema, DataReposVersionManager.XPTVERSIONTABLE_NAME)).append(' ');
+            sbSQL.append("ORDER BY vptid");
+            stmt = connection.createStatement();
+            rs = stmt.executeQuery(sbSQL.toString());
+            ArrayList<Object[]> tmpTablenames = new ArrayList<Object[]>();
+            int i = 0;
+            int current = -1;
+            while (rs.next()) {
+                Object[] values = new Object[2];
+                values[0] = rs.getString("vptname");
+                values[1] = rs.getShort("vptstatus");
+                tmpTablenames.add(values);
+                if (((Short) values[1]) >= DataReposVersionManager.VSSTATUS_LINKVIEW) {
+                    current = i;
+                    currentThemeTable = (String) values[0];
+                    currentThemeStatus = (Short) values[1];
+                }
+                i++;
+            }
+
+            if (current == -1) {
+                Object[] values = tmpTablenames.get(0);
+                targetTable = (String) values[0];
+            } else if (current < (tmpTablenames.size() - 1)) {
+                Object[] values = tmpTablenames.get(current + 1);
+                targetTable = (String) values[0];
+            } else {
+                Object[] values = tmpTablenames.get(0);
+                targetTable = (String) values[0];
+            }
+
+            sbSQL = new StringBuilder("UPDATE ");
+            sbSQL.append(encodeSchemaTableName(_pgSchema, DataReposVersionManager.XPTVERSIONTABLE_NAME)).append(' ');
+            sbSQL.append(" SET vptstatus = ");
+            sbSQL.append(DataReposVersionManager.VSSTATUS_COVERT);
+            sbSQL.append(" WHERE vptname = '");
+            sbSQL.append(targetTable).append("'");
+            int count = stmt.executeUpdate(sbSQL.toString());
+            if (count != 1) {
+                logger.info("update status for " + targetTable + " update result count="
+                    + count);
+            }
+        } catch (SQLException e) {
+            logger.warn(e.getMessage(), e);
+        } finally {
+            JDBCUtils.close(rs);
+            JDBCUtils.close(stmt);
+            JDBCUtils.close(connection, Transaction.AUTO_COMMIT, null);
+        }
+        return targetTable;
+    }
+
+    public String encodeSchemaTableName(String schemaName, String tableName) {
+        if (schemaName == null)
+            return "\"" + tableName + "\"";
+        return "\"" + schemaName + "\".\"" + tableName + "\"";
+    }
+
+    private boolean convertDynamicColorThemeWithCopyAPI(AbstractOracleJobContext context, String targetTableBaseName)
+        throws IOException {
+        if (context == null) {
+            getLogger().info("jobContext is null in convertDynamicColorThemeWithCopyAPI");
+            return false;
+        }
+        Connection connection = context.getOracleConnection();
+        Connection connectionPG = targetDataStore.getConnection(Transaction.AUTO_COMMIT);
+        while (connectionPG instanceof DelegatingConnection) {
+            connectionPG = ((DelegatingConnection) connectionPG).getDelegate();
+        }
+
+        if (!(connectionPG instanceof PGConnection)) {
+            return false;
+        }
+
+        final int MAX_BATCHSIZE = 250;
+        ResultSet rs = null;
+        Statement stmt = null;
+        try {
+            // connectionPG.setAutoCommit(false);
+            DefaultColorTable colorTable = (DefaultColorTable) DefaultColorTable.getInstance();
+            String targetTableName = targetTableBaseName + FDYNCOLOR_SUFFIX;
+            String targetTempName = "tmp_" + targetTableName;
+            logger.info("target table:" + targetTableName);
+            stmt = connection.createStatement(ResultSet.TYPE_FORWARD_ONLY, ResultSet.CONCUR_READ_ONLY);
+            rs = stmt.executeQuery(FETCH_COLORTAB);
+            rs.setFetchSize(MAX_BATCHSIZE);
+
+            createOrClearTempTargetTable(connectionPG, targetTempName,
+                "(tid smallint not null, oid int not null, dyncolor varchar(10) not null)");
+            StringBuilder sb = new StringBuilder();
+
+            CopyManager cpMgr = ((PGConnection) connectionPG).getCopyAPI();
+            PushbackReader reader = new PushbackReader(new StringReader(""), 10240);
+
+            int count = 0;
+            while (rs.next()) {
+                int cid = rs.getInt(1);
+                long oid = rs.getLong(2);
+                int colorId = rs.getInt(3);
+                String colorText = colorTable.getColorCode(colorId);
+                if (cid > Short.MAX_VALUE) {
+                    logger.info("Wrong Color Table:" + cid + "-" + oid);
+                    continue;
+                }
+                sb.append(cid).append(',');
+                sb.append(oid).append(',');
+                sb.append(colorText).append("\n");
+
+                if (count % MAX_BATCHSIZE == 0) {
+                    reader.unread(sb.toString().toCharArray());
+                    cpMgr.copyIn("COPY " + targetTempName + " FROM STDIN WITH CSV", reader);
+                    sb.delete(0, sb.length());
+                }
+                ++count;
+            }
+
+            reader.unread(sb.toString().toCharArray());
+            cpMgr.copyIn("COPY " + targetTempName + " FROM STDIN WITH CSV", reader);
+            createTargetTableIndexAndDropTemp(connectionPG, targetTableName, targetTempName, "tid, oid, dyncolor");
+
+            logger.info("Execute Copy Count=" + count);
+        } catch (SQLException e) {
+            logger.info(e.getMessage(), e);
+            throw new IOException(e.getMessage(), e);
+        } finally {
+            JDBCUtils.close(rs);
+            JDBCUtils.close(stmt);
+            JDBCUtils.close(connectionPG, Transaction.AUTO_COMMIT, null);
+        }
+        return true;
+    }
+
+    private boolean convertPowerOwnerThemeWithCopyAPI(AbstractOracleJobContext context, String targetTableBaseName)
+        throws IOException {
+        if (context == null) {
+            getLogger().info("jobContext is null in convertPowerOwnerThemeWithCopyAPI");
+            return false;
+        }
+        Connection connection = context.getOracleConnection();
+        Connection connectionPG = targetDataStore.getConnection(Transaction.AUTO_COMMIT);
+        while (connectionPG instanceof DelegatingConnection) {
+            connectionPG = ((DelegatingConnection) connectionPG).getDelegate();
+        }
+
+        if (!(connectionPG instanceof PGConnection)) {
+            return false;
+        }
+
+        final int MAX_BATCHSIZE = 250;
+        ResultSet rs = null;
+        Statement stmt = null;
+        try {
+            // connectionPG.setAutoCommit(false);
+            String targetTableName = targetTableBaseName + FOWNER_SUFFIX;
+            String targetTempName = "tmp_" + targetTableName;
+            logger.info("target table:" + targetTableName);
+            stmt = connection.createStatement(ResultSet.TYPE_FORWARD_ONLY, ResultSet.CONCUR_READ_ONLY);
+            rs = stmt.executeQuery(FETCH_CONNFDR);
+            rs.setFetchSize(MAX_BATCHSIZE);
+
+            createOrClearTempTargetTable(connectionPG, targetTempName,
+                "(tid smallint not null, oid int not null, fowner smallint not null, flow varchar(20) not null)");
+
+            StringBuilder sb = new StringBuilder();
+
+            CopyManager cpMgr = ((PGConnection) connectionPG).getCopyAPI();
+            PushbackReader reader = new PushbackReader(new StringReader(""), 10240);
+
+            int count = 0;
+            while (rs.next()) {
+                int cid = rs.getInt(1);
+                long oid = rs.getLong(2);
+                int ownerId = rs.getInt(3);
+                short dirId = (short) rs.getInt(4);
+                String flowMark;
+                ConnectivityDirectionEnum dir = ConnectivityDirectionEnum.convertShort(dirId);
+                if ((ConnectivityDirectionEnum.ForwardflowON == dir) ||
+                        (ConnectivityDirectionEnum.ForwardFixflowON == dir)) {
+                    flowMark = FORWARDFLOW_MARK;
+
+                } else if ((ConnectivityDirectionEnum.BackflowON == dir) ||
+                        (ConnectivityDirectionEnum.BackFixflowON == dir)) {
+                    flowMark = BACKFLOW_MARK;
+                } else if (ConnectivityDirectionEnum.Nondeterminate == dir) {
+                    flowMark = NONFLOW_MARK;
+                } else {
+                    flowMark = UNFLOW_MARK;
+                }
+
+                if (cid > Short.MAX_VALUE) {
+                    logger.info("Wrong Connectivity Table:" + cid + "-" + oid);
+                    continue;
+                }
+
+                sb.append(cid).append(',');
+                sb.append(oid).append(',');
+                sb.append(ownerId).append(',');
+                sb.append(flowMark).append('\n');
+
+                if (count % MAX_BATCHSIZE == 0) {
+                    reader.unread(sb.toString().toCharArray());
+                    cpMgr.copyIn("COPY " + targetTempName + " FROM STDIN WITH CSV", reader);
+                    sb.delete(0, sb.length());
+                }
+                ++count;
+            }
+
+            reader.unread(sb.toString().toCharArray());
+            cpMgr.copyIn("COPY " + targetTempName + " FROM STDIN WITH CSV", reader);
+            createTargetTableIndexAndDropTemp(connectionPG, targetTableName, targetTempName, "tid, oid, fowner, flow");
+
+            logger.info("Execute Copy Count=" + count);
+        } catch (SQLException e) {
+            logger.info(e.getMessage(), e);
+            throw new IOException(e.getMessage(), e);
+        } finally {
+            JDBCUtils.close(rs);
+            JDBCUtils.close(stmt);
+            JDBCUtils.close(connectionPG, Transaction.AUTO_COMMIT, null);
+        }
+        return true;
+    }
+
+    private void convertPowerOwnerTheme(AbstractOracleJobContext context, String targetTableBaseName) throws IOException {
+        if (context == null) {
+            getLogger().info("jobContext is null in convertPowerOwnerTheme");
+            return;
+        }
+        Connection connection = context.getOracleConnection();
+        Connection connectionPG = targetDataStore.getConnection(Transaction.AUTO_COMMIT);
+
+        boolean found = false;
+        ResultSet rs = null;
+        Statement stmt = null;
+        PreparedStatement pstmt = null;
+        try {
+            connectionPG.setAutoCommit(false);
+            String targetTableName = targetTableBaseName + FOWNER_SUFFIX;
+            logger.info("target table:" + targetTableName);
+            stmt = connection.createStatement(ResultSet.TYPE_FORWARD_ONLY, ResultSet.CONCUR_READ_ONLY);
+            rs = stmt.executeQuery(FETCH_CONNFDR);
+            rs.setFetchSize(50);
+
+            createOrClearTargetTable(connectionPG, targetTableName,
+                "(tid smallint not null, oid int not null, fowner smallint not null, flow varchar(20) not null)");
+
+            pstmt = connectionPG.prepareStatement("INSERT INTO " +
+                encodeSchemaTableName(_pgSchema, targetTableName) +
+                " (tid, oid, fowner, flow) VALUES (?, ?, ?, ?)" );
+
+            final int MAX_BATCHSIZE = 50;
+            int count = 0;
+            while (rs.next()) {
+                int cid = rs.getInt(1);
+                long oid = rs.getLong(2);
+                int ownerId = rs.getInt(3);
+                short dirId = (short) rs.getInt(4);
+                pstmt.setShort(1, (short) cid);
+                pstmt.setInt(2, (int) oid);
+                pstmt.setShort(3, (short) ownerId);
+                ConnectivityDirectionEnum dir = ConnectivityDirectionEnum.convertShort(dirId);
+                if ((ConnectivityDirectionEnum.ForwardflowON == dir) ||
+                        (ConnectivityDirectionEnum.ForwardFixflowON == dir)) {
+                    pstmt.setString(4, "shape://ccarrow");
+
+                } else if ((ConnectivityDirectionEnum.BackflowON == dir) ||
+                        (ConnectivityDirectionEnum.BackFixflowON == dir)) {
+                    pstmt.setString(4, "shape://rccarrow");
+                } else {
+                    pstmt.setString(4, "shape://backslash");
+                }
+                pstmt.addBatch();
+
+                if (count % MAX_BATCHSIZE == 0) {
+                    pstmt.executeBatch();
+                }
+                ++count;
+            }
+
+            pstmt.executeBatch();
+            createTargetTableIndex(connectionPG, targetTableName);
+
+            logger.info("Execute Update Count=" + count);
+        } catch (SQLException e) {
+            logger.info(e.getMessage(), e);
+            throw new IOException(e.getMessage(), e);
+        } finally {
+            JDBCUtils.close(rs);
+            JDBCUtils.close(stmt);
+            JDBCUtils.close(pstmt);
+            JDBCUtils.close(connectionPG, Transaction.AUTO_COMMIT, null);
+        }
+    }
+
+    private void createOrClearTargetTable(Connection connection, String tableName, String sql) throws SQLException {
+        Statement stmt = connection.createStatement();
+        ResultSet rs = null;
+        try {
+            rs = connection.getMetaData().getTables(null, _pgSchema, tableName, new String[]{"TABLE"});
+            if (rs.next()) {
+                stmt.execute("DROP TABLE " + encodeSchemaTableName(_pgSchema, tableName) + "CASCADE");
+            }
+
+            stmt.executeUpdate("CREATE TABLE " + encodeSchemaTableName(_pgSchema, tableName) + " " + sql);
+        } finally {
+            JDBCUtils.close(rs);
+            JDBCUtils.close(stmt);
+        }
+    }
+
+    private void createTargetTableIndex(Connection connection, String tableName) throws SQLException {
+        Statement stmt = connection.createStatement();
+        ResultSet rs = null;
+        try {
+            rs = connection.getMetaData().getTables(null, _pgSchema, tableName, new String[]{"TABLE"});
+            if (rs.next()) {
+                stmt.execute("ALTER TABLE " + encodeSchemaTableName(_pgSchema, tableName) +
+                    " ADD PRIMARY KEY (tid, oid)");
+            }
+        } finally {
+            JDBCUtils.close(rs);
+            JDBCUtils.close(stmt);
+        }
+    }
+
+    private void createTargetTableIndexAndDropTemp(Connection connection, String tableName, String tempTable,
+                                                   String fields) throws SQLException {
+        Statement stmt = connection.createStatement();
+        ResultSet rs = null;
+        try {
+            boolean found = false;
+            rs = connection.getMetaData().getTables(null, _pgSchema, tableName, new String[]{"TABLE"});
+            if (rs.next()) {
+                found = true;
+            }
+            JDBCUtils.close(rs);
+
+            if (!found) {
+                stmt.execute("CREATE TABLE " + tableName +" AS SELECT * FROM " + tempTable);
+                rs = connection.getMetaData().getTables(null, _pgSchema, tableName, new String[]{"TABLE"});
+                if (rs.next()) {
+                    stmt.execute("ALTER TABLE " + encodeSchemaTableName(_pgSchema, tableName) +
+                        " ADD PRIMARY KEY (tid, oid)");
+                }
+            } else {
+                stmt.execute("TRUNCATE "+ tableName + " CASCADE");
+                stmt.execute("INSERT INTO " + tableName + "(" + fields + ") SELECT " +
+                    fields + " FROM " + tempTable);
+                /*
+                --insert into xpwtheme1_fdyncolor (tid, oid, dyncolor) select tid, oid, dyncolor from xpwtheme2_fdyncolor;
+                --reindex table xpwtheme1_fdyncolor;
+                --alter table xpwtheme1_fdyncolor drop constraint xpwtheme1_fdyncolor_pkey;
+                --alter table xpwtheme1_fdyncolor ADD PRIMARY KEY (tid, oid);
+                 */
+            }
+            stmt.execute("DROP TABLE " + tempTable);
+        } finally {
+            JDBCUtils.close(rs);
+            JDBCUtils.close(stmt);
+        }
+    }
+
+    private void createOrClearTempTargetTable(Connection connection, String tableName, String sql) throws SQLException {
+        Statement stmt = connection.createStatement();
+        ResultSet rs = null;
+        try {
+            rs = connection.getMetaData().getTables(null, null, tableName, new String[]{"TABLE"});
+            if (rs.next()) {
+                stmt.execute("DROP TABLE " + encodeSchemaTableName(null, tableName) + "CASCADE");
+            }
+
+            stmt.executeUpdate("CREATE TEMP TABLE " + encodeSchemaTableName(null, tableName) + " " + sql);
+        } finally {
+            JDBCUtils.close(rs);
+            JDBCUtils.close(stmt);
+        }
+    }
+
+    private void convertDynamicColorTheme(AbstractOracleJobContext context, String targetTableBaseName) throws IOException {
+        if (context == null) {
+            getLogger().info("jobContext is null in convertDynamicColorTheme");
+            return;
+        }
+        Connection connection = context.getOracleConnection();
+        Connection connectionPG = targetDataStore.getConnection(Transaction.AUTO_COMMIT);
+
+        boolean found = false;
+        ResultSet rs = null;
+        Statement stmt = null;
+        PreparedStatement pstmt = null;
+        try {
+
+            DefaultColorTable colorTable = (DefaultColorTable) DefaultColorTable.getInstance();
+            String targetTableName = targetTableBaseName + FDYNCOLOR_SUFFIX;
+            logger.info("target table:" + targetTableName);
+            stmt = connection.createStatement(ResultSet.TYPE_FORWARD_ONLY, ResultSet.CONCUR_READ_ONLY);
+            rs = stmt.executeQuery(FETCH_COLORTAB);
+            rs.setFetchSize(50);
+
+            createOrClearTargetTable(connectionPG, targetTableName,
+                "(tid smallint not null, oid int not null, dyncolor varchar(10) not null)");
+
+            pstmt = connectionPG.prepareStatement("INSERT INTO " +
+                encodeSchemaTableName(_pgSchema, targetTableName) +
+                " (tid, oid, dyncolor) VALUES (?, ?, ?)" );
+
+            final int MAX_BATCHSIZE = 50;
+            int count = 0;
+            while (rs.next()) {
+                int cid = rs.getInt(1);
+                long oid = rs.getLong(2);
+                int colorId = rs.getInt(3);
+                String colorText = colorTable.getColorCode(colorId);
+
+                pstmt.setShort(1, (short) cid);
+                pstmt.setInt(2, (int) oid);
+                pstmt.setString(3, colorText);
+                pstmt.addBatch();
+
+                if (count % MAX_BATCHSIZE == 0) {
+                    pstmt.executeBatch();
+                }
+                ++count;
+            }
+
+            pstmt.executeBatch();
+            createTargetTableIndex(connectionPG, targetTableName);
+
+            logger.info("Execute Update Count=" + count);
+        } catch (SQLException e) {
+            logger.info(e.getMessage(), e);
+            throw new IOException(e.getMessage(), e);
+        } finally {
+            JDBCUtils.close(rs);
+            JDBCUtils.close(stmt);
+            JDBCUtils.close(pstmt);
+            JDBCUtils.close(connectionPG, Transaction.AUTO_COMMIT, null);
+        }
+    }
+
+    private void updatePWThemeStatusToReady(String targetSchema) {
+        if (targetDataStore == null) return;
+        Connection connection = null;
+        Statement stmt = null;
+        ResultSet rs = null;
+        boolean needCreate = false;
+        try {
+            StringBuilder sbSQL = new StringBuilder("UPDATE ");
+            sbSQL.append(encodeSchemaTableName(_pgSchema, DataReposVersionManager.XPTVERSIONTABLE_NAME)).append(' ');
+            sbSQL.append(" SET vptstatus = ");
+            sbSQL.append(DataReposVersionManager.VSSTATUS_READY);
+            sbSQL.append(" , vpttimestamp = CURRENT_TIMESTAMP WHERE vptname = '");
+            sbSQL.append(targetSchema).append("'");
+
+            connection = targetDataStore.getConnection(Transaction.AUTO_COMMIT);
+            stmt = connection.createStatement();
+            int count = stmt.executeUpdate(sbSQL.toString());
+            if (count != 1) {
+                logger.info("update status for " + targetSchema + " update result count="
+                    + count);
+            }
+        } catch (SQLException e) {
+            logger.warn(e.getMessage(), e);
+        } catch (IOException e) {
+            logger.warn(e.getMessage(), e);
+        } finally {
+            JDBCUtils.close(rs);
+            JDBCUtils.close(stmt);
+            JDBCUtils.close(connection, Transaction.AUTO_COMMIT, null);
+        }
+    }
+
+    private void createXPWThemeVersionTable(Connection connection, String pgSchema) throws SQLException {
+        Statement stmt = null;
+        StringBuilder sql = new StringBuilder("CREATE TABLE ");
+        sql.append(encodeSchemaTableName(pgSchema, DataReposVersionManager.XPTVERSIONTABLE_NAME));
+        sql.append(" ( vptid serial PRIMARY KEY, ");
+        sql.append(" vptname character varying(64) NOT NULL, ");
+        sql.append(" vptstatus smallint NOT NULL, ");
+        sql.append(" vpttimestamp timestamp with time zone ) ");
+        try {
+            stmt = connection.createStatement();
+            stmt.executeUpdate(sql.toString());
+
+            sql = new StringBuilder("ALTER TABLE ");
+            sql.append(encodeSchemaTableName(pgSchema, DataReposVersionManager.XPTVERSIONTABLE_NAME));
+            sql.append(" OWNER TO ").append(_pgUsername);
+            stmt.executeUpdate(sql.toString());
+
+            sql = new StringBuilder("GRANT ALL ON TABLE ");
+            sql.append(encodeSchemaTableName(pgSchema, DataReposVersionManager.XPTVERSIONTABLE_NAME));
+            sql.append(" TO public");
+            stmt.executeUpdate(sql.toString());
+
+            for (String schemaName : DataReposVersionManager.DEFAULTXPTVERSIONTABLE_NAMES) {
+                sql = new StringBuilder("INSERT INTO ");
+                sql.append(encodeSchemaTableName(pgSchema, DataReposVersionManager.XPTVERSIONTABLE_NAME));
+                sql.append(" (vptname, vptstatus) VALUES ('");
+                sql.append(schemaName).append("', ");
+                sql.append(DataReposVersionManager.VSSTATUS_AVAILABLE).append(" )");
+                stmt.executeUpdate(sql.toString());
+            }
+
+        } finally {
+            if (stmt != null) stmt.close();
+        }
+    }
+
+    protected void transferThemesVersionStatus(Connection connection,
+                                       short vsstatusBefore, short vsstatusAfter, boolean exclusive) throws JobExecutionException {
+
+        try {
+            String currentTargetTheme = retrieveCurrentThemeName(connection, vsstatusBefore);
+            if (currentTargetTheme == null) {
+                logger.info("Cannot found target schema in dataStore. status=" + vsstatusBefore);
+                return;
+            }
+            String existTargetSchema = null;
+            if (exclusive)
+                existTargetSchema = retrieveCurrentThemeName(connection, vsstatusAfter);
+
+
+            updateCurrentThemeStatus(connection, currentTargetTheme, vsstatusAfter);
+            if ((exclusive) && (existTargetSchema != null)) {
+                updateCurrentThemeStatus(connection, existTargetSchema,
+                    DataReposVersionManager.VSSTATUS_AVAILABLE);
+            }
+        } catch (SQLException e) {
+            logger.warn(e.getMessage(), e);
+            throw new JobExecutionException("Update " + DataReposVersionManager.XPTVERSIONTABLE_NAME +
+                " has error-", e);
+        }
+    }
+
+    protected void transferThemesVersionStatus(short vsstatusBefore, short vsstatusAfter, boolean exclusive) throws JobExecutionException {
+
+        if (targetDataStore == null) return;
+        Connection connection = null;
+
+        try {
+            connection = targetDataStore.getConnection(Transaction.AUTO_COMMIT);
+
+            transferThemesVersionStatus(connection, vsstatusBefore, vsstatusAfter, exclusive);
+        } catch (IOException e) {
+            logger.warn(e.getMessage(), e);
+        } finally {
+            JDBCUtils.close(connection, Transaction.AUTO_COMMIT, null);
+        }
+    }
+}
diff --git a/xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/jobs/OracleIncrementDgn2PostGISJob.java b/xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/jobs/OracleIncrementDgn2PostGISJob.java
index 8570254..2a904f2 100644
--- a/xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/jobs/OracleIncrementDgn2PostGISJob.java
+++ b/xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/jobs/OracleIncrementDgn2PostGISJob.java
@@ -5,6 +5,7 @@
 import java.nio.ByteBuffer;
 import java.nio.ByteOrder;
 import java.sql.Connection;
+import java.sql.PreparedStatement;
 import java.sql.ResultSet;
 import java.sql.SQLException;
 import java.sql.Statement;
@@ -51,7 +52,7 @@
     private static final String USEWKB = "USEWKB";
 
     private static final int FETCHSIZE = 30;
-    private static final int COMMITSIZE = 100;
+    private static final int COMMITSIZE = 10;
 
     protected static PostgisNGDataStoreFactory dataStoreFactory = new PostgisNGDataStoreFactory();
 
@@ -97,6 +98,7 @@
     @Override
     protected void extractJobConfiguration(JobDetail jobDetail) throws JobExecutionException {
         super.extractJobConfiguration(jobDetail);
+
         JobDataMap dataMap = jobDetail.getJobDataMap();
         _pgHost = dataMap.getString(PGHOST);
         _pgDatabase = dataMap.getString(PGDATBASE);
@@ -213,6 +215,7 @@
 
         // Log the time the job started
         logger.info(jobName + " fired at " + new Date());
+        extractJobConfiguration(jobDetail);
 
         createSourceDataStore();
         createTargetDataStore();
@@ -397,11 +400,14 @@
             return;
         }
 
-        // SELECT COUNT(*) FROM CMMS_POSTDB.GEO_EXCHANGE WHERE ISEXCHANGE <> 0
+        // SELECT COUNT(*) FROM CMMS_POSTDB.GEO_EXCHANGE WHERE ISEXCHANGE = 0
         int exchangeCount = fetchExchangeCount(connection);
+        logger.info("exchangeCount=" + exchangeCount);
+
         try {
-            processIncrementElement(jobContext);
+            processIncrementElement(jobContext, exchangeCount);
             // jobContext.setCurrentSchema(querySchema);
+
         } finally {
         }
 
@@ -412,7 +418,7 @@
         Statement stmt = connection.createStatement(ResultSet.TYPE_FORWARD_ONLY, ResultSet.CONCUR_READ_ONLY);
         ResultSet rs = null;
         StringBuilder sbSQL = new StringBuilder();
-        sbSQL.append("SELECT COUNT(*) FROM \"CMMS_POSTDB\".\"GEO_EXCHANGE\" WHERE ISEXCHANGE <> 0");
+        sbSQL.append("SELECT COUNT(*) FROM \"CMMS_POSTDB\".\"GEO_EXCHANGE\" WHERE ISEXCHANGE = 0");
 
         int size = -1;
         try {
@@ -433,14 +439,20 @@
         Element element;
     };
 
-    private void processIncrementElement(OracleIncrementPostGISJobContext jobContext) throws SQLException {
+    private void processIncrementElement(OracleIncrementPostGISJobContext jobContext, int exchangeCount) throws SQLException {
         Connection connection = jobContext.getOracleConnection();
 
-        // SELECT TAG_LUFID, TAG_SFSC, TAG_BCOMPID, TAG_SOCCID, STATUS, IGDSELM
+        if (exchangeCount == 0) {
+            logger.info("GEO_EXCHANGE ELEMENT COUNT IS ZERO.");
+            return;
+        }
+
+        // SELECT ID, TAG_LUFID, TAG_SFSC, TAG_BCOMPID, TAG_SOCCID, STATUS, TASKID, IGDSELM
         //  FROM CMMS_POSTDB.GEO_EXCHANGE ORDER BY UPDATETIME WHERE ISEXCHANGE <> 0
-        String fetchSrcStmtFmt = "SELECT TAG_LUFID, TAG_SFSC, TAG_BCOMPID, TAG_SOCCID, STATUS, TASKID IGDSELM " +
-            "FROM \"%s\".\"%s\" ORDER BY UPDATETIME WHERE ISEXCHANGE <> 0";
-        //String fetchSrcStmtFmt = "SELECT IGDSELM FROM \"%s\".\"%s\" WHERE TAG_SFSC = 423 AND TAG_LUFID = 21612065 ORDER BY ROWID";
+        String fetchSrcStmtFmt = "SELECT ID, TAG_LUFID, TAG_SFSC, TAG_BCOMPID, TAG_SOCCID, STATUS, TASKID, IGDSELM " +
+            "FROM \"%s\".\"%s\" WHERE ISEXCHANGE = 0 ORDER BY UPDATETIME";
+        // String fetchSrcStmtFmt = "SELECT IGDSELM FROM \"%s\".\"%s\"
+        //      WHERE TAG_SFSC = 423 AND TAG_LUFID = 21612065 ORDER BY ROWID";
         PrintfFormat spf = new PrintfFormat(fetchSrcStmtFmt);
         String fetchSrcStmt = spf.sprintf(new Object[]{"CMMS_POSTDB", "GEO_EXCHANGE"});
         Statement stmtSrc = connection.createStatement(ResultSet.TYPE_FORWARD_ONLY, ResultSet.CONCUR_READ_ONLY);
@@ -448,23 +460,31 @@
         stmtSrc.setFetchSize(FETCHSIZE);
         ResultSet rsSrc = stmtSrc.executeQuery(fetchSrcStmt);
         int igdsMetaType = rsSrc.getMetaData().getColumnType(1);
+        ArrayList<Integer> transIds = new ArrayList<Integer>();
+
+        int step = exchangeCount / 100;
+        int order = 0;
+        int current = 0;
+        jobContext.getExecutionContext().put("IncrementDgn2PostGISJobProgress", 0);
+
         while (rsSrc.next()) {
             if (isProfileMode()) {
                 markQueryTime();
             }
             ElementTransactionContext xContext = new ElementTransactionContext();
-            xContext.oid = rsSrc.getInt(1);
-            xContext.cid = (short) rsSrc.getInt(2);
-            xContext.compid = (short) rsSrc.getInt(3);
-            xContext.occid = (short) rsSrc.getInt(4);
-            xContext.transcationType = rsSrc.getInt(5);
-            xContext.taskid = rsSrc.getInt(6);
+            xContext.transcationId = rsSrc.getInt(1);
+            xContext.oid = rsSrc.getInt(2);
+            xContext.cid = (short) rsSrc.getInt(3);
+            xContext.compid = (short) rsSrc.getInt(4);
+            xContext.occid = (short) rsSrc.getInt(5);
+            xContext.transcationType = rsSrc.getInt(6);
+            xContext.taskid = rsSrc.getInt(7);
 
             try {
-                if (xContext.transcationType > 2) {
+                if (xContext.transcationType <= 2) {
                     byte[] raw = null;
                     if (igdsMetaType == Types.BLOB) {
-                        BLOB blob = (BLOB) rsSrc.getBlob(7);
+                        BLOB blob = (BLOB) rsSrc.getBlob(8);
 
                         try {
                             raw = getBytesFromBLOB(blob);
@@ -474,7 +494,7 @@
                             // blob.close();
                         }
                     } else {
-                        raw = rsSrc.getBytes(7);
+                        raw = rsSrc.getBytes(8);
                     }
                     if (raw != null) {
                         Element element = fetchBinaryElement(raw);
@@ -487,15 +507,88 @@
                             accumulateQueryTime();
                         }
                     }
+                } else {
+                    xContext.element = null;
                 }
-                jobContext.putFeatureCollection(xContext);
+
+                if (xContext.transcationType > 1) {
+                    // remove first
+                }
+
+                jobContext.processFeatureContext(xContext);
+                transIds.add(xContext.transcationId);
+
             } catch (Dgn7fileException e) {
                 logger.warn("Dgn7Exception", e);
             }
+
+            if ((order % COMMITSIZE) == 0) {
+                // OracleConnection connection = jobContext.getOracleConnection();
+                // connection.commitTransaction();
+                jobContext.commitTransaction();
+                //jobContext.startTransaction();
+                System.gc();
+                System.runFinalization();
+            }
+
+            if (step != 0) {
+                int now = order % step;
+                if (now != current) {
+                    current = now;
+                    jobContext.getExecutionContext().put("IncrementDgn2PostGISJobProgress", current);
+
+                }
+            } else {
+                jobContext.getExecutionContext().put("IncrementDgn2PostGISJobProgress", current);
+                current++;
+            }
         }
+
+        jobContext.getExecutionContext().put("IncrementDgn2PostGISJobProgress", 100);
+
+        jobContext.commitTransaction();
+        jobContext.resetFeatureContext();
 
         JDBCUtils.close(rsSrc);
         JDBCUtils.close(stmtSrc);
+
+        if (!transIds.isEmpty()) {
+            completeTransactionAction(connection, transIds);
+        }
+    }
+
+    private void completeTransactionAction(Connection connection, ArrayList<Integer> transIds) {
+        if (transIds.isEmpty()) return;
+
+        boolean autoCommit = true;
+        PreparedStatement statement = null;
+        try {
+            autoCommit = connection.getAutoCommit();
+            connection.setAutoCommit(false);
+            String sql = "UPDATE \"CMMS_POSTDB\".\"GEO_EXCHANGE\" SET ISEXCHANGE=? WHERE ID=?";
+
+            statement = connection.prepareStatement(sql);
+            for (int id : transIds) {
+                statement.setInt((int) 1, 1);
+                statement.setInt((int) 2, id);
+                statement.executeUpdate();
+            }
+            connection.commit();
+        } catch (SQLException e) {
+            logger.warn(e.getMessage(), e);
+            try {
+                connection.rollback();
+            } catch (SQLException e1) {
+                logger.warn(e.getMessage(), e1);
+            }
+        } finally {
+            JDBCUtils.close(statement);
+            try {
+                connection.setAutoCommit(autoCommit);
+            } catch (SQLException e) {
+                logger.warn(e.getMessage(), e);
+            }
+        }
     }
 
     // Binary to Element
diff --git a/xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/jobs/context/edbgeo/GeneralDgnConvertEdbGeoJobContext.java b/xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/jobs/context/edbgeo/GeneralDgnConvertEdbGeoJobContext.java
index b7bf7f1..9107ffe 100644
--- a/xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/jobs/context/edbgeo/GeneralDgnConvertEdbGeoJobContext.java
+++ b/xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/jobs/context/edbgeo/GeneralDgnConvertEdbGeoJobContext.java
@@ -281,6 +281,7 @@
             double angle = textElement.getRotationAngle();
             String content = textElement.getText();
             content = content.replace('\u0000', ' ');
+            content = content.trim();
             angle = BigDecimal.valueOf(angle).setScale(3, RoundingMode.HALF_UP).doubleValue();
             if (geom != null) {
                 return SimpleFeatureBuilder.build(featureType, new Object[]{
diff --git a/xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/jobs/context/postgis/DummyFeatureConvertPostGISJobContext.java b/xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/jobs/context/postgis/DummyFeatureConvertPostGISJobContext.java
index ca42eda..f86d4cb 100644
--- a/xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/jobs/context/postgis/DummyFeatureConvertPostGISJobContext.java
+++ b/xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/jobs/context/postgis/DummyFeatureConvertPostGISJobContext.java
@@ -107,7 +107,9 @@
                 AbstractFLinkageDispatchableFilter.getFeatureLinkage(element);
             logger.warn("Unknown Element:" + element.getElementType().toString() +
                 ":type=" + element.getType() + ":lv=" + element.getLevelIndex() + ":id=" +
-                (linkage == null ? "NULL" : "FSC=" + (linkage.getFsc() + "|COMPID=" + linkage.getComponentID())));
+                    (linkage == null ? "NULL" : "FSC=" + (linkage.getFsc() + "|UFID=" + linkage.getUfid() +
+                            "|COMPID=" + linkage.getComponentID())));
+
             if (element instanceof ComplexElement) {
                 ComplexElement complex = (ComplexElement) element;
                 logger.warn("----Complex Element size=" + complex.size());
diff --git a/xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/jobs/context/postgis/FeatureDgnConvertPostGISJobContext.java b/xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/jobs/context/postgis/FeatureDgnConvertPostGISJobContext.java
index 69241cf..3539a99 100644
--- a/xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/jobs/context/postgis/FeatureDgnConvertPostGISJobContext.java
+++ b/xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/jobs/context/postgis/FeatureDgnConvertPostGISJobContext.java
@@ -100,7 +100,9 @@
                 AbstractFLinkageDispatchableFilter.getFeatureLinkage(element);
             logger.warn("Unknown Element:" + element.getElementType().toString() +
                 ":type=" + element.getType() + ":lv=" + element.getLevelIndex() + ":id=" +
-                (linkage == null ? "NULL" : "FSC=" + (linkage.getFsc() + "|COMPID=" + linkage.getComponentID())));
+                (linkage == null ? "NULL" : "FSC=" + (linkage.getFsc() + "|UFID=" + linkage.getUfid() +
+                        "|COMPID=" + linkage.getComponentID())));
+
             if (element instanceof ComplexElement) {
                 ComplexElement complex = (ComplexElement) element;
                 logger.warn("----Complex Element size=" + complex.size());
diff --git a/xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/jobs/context/postgis/GeneralDgnConvertPostGISJobContext.java b/xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/jobs/context/postgis/GeneralDgnConvertPostGISJobContext.java
index 84993eb..3090d5a 100644
--- a/xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/jobs/context/postgis/GeneralDgnConvertPostGISJobContext.java
+++ b/xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/jobs/context/postgis/GeneralDgnConvertPostGISJobContext.java
@@ -282,6 +282,7 @@
             double angle = textElement.getRotationAngle();
             String content = textElement.getText();
             content = content.replace('\u0000', ' ');
+            content = content.trim();
             angle = BigDecimal.valueOf(angle).setScale(3, RoundingMode.HALF_UP).doubleValue();
             if (geom != null) {
                 return SimpleFeatureBuilder.build(featureType, new Object[]{
diff --git a/xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/jobs/context/postgis/IndexDgnConvertPostGISJobContext.java b/xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/jobs/context/postgis/IndexDgnConvertPostGISJobContext.java
index 8c612ca..3dc991a 100644
--- a/xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/jobs/context/postgis/IndexDgnConvertPostGISJobContext.java
+++ b/xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/jobs/context/postgis/IndexDgnConvertPostGISJobContext.java
@@ -137,7 +137,8 @@
             } else {
                 Coordinate pt = polygon.getEnvelopeInternal().centre();
                 String id = TPCLIDConverter.CoordinateToTpclId(pt);
-                logger.info("cannot craete feature. " + element.toString() + "'" +
+
+                logger.info("cannot craete feature. type=" + element.getElementType() + "'" +
                     id + "'- from pt=" + pt);
             }
             return;
diff --git a/xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/jobs/context/postgis/OracleConvertPostGISJobContext.java b/xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/jobs/context/postgis/OracleConvertPostGISJobContext.java
index 46ebe1f..f6a8741 100644
--- a/xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/jobs/context/postgis/OracleConvertPostGISJobContext.java
+++ b/xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/jobs/context/postgis/OracleConvertPostGISJobContext.java
@@ -122,7 +122,8 @@
                 AbstractFLinkageDispatchableFilter.getFeatureLinkage(element);
             logger.warn("Unknown Element:" + element.getElementType().toString() +
                 ":type=" + element.getType() + ":lv=" + element.getLevelIndex() + ":id=" +
-                (linkage == null ? "NULL" : "FSC=" + (linkage.getFsc() + "|COMPID=" + linkage.getComponentID())));
+                    (linkage == null ? "NULL" : "FSC=" + (linkage.getFsc() + "|UFID=" + linkage.getUfid() +
+                            "|COMPID=" + linkage.getComponentID())));
 
             if (element instanceof ComplexElement) {
                 ComplexElement complex = (ComplexElement) element;
@@ -144,7 +145,8 @@
                 AbstractFLinkageDispatchableFilter.getFeatureLinkage(element);
             logger.warn("Empty Geom Element:" + element.getElementType().toString() +
                 ":type=" + element.getType() + ":lv=" + element.getLevelIndex() + ":id=" +
-                (linkage == null ? "NULL" : (linkage.getFsc() + "|" + linkage.getComponentID())));
+                (linkage == null ? "NULL" : (linkage.getFsc() + "|" + linkage.getUfid() + "|" +
+                                             linkage.getComponentID())));
 
             if (element instanceof ComplexElement) {
                 ComplexElement complex = (ComplexElement) element;
diff --git a/xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/jobs/context/postgis/OracleIncrementPostGISJobContext.java b/xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/jobs/context/postgis/OracleIncrementPostGISJobContext.java
index 524976b..577bcb8 100644
--- a/xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/jobs/context/postgis/OracleIncrementPostGISJobContext.java
+++ b/xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/jobs/context/postgis/OracleIncrementPostGISJobContext.java
@@ -9,11 +9,13 @@
 import java.sql.Connection;
 import java.sql.DriverManager;
 import java.sql.PreparedStatement;
+import java.sql.ResultSet;
 import java.sql.SQLException;
 import java.sql.Statement;
 import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.Iterator;
+import java.util.List;
 
 import com.vividsolutions.jts.geom.Geometry;
 import com.vividsolutions.jts.util.Assert;
@@ -73,6 +75,7 @@
     private int accumulate = 0;
 
     public static class ElementTransactionContext {
+        public int transcationId;
         public int transcationType;
         public short cid;
         public int oid;
@@ -83,8 +86,9 @@
         public int result;
     };
 
+
     public OracleIncrementPostGISJobContext(String dataPath, DataStore pgDS, String targetSchema, String filterConfig,
-                                          boolean profileMode, boolean useTransform) {
+                                            boolean profileMode, boolean useTransform) {
         super(dataPath, pgDS, targetSchema, profileMode, useTransform);
         _filterConfig = filterConfig;
         elementDispatcher = createElementDispatcher();
@@ -126,26 +130,122 @@
 
     /**
      * STATUS 欄位 :0:新增  2:編輯  3:刪除設備   4:刪除元件
+     *
      * @param context
      */
-    public void putFeatureCollection(ElementTransactionContext context) {
+    public void processFeatureContext(ElementTransactionContext context) {
         assert elementDispatcher != null;
         if (context == null) {
             logger.warn("putFeatureCollection context is null");
             return;
         }
+        SimpleFeature simpleFeature = null;
         if (context.transcationType == 0) {
             // insert Element
-            putFeatureCollection(context.element);
+            if (context.element != null) {
+                simpleFeature = generateFeature(context.element);
+                if (simpleFeature == null) return;
+            }
+
+            if (simpleFeature != null) {
+                SimpleFeatureType featureType = simpleFeature.getFeatureType();
+                String bindingStmt = makePrepareInsertSql(featureType);
+                logger.trace("Execute SQL(0):" + bindingStmt);
+                executePrepareSQL(bindingStmt, simpleFeature);
+            }
         } else if (context.transcationType == 2) {
             // Update Element
+            if (context.element != null) {
+                simpleFeature = generateFeature(context.element);
+                if (simpleFeature == null) return;
+            }
+
+            if (simpleFeature != null) {
+                SimpleFeatureType featureType = simpleFeature.getFeatureType();
+                // String deleteStmt = makePrepareDeleteSql(featureType);
+                String deleteStmt = makePrepareDeleteSql(context);
+                logger.trace("Execute SQL(2):" + deleteStmt);
+                executeSQL(deleteStmt);
+                String bindingStmt = makePrepareInsertSql(featureType);
+                logger.trace("Execute SQL(2):" + bindingStmt);
+                executePrepareSQL(bindingStmt, simpleFeature);
+            }
         } else if (context.transcationType == 3) {
             // Remove Whole Feature
+            String deleteStmt = makePrepareDeleteSql(context);
+            logger.trace("Execute SQL(3):" + deleteStmt);
+            executeSQL(deleteStmt);
         } else if (context.transcationType == 4) {
             // Remove Feature Part
+            try {
+                List<String> tableList = fetchExistTableSchema(getTargetSchema(), context);
+                for (String targetTable : tableList) {
+                    String deleteStmt = makePrepareDeleteSql(context, targetTable);
+                    logger.trace("Execute SQL(4):" + deleteStmt);
+                    executeSQL(deleteStmt);
+                }
+            } catch (SQLException e) {
+                logger.warn(e.getMessage(), e);
+            }
         }
     }
 
+    private SimpleFeature generateFeature(Element element) {
+        assert elementDispatcher != null;
+        // 判斷是否符和條件
+        SimpleFeature feature = elementDispatcher.execute(element, getDistId(), isTransformed());
+        if (feature == null) {
+            boolean isEmptySize = false;
+            FrammeAttributeData linkage =
+                AbstractFLinkageDispatchableFilter.getFeatureLinkage(element);
+            logger.warn("Unknown Element:" + element.getElementType().toString() +
+                ":type=" + element.getType() + ":lv=" + element.getLevelIndex() + ":id=" +
+                (linkage == null ? "NULL" : "FSC=" + (linkage.getFsc() + "|UFID=" + linkage.getUfid() +
+                    "|COMPID=" + linkage.getComponentID())));
+
+            if (element instanceof ComplexElement) {
+                ComplexElement complex = (ComplexElement) element;
+                logger.warn("----Complex Element size=" + complex.size() + ":" +
+                    (linkage == null ? "NULL" : (linkage.getUfid())));
+                if (complex.size() == 0)
+                    isEmptySize = true;
+            }
+
+            /*
+            if (getElementLogging() && (!isEmptySize)) {
+                getElementLogger().logElement(element, getCurrentSchema());
+            }
+            */
+            return null;
+        }
+
+        if (((Geometry) feature.getDefaultGeometry()).isEmpty()) {
+            boolean isEmptySize = false;
+            FrammeAttributeData linkage =
+                AbstractFLinkageDispatchableFilter.getFeatureLinkage(element);
+            logger.warn("Empty Geom Element:" + element.getElementType().toString() +
+                ":type=" + element.getType() + ":lv=" + element.getLevelIndex() + ":id=" +
+                (linkage == null ? "NULL" : (linkage.getFsc() + "|" + linkage.getComponentID())));
+
+            if (element instanceof ComplexElement) {
+                ComplexElement complex = (ComplexElement) element;
+                logger.warn("----Complex Element size=" + complex.size() + ":" +
+                    (linkage == null ? "NULL" : (linkage.getUfid())));
+                if (complex.size() == 0)
+                    isEmptySize = true;
+            }
+
+            /*
+            if (getElementLogging() && (!isEmptySize)) {
+                getElementLogger().logElement(element, getCurrentSchema());
+            }
+            */
+            return null;
+        }
+        return feature;
+    }
+
+    /*
     protected void putFeatureCollection(Element element) {
         assert elementDispatcher != null;
         // 判斷是否符和條件
@@ -156,7 +256,8 @@
                 AbstractFLinkageDispatchableFilter.getFeatureLinkage(element);
             logger.warn("Unknown Element:" + element.getElementType().toString() +
                 ":type=" + element.getType() + ":lv=" + element.getLevelIndex() + ":id=" +
-                (linkage == null ? "NULL" : "FSC=" + (linkage.getFsc() + "|COMPID=" + linkage.getComponentID())));
+                (linkage == null ? "NULL" : "FSC=" + (linkage.getFsc() + "|UFID=" + linkage.getUfid() +
+                        "|COMPID=" + linkage.getComponentID())));
 
             if (element instanceof ComplexElement) {
                 ComplexElement complex = (ComplexElement) element;
@@ -204,6 +305,7 @@
             commitTransaction();
         }
     }
+    */
 
     public void startTransaction() {
     }
@@ -233,6 +335,8 @@
 
     private void updateDataStore() {
         if (isProfileMode()) markUpdateTime();
+        if (txFeaturesContext.keySet().isEmpty()) return;
+
         Iterator<SimpleFeatureType> it = txFeaturesContext.keySet().iterator();
         Connection conn = null;
         try {
@@ -366,31 +470,7 @@
     protected void createOrClearFeatureDataTable(SimpleFeatureType featureType) throws SchemaException {
         String featureName = featureType.getTypeName();
         Connection conn = null;
-        if (isExistFeature(featureType)) {
-            try {
-                conn = getConnection();
-                if (dropTableMode) {
-                    dropGeometryColumn(conn, getTargetSchema(), featureName,
-                                       (featureType).getGeometryDescriptor().getName().getLocalPart());
-                    dropTable(conn, getTargetSchema(), featureName);
-
-                    ArrayList<String> schemaTexts = createNewSchemaTexts(conn, featureType);
-                    for (String stmtText : schemaTexts) {
-                        Statement stmt = conn.createStatement();
-                        stmt.execute(stmtText);
-                        JDBCUtils.close(stmt);
-                    }
-                } else {
-                    deleteTable(conn, getTargetSchema(), featureName);
-                }
-            } catch (IOException e) {
-                logger.warn(e.getMessage(), e);
-            } catch (SQLException e) {
-                logger.warn(e.getMessage(), e);
-            } finally {
-                JDBCUtils.close(conn, Transaction.AUTO_COMMIT, null);
-            }
-        } else {
+        if (!isExistFeature(featureType)) {
             String tempStmt = null;
             try {
                 conn = getConnection();
@@ -399,7 +479,7 @@
                     Statement stmt = conn.createStatement();
                     tempStmt = stmtText;
                     stmt.execute(stmtText);
-                    stmt.close();
+                    JDBCUtils.close(stmt);
                 }
                 JDBCUtils.close(conn, Transaction.AUTO_COMMIT, null);
             } catch (IOException e) {
@@ -417,4 +497,157 @@
     public boolean isSchemaChanged() {
         return schemaChanged;
     }
+
+    protected String getFeatureTableName(ElementTransactionContext elmContext, boolean forLookup) {
+        StringBuilder sb = new StringBuilder();
+        sb.append("fsc-");
+        sb.append(elmContext.cid);
+        if (!forLookup) {
+            sb.append("-c-");
+            sb.append(elmContext.compid);
+        }
+        return sb.toString();
+    }
+
+    List<String> fetchExistTableSchema(String schemaName, ElementTransactionContext elmContext) throws SQLException {
+        Connection connection = getConnection();
+        String tablePattern = getFeatureTableName(elmContext, true);
+        ResultSet rsMeta = connection.getMetaData().getTables(null, schemaName,
+            tablePattern + "%", new String[]{"TABLE"});
+
+        ArrayList<String> tables = new ArrayList<String>();
+        try {
+            while (rsMeta.next()) {
+                String tablename = rsMeta.getString(3);
+                tables.add(tablename);
+            }
+            // } catch (SQLException e)
+        } finally {
+            if (rsMeta != null) {
+                rsMeta.close();
+                rsMeta = null;
+            }
+        }
+        return tables;
+    }
+
+    @Override
+    protected String makeInsertSql(SimpleFeature feature, int srid) {
+        return super.makeInsertSql(feature, srid);
+    }
+
+    @Override
+    protected String makePrepareInsertSql(SimpleFeatureType featureType) {
+        return super.makePrepareInsertSql(featureType);
+    }
+
+    protected String makePrepareDeleteSql(ElementTransactionContext context) {
+        String tableName = getFeatureTableName(context, false);
+        return makePrepareDeleteSql(context, tableName);
+    }
+
+    private String makePrepareDeleteSql(ElementTransactionContext context, String targetTable) {
+        StringBuilder stmtBuilder = new StringBuilder();
+        stmtBuilder.append("DELETE FROM ");
+        String tableName = getFeatureTableName(context, false);
+        stmtBuilder.append(encodeSchemaTableName(targetTable));
+        stmtBuilder.append(" WHERE tid=");
+        stmtBuilder.append(context.cid);
+        stmtBuilder.append(" AND oid=");
+        stmtBuilder.append(context.oid);
+        if (context.compid != -1) {
+            stmtBuilder.append(" AND cid=");
+            stmtBuilder.append(context.compid);
+        }
+
+        return stmtBuilder.toString();
+    }
+
+    private void executeSQL(String sqlStmt) {
+
+        Connection conn = null;
+        Statement stmt = null;
+        try {
+            conn = getConnection();
+            stmt = conn.createStatement();
+            stmt.execute(sqlStmt);
+            JDBCUtils.close(stmt);
+            JDBCUtils.close(conn, Transaction.AUTO_COMMIT, null);
+        } catch (SQLException e) {
+            JDBCUtils.close(stmt);
+            JDBCUtils.close(conn, Transaction.AUTO_COMMIT, e);
+            logger.warn("RUN--" + sqlStmt);
+            logger.warn(e.getMessage(), e);
+        }
+    }
+
+    private void executePrepareSQL(String sqlStmt, SimpleFeature feature) {
+
+        Connection conn = null;
+        PreparedStatement pstmt = null;
+        try {
+            conn = getConnection();
+            boolean autoCommit = conn.getAutoCommit();
+            conn.setAutoCommit(false);
+
+            pstmt = conn.prepareStatement(sqlStmt);
+
+            try {
+                // stmt.execute(feature);
+                bindFeatureParameters(pstmt, feature);
+                // pstmt.executeUpdate();
+                pstmt.addBatch();
+            } catch (PSQLException e) {
+                if (sqlStmt != null) {
+                    logger.error("Execute:" + sqlStmt);
+                }
+                logger.error(e.getServerErrorMessage());
+                logger.error(e.getMessage(), e);
+            } catch (NullPointerException e) {
+                if (sqlStmt != null) {
+                    logger.error("Execute:" + sqlStmt);
+                }
+                logger.error(feature.toString());
+                logger.error(e.getMessage(), e);
+            } catch (ClassCastException e) {
+                if (sqlStmt != null) {
+                    logger.error("Execute:" + sqlStmt);
+                }
+                for (int i = 0; i < feature.getAttributeCount(); i++) {
+                    logger.info("attr[" + i + "]-" + ((feature.getAttribute(i) == null) ? " NULL" :
+                        feature.getAttribute(i).toString()));
+                }
+                logger.error(e.getMessage(), e);
+            }
+
+            int[] numUpdates = pstmt.executeBatch();
+            for (int i = 0; i < numUpdates.length; i++) {
+                if (numUpdates[i] == -2)
+                    logger.warn("Execution " + i + ": unknown number of rows updated");
+            }
+            conn.commit();
+
+            JDBCUtils.close(pstmt);
+            logger.debug("End Save into PostGIS:" + feature.getFeatureType().getTypeName());
+
+            conn.setAutoCommit(autoCommit);
+            JDBCUtils.close(conn, Transaction.AUTO_COMMIT, null);
+            accumulate = 0;
+        } catch (BatchUpdateException e) {
+            JDBCUtils.close(pstmt);
+            JDBCUtils.close(conn, Transaction.AUTO_COMMIT, e);
+            logger.error(e.getMessage(), e);
+            SQLException ex;
+            while ((ex = e.getNextException()) != null) {
+                // logger.warn(ex.getMessage(), ex);
+                logger.warn(ex.getMessage());
+            }
+        } catch (SQLException e) {
+            JDBCUtils.close(pstmt);
+            JDBCUtils.close(conn, Transaction.AUTO_COMMIT, e);
+            logger.error(e.getMessage(), e);
+        } finally {
+            if (isProfileMode()) accumulateUpdateTime();
+        }
+    }
 }
diff --git a/xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/util/FeatureTypeBuilderUtil.java b/xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/util/FeatureTypeBuilderUtil.java
index 584ffe4..6c8c441 100644
--- a/xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/util/FeatureTypeBuilderUtil.java
+++ b/xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/util/FeatureTypeBuilderUtil.java
@@ -127,7 +127,7 @@
                 "angle", createAttributeType(attrBuilder, "FloatType", Float.class, notAllowNull, 1, (float) 0.0)));
         attrBuilder = new AttributeTypeBuilder();
         attrDescs.add(attrBuilder.buildDescriptor(
-                "context", createAttributeType(attrBuilder, "StringType", String.class, notAllowNull, 254, "")));
+                "context", createAttributeType(attrBuilder, "StringType", String.class, notAllowNull, 512, "")));
         /*
         attrBuilder = new AttributeTypeBuilder();
         attrDescs.add(attrBuilder.buildDescriptor(
@@ -387,7 +387,7 @@
                 "angle", createAttributeType(attrBuilder, "FloatType", Float.class, notAllowNull, 1, (float) 0.0)));
         attrBuilder = new AttributeTypeBuilder();
         attrDescs.add(attrBuilder.buildDescriptor(
-                "context", createAttributeType(attrBuilder, "StringType", String.class, allowNull, 254, "")));
+                "context", createAttributeType(attrBuilder, "StringType", String.class, allowNull, 512, "")));
         /*
         attrBuilder = new AttributeTypeBuilder();
         attrDescs.add(attrBuilder.buildDescriptor(
@@ -455,7 +455,7 @@
                 "angle", createAttributeType(attrBuilder, "FloatType", Float.class, notAllowNull, 1, (float) 0.0)));
         attrBuilder = new AttributeTypeBuilder();
         attrDescs.add(attrBuilder.buildDescriptor(
-                "symbol", createAttributeType(attrBuilder, "StringType", String.class, notAllowNull, 20)));
+                "symbol", createAttributeType(attrBuilder, "StringType", String.class, notAllowNull, 20, "")));
         /*
         attrBuilder = new AttributeTypeBuilder();
         attrDescs.add(attrBuilder.buildDescriptor(
@@ -692,7 +692,7 @@
                 "angle", createAttributeType(attrBuilder, "FloatType", Float.class, notAllowNull, 1, (float) 0.0)));
         attrBuilder = new AttributeTypeBuilder();
         attrDescs.add(attrBuilder.buildDescriptor(
-                "symbol", createAttributeType(attrBuilder, "StringType", String.class, notAllowNull, 20)));
+                "symbol", createAttributeType(attrBuilder, "StringType", String.class, notAllowNull, 20, "")));
         /*
         attrBuilder = new AttributeTypeBuilder();
         attrDescs.add(attrBuilder.buildDescriptor(
diff --git a/xdgnjobs/ximple-spatialjob/src/main/resources/conf/DefaultConvertShpFilter.xml b/xdgnjobs/ximple-spatialjob/src/main/resources/conf/DefaultConvertShpFilter.xml
old mode 100644
new mode 100755
index 0d281a0..76c9085
--- a/xdgnjobs/ximple-spatialjob/src/main/resources/conf/DefaultConvertShpFilter.xml
+++ b/xdgnjobs/ximple-spatialjob/src/main/resources/conf/DefaultConvertShpFilter.xml
@@ -1,10 +1,10 @@
-<?xml version="1.0" encoding="big5" ?>
+<?xml version="1.0" encoding="utf-8" ?>
 <ElementDispatcherRules>
   <!-- High Voltage Features -->
   <TypeCompFilter name="FSC-106.C-0">
     <tid>106</tid>
     <cid>0</cid>
-    <description>�D�����u</description>
+    <description>主高壓線</description>
     <elementCriterion>
       <elementType>12</elementType>
       <elementType>4</elementType>
@@ -14,7 +14,7 @@
   <TypeCompFilter name="FSC-106.C-1">
     <tid>106</tid>
     <cid>1</cid>
-    <description>�����u�޽u</description>
+    <description>高壓線引線</description>
     <elementCriterion>
       <elementType>12</elementType>
       <elementType>4</elementType>
@@ -24,7 +24,7 @@
   <TypeCompFilter name="FSC-106.C-2">
     <tid>106</tid>
     <cid>2</cid>
-    <description>�����u�޽u���O</description>
+    <description>高壓線引線註記</description>
     <elementCriterion>
       <elementType>7</elementType>
     </elementCriterion>
@@ -33,7 +33,7 @@
   <TypeCompFilter name="FSC-106.C-4">
     <tid>106</tid>
     <cid>4</cid>
-    <description>�����u�X�u�N���޽u���O</description>
+    <description>高壓線饋線代號引線註記</description>
     <elementCriterion>
       <elementType>17</elementType>
     </elementCriterion>
@@ -42,7 +42,7 @@
   <TypeCompFilter name="FSC-106.C-5">
       <tid>106</tid>
       <cid>5</cid>
-      <description>�u���ۧ�</description>
+      <description>線路相序</description>
       <elementCriterion>
         <elementType>17</elementType>
       </elementCriterion>
@@ -51,7 +51,7 @@
   <TypeCompFilter name="FSC-402.C-0">
     <tid>402</tid>
     <cid>0</cid>
-    <description>�ܹq��</description>
+    <description>變電所</description>
     <elementCriterion>
       <elementType>17</elementType>
     </elementCriterion>
@@ -60,7 +60,7 @@
   <TypeCompFilter name="FSC-402.C-1">
     <tid>402</tid>
     <cid>1</cid>
-    <description>�ܹq�ҵ��O</description>
+    <description>變電所註記</description>
     <elementCriterion>
       <elementType>7</elementType>
       <elementType>17</elementType>
@@ -70,7 +70,7 @@
   <TypeCompFilter name="FSC-402.C-2">
     <tid>402</tid>
     <cid>2</cid>
-    <description>�ܹq�Ҥ�����O</description>
+    <description>變電所中文註記</description>
     <elementCriterion>
       <elementType>7</elementType>
       <elementType>17</elementType>
@@ -80,7 +80,7 @@
   <TypeCompFilter name="FSC-411.C-0">
     <tid>411</tid>
     <cid>0</cid>
-    <description>�t�q��</description>
+    <description>配電場</description>
     <elementCriterion>
       <elementType>17</elementType>
     </elementCriterion>
@@ -89,7 +89,7 @@
   <TypeCompFilter name="FSC-411.C-1">
     <tid>411</tid>
     <cid>1</cid>
-    <description>�t�q�����O</description>
+    <description>配電場註記</description>
     <elementCriterion>
       <elementType>7</elementType>
       <elementType>17</elementType>
@@ -99,7 +99,7 @@
   <TypeCompFilter name="FSC-411.C-2">
     <tid>411</tid>
     <cid>2</cid>
-    <description>�t�q��-1/600</description>
+    <description>配電場-1/600</description>
     <elementCriterion>
       <elementType>17</elementType>
     </elementCriterion>
@@ -108,7 +108,7 @@
   <TypeCompFilter name="FSC-411.C-3">
     <tid>411</tid>
     <cid>3</cid>
-    <description>�t�q�����O-1/600</description>
+    <description>配電場註記-1/600</description>
     <elementCriterion>
       <elementType>17</elementType>
       <elementType>7</elementType>
@@ -118,7 +118,7 @@
   <TypeCompFilter name="FSC-411.C-4">
     <tid>411</tid>
     <cid>3</cid>
-    <description>�C���t�ι�-�t�q�Ǯy�е��O</description>
+    <description>低壓系統圖-配電室座標註記</description>
     <elementCriterion>
       <elementType>17</elementType>
       <elementType>7</elementType>
@@ -128,7 +128,7 @@
   <TypeCompFilter name="FSC-411.C-5">
     <tid>411</tid>
     <cid>3</cid>
-    <description>���O�t�ι�-�t�q�Ǯy�е��O</description>
+    <description>路燈系統圖-配電室座標註記</description>
     <elementCriterion>
       <elementType>17</elementType>
       <elementType>7</elementType>
@@ -138,7 +138,7 @@
   <TypeCompFilter name="FSC-411.C-6">
     <tid>411</tid>
     <cid>3</cid>
-    <description>���l�t�ι�-�t�q�Ǯy�е��O</description>
+    <description>光纜系統圖-配電室座標註記</description>
     <elementCriterion>
       <elementType>17</elementType>
       <elementType>7</elementType>
@@ -148,7 +148,7 @@
   <TypeCompFilter name="FSC-411.C-7">
     <tid>411</tid>
     <cid>7</cid>
-    <description>�t�q��1/600�ޤW�U�Ÿ�</description>
+    <description>配電場1/600引上下符號</description>
     <elementCriterion>
       <elementType>17</elementType>
     </elementCriterion>
@@ -157,7 +157,7 @@
   <TypeCompFilter name="FSC-411.C-8">
     <tid>411</tid>
     <cid>8</cid>
-    <description>�t�q��1/1200�ޤW�U�Ÿ�</description>
+    <description>配電場1/1200引上下符號</description>
     <elementCriterion>
       <elementType>17</elementType>
     </elementCriterion>
@@ -166,7 +166,7 @@
   <TypeCompFilter name="FSC-417.C-0">
     <tid>417</tid>
     <cid>0</cid>
-    <description>�@�c��Ƥ�</description>
+    <description>共構投料孔</description>
     <elementCriterion>
       <elementType>17</elementType>
     </elementCriterion>
@@ -175,7 +175,7 @@
   <TypeCompFilter name="FSC-417.C-1">
     <tid>417</tid>
     <cid>1</cid>
-    <description>�@�c��Ƥյ��O</description>
+    <description>共構投料孔註記</description>
     <elementCriterion>
       <elementType>17</elementType>
     </elementCriterion>
@@ -184,7 +184,7 @@
   <TypeCompFilter name="FSC-419.C-0">
     <tid>419</tid>
     <cid>0</cid>
-    <description>�s����</description>
+    <description>連接孔</description>
     <elementCriterion>
       <elementType>17</elementType>
     </elementCriterion>
@@ -193,7 +193,7 @@
   <TypeCompFilter name="FSC-419.C-1">
     <tid>419</tid>
     <cid>1</cid>
-    <description>�s���չϸ��y��</description>
+    <description>連接孔圖號座標</description>
     <elementCriterion>
       <elementType>17</elementType>
     </elementCriterion>
@@ -202,7 +202,7 @@
   <TypeCompFilter name="FSC-420.C-0">
     <tid>420</tid>
     <cid>0</cid>
-    <description>�޷�</description>
+    <description>管溝</description>
     <elementCriterion>
       <elementType>6</elementType>
     </elementCriterion>
@@ -211,7 +211,7 @@
   <TypeCompFilter name="FSC-420.C-1">
     <tid>420</tid>
     <cid>1</cid>
-    <description>�޷����O</description>
+    <description>管溝註記</description>
     <elementCriterion>
       <elementType>17</elementType>
     </elementCriterion>
@@ -220,7 +220,7 @@
   <TypeCompFilter name="FSC-421.C-0">
     <tid>421</tid>
     <cid>0</cid>
-    <description>�@�P�޹D</description>
+    <description>共同管道</description>
     <elementCriterion>
       <elementType>6</elementType>
     </elementCriterion>
@@ -229,66 +229,16 @@
   <TypeCompFilter name="FSC-421.C-1">
     <tid>421</tid>
     <cid>1</cid>
-    <description>�@�P�޹D���O</description>
+    <description>共同管道註記</description>
     <elementCriterion>
       <elementType>17</elementType>
     </elementCriterion>
     <TextCreateStrategy/>
-  </TypeCompFilter>
-  <TypeCompFilter name="FSC-423.C-0">
-    <tid>423</tid>
-    <cid>0</cid>
-    <description>�޸��_��</description>
-    <elementCriterion>
-      <elementType>7</elementType>
-      <elementType>17</elementType>
-    </elementCriterion>
-    <MultiSymbolCreateStrategy/>
-  </TypeCompFilter>
-  <TypeCompFilter name="FSC-423.C-1">
-    <tid>423</tid>
-    <cid>1</cid>
-    <description>�޸��_���޽u</description>
-    <elementCriterion>
-      <elementType>12</elementType>
-      <elementType>4</elementType>
-    </elementCriterion>
-    <LineCreateStrategy/>
-  </TypeCompFilter>
-  <TypeCompFilter name="FSC-423.C-2">
-    <tid>423</tid>
-    <cid>2</cid>
-    <description>���׵��O</description>
-    <elementCriterion>
-      <elementType>7</elementType>
-      <elementType>17</elementType>
-    </elementCriterion>
-    <TextCreateStrategy/>
-  </TypeCompFilter>
-  <TypeCompFilter name="FSC-423.C-3">
-    <tid>423</tid>
-    <cid>3</cid>
-    <description>��u���O</description>
-    <elementCriterion>
-      <elementType>17</elementType>
-      <elementType>7</elementType>
-    </elementCriterion>
-    <TextCreateStrategy/>
-  </TypeCompFilter>
-  <TypeCompFilter name="FSC-423.C-4">
-    <tid>423</tid>
-    <cid>4</cid>
-    <description>�޸��_�����U�u</description>
-    <elementCriterion>
-      <elementType>12</elementType>
-      <elementType>4</elementType>
-    </elementCriterion>
-    <LineCreateStrategy/>
   </TypeCompFilter>
   <TypeCompFilter name="FSC-424.C-0">
     <tid>424</tid>
     <cid>0</cid>
-    <description>�S��u�k�X�вŸ�</description>
+    <description>特殊工法旗標符號</description>
     <elementCriterion>
       <elementType>17</elementType>
     </elementCriterion>
@@ -297,7 +247,7 @@
   <TypeCompFilter name="FSC-501.C-0">
     <tid>501</tid>
     <cid>0</cid>
-    <description>����X</description>
+    <description>障礙圍籬</description>
     <elementCriterion>
       <elementType>6</elementType>
     </elementCriterion>
@@ -306,7 +256,7 @@
   <TypeCompFilter name="FSC-501.C-1">
     <tid>501</tid>
     <cid>1</cid>
-    <description>����X��r���O</description>
+    <description>障礙圍籬文字註記</description>
     <elementCriterion>
       <elementType>17</elementType>
     </elementCriterion>
@@ -315,7 +265,7 @@
   <TypeCompFilter name="FSC-502.C-0">
     <tid>502</tid>
     <cid>0</cid>
-    <description>���D���X</description>
+    <description>問題圍籬</description>
     <elementCriterion>
       <elementType>6</elementType>
     </elementCriterion>
@@ -324,7 +274,7 @@
   <TypeCompFilter name="FSC-502.C-1">
     <tid>502</tid>
     <cid>1</cid>
-    <description>���D���X��r���O</description>
+    <description>問題圍籬文字註記</description>
     <elementCriterion>
       <elementType>17</elementType>
     </elementCriterion>
@@ -333,7 +283,7 @@
   <TypeCompFilter name="FSC-405.C-0">
     <tid>405</tid>
     <cid>0</cid>
-    <description>���u��</description>
+    <description>接線盒</description>
     <elementCriterion>
       <elementType>17</elementType>
     </elementCriterion>
@@ -342,7 +292,7 @@
   <TypeCompFilter name="FSC-405.C-1">
     <tid>405</tid>
     <cid>1</cid>
-    <description>���u����r���O</description>
+    <description>接線盒文字註記</description>
     <elementCriterion>
       <elementType>17</elementType>
     </elementCriterion>
@@ -351,7 +301,7 @@
   <TypeCompFilter name="FSC-418.C-0">
     <tid>418</tid>
     <cid>0</cid>
-    <description>�H���X�J�f</description>
+    <description>人員出入口</description>
     <elementCriterion>
       <elementType>17</elementType>
     </elementCriterion>
@@ -360,7 +310,7 @@
   <TypeCompFilter name="FSC-418.C-1">
     <tid>418</tid>
     <cid>1</cid>
-    <description>�H���X�J�f��r���O</description>
+    <description>人員出入口文字註記</description>
     <elementCriterion>
       <elementType>17</elementType>
     </elementCriterion>
@@ -369,7 +319,7 @@
   <TypeCompFilter name="FSC-503.C-0">
     <tid>503</tid>
     <cid>0</cid>
-    <description>��r���O</description>
+    <description>文字註記</description>
     <elementCriterion>
       <elementType>17</elementType>
     </elementCriterion>
@@ -378,7 +328,7 @@
   <TypeCompFilter name="FSC-407.C-0">
     <tid>407</tid>
     <cid>0</cid>
-    <description>�q��</description>
+    <description>電桿</description>
     <elementCriterion>
       <elementType>17</elementType>
     </elementCriterion>
@@ -387,7 +337,7 @@
   <TypeCompFilter name="FSC-407.C-1">
     <tid>407</tid>
     <cid>1</cid>
-    <description>�q����O</description>
+    <description>電桿註記</description>
     <elementCriterion>
       <elementType>17</elementType>
       <elementType>7</elementType>
@@ -397,7 +347,7 @@
   <TypeCompFilter name="FSC-407.C-2">
     <tid>407</tid>
     <cid>2</cid>
-    <description>�q��-1/600</description>
+    <description>電桿-1/600</description>
     <elementCriterion>
       <elementType>17</elementType>
     </elementCriterion>
@@ -406,7 +356,7 @@
   <TypeCompFilter name="FSC-407.C-3">
     <tid>407</tid>
     <cid>3</cid>
-    <description>�q��-1/600���O</description>
+    <description>電桿-1/600註記</description>
     <elementCriterion>
       <elementType>7</elementType>
       <elementType>17</elementType>
@@ -416,7 +366,7 @@
   <TypeCompFilter name="FSC-407.C-5">
     <tid>407</tid>
     <cid>5</cid>
-    <description>�y��O</description>
+    <description>座標註記</description>
     <elementCriterion>
       <elementType>17</elementType>
     </elementCriterion>
@@ -425,7 +375,7 @@
   <TypeCompFilter name="FSC-407.C-7">
     <tid>407</tid>
     <cid>7</cid>
-    <description>1/600�q��ޤW�U�Ÿ�</description>
+    <description>1/600電桿引上下符號</description>
     <elementCriterion>
       <elementType>17</elementType>
     </elementCriterion>
@@ -434,7 +384,7 @@
   <TypeCompFilter name="FSC-407.C-8">
     <tid>407</tid>
     <cid>8</cid>
-    <description>1/1200�q��ޤW�U�Ÿ�</description>
+    <description>1/1200電桿引上下符號</description>
     <elementCriterion>
       <elementType>17</elementType>
     </elementCriterion>
@@ -443,7 +393,7 @@
   <TypeCompFilter name="FSC-407.C-9">
     <tid>407</tid>
     <cid>9</cid>
-    <description>�q�������u</description>
+    <description>電桿水平支線</description>
     <elementCriterion>
       <elementType>4</elementType>
       <elementType>17</elementType>
@@ -453,7 +403,7 @@
   <TypeCompFilter name="FSC-407.C-10">
     <tid>407</tid>
     <cid>10</cid>
-    <description>�q�������u���\</description>
+    <description>電桿水平支線頂蓋</description>
     <elementCriterion>
       <elementType>17</elementType>
     </elementCriterion>
@@ -462,7 +412,7 @@
   <TypeCompFilter name="FSC-407.C-11">
     <tid>407</tid>
     <cid>11</cid>
-    <description>�q�������u���\</description>
+    <description>電桿水平支線頂蓋</description>
     <elementCriterion>
       <elementType>17</elementType>
     </elementCriterion>
@@ -471,7 +421,16 @@
   <TypeCompFilter name="FSC-407.C-12">
     <tid>407</tid>
     <cid>12</cid>
-    <description>�q��츹</description>
+    <description>電桿桿號</description>
+    <elementCriterion>
+      <elementType>17</elementType>
+    </elementCriterion>
+    <TextCreateStrategy/>
+  </TypeCompFilter>
+  <TypeCompFilter name="FSC-407.C-13">
+    <tid>407</tid>
+    <cid>13</cid>
+    <description>電桿桿高</description>
     <elementCriterion>
       <elementType>17</elementType>
     </elementCriterion>
@@ -480,7 +439,7 @@
   <TypeCompFilter name="FSC-114.C-0">
     <tid>114</tid>
     <cid>0</cid>
-    <description>�}��</description>
+    <description>開關</description>
     <elementCriterion>
       <elementType>17</elementType>
     </elementCriterion>
@@ -489,7 +448,7 @@
   <TypeCompFilter name="FSC-114.C-1">
     <tid>114</tid>
     <cid>1</cid>
-    <description>�}���j�����O</description>
+    <description>開關迴路註記</description>
     <elementCriterion>
       <elementType>17</elementType>
       <elementType>7</elementType>
@@ -499,7 +458,7 @@
   <TypeCompFilter name="FSC-114.C-2">
     <tid>114</tid>
     <cid>2</cid>
-    <description>�}���p�P��</description>
+    <description>開關小星號</description>
     <elementCriterion>
       <elementType>17</elementType>
     </elementCriterion>
@@ -508,7 +467,7 @@
   <TypeCompFilter name="FSC-114.C-3">
     <tid>114</tid>
     <cid>3</cid>
-    <description>�}���j�P��</description>
+    <description>開關大星號</description>
     <elementCriterion>
       <elementType>17</elementType>
     </elementCriterion>
@@ -517,7 +476,7 @@
   <TypeCompFilter name="FSC-122.C-0">
     <tid>122</tid>
     <cid>0</cid>
-    <description>�����s��</description>
+    <description>直接連接</description>
     <elementCriterion>
       <elementType>4</elementType>
       <elementType>12</elementType>
@@ -528,7 +487,7 @@
   <TypeCompFilter name="FSC-122.C-1">
     <tid>122</tid>
     <cid>1</cid>
-    <description>�����s�����O</description>
+    <description>直接連接註記</description>
     <elementCriterion>
       <elementType>7</elementType>
       <elementType>17</elementType>
@@ -538,7 +497,7 @@
   <TypeCompFilter name="FSC-107.C-0">
     <tid>107</tid>
     <cid>0</cid>
-    <description>������</description>
+    <description>高壓用戶</description>
     <elementCriterion>
       <elementType>17</elementType>
     </elementCriterion>
@@ -547,7 +506,7 @@
   <TypeCompFilter name="FSC-107.C-1">
     <tid>107</tid>
     <cid>1</cid>
-    <description>��������O</description>
+    <description>高壓用戶註記</description>
     <elementCriterion>
       <elementType>7</elementType>
       <elementType>17</elementType>
@@ -557,7 +516,7 @@
   <TypeCompFilter name="FSC-107.C-2">
     <tid>107</tid>
     <cid>2</cid>
-    <description>�����Τᤤ����O</description>
+    <description>高壓用戶中文註記</description>
     <elementCriterion>
       <elementType>7</elementType>
       <elementType>17</elementType>
@@ -567,7 +526,7 @@
   <TypeCompFilter name="FSC-117.C-0">
     <tid>117</tid>
     <cid>0</cid>
-    <description>Tie������</description>
+    <description>Tie變壓器</description>
     <elementCriterion>
       <elementType>17</elementType>
     </elementCriterion>
@@ -576,7 +535,7 @@
   <TypeCompFilter name="FSC-105.C-0">
     <tid>105</tid>
     <cid>0</cid>
-    <description>�������Y</description>
+    <description>直路接頭</description>
     <elementCriterion>
       <elementType>17</elementType>
     </elementCriterion>
@@ -585,7 +544,7 @@
   <TypeCompFilter name="FSC-105.C-1">
     <tid>105</tid>
     <cid>1</cid>
-    <description>�������Y���O</description>
+    <description>直路接頭註記</description>
     <elementCriterion>
       <elementType>17</elementType>
     </elementCriterion>
@@ -594,7 +553,7 @@
   <TypeCompFilter name="FSC-101.C-0">
     <tid>101</tid>
     <cid>0</cid>
-    <description>�׬y��</description>
+    <description>匯流排</description>
     <elementCriterion>
       <elementType>4</elementType>
       <elementType>12</elementType>
@@ -604,7 +563,7 @@
   <TypeCompFilter name="FSC-120.C-0">
     <tid>120</tid>
     <cid>0</cid>
-    <description>�`�I</description>
+    <description>節點</description>
     <elementCriterion>
       <elementType>17</elementType>
     </elementCriterion>
@@ -613,7 +572,7 @@
   <TypeCompFilter name="FSC-150.C-0">
     <tid>150</tid>
     <cid>0</cid>
-    <description>����}��</description>
+    <description>兩路開關</description>
     <elementCriterion>
       <elementType>17</elementType>
     </elementCriterion>
@@ -622,7 +581,7 @@
   <TypeCompFilter name="FSC-130.C-0">
     <tid>130</tid>
     <cid>0</cid>
-    <description>�ɽu��e</description>
+    <description>導線交叉</description>
     <elementCriterion>
       <elementType>17</elementType>
     </elementCriterion>
@@ -631,7 +590,7 @@
   <TypeCompFilter name="FSC-131.C-0">
     <tid>131</tid>
     <cid>0</cid>
-    <description>�ɽu�ܧ�</description>
+    <description>導線變更</description>
     <elementCriterion>
       <elementType>17</elementType>
     </elementCriterion>
@@ -640,7 +599,7 @@
   <TypeCompFilter name="FSC-109.C-0">
     <tid>109</tid>
     <cid>0</cid>
-    <description>���u�s��</description>
+    <description>跳線連接</description>
     <elementCriterion>
       <elementType>17</elementType>
     </elementCriterion>
@@ -649,7 +608,7 @@
   <TypeCompFilter name="FSC-116.C-0">
     <tid>116</tid>
     <cid>0</cid>
-    <description>�����׺�</description>
+    <description>高壓終端</description>
     <elementCriterion>
       <elementType>17</elementType>
     </elementCriterion>
@@ -658,7 +617,7 @@
   <TypeCompFilter name="FSC-108.C-0">
     <tid>108</tid>
     <cid>0</cid>
-    <description>�_����</description>
+    <description>斷路器</description>
     <elementCriterion>
       <elementType>17</elementType>
     </elementCriterion>
@@ -667,7 +626,7 @@
   <TypeCompFilter name="FSC-108.C-1">
     <tid>108</tid>
     <cid>1</cid>
-    <description>�_�������O</description>
+    <description>斷路器註記</description>
     <elementCriterion>
       <elementType>17</elementType>
       <elementType>7</elementType>
@@ -677,7 +636,7 @@
   <TypeCompFilter name="FSC-119.C-0">
     <tid>119</tid>
     <cid>0</cid>
-    <description>�q��</description>
+    <description>電驛</description>
     <elementCriterion>
       <elementType>17</elementType>
     </elementCriterion>
@@ -686,7 +645,7 @@
   <TypeCompFilter name="FSC-115.C-0">
     <tid>115</tid>
     <cid>0</cid>
-    <description>������</description>
+    <description>變壓器</description>
     <elementCriterion>
       <elementType>17</elementType>
     </elementCriterion>
@@ -695,7 +654,7 @@
   <TypeCompFilter name="FSC-115.C-1">
     <tid>115</tid>
     <cid>1</cid>
-    <description>���������O</description>
+    <description>變壓器註記</description>
     <elementCriterion>
       <elementType>7</elementType>
       <elementType>17</elementType>
@@ -705,7 +664,7 @@
   <TypeCompFilter name="FSC-115.C-2">
     <tid>115</tid>
     <cid>2</cid>
-    <description>���O�t�������</description>
+    <description>路燈系統圖變壓器</description>
     <elementCriterion>
       <elementType>17</elementType>
     </elementCriterion>
@@ -714,7 +673,7 @@
   <TypeCompFilter name="FSC-115.C-3">
     <tid>115</tid>
     <cid>3</cid>
-    <description>���O�t����������O</description>
+    <description>路燈系統圖變壓器註記</description>
     <elementCriterion>
       <elementType>7</elementType>
       <elementType>17</elementType>
@@ -724,7 +683,7 @@
   <TypeCompFilter name="FSC-115.C-4">
     <tid>115</tid>
     <cid>4</cid>
-    <description>�C���t�������</description>
+    <description>低壓系統圖變壓器</description>
     <elementCriterion>
       <elementType>7</elementType>
       <elementType>17</elementType>
@@ -734,7 +693,7 @@
   <TypeCompFilter name="FSC-115.C-5">
     <tid>115</tid>
     <cid>5</cid>
-    <description>�C���t����������O</description>
+    <description>低壓系統圖變壓器註記</description>
     <elementCriterion>
       <elementType>7</elementType>
       <elementType>17</elementType>
@@ -744,7 +703,7 @@
   <TypeCompFilter name="FSC-115.C-6">
     <tid>115</tid>
     <cid>6</cid>
-    <description>�C���t�ι�-�t�q�Ǯy�е��O</description>
+    <description>低壓系統圖-配電室座標註記</description>
     <elementCriterion>
       <elementType>7</elementType>
       <elementType>17</elementType>
@@ -754,7 +713,7 @@
   <TypeCompFilter name="FSC-115.C-7">
     <tid>115</tid>
     <cid>7</cid>
-    <description>�C���t�ι�-�t�q�Ǯy�е��O</description>
+    <description>低壓系統圖-配電室座標註記</description>
     <elementCriterion>
       <elementType>7</elementType>
       <elementType>17</elementType>
@@ -764,7 +723,7 @@
   <TypeCompFilter name="FSC-115.C-8">
     <tid>115</tid>
     <cid>8</cid>
-    <description>�[��������(�a�U�C����)���O</description>
+    <description>架空變壓器(地下低壓用)註記</description>
     <elementCriterion>
       <elementType>7</elementType>
       <elementType>17</elementType>
@@ -774,7 +733,7 @@
   <TypeCompFilter name="FSC-115.C-91">
     <tid>115</tid>
     <cid>91</cid>
-    <description>�����������s���u</description>
+    <description>變壓器延伸連接線</description>
     <elementCriterion>
       <elementType>12</elementType>
       <elementType>4</elementType>
@@ -784,7 +743,7 @@
   <TypeCompFilter name="FSC-118.C-0">
     <tid>118</tid>
     <cid>0</cid>
-    <description>�D������</description>
+    <description>主變壓器</description>
     <elementCriterion>
       <elementType>17</elementType>
     </elementCriterion>
@@ -793,7 +752,7 @@
   <TypeCompFilter name="FSC-102.C-0">
     <tid>102</tid>
     <cid>0</cid>
-    <description>�q�e��</description>
+    <description>電容器</description>
     <elementCriterion>
       <elementType>17</elementType>
     </elementCriterion>
@@ -802,7 +761,7 @@
   <TypeCompFilter name="FSC-100.C-0">
     <tid>100</tid>
     <cid>0</cid>
-    <description>�׹p��</description>
+    <description>避雷器</description>
     <elementCriterion>
       <elementType>17</elementType>
     </elementCriterion>
@@ -811,7 +770,7 @@
   <TypeCompFilter name="FSC-140.C-0">
     <tid>140</tid>
     <cid>0</cid>
-    <description>�����u��(�u���ϥ�)</description>
+    <description>高壓線路(線路圖用)</description>
     <elementCriterion>
       <elementType>12</elementType>
       <elementType>4</elementType>
@@ -821,7 +780,7 @@
   <TypeCompFilter name="FSC-140.C-1">
     <tid>140</tid>
     <cid>1</cid>
-    <description>�޽u(�u���ϥ�)</description>
+    <description>引線(線路圖用)</description>
     <elementCriterion>
       <elementType>12</elementType>
       <elementType>4</elementType>
@@ -831,7 +790,7 @@
   <TypeCompFilter name="FSC-140.C-2">
     <tid>140</tid>
     <cid>2</cid>
-    <description>�ɽu���O(�u���ϥ�)</description>
+    <description>導線註記(線路圖用)</description>
     <elementCriterion>
       <elementType>7</elementType>
       <elementType>17</elementType>
@@ -841,7 +800,7 @@
   <TypeCompFilter name="FSC-140.C-3">
     <tid>140</tid>
     <cid>3</cid>
-    <description>�X�u�N���޽u(�u���ϥ�)</description>
+    <description>饋線代號引線(線路圖用)</description>
     <elementCriterion>
       <elementType>12</elementType>
       <elementType>4</elementType>
@@ -851,7 +810,7 @@
   <TypeCompFilter name="FSC-140.C-4">
     <tid>140</tid>
     <cid>4</cid>
-    <description>�X�u�N�����O(�u���ϥ�)</description>
+    <description>饋線代號註記(線路圖用)</description>
     <elementCriterion>
       <elementType>7</elementType>
       <elementType>17</elementType>
@@ -861,7 +820,7 @@
   <TypeCompFilter name="FSC-151.C-0">
     <tid>150</tid>
     <cid>0</cid>
-    <description>�`���}��</description>
+    <description>常閉開關</description>
     <elementCriterion>
       <elementType>17</elementType>
     </elementCriterion>
@@ -871,17 +830,17 @@
   <TypeCompFilter name="FSC-200.C-0">
     <tid>200</tid>
     <cid>0</cid>
-    <description>�C���`�I</description>
+    <description>低壓節點</description>
     <elementCriterion>
       <elementType>17</elementType>
     </elementCriterion>
     <SymbolCreateStrategy/>
   </TypeCompFilter>
-  <!-- *****�C��****** -->
+  <!-- *****低壓****** -->
   <TypeCompFilter name="FSC-201.C-0">
     <tid>201</tid>
     <cid>0</cid>
-    <description>����u</description>
+    <description>接戶線</description>
     <elementCriterion>
       <elementType>12</elementType>
       <elementType>16</elementType>
@@ -892,7 +851,7 @@
   <TypeCompFilter name="FSC-201.C-1">
     <tid>201</tid>
     <cid>1</cid>
-    <description>����u���O</description>
+    <description>接戶線註記</description>
     <elementCriterion>
       <elementType>7</elementType>
       <elementType>17</elementType>
@@ -902,7 +861,7 @@
   <TypeCompFilter name="FSC-201.C-2">
     <tid>201</tid>
     <cid>2</cid>
-    <description>����u���׵��O</description>
+    <description>接戶線長度註記</description>
     <elementCriterion>
       <elementType>7</elementType>
       <elementType>17</elementType>
@@ -912,7 +871,7 @@
   <TypeCompFilter name="FSC-202.C-0">
     <tid>202</tid>
     <cid>0</cid>
-    <description>�����I</description>
+    <description>接戶點</description>
     <elementCriterion>
       <elementType>17</elementType>
     </elementCriterion>
@@ -921,7 +880,7 @@
   <TypeCompFilter name="FSC-202.C-1">
     <tid>202</tid>
     <cid>1</cid>
-    <description>�����I���P���O</description>
+    <description>接戶點門牌註記</description>
     <elementCriterion>
       <elementType>7</elementType>
       <elementType>17</elementType>
@@ -931,7 +890,7 @@
   <TypeCompFilter name="FSC-203.C-0">
     <tid>203</tid>
     <cid>0</cid>
-    <description>���O�d�������I</description>
+    <description>路燈責任分界點</description>
     <elementCriterion>
       <elementType>17</elementType>
     </elementCriterion>
@@ -940,7 +899,7 @@
   <TypeCompFilter name="FSC-203.C-1">
     <tid>203</tid>
     <cid>1</cid>
-    <description>���O�d�������I���O</description>
+    <description>路燈責任分界點註記</description>
     <elementCriterion>
       <elementType>7</elementType>
       <elementType>17</elementType>
@@ -950,7 +909,7 @@
   <TypeCompFilter name="FSC-204.C-0">
     <tid>204</tid>
     <cid>0</cid>
-    <description>�C�����u</description>
+    <description>低壓跳線</description>
     <elementCriterion>
       <elementType>17</elementType>
     </elementCriterion>
@@ -959,7 +918,7 @@
   <TypeCompFilter name="FSC-205.C-0">
     <tid>205</tid>
     <cid>0</cid>
-    <description>�C���ɽu</description>
+    <description>低壓導線</description>
     <elementCriterion>
       <elementType>4</elementType>
       <elementType>12</elementType>
@@ -969,7 +928,7 @@
   <TypeCompFilter name="FSC-205.C-1">
     <tid>205</tid>
     <cid>1</cid>
-    <description>�C���ɽu���O</description>
+    <description>低壓導線註記</description>
     <elementCriterion>
       <elementType>7</elementType>
       <elementType>17</elementType>
@@ -979,7 +938,7 @@
   <TypeCompFilter name="FSC-205.C-2">
     <tid>205</tid>
     <cid>2</cid>
-    <description>�C���ɽu���׵��O</description>
+    <description>低壓導線長度註記</description>
     <elementCriterion>
       <elementType>7</elementType>
     </elementCriterion>
@@ -988,7 +947,7 @@
   <TypeCompFilter name="FSC-206.C-0">
     <tid>206</tid>
     <cid>0</cid>
-    <description>�C�������c</description>
+    <description>低壓遙控箱</description>
     <elementCriterion>
       <elementType>17</elementType>
     </elementCriterion>
@@ -997,7 +956,7 @@
   <TypeCompFilter name="FSC-206.C-1">
     <tid>206</tid>
     <cid>1</cid>
-    <description>�C�������c���O</description>
+    <description>低壓遙控箱註記</description>
     <elementCriterion>
       <elementType>7</elementType>
       <elementType>17</elementType>
@@ -1007,7 +966,7 @@
   <TypeCompFilter name="FSC-206.C-2">
     <tid>206</tid>
     <cid>2</cid>
-    <description>�C�������c���P���O</description>
+    <description>低壓遙控箱門牌註記</description>
     <elementCriterion>
       <elementType>7</elementType>
       <elementType>17</elementType>
@@ -1017,7 +976,7 @@
   <TypeCompFilter name="FSC-207.C-0">
     <tid>207</tid>
     <cid>0</cid>
-    <description>�C��ĵ����</description>
+    <description>低壓警報器</description>
     <elementCriterion>
       <elementType>17</elementType>
     </elementCriterion>
@@ -1026,7 +985,7 @@
   <TypeCompFilter name="FSC-207.C-1">
     <tid>207</tid>
     <cid>1</cid>
-    <description>�C��ĵ�������O</description>
+    <description>低壓警報器註記</description>
     <elementCriterion>
       <elementType>7</elementType>
       <elementType>17</elementType>
@@ -1036,7 +995,7 @@
   <TypeCompFilter name="FSC-207.C-2">
     <tid>207</tid>
     <cid>2</cid>
-    <description>�C��ĵ�������P���O</description>
+    <description>低壓警報器門牌註記</description>
     <elementCriterion>
       <elementType>7</elementType>
       <elementType>17</elementType>
@@ -1046,7 +1005,7 @@
   <TypeCompFilter name="FSC-208.C-0">
     <tid>208</tid>
     <cid>0</cid>
-    <description>�C���׺�</description>
+    <description>低壓終端</description>
     <elementCriterion>
       <elementType>17</elementType>
     </elementCriterion>
@@ -1055,7 +1014,7 @@
   <TypeCompFilter name="FSC-209.C-0">
     <tid>209</tid>
     <cid>0</cid>
-    <description>�C����q���x</description>
+    <description>低壓交通號誌</description>
     <elementCriterion>
       <elementType>17</elementType>
     </elementCriterion>
@@ -1064,7 +1023,7 @@
   <TypeCompFilter name="FSC-209.C-1">
     <tid>209</tid>
     <cid>1</cid>
-    <description>�C����q���x���O</description>
+    <description>低壓交通號誌註記</description>
     <elementCriterion>
       <elementType>7</elementType>
       <elementType>17</elementType>
@@ -1074,7 +1033,7 @@
   <TypeCompFilter name="FSC-210.C-0">
     <tid>210</tid>
     <cid>0</cid>
-    <description>�C���a�U�ɽu</description>
+    <description>低壓地下導線</description>
     <elementCriterion>
       <elementType>4</elementType>
       <elementType>12</elementType>
@@ -1085,7 +1044,7 @@
   <TypeCompFilter name="FSC-210.C-1">
     <tid>210</tid>
     <cid>1</cid>
-    <description>�C���a�U�ɽu���I�Ÿ�</description>
+    <description>低壓地下導線打點符號</description>
     <elementCriterion>
       <elementType>17</elementType>
     </elementCriterion>
@@ -1094,7 +1053,7 @@
   <TypeCompFilter name="FSC-210.C-2">
     <tid>210</tid>
     <cid>2</cid>
-    <description>�C���a�U�ɽu���׵��O</description>
+    <description>低壓地下導線長度註記</description>
     <elementCriterion>
       <elementType>17</elementType>
     </elementCriterion>
@@ -1103,7 +1062,7 @@
   <TypeCompFilter name="FSC-210.C-3">
     <tid>210</tid>
     <cid>3</cid>
-    <description>�C���a�U�ɽu�Ÿ�</description>
+    <description>低壓地下導線符號</description>
     <elementCriterion>
       <elementType>4</elementType>
       <elementType>12</elementType>
@@ -1113,7 +1072,7 @@
   <TypeCompFilter name="FSC-210.C-4">
     <tid>210</tid>
     <cid>4</cid>
-    <description>�C���a�U�ɽu���O</description>
+    <description>低壓地下導線註記</description>
     <elementCriterion>
       <elementType>7</elementType>
       <elementType>17</elementType>
@@ -1123,7 +1082,7 @@
   <TypeCompFilter name="FSC-211.C-0">
     <tid>211</tid>
     <cid>0</cid>
-    <description>�C���[�ű���u</description>
+    <description>低壓架空接戶線</description>
     <elementCriterion>
       <elementType>4</elementType>
       <elementType>12</elementType>
@@ -1133,7 +1092,7 @@
   <TypeCompFilter name="FSC-211.C-1">
     <tid>211</tid>
     <cid>1</cid>
-    <description>�C���[�ű���u���O</description>
+    <description>低壓架空接戶線註記</description>
     <elementCriterion>
       <elementType>7</elementType>
       <elementType>17</elementType>
@@ -1143,7 +1102,7 @@
   <TypeCompFilter name="FSC-211.C-2">
     <tid>211</tid>
     <cid>2</cid>
-    <description>�C���[�ű���u���׵��O</description>
+    <description>低壓架空接戶線長度註記</description>
     <elementCriterion>
       <elementType>7</elementType>
       <elementType>17</elementType>
@@ -1153,7 +1112,7 @@
   <TypeCompFilter name="FSC-212.C-0">
     <tid>212</tid>
     <cid>0</cid>
-    <description>�C���[�ųs������u</description>
+    <description>低壓架空連接接戶線</description>
     <elementCriterion>
       <elementType>4</elementType>
       <elementType>12</elementType>
@@ -1163,7 +1122,7 @@
   <TypeCompFilter name="FSC-212.C-1">
     <tid>212</tid>
     <cid>1</cid>
-    <description>�C���[�ųs������u���O</description>
+    <description>低壓架空連接接戶線註記</description>
     <elementCriterion>
       <elementType>7</elementType>
       <elementType>17</elementType>
@@ -1173,7 +1132,7 @@
   <TypeCompFilter name="FSC-212.C-2">
     <tid>212</tid>
     <cid>2</cid>
-    <description>�C���[�ųs������u���׵��O</description>
+    <description>低壓架空連接接戶線長度註記</description>
     <elementCriterion>
       <elementType>7</elementType>
       <elementType>17</elementType>
@@ -1183,7 +1142,7 @@
   <TypeCompFilter name="FSC-213.C-0">
     <tid>213</tid>
     <cid>0</cid>
-    <description>�C���a�U�s������u</description>
+    <description>低壓地下連接接戶線</description>
     <elementCriterion>
       <elementType>4</elementType>
       <elementType>12</elementType>
@@ -1194,7 +1153,7 @@
   <TypeCompFilter name="FSC-213.C-1">
     <tid>213</tid>
     <cid>1</cid>
-    <description>�C���a�U�s������u���O</description>
+    <description>低壓地下連接接戶線註記</description>
     <elementCriterion>
       <elementType>7</elementType>
       <elementType>17</elementType>
@@ -1204,7 +1163,7 @@
   <TypeCompFilter name="FSC-213.C-2">
     <tid>213</tid>
     <cid>2</cid>
-    <description>�C���a�U�s������u���׵��O</description>
+    <description>低壓地下連接接戶線長度註記</description>
     <elementCriterion>
       <elementType>7</elementType>
       <elementType>17</elementType>
@@ -1214,7 +1173,7 @@
   <TypeCompFilter name="FSC-215.C-0">
     <tid>215</tid>
     <cid>0</cid>
-    <description>�C���۰ʭt�������}��</description>
+    <description>低壓自動負載切換開關</description>
     <elementCriterion>
       <elementType>17</elementType>
     </elementCriterion>
@@ -1223,7 +1182,7 @@
   <TypeCompFilter name="FSC-216.C-0">
     <tid>216</tid>
     <cid>0</cid>
-    <description>�a�U�C���ʵ���</description>
+    <description>地下低壓監視器</description>
     <elementCriterion>
       <elementType>17</elementType>
     </elementCriterion>
@@ -1232,7 +1191,7 @@
   <TypeCompFilter name="FSC-216.C-1">
     <tid>216</tid>
     <cid>1</cid>
-    <description>�C���ʵ������O</description>
+    <description>低壓監視器註記</description>
     <elementCriterion>
       <elementType>7</elementType>
       <elementType>17</elementType>
@@ -1242,7 +1201,7 @@
   <TypeCompFilter name="FSC-216.C-2">
     <tid>216</tid>
     <cid>2</cid>
-    <description>�C���ʵ������P���O</description>
+    <description>低壓監視器門牌註記</description>
     <elementCriterion>
       <elementType>7</elementType>
       <elementType>17</elementType>
@@ -1252,17 +1211,17 @@
   <TypeCompFilter name="FSC-217.C-0">
     <tid>217</tid>
     <cid>0</cid>
-    <description>�C���a�U���</description>
+    <description>低壓地下游休</description>
     <elementCriterion>
       <elementType>17</elementType>
     </elementCriterion>
     <SymbolCreateStrategy/>
   </TypeCompFilter>
-  <!-- ���l -->
+  <!-- 光纜 -->
   <TypeCompFilter name="FSC-300.C-0">
     <tid>300</tid>
     <cid>0</cid>
-    <description>�q�T���l�u</description>
+    <description>通訊光纜線</description>
     <elementCriterion>
       <elementType>4</elementType>
       <elementType>12</elementType>
@@ -1272,7 +1231,7 @@
   <TypeCompFilter name="FSC-300.C-1">
     <tid>300</tid>
     <cid>1</cid>
-    <description>���ֹq�l����(����)���O</description>
+    <description>光纖電纜型式(長度)註記</description>
     <elementCriterion>
       <elementType>7</elementType>
       <elementType>17</elementType>
@@ -1282,7 +1241,7 @@
   <TypeCompFilter name="FSC-300.C-2">
     <tid>300</tid>
     <cid>2</cid>
-    <description>���ֹq�l��r�������O</description>
+    <description>光纖電纜文字說明註記</description>
     <elementCriterion>
       <elementType>7</elementType>
       <elementType>17</elementType>
@@ -1292,7 +1251,7 @@
   <TypeCompFilter name="FSC-300.C-3">
     <tid>300</tid>
     <cid>3</cid>
-    <description>���ֹq�l�޽u�Ÿ�</description>
+    <description>光纖電纜引線符號</description>
     <elementCriterion>
       <elementType>4</elementType>
       <elementType>12</elementType>
@@ -1302,7 +1261,7 @@
   <TypeCompFilter name="FSC-300.C-4">
     <tid>300</tid>
     <cid>4</cid>
-    <description>���ֹq�l���I�Ÿ�</description>
+    <description>光纖電纜打點符號</description>
     <elementCriterion>
       <elementType>17</elementType>
     </elementCriterion>
@@ -1311,7 +1270,7 @@
   <TypeCompFilter name="FSC-301.C-0">
     <tid>301</tid>
     <cid>0</cid>
-    <description>���O����u</description>
+    <description>路燈控制線</description>
     <elementCriterion>
       <elementType>4</elementType>
       <elementType>12</elementType>
@@ -1321,7 +1280,7 @@
   <TypeCompFilter name="FSC-301.C-1">
     <tid>301</tid>
     <cid>1</cid>
-    <description>���O����u�޽u�Ÿ�</description>
+    <description>路燈控制線引線符號</description>
     <elementCriterion>
       <elementType>12</elementType>
     </elementCriterion>
@@ -1330,7 +1289,7 @@
   <TypeCompFilter name="FSC-301.C-3">
     <tid>301</tid>
     <cid>3</cid>
-    <description>���O����u���O</description>
+    <description>路燈控制線註記</description>
     <elementCriterion>
       <elementType>7</elementType>
       <elementType>17</elementType>
@@ -1340,7 +1299,7 @@
   <TypeCompFilter name="FSC-999.C-0">
     <tid>999</tid>
     <cid>0</cid>
-    <description>���O</description>
+    <description>註記</description>
     <elementCriterion>
       <elementType>7</elementType>
       <elementType>17</elementType>
@@ -1350,7 +1309,7 @@
   <TypeCompFilter name="FSC-113.C-0">
     <tid>113</tid>
     <cid>0</cid>
-    <description>�����a�U���</description>
+    <description>高壓地下游休</description>
     <elementCriterion>
       <elementType>17</elementType>
     </elementCriterion>
@@ -1359,7 +1318,7 @@
   <TypeCompFilter name="FSC-403.C-0">
     <tid>403</tid>
     <cid>0</cid>
-    <description>���C���H���</description>
+    <description>高低壓人手孔</description>
     <elementCriterion>
       <elementType>17</elementType>
     </elementCriterion>
@@ -1368,7 +1327,7 @@
   <TypeCompFilter name="FSC-403.C-1">
     <tid>403</tid>
     <cid>1</cid>
-    <description>���C���H��ծy�е��O</description>
+    <description>高低壓人手孔座標註記</description>
     <elementCriterion>
       <elementType>7</elementType>
       <elementType>17</elementType>
@@ -1378,7 +1337,7 @@
   <TypeCompFilter name="FSC-403.C-2">
     <tid>403</tid>
     <cid>2</cid>
-    <description>���C���H��ն��Ÿ�</description>
+    <description>高低壓人手孔圓圈符號</description>
     <elementCriterion>
       <elementType>17</elementType>
     </elementCriterion>
@@ -1387,7 +1346,7 @@
   <TypeCompFilter name="FSC-403.C-4">
     <tid>403</tid>
     <cid>4</cid>
-    <description>���O�ն��</description>
+    <description>路燈孔圓圈</description>
     <elementCriterion>
       <elementType>17</elementType>
     </elementCriterion>
@@ -1396,7 +1355,7 @@
   <TypeCompFilter name="FSC-403.C-5">
     <tid>403</tid>
     <cid>5</cid>
-    <description>���O�ծy�е��O</description>
+    <description>路燈孔座標註記</description>
     <elementCriterion>
       <elementType>7</elementType>
       <elementType>17</elementType>
@@ -1406,7 +1365,7 @@
   <TypeCompFilter name="FSC-403.C-6">
     <tid>403</tid>
     <cid>6</cid>
-    <description>���֤ն��Ÿ�</description>
+    <description>光纖孔圓圈符號</description>
     <elementCriterion>
       <elementType>17</elementType>
     </elementCriterion>
@@ -1415,7 +1374,7 @@
   <TypeCompFilter name="FSC-403.C-7">
     <tid>403</tid>
     <cid>7</cid>
-    <description>���l�ծy�е��O(���l�ϥ�)</description>
+    <description>光纜孔座標註記(光纜圖用)</description>
     <elementCriterion>
       <elementType>7</elementType>
       <elementType>17</elementType>
@@ -1425,27 +1384,29 @@
   <TypeCompFilter name="FSC-401.C-0">
     <tid>401</tid>
     <cid>0</cid>
-    <description>�޸�</description>
+    <description>管路</description>
     <elementCriterion>
       <elementType>12</elementType>
       <elementType>16</elementType>
+      <elementType>4</elementType>
     </elementCriterion>
     <LineCreateStrategy/>
   </TypeCompFilter>
   <TypeCompFilter name="FSC-401.C-1">
     <tid>401</tid>
     <cid>1</cid>
-    <description>�޸��޽u</description>
+    <description>管路引線</description>
     <elementCriterion>
       <elementType>12</elementType>
       <elementType>16</elementType>
+      <elementType>4</elementType>
     </elementCriterion>
     <LineCreateStrategy/>
   </TypeCompFilter>
   <TypeCompFilter name="FSC-401.C-2">
     <tid>401</tid>
     <cid>2</cid>
-    <description>�޸��޴U</description>
+    <description>管路管帽</description>
     <elementCriterion>
       <elementType>17</elementType>
     </elementCriterion>
@@ -1454,7 +1415,7 @@
   <TypeCompFilter name="FSC-401.C-3">
     <tid>401</tid>
     <cid>3</cid>
-    <description>�޸���r�������O</description>
+    <description>管路文字說明註記</description>
     <elementCriterion>
       <elementType>7</elementType>
       <elementType>17</elementType>
@@ -1464,7 +1425,7 @@
   <TypeCompFilter name="FSC-401.C-5">
     <tid>401</tid>
     <cid>5</cid>
-    <description>�޸��_���Ϭq�Ϲj</description>
+    <description>管路斷面區段區隔</description>
     <elementCriterion>
       <elementType>17</elementType>
     </elementCriterion>
@@ -1473,7 +1434,7 @@
   <TypeCompFilter name="FSC-302.C-0">
     <tid>302</tid>
     <cid>0</cid>
-    <description>���O�t���u</description>
+    <description>路燈負載線</description>
     <elementCriterion>
       <elementType>12</elementType>
     </elementCriterion>
@@ -1482,7 +1443,7 @@
   <TypeCompFilter name="FSC-302.C-1">
     <tid>302</tid>
     <cid>1</cid>
-    <description>���O�t���u���O</description>
+    <description>路燈負載線註記</description>
     <elementCriterion>
       <elementType>17</elementType>
       <elementType>7</elementType>
@@ -1492,7 +1453,7 @@
   <TypeCompFilter name="FSC-303.C-0">
     <tid>303</tid>
     <cid>0</cid>
-    <description>���O�ާ@�u</description>
+    <description>路燈操作線</description>
     <elementCriterion>
       <elementType>12</elementType>
     </elementCriterion>
@@ -1501,7 +1462,7 @@
   <TypeCompFilter name="FSC-303.C-1">
     <tid>303</tid>
     <cid>1</cid>
-    <description>���O�ާ@�u�޽u</description>
+    <description>路燈操作線引線</description>
     <elementCriterion>
       <elementType>12</elementType>
     </elementCriterion>
@@ -1510,7 +1471,7 @@
   <TypeCompFilter name="FSC-303.C-3">
     <tid>303</tid>
     <cid>3</cid>
-    <description>���O�ާ@�u���O</description>
+    <description>路燈操作線註記</description>
     <elementCriterion>
       <elementType>7</elementType>
       <elementType>17</elementType>
@@ -1520,7 +1481,7 @@
   <TypeCompFilter name="FSC-305.C-0">
     <tid>305</tid>
     <cid>0</cid>
-    <description>���O�I����</description>
+    <description>路燈點滅器</description>
     <elementCriterion>
       <elementType>17</elementType>
     </elementCriterion>
@@ -1529,7 +1490,7 @@
   <TypeCompFilter name="FSC-306.C-0">
     <tid>306</tid>
     <cid>0</cid>
-    <description>���O�ɱ��}��</description>
+    <description>路燈時控開關</description>
     <elementCriterion>
       <elementType>17</elementType>
     </elementCriterion>
@@ -1538,7 +1499,7 @@
   <TypeCompFilter name="FSC-307.C-0">
     <tid>307</tid>
     <cid>0</cid>
-    <description>���O���[�I</description>
+    <description>路燈分歧點</description>
     <elementCriterion>
       <elementType>17</elementType>
     </elementCriterion>
@@ -1547,7 +1508,7 @@
   <TypeCompFilter name="FSC-308.C-0">
     <tid>308</tid>
     <cid>0</cid>
-    <description>���O�׺�</description>
+    <description>路燈終端</description>
     <elementCriterion>
       <elementType>17</elementType>
     </elementCriterion>
@@ -1556,7 +1517,7 @@
   <TypeCompFilter name="FSC-311.C-0">
     <tid>311</tid>
     <cid>0</cid>
-    <description>���O�x�b</description>
+    <description>路燈台帳</description>
     <elementCriterion>
       <elementType>17</elementType>
     </elementCriterion>
@@ -1565,7 +1526,7 @@
   <TypeCompFilter name="FSC-311.C-1">
     <tid>311</tid>
     <cid>1</cid>
-    <description>���O�x�b�ϸ�(�e�q.����)���O</description>
+    <description>路燈台帳圖號(容量.盞數)註記</description>
     <elementCriterion>
       <elementType>7</elementType>
       <elementType>17</elementType>
@@ -1575,7 +1536,7 @@
   <TypeCompFilter name="FSC-314.C-0">
     <tid>314</tid>
     <cid>0</cid>
-    <description>�[�Ÿ��O�t���u</description>
+    <description>架空路燈負載線</description>
     <elementCriterion>
       <elementType>12</elementType>
     </elementCriterion>
@@ -1584,7 +1545,7 @@
   <TypeCompFilter name="FSC-314.C-1">
     <tid>314</tid>
     <cid>1</cid>
-    <description>�[�Ÿ��O�t���u���O</description>
+    <description>架空路燈負載線註記</description>
     <elementCriterion>
       <elementType>7</elementType>
     </elementCriterion>
@@ -1593,7 +1554,7 @@
   <TypeCompFilter name="FSC-315.C-0">
     <tid>315</tid>
     <cid>0</cid>
-    <description>�[�Ÿ��O����u</description>
+    <description>架空路燈控制線</description>
     <elementCriterion>
       <elementType>12</elementType>
     </elementCriterion>
@@ -1602,7 +1563,7 @@
   <TypeCompFilter name="FSC-315.C-1">
     <tid>315</tid>
     <cid>1</cid>
-    <description>�[�Ÿ��O����u���O</description>
+    <description>架空路燈控制線註記</description>
     <elementCriterion>
       <elementType>7</elementType>
       <elementType>17</elementType>
@@ -1612,7 +1573,7 @@
   <TypeCompFilter name="FSC-316.C-0">
     <tid>316</tid>
     <cid>0</cid>
-    <description>���O����</description>
+    <description>路燈直路</description>
     <elementCriterion>
       <elementType>17</elementType>
     </elementCriterion>
@@ -1621,7 +1582,7 @@
   <TypeCompFilter name="FSC-317.C-0">
     <tid>317</tid>
     <cid>0</cid>
-    <description>���O����}��</description>
+    <description>路燈控制開關</description>
     <elementCriterion>
       <elementType>17</elementType>
     </elementCriterion>
@@ -1630,7 +1591,7 @@
   <TypeCompFilter name="FSC-317.C-1">
     <tid>317</tid>
     <cid>1</cid>
-    <description>���O����}�����O</description>
+    <description>路燈控制開關註記</description>
     <elementCriterion>
       <elementType>7</elementType>
       <elementType>17</elementType>
@@ -1640,7 +1601,7 @@
   <TypeCompFilter name="FSC-318.C-0">
     <tid>318</tid>
     <cid>0</cid>
-    <description>���O�׬y��</description>
+    <description>路燈匯流排</description>
     <elementCriterion>
       <elementType>12</elementType>
     </elementCriterion>
@@ -1649,7 +1610,7 @@
   <TypeCompFilter name="FSC-319.C-0">
     <tid>319</tid>
     <cid>0</cid>
-    <description>���֦��e</description>
+    <description>光纖收容</description>
     <elementCriterion>
       <elementType>17</elementType>
     </elementCriterion>
@@ -1658,7 +1619,7 @@
   <TypeCompFilter name="FSC-320.C-0">
     <tid>320</tid>
     <cid>0</cid>
-    <description>���ֳq�T���Y</description>
+    <description>光纖通訊接頭</description>
     <elementCriterion>
       <elementType>17</elementType>
     </elementCriterion>
@@ -1667,7 +1628,7 @@
   <TypeCompFilter name="FSC-325.C-0">
     <tid>325</tid>
     <cid>0</cid>
-    <description>���֤��t�˸m</description>
+    <description>光纖分配裝置</description>
     <elementCriterion>
       <elementType>17</elementType>
     </elementCriterion>
@@ -1676,7 +1637,7 @@
   <TypeCompFilter name="FSC-325.C-1">
     <tid>325</tid>
     <cid>1</cid>
-    <description>���֤��t�˸m���O</description>
+    <description>光纖分配裝置註記</description>
     <elementCriterion>
       <elementType>17</elementType>
     </elementCriterion>
@@ -1686,7 +1647,7 @@
   <TypeCompFilter name="FSC-323.C-0">
     <tid>323</tid>
     <cid>0</cid>
-    <description>���q�ഫ��</description>
+    <description>光電轉換器</description>
     <elementCriterion>
       <elementType>17</elementType>
     </elementCriterion>
@@ -1695,7 +1656,7 @@
   <TypeCompFilter name="FSC-324.C-0">
     <tid>324</tid>
     <cid>0</cid>
-    <description>�۰ʤƻ�����</description>
+    <description>自動化遙控器</description>
     <elementCriterion>
       <elementType>17</elementType>
     </elementCriterion>
@@ -1704,13 +1665,108 @@
   <TypeCompFilter name="FSC-324.C-1">
     <tid>324</tid>
     <cid>1</cid>
-    <description>�۰ʤƻ��������O</description>
+    <description>自動化遙控器註記</description>
     <elementCriterion>
       <elementType>7</elementType>
       <elementType>17</elementType>
     </elementCriterion>
     <TextCreateStrategy/>
   </TypeCompFilter>
+  
+  <TypeCompFilter name="FSC-103.C-0">
+    <tid>103</tid>
+    <cid>0</cid>
+    <description>電纜故障指示器</description>
+    <elementCriterion>
+      <elementType>17</elementType>
+    </elementCriterion>
+    <SymbolCreateStrategy/>
+  </TypeCompFilter>
+  <TypeCompFilter name="FSC-110.C-0">
+    <tid>110</tid>
+    <cid>0</cid>
+    <description>分散式能源</description>
+    <elementCriterion>
+      <elementType>17</elementType>
+    </elementCriterion>
+    <SymbolCreateStrategy/>
+  </TypeCompFilter>  
+    <TypeCompFilter name="FSC-110.C-2">
+      <tid>110</tid>
+      <cid>2</cid>
+      <description>分散式能源引線</description>
+      <elementCriterion>
+        <elementType>12</elementType>
+        <elementType>4</elementType>
+      </elementCriterion>
+      <LineCreateStrategy/>
+  </TypeCompFilter>
+  <TypeCompFilter name="FSC-323.C-0">
+    <tid>323</tid>
+    <cid>0</cid>
+    <description>光電轉換器</description>
+    <elementCriterion>
+      <elementType>17</elementType>
+    </elementCriterion>
+    <SymbolCreateStrategy/>
+  </TypeCompFilter>
+  <TypeCompFilter name="FSC-312.C-0">
+    <tid>312</tid>
+    <cid>0</cid>
+    <description>路燈台帳</description>
+    <elementCriterion>
+      <elementType>17</elementType>
+    </elementCriterion>
+    <SymbolCreateStrategy/>
+  </TypeCompFilter>
+  <TypeCompFilter name="FSC-312.C-1">
+    <tid>312</tid>
+    <cid>1</cid>
+    <description>路燈台帳註記</description>
+    <elementCriterion>
+      <elementType>7</elementType>
+      <elementType>17</elementType>
+    </elementCriterion>
+    <TextCreateStrategy/>
+  </TypeCompFilter>  
+  <TypeCompFilter name="FSC-313.C-0">
+    <tid>313</tid>
+    <cid>0</cid>
+    <description>附架點數台帳</description>
+    <elementCriterion>
+      <elementType>17</elementType>
+    </elementCriterion>
+    <SymbolCreateStrategy/>
+  </TypeCompFilter>
+  <TypeCompFilter name="FSC-313.C-1">
+    <tid>313</tid>
+    <cid>1</cid>
+    <description>附架點數台帳註記</description>
+    <elementCriterion>
+      <elementType>7</elementType>
+      <elementType>17</elementType>
+    </elementCriterion>
+    <TextCreateStrategy/>
+  </TypeCompFilter>  
+  <TypeCompFilter name="FSC-112.C-0">
+    <tid>112</tid>
+    <cid>0</cid>
+    <description>AMI</description>
+    <elementCriterion>
+      <elementType>17</elementType>
+    </elementCriterion>
+    <SymbolCreateStrategy/>
+  </TypeCompFilter>  
+  <TypeCompFilter name="FSC-111.C-0">
+    <tid>111</tid>
+    <cid>0</cid>
+    <description>電壓調整器</description>
+    <elementCriterion>
+      <elementType>17</elementType>
+    </elementCriterion>
+    <SymbolCreateStrategy/>
+  </TypeCompFilter>
+
   <!-- Dummy
   <TypeCompLevelFilter name="DemoFeature3">
     <tid>999</tid>
@@ -1719,5 +1775,57 @@
     <description>DemoFilter for DemoFeature</description>
     <TextCreateStrategy-None/>
   </TypeCompLevelFilter>
+    
+  <TypeCompFilter name="FSC-423.C-0">
+    <tid>423</tid>
+    <cid>0</cid>
+    <description>管路斷面</description>
+    <elementCriterion>
+      <elementType>7</elementType>
+      <elementType>17</elementType>
+    </elementCriterion>
+    <MultiSymbolCreateStrategy/>
+  </TypeCompFilter>
+  <TypeCompFilter name="FSC-423.C-1">
+    <tid>423</tid>
+    <cid>1</cid>
+    <description>管路斷面引線</description>
+    <elementCriterion>
+      <elementType>12</elementType>
+      <elementType>4</elementType>
+    </elementCriterion>
+    <LineCreateStrategy/>
+  </TypeCompFilter>
+  <TypeCompFilter name="FSC-423.C-2">
+    <tid>423</tid>
+    <cid>2</cid>
+    <description>長度註記</description>
+    <elementCriterion>
+      <elementType>7</elementType>
+      <elementType>17</elementType>
+    </elementCriterion>
+    <TextCreateStrategy/>
+  </TypeCompFilter>
+  <TypeCompFilter name="FSC-423.C-3">
+    <tid>423</tid>
+    <cid>3</cid>
+    <description>穿線註記</description>
+    <elementCriterion>
+      <elementType>17</elementType>
+      <elementType>7</elementType>
+    </elementCriterion>
+    <TextCreateStrategy/>
+  </TypeCompFilter>
+  <TypeCompFilter name="FSC-423.C-4">
+    <tid>423</tid>
+    <cid>4</cid>
+    <description>管路斷面輔助線</description>
+    <elementCriterion>
+      <elementType>12</elementType>
+      <elementType>4</elementType>
+    </elementCriterion>
+    <LineCreateStrategy/>
+  </TypeCompFilter>
+  
   -->
 </ElementDispatcherRules>

--
Gitblit v0.0.0-SNAPSHOT