From d2986858ad69383e3b06188b4cebe9c2f714f2dd Mon Sep 17 00:00:00 2001
From: ?? ? <ulysseskao@ximple.com.tw>
Date: Thu, 12 Jun 2008 15:44:42 +0800
Subject: [PATCH] update for EOFM-117

---
 xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/jobs/AbstractOracleDatabaseJob.java                          |   10 +
 xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/jobs/OracleUpgradeBlob2UDTJob.java                           |    3 
 xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/filter/ElementDispatcher.java                                |   35 ++++
 xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/jobs/context/AbstractOracleJobContext.java                   |    5 
 xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/jobs/OracleConvertDgn2OraSDOJob.java                         |   11 
 xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/jobs/OracleConvertDgn2ShpJob.java                            |   15 +
 xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/filter/TypeIdDispatchableFilter.java                         |   20 ++
 xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/filter/TypeCompLevelIdDispatchableFilter.java                |   20 ++
 xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/jobs/context/postgis/OracleConvertPostGISJobContext.java     |  193 +++++++++++++++++------
 xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/filter/CreateLineStringStrategy.java                         |    1 
 xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/jobs/OracleConvertDgn2PostGISJob.java                        |   55 ++----
 xdgnjobs/ximple-jobcarrier/src/main/resources/quartz_jobs.xml                                                          |    8 
 xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/jobs/context/postgis/AbstractOracleToPostGISJobContext.java  |    3 
 xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/filter/CreateEllipseShapeStrategy.java                       |   27 +++
 xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/filter/CreateArcLineStringStrategy.java                      |   27 +++
 xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/jobs/context/postgis/GeneralDgnConvertPostGISJobContext.java |    2 
 xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/filter/ElementDispatchableFilter.java                        |    4 
 xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/jobs/OracleConvertDgn2MySQLJob.java                          |   11 
 xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/filter/TypeCompIdDispatchableFilter.java                     |   20 ++
 xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/jobs/context/postgis/AbstractDgnToPostGISJobContext.java     |    3 
 20 files changed, 349 insertions(+), 124 deletions(-)

diff --git a/xdgnjobs/ximple-jobcarrier/src/main/resources/quartz_jobs.xml b/xdgnjobs/ximple-jobcarrier/src/main/resources/quartz_jobs.xml
index 79528a2..1bd55fc 100644
--- a/xdgnjobs/ximple-jobcarrier/src/main/resources/quartz_jobs.xml
+++ b/xdgnjobs/ximple-jobcarrier/src/main/resources/quartz_jobs.xml
@@ -76,7 +76,7 @@
         </entry>
         <entry>
           <key>CONVERTDB</key>
-          <value>false</value>
+          <value>true</value>
         </entry>
         <entry>
           <key>CONVERTFILE</key>
@@ -100,12 +100,16 @@
         </entry>
         <entry>
           <key>TESTMODE</key>
-          <value>true</value>
+          <value>false</value>
         </entry>
         <entry>
           <key>TESTCOUNT</key>
           <value>2</value>
         </entry>
+        <entry>
+          <key>COPYCONNECTIVITYMODE</key>
+          <value>true</value>
+        </entry>
       </job-data-map>
     </job-detail>
 
diff --git a/xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/filter/CreateArcLineStringStrategy.java b/xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/filter/CreateArcLineStringStrategy.java
index 2be6c13..5d0f184 100644
--- a/xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/filter/CreateArcLineStringStrategy.java
+++ b/xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/filter/CreateArcLineStringStrategy.java
@@ -3,6 +3,8 @@
 import java.util.List;
 import java.util.TreeMap;
 
+import javax.swing.event.EventListenerList;
+
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
 import org.geotools.feature.Feature;
@@ -27,6 +29,9 @@
     GeometryFactory geometryFactory = new GeometryFactory();
     TreeMap<String, FeatureTypeBuilder> typeBuilders = new TreeMap<String, FeatureTypeBuilder>();
     TWD97GeometryConverterDecorator convertDecorator = new TWD97GeometryConverterDecorator();
+
+    // Create the listener list
+    protected EventListenerList listenerList = new EventListenerList();
 
     public CreateArcLineStringStrategy()
     {
@@ -82,5 +87,27 @@
         }
         return feature;
     }
+
+    public void addCreateFeatureTypeEventListener(CreateFeatureTypeEventListener listener)
+    {
+        listenerList.add(CreateFeatureTypeEventListener.class, listener);
+    }
+
+    public void removeCreateFeatureTypeEventListener(CreateFeatureTypeEventListener listener)
+    {
+        listenerList.remove(CreateFeatureTypeEventListener.class, listener);
+    }
+
+    protected void fireFeatureTypeEvent(FeatureTypeEvent evt)
+    {
+        Object[] listeners = listenerList.getListenerList();
+        for (int i = 0; i < listeners.length; i += 2)
+        {
+            if (listeners[i] == CreateFeatureTypeEventListener.class)
+            {
+                ((CreateFeatureTypeEventListener) listeners[i + 1]).createFeatureTypeOccurred(evt);
+            }
+        }
+    }
 }
 
diff --git a/xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/filter/CreateEllipseShapeStrategy.java b/xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/filter/CreateEllipseShapeStrategy.java
index 9fd0ed6..058674f 100644
--- a/xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/filter/CreateEllipseShapeStrategy.java
+++ b/xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/filter/CreateEllipseShapeStrategy.java
@@ -3,6 +3,8 @@
 import java.util.List;
 import java.util.TreeMap;
 
+import javax.swing.event.EventListenerList;
+
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
 import org.geotools.feature.Feature;
@@ -27,6 +29,9 @@
     GeometryFactory geometryFactory = new GeometryFactory();
     TreeMap<String, FeatureTypeBuilder> typeBuilders = new TreeMap<String, FeatureTypeBuilder>();
     TWD97GeometryConverterDecorator convertDecorator = new TWD97GeometryConverterDecorator();
+
+    // Create the listener list
+    protected EventListenerList listenerList = new EventListenerList();
 
     public CreateEllipseShapeStrategy()
     {
@@ -82,6 +87,28 @@
         }
         return feature;
     }
+
+    public void addCreateFeatureTypeEventListener(CreateFeatureTypeEventListener listener)
+    {
+        listenerList.add(CreateFeatureTypeEventListener.class, listener);
+    }
+
+    public void removeCreateFeatureTypeEventListener(CreateFeatureTypeEventListener listener)
+    {
+        listenerList.remove(CreateFeatureTypeEventListener.class, listener);
+    }
+
+    protected void fireFeatureTypeEvent(FeatureTypeEvent evt)
+    {
+        Object[] listeners = listenerList.getListenerList();
+        for (int i = 0; i < listeners.length; i += 2)
+        {
+            if (listeners[i] == CreateFeatureTypeEventListener.class)
+            {
+                ((CreateFeatureTypeEventListener) listeners[i + 1]).createFeatureTypeOccurred(evt);
+            }
+        }
+    }
 }
 
 
diff --git a/xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/filter/CreateLineStringStrategy.java b/xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/filter/CreateLineStringStrategy.java
index 8c134c3..ae666a3 100644
--- a/xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/filter/CreateLineStringStrategy.java
+++ b/xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/filter/CreateLineStringStrategy.java
@@ -139,7 +139,6 @@
         return feature;
     }
 
-
     public void addCreateFeatureTypeEventListener(CreateFeatureTypeEventListener listener)
     {
         listenerList.add(CreateFeatureTypeEventListener.class, listener);
diff --git a/xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/filter/ElementDispatchableFilter.java b/xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/filter/ElementDispatchableFilter.java
index ed3f5ba..2eb54be 100644
--- a/xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/filter/ElementDispatchableFilter.java
+++ b/xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/filter/ElementDispatchableFilter.java
@@ -11,4 +11,8 @@
     public Feature execute(Element element);
 
     void setUseLongName(boolean useLongName);
+
+    public void addCreateFeatureTypeEventListener(CreateFeatureTypeEventListener listener);
+
+    public void removeCreateFeatureTypeEventListener(CreateFeatureTypeEventListener listener);
 }
diff --git a/xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/filter/ElementDispatcher.java b/xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/filter/ElementDispatcher.java
index 38e3e9e..a64d23e 100644
--- a/xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/filter/ElementDispatcher.java
+++ b/xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/filter/ElementDispatcher.java
@@ -2,14 +2,19 @@
 
 import java.util.LinkedList;
 
+import javax.swing.event.EventListenerList;
+
 import org.geotools.feature.Feature;
 
 import com.ximple.io.dgn7.Element;
 
-public class ElementDispatcher
+public class ElementDispatcher implements CreateFeatureTypeEventListener
 {
     private LinkedList<ElementDispatchableFilter> rules;
     private boolean useLongName = false;
+
+    // Create the listener list
+    protected EventListenerList listenerList = new EventListenerList();
 
     public ElementDispatcher()
     {
@@ -24,6 +29,7 @@
     public void addRule(ElementDispatchableFilter rule)
     {
         rule.setUseLongName(useLongName);
+        rule.addCreateFeatureTypeEventListener(this);
         rules.add(rule);
     }
 
@@ -55,4 +61,31 @@
         }
         return null;
     }
+
+    public void addCreateFeatureTypeEventListener(CreateFeatureTypeEventListener listener)
+    {
+        listenerList.add(CreateFeatureTypeEventListener.class, listener);
+    }
+
+    public void removeCreateFeatureTypeEventListener(CreateFeatureTypeEventListener listener)
+    {
+        listenerList.remove(CreateFeatureTypeEventListener.class, listener);
+    }
+
+    protected void fireFeatureTypeEvent(FeatureTypeEvent evt)
+    {
+        Object[] listeners = listenerList.getListenerList();
+        for (int i = 0; i < listeners.length; i += 2)
+        {
+            if (listeners[i] == CreateFeatureTypeEventListener.class)
+            {
+                ((CreateFeatureTypeEventListener) listeners[i + 1]).createFeatureTypeOccurred(evt);
+            }
+        }
+    }
+
+    public void createFeatureTypeOccurred(FeatureTypeEvent evt)
+    {
+        fireFeatureTypeEvent(evt);
+    }
 }
diff --git a/xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/filter/TypeCompIdDispatchableFilter.java b/xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/filter/TypeCompIdDispatchableFilter.java
index 83c9651..4810b12 100644
--- a/xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/filter/TypeCompIdDispatchableFilter.java
+++ b/xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/filter/TypeCompIdDispatchableFilter.java
@@ -7,6 +7,7 @@
 
 import com.ximple.io.dgn7.Element;
 import com.ximple.io.dgn7.FrammeAttributeData;
+import com.ximple.eofms.util.StringUtils;
 
 public class TypeCompIdDispatchableFilter extends AbstractFLinkageDispatchableFilter
         implements CreateFeatureTypeEventListener
@@ -58,7 +59,16 @@
 
     public void setCreateStrategy(CreateFeatureTypeStrategy createStrategy)
     {
+        if (this.createStrategy != null)
+        {
+            this.createStrategy.removeCreateFeatureTypeEventListener(this);
+        }
         this.createStrategy = createStrategy;
+
+        if (this.createStrategy != null)
+        {
+            this.createStrategy.addCreateFeatureTypeEventListener(this);
+        }
     }
 
     public boolean isUseLongName()
@@ -103,7 +113,15 @@
     public String getFeatureTypeName(Element element)
     {
         StringBuilder sb = new StringBuilder();
-        sb.append(getName());
+        String name = getName().toLowerCase();
+        String[] pices = StringUtils.splitToArray(name, ".");
+        boolean bfirst = true;
+        for (String temp : pices)
+        {
+            if (bfirst) bfirst = false;
+            else sb.append('-');
+            sb.append(temp);
+        }
         if (useLongName)
         {
             sb.append("_");
diff --git a/xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/filter/TypeCompLevelIdDispatchableFilter.java b/xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/filter/TypeCompLevelIdDispatchableFilter.java
index 2956b46..ab302e4 100644
--- a/xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/filter/TypeCompLevelIdDispatchableFilter.java
+++ b/xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/filter/TypeCompLevelIdDispatchableFilter.java
@@ -7,6 +7,7 @@
 
 import com.ximple.io.dgn7.Element;
 import com.ximple.io.dgn7.FrammeAttributeData;
+import com.ximple.eofms.util.StringUtils;
 
 public class TypeCompLevelIdDispatchableFilter extends AbstractFLinkageDispatchableFilter
         implements CreateFeatureTypeEventListener
@@ -70,7 +71,16 @@
 
     public void setCreateStrategy(CreateFeatureTypeStrategy createStrategy)
     {
+        if (this.createStrategy != null)
+        {
+            this.createStrategy.removeCreateFeatureTypeEventListener(this);
+        }
         this.createStrategy = createStrategy;
+
+        if (this.createStrategy != null)
+        {
+            this.createStrategy.addCreateFeatureTypeEventListener(this);
+        }
     }
 
 
@@ -112,7 +122,15 @@
     public String getFeatureTypeName(Element element)
     {
         StringBuilder sb = new StringBuilder();
-        sb.append(getName());
+        String name = getName().toLowerCase();
+        String[] pices = StringUtils.splitToArray(name, ".");
+        boolean bfirst = true;
+        for (String temp : pices)
+        {
+            if (bfirst) bfirst = false;
+            else sb.append('-');
+            sb.append(temp);
+        }
         if (useLongName)
         {
             sb.append("_");
diff --git a/xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/filter/TypeIdDispatchableFilter.java b/xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/filter/TypeIdDispatchableFilter.java
index fd25d05..b683361 100644
--- a/xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/filter/TypeIdDispatchableFilter.java
+++ b/xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/filter/TypeIdDispatchableFilter.java
@@ -7,6 +7,7 @@
 
 import com.ximple.io.dgn7.Element;
 import com.ximple.io.dgn7.FrammeAttributeData;
+import com.ximple.eofms.util.StringUtils;
 
 public class TypeIdDispatchableFilter extends AbstractFLinkageDispatchableFilter implements CreateFeatureTypeEventListener
 {
@@ -44,7 +45,16 @@
 
     public void setCreateStrategy(CreateFeatureTypeStrategy createStrategy)
     {
+        if (this.createStrategy != null)
+        {
+            this.createStrategy.removeCreateFeatureTypeEventListener(this);
+        }
         this.createStrategy = createStrategy;
+
+        if (this.createStrategy != null)
+        {
+            this.createStrategy.addCreateFeatureTypeEventListener(this);
+        }
     }
 
     public boolean isDispatchable(Element element)
@@ -84,7 +94,15 @@
     public String getFeatureTypeName(Element element)
     {
         StringBuilder sb = new StringBuilder();
-        sb.append(getName());
+        String name = getName().toLowerCase();
+        String[] pices = StringUtils.splitToArray(name, ".");
+        boolean bfirst = true;
+        for (String temp : pices)
+        {
+            if (bfirst) bfirst = false;
+            else sb.append('-');
+            sb.append(temp);
+        }
         if (useLongName)
         {
             sb.append("_");
diff --git a/xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/jobs/AbstractOracleDatabaseJob.java b/xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/jobs/AbstractOracleDatabaseJob.java
index 163b63c..3ff0034 100644
--- a/xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/jobs/AbstractOracleDatabaseJob.java
+++ b/xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/jobs/AbstractOracleDatabaseJob.java
@@ -53,6 +53,7 @@
     private static final String ORAPASS = "ORAPASS";
     private static final String TESTMODE = "TESTMODE";
     private static final String TESTCOUNT = "TESTCOUNT";
+    private static final String COPYCONNECTIVITYMODE = "COPYCONNECTIVITYMODE";
 
     protected static OracleDataStoreFactory dataStoreFactory = new OracleDataStoreFactory();
 
@@ -70,6 +71,7 @@
     protected String _createDummy;
     protected ArrayList<String> _orgSchema = new ArrayList<String>();
     protected boolean _testMode = false;
+    protected boolean _copyConnectivityMode = false;
     protected int _testCount = -1;
     protected OracleDataStore sourceDataStore;
     private boolean driverFound = true;
@@ -131,6 +133,7 @@
         }
         _testMode = dataMap.getBooleanFromString(TESTMODE);
         _testCount = dataMap.getIntFromString(TESTCOUNT);
+        _copyConnectivityMode = dataMap.getBooleanFromString(COPYCONNECTIVITYMODE);
 
         // Validate the required input
         if (_dataPath == null)
@@ -348,6 +351,11 @@
                 !_createDummy.equalsIgnoreCase("no") && !_createDummy.equalsIgnoreCase("0");
     }
 
+    public boolean isCopyConnectivityMode()
+    {
+        return _copyConnectivityMode;
+    }
+
     public DataStore getSourceDataStore()
     {
         return sourceDataStore;
@@ -376,7 +384,7 @@
         map.put("namespace", null);
         if (!map.containsKey(OracleDataStoreFactory.MAXCONN.key))
         {
-            map.put(OracleDataStoreFactory.MAXCONN.key, "2");
+            map.put(OracleDataStoreFactory.MAXCONN.key, "10");
         }
         if (!map.containsKey(OracleDataStoreFactory.MINCONN.key))
         {
diff --git a/xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/jobs/OracleConvertDgn2MySQLJob.java b/xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/jobs/OracleConvertDgn2MySQLJob.java
index 1cd3c29..c8cb87c 100644
--- a/xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/jobs/OracleConvertDgn2MySQLJob.java
+++ b/xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/jobs/OracleConvertDgn2MySQLJob.java
@@ -13,6 +13,7 @@
 import java.sql.SQLException;
 import java.sql.Statement;
 import java.sql.Types;
+import java.sql.Connection;
 import java.util.Calendar;
 import java.util.Date;
 import java.util.Map;
@@ -206,7 +207,7 @@
         {
             logger.info("-- step:clearOutputDatabase --");
             clearOutputDatabase();
-            boolean bFirst = true;
+            boolean bFirst = isCopyConnectivityMode();
             if (checkConvertDB())
             {
                 logger.info("-- step:convertOracleDB --");
@@ -278,7 +279,7 @@
      */
     private void copyConnectivity(OracleConvertMySQLJobContext jobContext) throws SQLException
     {
-        OracleConnection connection = jobContext.getOracleConnection();
+        Connection connection = jobContext.getOracleConnection();
         Statement stmt = connection.createStatement();
         stmt.execute(AbstractOracleJobContext.TRUNCATE_CONNECTIVITY_WEBCHECK);
         stmt.execute(AbstractOracleJobContext.COPY_CONNECTIVITY_TO_WEBCHECK);
@@ -343,7 +344,7 @@
         System.gc();
     }
 
-    protected OrderedMap getBlobStorageList(OracleConnection connection, String schemaSrc, String tableSrc,
+    protected OrderedMap getBlobStorageList(Connection connection, String schemaSrc, String tableSrc,
                                             OrderedMap orderedMap) throws SQLException
     {
         if (orderedMap == null)
@@ -436,7 +437,7 @@
     protected void queryIgsetElement(OracleConvertMySQLJobContext jobContext,
                                      String srcschema, String srctable) throws SQLException
     {
-        OracleConnection connection = jobContext.getOracleConnection();
+        Connection connection = jobContext.getOracleConnection();
         String fetchSrcStmtFmt = "SELECT IGDSELM FROM \"%s\".\"%s\" ORDER BY ROWID";
         PrintfFormat spf = new PrintfFormat(fetchSrcStmtFmt);
         String fetchSrcStmt = spf.sprintf(new Object[]{srcschema, srctable});
@@ -478,7 +479,7 @@
     protected void queryRawElement(OracleConvertMySQLJobContext jobContext,
                                    String srcschema, String srctable) throws SQLException
     {
-        OracleConnection connection = jobContext.getOracleConnection();
+        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});
diff --git a/xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/jobs/OracleConvertDgn2OraSDOJob.java b/xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/jobs/OracleConvertDgn2OraSDOJob.java
index e22cdb6..ac5c49d 100644
--- a/xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/jobs/OracleConvertDgn2OraSDOJob.java
+++ b/xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/jobs/OracleConvertDgn2OraSDOJob.java
@@ -13,6 +13,7 @@
 import java.sql.SQLException;
 import java.sql.Statement;
 import java.sql.Types;
+import java.sql.Connection;
 import java.util.Calendar;
 import java.util.Date;
 import java.util.Map;
@@ -206,7 +207,7 @@
         {
             logger.info("-- step:clearOutputDatabase --");
             clearOutputDatabase();
-            boolean bFirst = true;
+            boolean bFirst = isCopyConnectivityMode();
             if (checkConvertDB())
             {
                 logger.info("-- step:convertOracleDB --");
@@ -278,7 +279,7 @@
      */
     private void copyConnectivity(OracleConvertOraSDOJobContext jobContext) throws SQLException
     {
-        OracleConnection connection = jobContext.getOracleConnection();
+        Connection connection = jobContext.getOracleConnection();
         Statement stmt = connection.createStatement();
         stmt.execute(AbstractOracleJobContext.TRUNCATE_CONNECTIVITY_WEBCHECK);
         stmt.execute(AbstractOracleJobContext.COPY_CONNECTIVITY_TO_WEBCHECK);
@@ -343,7 +344,7 @@
         System.gc();
     }
 
-    protected OrderedMap getBlobStorageList(OracleConnection connection, String schemaSrc, String tableSrc,
+    protected OrderedMap getBlobStorageList(Connection connection, String schemaSrc, String tableSrc,
                                             OrderedMap orderedMap) throws SQLException
     {
         if (orderedMap == null)
@@ -436,7 +437,7 @@
     protected void queryIgsetElement(OracleConvertOraSDOJobContext jobContext,
                                      String srcschema, String srctable) throws SQLException
     {
-        OracleConnection connection = jobContext.getOracleConnection();
+        Connection connection = jobContext.getOracleConnection();
         String fetchSrcStmtFmt = "SELECT IGDSELM FROM \"%s\".\"%s\" ORDER BY ROWID";
         PrintfFormat spf = new PrintfFormat(fetchSrcStmtFmt);
         String fetchSrcStmt = spf.sprintf(new Object[]{srcschema, srctable});
@@ -478,7 +479,7 @@
     protected void queryRawElement(OracleConvertOraSDOJobContext jobContext,
                                    String srcschema, String srctable) throws SQLException
     {
-        OracleConnection connection = jobContext.getOracleConnection();
+        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});
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 99bfa96..8b679f9 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
@@ -13,6 +13,7 @@
 import java.sql.SQLException;
 import java.sql.Statement;
 import java.sql.Types;
+import java.sql.Connection;
 import java.util.Calendar;
 import java.util.Date;
 import java.util.Map;
@@ -98,36 +99,7 @@
 
     protected Map<String, String> pgProperties;
     protected PostgisDataStore targetDataStore;
-
-    /*
-       PostgisDataStore pg = new PostgisDataStore(pool, f.schema, getName(),
-               PostgisDataStore.OPTIMIZE_SQL);
-       pg.setWKBEnabled(WKB_ENABLED);
-       pg.setEstimatedExtent(true);
-       pg.setFIDMapper("road", new TypedFIDMapper(new BasicFIDMapper("fid", 255, false), "road"));
-       pg.setFIDMapper("river", new TypedFIDMapper(new BasicFIDMapper("fid", 255, false), "river"));
-       pg.setFIDMapper("testset",
-           new TypedFIDMapper(new BasicFIDMapper("gid", 255, true), "testset"));
-
-    */
-    /*
-        Transaction transaction = new DefaultTransaction("attemptWriteFW");
-        FeatureWriter writer = ds.getFeatureWriter(table, transaction);
-        Feature feature;
-
-        while (writer.hasNext()) {
-            feature = (Feature) writer.next();
-        }
-
-        feature = (Feature) writer.next();
-        feature.setAttribute(0, "test");
-        writer.write();
-
-        String id = feature.getID();
-        transaction.commit();
-        transaction.close();
-    
-     */
+    // protected OracleConvertPostGISJobContext oracleJobContext;
 
     public Log getLogger()
     {
@@ -136,6 +108,13 @@
 
     protected AbstractOracleJobContext prepareJobContext(String filterPath)
     {
+        /*
+        if (oracleJobContext == null)
+        {
+            oracleJobContext = new OracleConvertPostGISJobContext(getDataPath(), getTargetDataStore(), filterPath);
+        }
+        return oracleJobContext;
+        */
         return new OracleConvertPostGISJobContext(getDataPath(), getTargetDataStore(), filterPath);
     }
 
@@ -235,7 +214,7 @@
         {
             logger.info("-- step:clearOutputDatabase --");
             clearOutputDatabase();
-            boolean bFirst = true;
+            boolean bFirst = isCopyConnectivityMode();
             if (checkConvertDB())
             {
                 logger.info("-- step:convertOracleDB --");
@@ -308,7 +287,7 @@
      */
     private void copyConnectivity(OracleConvertPostGISJobContext jobContext) throws SQLException
     {
-        OracleConnection connection = jobContext.getOracleConnection();
+        Connection connection = jobContext.getOracleConnection();
         Statement stmt = connection.createStatement();
         stmt.execute(AbstractOracleJobContext.TRUNCATE_CONNECTIVITY_WEBCHECK);
         stmt.execute(AbstractOracleJobContext.COPY_CONNECTIVITY_TO_WEBCHECK);
@@ -318,8 +297,8 @@
                                  String querySchema, String dataPath) throws SQLException
     {
         int order = 0;
-        OrderedMap map = getBlobStorageList(jobContext.getOracleConnection(), querySchema, "SD$SPACENODES"
-                , null);
+        OrderedMap map = getBlobStorageList(jobContext.getOracleConnection(),
+                querySchema, "SD$SPACENODES" , null);
 
         logger.info("begin convert job:[" + map.size() + "]:testmode=" + _testMode);
 
@@ -368,12 +347,12 @@
         jobContext.getExecutionContext().put("ConvertDgn2PostGISJobProgress", 100);
 
         jobContext.commitTransaction();
-
+        jobContext.resetFeatureContext();
         logger.info("end convert job:[" + order + "]");
         System.gc();
     }
 
-    protected OrderedMap getBlobStorageList(OracleConnection connection, String schemaSrc, String tableSrc,
+    protected OrderedMap getBlobStorageList(Connection connection, String schemaSrc, String tableSrc,
                                             OrderedMap orderedMap) throws SQLException
     {
         if (orderedMap == null)
@@ -466,7 +445,7 @@
     protected void queryIgsetElement(OracleConvertPostGISJobContext jobContext,
                                      String srcschema, String srctable) throws SQLException
     {
-        OracleConnection connection = jobContext.getOracleConnection();
+        Connection connection = jobContext.getOracleConnection();
         String fetchSrcStmtFmt = "SELECT IGDSELM FROM \"%s\".\"%s\" ORDER BY ROWID";
         PrintfFormat spf = new PrintfFormat(fetchSrcStmtFmt);
         String fetchSrcStmt = spf.sprintf(new Object[]{srcschema, srctable});
@@ -508,7 +487,7 @@
     protected void queryRawElement(OracleConvertPostGISJobContext jobContext,
                                    String srcschema, String srctable) throws SQLException
     {
-        OracleConnection connection = jobContext.getOracleConnection();
+        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});
diff --git a/xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/jobs/OracleConvertDgn2ShpJob.java b/xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/jobs/OracleConvertDgn2ShpJob.java
index ee488c5..22c9784 100644
--- a/xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/jobs/OracleConvertDgn2ShpJob.java
+++ b/xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/jobs/OracleConvertDgn2ShpJob.java
@@ -13,6 +13,7 @@
 import java.sql.SQLException;
 import java.sql.Statement;
 import java.sql.Types;
+import java.sql.Connection;
 import java.util.Date;
 
 import org.apache.commons.collections.OrderedMap;
@@ -59,7 +60,6 @@
     final static Log logger = LogFactory.getLog(OracleConvertDgn2ShpJob.class);
 
     private static final int FETCHSIZE = 30;
-    private static final int BATCHSIZE = 25;
     private static final int COMMITSIZE = 20;
 
     class Pair
@@ -112,7 +112,7 @@
         {
             logger.info("-- step:clearOutputDirectory --");
             clearOutputDirectory();
-            boolean bFirst = true;
+            boolean bFirst = isCopyConnectivityMode();
             if (checkConvertDB())
             {
                 logger.info("-- step:convertOracleDB --");
@@ -127,9 +127,10 @@
                     jobContext.setExecutionContext(context);
 
                     if (bFirst)
+                    {
                         copyConnectivity(jobContext);
-                    else
                         bFirst = false;
+                    }
 
                     logger.info("----- start schema:" + orgSchema + " -----");
                     exetcuteConvert(jobContext, orgSchema, _dataPath);
@@ -180,7 +181,7 @@
      */
     private void copyConnectivity(OracleConvertShapefilesJobContext jobContext) throws SQLException
     {
-        OracleConnection connection = jobContext.getOracleConnection();
+        Connection connection = jobContext.getOracleConnection();
         Statement stmt = connection.createStatement();
         stmt.execute(OracleConvertShapefilesJobContext.TRUNCATE_CONNECTIVITY_WEBCHECK);
         stmt.execute(OracleConvertShapefilesJobContext.COPY_CONNECTIVITY_TO_WEBCHECK);
@@ -245,7 +246,7 @@
         System.gc();
     }
 
-    protected OrderedMap getBlobStorageList(OracleConnection connection, String schemaSrc, String tableSrc,
+    protected OrderedMap getBlobStorageList(Connection connection, String schemaSrc, String tableSrc,
                                             OrderedMap orderedMap) throws SQLException
     {
         if (orderedMap == null)
@@ -338,7 +339,7 @@
     protected void queryIgsetElement(OracleConvertShapefilesJobContext jobContext,
                                      String srcschema, String srctable) throws SQLException
     {
-        OracleConnection connection = jobContext.getOracleConnection();
+        Connection connection = jobContext.getOracleConnection();
         String fetchSrcStmtFmt = "SELECT IGDSELM FROM \"%s\".\"%s\" ORDER BY ROWID";
         PrintfFormat spf = new PrintfFormat(fetchSrcStmtFmt);
         String fetchSrcStmt = spf.sprintf(new Object[]{srcschema, srctable});
@@ -380,7 +381,7 @@
     protected void queryRawElement(OracleConvertShapefilesJobContext jobContext,
                                    String srcschema, String srctable) throws SQLException
     {
-        OracleConnection connection = jobContext.getOracleConnection();
+        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});
diff --git a/xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/jobs/OracleUpgradeBlob2UDTJob.java b/xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/jobs/OracleUpgradeBlob2UDTJob.java
index cbeb488..76865af 100644
--- a/xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/jobs/OracleUpgradeBlob2UDTJob.java
+++ b/xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/jobs/OracleUpgradeBlob2UDTJob.java
@@ -1,6 +1,7 @@
 package com.ximple.eofms.jobs;
 
 import java.sql.SQLException;
+import java.sql.Connection;
 import java.util.Date;
 
 import org.apache.commons.logging.Log;
@@ -65,7 +66,7 @@
     private void exetcuteConvert(AbstractOracleJobContext jobContext,
                                  String orgSchema, String dataPath) throws SQLException
     {
-        OracleConnection connection = jobContext.getOracleConnection();
+        Connection connection = jobContext.getOracleConnection();
         OracleDatabaseMetaData metaData = (OracleDatabaseMetaData) connection.getMetaData();
         OracleStatement statement = (OracleStatement) connection.createStatement();
     }
diff --git a/xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/jobs/context/AbstractOracleJobContext.java b/xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/jobs/context/AbstractOracleJobContext.java
index 0b112ae..6cd8c99 100644
--- a/xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/jobs/context/AbstractOracleJobContext.java
+++ b/xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/jobs/context/AbstractOracleJobContext.java
@@ -2,6 +2,7 @@
 
 import java.io.IOException;
 import java.util.Properties;
+import java.sql.Connection;
 
 import org.apache.commons.logging.Log;
 import org.geotools.data.DataStore;
@@ -236,13 +237,13 @@
         }
     }
 
-    public OracleConnection getOracleConnection()
+    public Connection getOracleConnection()
     {
         try
         {
             if (sourceDataStore != null)
             {
-                return (OracleConnection) sourceDataStore.getConnection(Transaction.AUTO_COMMIT);
+                return sourceDataStore.getConnection(Transaction.AUTO_COMMIT);
             }
 
         } catch (IOException e)
diff --git a/xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/jobs/context/postgis/AbstractDgnToPostGISJobContext.java b/xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/jobs/context/postgis/AbstractDgnToPostGISJobContext.java
index ed63d2b..983a897 100644
--- a/xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/jobs/context/postgis/AbstractDgnToPostGISJobContext.java
+++ b/xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/jobs/context/postgis/AbstractDgnToPostGISJobContext.java
@@ -432,9 +432,10 @@
                     getLogger().warn("Error: " + geomAttribute.getLocalName() + " unknown type!!!");
                 }
 
+                String indexName = tableName.replace('-', '_');
                 //also build a spatial index on each geometry column.
                 sql = new StringBuffer("CREATE INDEX spatial_");
-                sql.append(tableName);
+                sql.append(indexName);
                 sql.append("_");
                 sql.append(anAttributeType.getLocalName().toLowerCase());
                 sql.append(" ON ");
diff --git a/xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/jobs/context/postgis/AbstractOracleToPostGISJobContext.java b/xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/jobs/context/postgis/AbstractOracleToPostGISJobContext.java
index 74dcd4d..deaa440 100644
--- a/xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/jobs/context/postgis/AbstractOracleToPostGISJobContext.java
+++ b/xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/jobs/context/postgis/AbstractOracleToPostGISJobContext.java
@@ -438,9 +438,10 @@
                     getLogger().warn("Error: " + geomAttribute.getLocalName() + " unknown type!!!");
                 }
 
+                String indexName = tableName.replace('-', '_');
                 //also build a spatial index on each geometry column.
                 sql = new StringBuffer("CREATE INDEX spatial_");
-                sql.append(tableName);
+                sql.append(indexName);
                 sql.append("_");
                 sql.append(anAttributeType.getLocalName().toLowerCase());
                 sql.append(" ON ");
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 e04d2e4..12fca64 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
@@ -188,7 +188,7 @@
                     i++;
                     */
                 }
-
+                stmtTexts.clear();
                 conn.setAutoCommit(autoCommit);
                 logger.debug("End Save into PostGIS:" + featureType.getTypeName());
             }
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 86bf599..964f19e 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
@@ -7,6 +7,8 @@
 import java.net.URL;
 import java.sql.DriverManager;
 import java.sql.SQLException;
+import java.sql.Connection;
+import java.sql.Statement;
 import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.Iterator;
@@ -26,19 +28,25 @@
 import org.geotools.feature.FeatureType;
 import org.geotools.feature.IllegalAttributeException;
 import org.geotools.feature.SimpleFeature;
+import org.geotools.feature.FeatureTypeBuilder;
+import org.geotools.feature.SchemaException;
 import org.quartz.JobExecutionContext;
 import org.xml.sax.SAXException;
+import org.postgresql.util.PSQLException;
 
 import com.vividsolutions.jts.util.Assert;
 
 import com.ximple.eofms.filter.AbstractFLinkageDispatchableFilter;
 import com.ximple.eofms.filter.ElementDispatcher;
+import com.ximple.eofms.filter.CreateFeatureTypeEventListener;
+import com.ximple.eofms.filter.FeatureTypeEvent;
 import com.ximple.eofms.jobs.OracleElementLogger;
 import com.ximple.io.dgn7.ComplexElement;
 import com.ximple.io.dgn7.Element;
 import com.ximple.io.dgn7.FrammeAttributeData;
 
 public class OracleConvertPostGISJobContext extends AbstractOracleToPostGISJobContext
+    implements CreateFeatureTypeEventListener
 {
     static Log logger = LogFactory.getLog(OracleConvertPostGISJobContext.class);
     static final LoggerFacade sLogger = new CommonsLoggingLogger(logger);
@@ -62,22 +70,25 @@
 
     private ElementDispatcher elementDispatcher;
 
-    private HashMap featuresContext = new HashMap();
-    private HashMap<String, FeatureWriter> featuresWriterContext = new HashMap<String, FeatureWriter>();
-    private PessimisticMapWrapper txFeaturesContext;
+    // private HashMap featuresContext = new HashMap();
+    // private HashMap<String, FeatureWriter> featuresWriterContext = new HashMap<String, FeatureWriter>();
+    // private PessimisticMapWrapper txFeaturesContext;
+    private HashMap<FeatureType, ArrayList<String>> txFeaturesContext = new HashMap<FeatureType, ArrayList<String>>();
 
     private JobExecutionContext executionContext;
 
     private String currentSchema = null;
     private String pgCurrentSchema = null;
     private boolean schemaChanged = false;
+    private boolean dropTableMode = true;
 
     public OracleConvertPostGISJobContext(String dataPath, DataStore pgDS, String filterConfig)
     {
         super(dataPath, pgDS);
         _filterConfig = filterConfig;
         elementDispatcher = createElementDispatcher();
-        txFeaturesContext = new PessimisticMapWrapper(featuresContext, sLogger);
+        elementDispatcher.addCreateFeatureTypeEventListener(this);
+        // txFeaturesContext = new PessimisticMapWrapper(featuresContext, sLogger);
     }
 
     private ElementDispatcher createElementDispatcher()
@@ -154,15 +165,14 @@
 
         if (!txFeaturesContext.containsKey(feature.getFeatureType()))
         {
-            txFeaturesContext.put(feature.getFeatureType(), new ArrayList());
+            txFeaturesContext.put(feature.getFeatureType(), new ArrayList<String>());
         }
-        ArrayList arrayList = (ArrayList) txFeaturesContext.get(feature.getFeatureType());
-        arrayList.add(feature);
+        ArrayList<String> arrayList = txFeaturesContext.get(feature.getFeatureType());
+        arrayList.add(makeInsertSql(feature, -1));
     }
 
     public void startTransaction()
     {
-        //txFeaturesContext.startTransaction();
     }
 
     public void commitTransaction()
@@ -176,7 +186,7 @@
             logger.debug("Transaction is empty.");
         }
 
-        if (!featuresContext.isEmpty())
+        if (!txFeaturesContext.isEmpty())
         {
             updateDataStore();
         }
@@ -187,64 +197,68 @@
 
     public void rollbackTransaction()
     {
-        //txFeaturesContext.rollbackTransaction();
-        if (!featuresContext.isEmpty())
+        if (!txFeaturesContext.isEmpty())
         {
             updateDataStore();
         }
     }
 
+    public void resetFeatureContext()
+    {
+        txFeaturesContext.clear();
+    }
+
     private void updateDataStore()
     {
-        Iterator it = featuresContext.keySet().iterator();
-
+        Iterator<FeatureType> it = txFeaturesContext.keySet().iterator();
+        String currentStmt = null;
         try
         {
             while (it.hasNext())
             {
-                FeatureType featureType = (FeatureType) it.next();
-                FeatureWriter writer = null;
-                if (featuresWriterContext.containsKey(featureType.getTypeName()))
-                {
-                    writer = featuresWriterContext.get(featureType.getTypeName());
-                } else
-                {
-                    DataStore postGisDataStore = null;
-                    postGisDataStore = dataStoreFactory.createDataStore(properties);
+                FeatureType featureType = it.next();
+                logger.debug("Begin Save into PostGIS:" + featureType.getTypeName());
 
-                    boolean existTable = isExistFeature(featureType);
+                ArrayList<String> stmtTexts = txFeaturesContext.get(featureType);
+                Connection conn = getConnection();
+                boolean autoCommit = conn.getAutoCommit();
+                conn.setAutoCommit(true);
 
-                    if (!existTable)
+                for (String stmtText : stmtTexts)
+                {
+                    currentStmt = stmtText;
+                    Statement stmt = conn.createStatement();
+                    try
                     {
-                        postGisDataStore.createSchema(featureType);
-                        writer = postGisDataStore.getFeatureWriter(featureType.getTypeName(),
-                                Transaction.AUTO_COMMIT);
-                    } else
+                        stmt.execute(stmtText);
+                    } catch (PSQLException e)
                     {
-                        writer = postGisDataStore.getFeatureWriterAppend(featureType.getTypeName(),
-                                Transaction.AUTO_COMMIT);
+                        if (currentStmt != null)
+                        {
+                            logger.error("Execute:" + currentStmt);
+                        }
+                        logger.error(e.getServerErrorMessage());
+                        logger.error(e.getMessage(), e);
+                    } finally {
+                        stmt.close();
                     }
-                    featuresWriterContext.put(featureType.getTypeName(), writer);
+                    /*
+                    if ((i % BATCHSIZE) != 0)
+                    {
+                        stmt.addBatch(stmtText);
+                    } else {
+                        stmt.addBatch(stmtText);
+                        stmt.executeBatch();
+                    }
+                    i++;
+                    */
                 }
 
-                ArrayList features = (ArrayList) featuresContext.get(featureType);
-                Iterator itFeature = features.iterator();
-                while (itFeature.hasNext())
-                {
-                    Feature feature = (Feature) itFeature.next();
-                    ((SimpleFeature) writer.next()).setAttributes(feature.getAttributes(null));
-                }
-                //writer.close();
-                logger.debug("End Save PostGIS:" + featureType.getTypeName());
+                stmtTexts.clear();
+                conn.setAutoCommit(autoCommit);
+                logger.debug("End Save into PostGIS:" + featureType.getTypeName());
             }
-            featuresContext.clear();
-        } catch (MalformedURLException e)
-        {
-            logger.error(e.getMessage(), e);
-        } catch (IllegalAttributeException e)
-        {
-            logger.error(e.getMessage(), e);
-        } catch (IOException e)
+        } catch (SQLException e)
         {
             logger.error(e.getMessage(), e);
         }
@@ -268,13 +282,6 @@
      */
     public void closeFeatureWriter() throws IOException
     {
-
-        for (FeatureWriter featureWriter : this.featuresWriterContext.values())
-        {
-            featureWriter.close();
-        }
-
-        this.featuresWriterContext.clear();
     }
 
     protected OracleElementLogger getElementLogger()
@@ -302,4 +309,80 @@
     {
         return logger;
     }
+
+    public boolean isDropTableMode()
+    {
+        return dropTableMode;
+    }
+
+    public void setDropTableMode(boolean dropTableMode)
+    {
+        this.dropTableMode = dropTableMode;
+    }
+
+    public void createFeatureTypeOccurred(FeatureTypeEvent evt)
+    {
+        try
+        {
+            clearFeatureData(evt.getFeatureType());
+        } catch (SchemaException e)
+        {
+            logger.warn(e.getMessage(), e);
+        }
+    }
+
+    protected void clearFeatureData(FeatureType featureType) throws SchemaException
+    {
+        String featureName = featureType.getTypeName();
+        if (isExistFeature(featureType))
+        {
+            try
+            {
+                Connection conn = targetDataStore.getConnection(Transaction.AUTO_COMMIT);
+                if (dropTableMode)
+                {
+                    dropGeometryColumn(conn, featureName,
+                            featureType.getDefaultGeometry().getLocalName());
+                    dropTable(conn, featureName);
+
+                    ArrayList<String> schemaTexts = createSchemaTexts(featureType);
+                    for (String stmtText : schemaTexts)
+                    {
+                        Statement stmt = conn.createStatement();
+                        stmt.execute(stmtText);
+                        stmt.close();
+                    }
+                } else {
+                    deleteTable(conn, featureName);
+                }
+                conn.close();
+            } catch (IOException e)
+            {
+                logger.warn(e.getMessage(), e);
+            } catch (SQLException e)
+            {
+                logger.warn(e.getMessage(), e);
+            }
+        } else
+        {
+            try
+            {
+                Connection conn = targetDataStore.getConnection(Transaction.AUTO_COMMIT);
+                ArrayList<String> schemaTexts = createSchemaTexts(featureType);
+                for (String stmtText : schemaTexts)
+                {
+                    Statement stmt = conn.createStatement();
+                    stmt.execute(stmtText);
+                    stmt.close();
+                }
+                conn.close();
+            } catch (IOException e)
+            {
+                logger.warn(e.getMessage(), e);
+            } catch (SQLException e)
+            {
+                logger.warn(e.getMessage(), e);
+            }
+        }
+    }
 }

--
Gitblit v0.0.0-SNAPSHOT