From aaf4c6c3a1d50b67b9a7dfd1bc011615ba5d9f57 Mon Sep 17 00:00:00 2001
From: ?? ? <ulysseskao@ximple.com.tw>
Date: Fri, 06 Jun 2008 18:44:30 +0800
Subject: [PATCH] update for EOFM-115

---
 xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/jobs/OracleConvertDgn2PostGISJob.java |  261 ++++++++++++++++++++++++++++++++++------------------
 1 files changed, 170 insertions(+), 91 deletions(-)

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 e2d0c90..058a7b8 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
@@ -1,56 +1,62 @@
 package com.ximple.eofms.jobs;
 
-import java.util.Date;
-import java.sql.SQLException;
-import java.sql.Statement;
-import java.sql.ResultSet;
-import java.sql.Types;
-import java.io.IOException;
 import java.io.File;
-import java.io.FilenameFilter;
 import java.io.FileInputStream;
 import java.io.FileNotFoundException;
+import java.io.FilenameFilter;
+import java.io.IOException;
 import java.math.BigDecimal;
 import java.nio.ByteBuffer;
 import java.nio.ByteOrder;
 import java.nio.channels.FileChannel;
-
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
-import org.apache.commons.collections.OrderedMap;
-import org.apache.commons.collections.OrderedMapIterator;
-import org.apache.commons.collections.map.LinkedMap;
-import org.quartz.JobExecutionContext;
-import org.quartz.JobExecutionException;
-import org.quartz.JobDetail;
-import org.quartz.JobDataMap;
-import org.geotools.feature.IllegalAttributeException;
-import org.geotools.feature.SchemaException;
+import java.sql.ResultSet;
+import java.sql.SQLException;
+import java.sql.Statement;
+import java.sql.Types;
+import java.util.Calendar;
+import java.util.Date;
+import java.util.Map;
+import java.util.TreeMap;
 
 import com.vividsolutions.jts.geom.GeometryFactory;
-
-import oracle.jdbc.OracleConnection;
-import oracle.jdbc.OracleResultSet;
-import oracle.sql.BLOB;
-import oracle.sql.ARRAY;
-
-import com.ximple.util.PrintfFormat;
-import com.ximple.io.dgn7.Element;
-import com.ximple.io.dgn7.Dgn7fileException;
-import com.ximple.io.dgn7.ElementType;
-import com.ximple.io.dgn7.IElementHandler;
-import com.ximple.io.dgn7.ComplexElement;
-import com.ximple.io.dgn7.Dgn7fileReader;
-import com.ximple.io.dgn7.Lock;
-import com.ximple.io.dgn7.TextElement;
+import com.ximple.eofms.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.BinConverter;
 import com.ximple.eofms.util.ByteArrayCompressor;
 import com.ximple.eofms.util.StringUtils;
-import com.ximple.eofms.jobs.context.AbstractOracleJobContext;
-import com.ximple.eofms.jobs.context.FeatureDgnConvertShpJobContext;
-import com.ximple.eofms.jobs.context.GeneralDgnConvertShpJobContext;
-import com.ximple.eofms.jobs.context.IndexDgnConvertShpJobContext;
-import com.ximple.eofms.jobs.context.OracleConvertShapefilesJobContext;
+import com.ximple.io.dgn7.ComplexElement;
+import com.ximple.io.dgn7.Dgn7fileException;
+import com.ximple.io.dgn7.Dgn7fileReader;
+import com.ximple.io.dgn7.Element;
+import com.ximple.io.dgn7.ElementType;
+import com.ximple.io.dgn7.IElementHandler;
+import com.ximple.io.dgn7.Lock;
+import com.ximple.io.dgn7.TextElement;
+import com.ximple.util.PrintfFormat;
+
+import org.apache.commons.collections.OrderedMap;
+import org.apache.commons.collections.OrderedMapIterator;
+import org.apache.commons.collections.map.LinkedMap;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.geotools.data.DataStore;
+import org.geotools.data.oracle.OracleDataStore;
+import org.geotools.data.postgis.PostgisDataStore;
+import org.geotools.data.postgis.PostgisDataStoreFactory;
+import org.geotools.feature.IllegalAttributeException;
+import org.geotools.feature.SchemaException;
+import org.quartz.JobDataMap;
+import org.quartz.JobDetail;
+import org.quartz.JobExecutionContext;
+import org.quartz.JobExecutionException;
+
+import oracle.jdbc.OracleConnection;
+import oracle.jdbc.OracleResultSet;
+import oracle.sql.ARRAY;
+import oracle.sql.BLOB;
 
 public class OracleConvertDgn2PostGISJob extends AbstractOracleDatabaseJob
 {
@@ -61,7 +67,7 @@
     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 PGPASS = "PGPASS";
     private static final String USEWKB = "USEWKB";
 
     private static final int FETCHSIZE = 30;
@@ -80,6 +86,8 @@
         }
     }
 
+    protected static PostgisDataStoreFactory dataStoreFactory = new PostgisDataStoreFactory();
+
     GeometryFactory _geomFactory = new GeometryFactory();
     protected String _pgHost;
     protected String _pgDatabase;
@@ -89,30 +97,20 @@
     protected String _pgPassword;
     protected String _pgUseWKB;
 
-    // static PostgisDataStoreFactory factory = new PostgisDataStoreFactory();
+    protected Map pgProperties;
+    protected PostgisDataStore targetDataStore;
+
     /*
-        f = PostgisTests.newFixture();
-        remote = new HashMap();
-        remote.put("dbtype", "postgis");
-        remote.put("charset", "");
-        remote.put("host", f.host);
-        remote.put("port", f.port);
-        remote.put("database", f.database);
-        remote.put("user", f.user);
-        remote.put("passwd", f.password);
-        remote.put("namespace", f.namespace);
-     */
-    /*
-        PostgisDataStore pg = new PostgisDataStore(pool, f.schema, getName(),
-                PostgisDataStore.OPTIMIZE_SQL);
-        pg.setWKBEnabled(WKB_ENABLED);
-        pg.setEstimatedExtent(true);
-        pg.setFIDMapper("road", new TypedFIDMapper(new BasicFIDMapper("fid", 255, false), "road"));
-        pg.setFIDMapper("river", new TypedFIDMapper(new BasicFIDMapper("fid", 255, false), "river"));
-        pg.setFIDMapper("testset",
-            new TypedFIDMapper(new BasicFIDMapper("gid", 255, true), "testset"));
-    
-     */
+       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);
@@ -139,7 +137,7 @@
 
     protected AbstractOracleJobContext prepareJobContext(String filterPath)
     {
-        return new OracleConvertShapefilesJobContext(filterPath);
+        return new OracleConvertPostGISJobContext(getDataPath(), getTargetDataStore(), filterPath);
     }
 
     protected void extractJobConfiguration(JobDetail jobDetail) throws JobExecutionException
@@ -155,6 +153,7 @@
         _pgUseWKB = dataMap.getString(USEWKB);
 
         Log logger = getLogger();
+        /*
         logger.info("PGHOST=" + _pgHost);
         logger.info("PGDDATBASE=" + _pgDatabase);
         logger.info("PGPORT=" + _pgPort);
@@ -162,31 +161,49 @@
         logger.info("PGUSER=" + _pgUsername);
         logger.info("PGPASS=" + _pgPassword);
         logger.info("USEWKB=" + _pgUseWKB);
+        */
 
         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("dbtype", "postgis");
+        remote.put("charset", "UTF-8");
+        remote.put("host", _pgHost);
+        remote.put("port", _pgPort);
+        remote.put("database", _pgDatabase);
+        remote.put("user", _pgUsername);
+        remote.put("passwd", _pgPassword);
+        remote.put("namespace", null);
+        pgProperties = remote;
     }
 
     public void execute(JobExecutionContext context) throws JobExecutionException
@@ -200,11 +217,26 @@
         // 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.");
+        }
+
+        Calendar cal = Calendar.getInstance();
+        Date startTime = cal.getTime();
         try
         {
-            logger.info("-- step:clearOutputDirectory --");
-            clearOutputDirectory();
+            logger.info("-- step:clearOutputDatabase --");
+            clearOutputDatabase();
             boolean bFirst = true;
             if (checkConvertDB())
             {
@@ -212,12 +244,9 @@
 
                 for (String orgSchema : _orgSchema)
                 {
-                    OracleConvertShapefilesJobContext jobContext = (OracleConvertShapefilesJobContext) prepareJobContext(_filterPath);
-                    jobContext.setConnectionInfo(_oracleHost, _oraclePort, _oracleInstance);
-                    jobContext.setLogin(_username, _password);
-                    jobContext.setShapeData(_dataPath);
-                    jobContext.setConvertDB(_convertDB);
-                    jobContext.setConvertFile(_convertFile);
+                    OracleConvertPostGISJobContext jobContext =
+                            (OracleConvertPostGISJobContext) prepareJobContext(_filterPath);
+                    jobContext.setSourceDataStore(getSourceDataStore());
                     jobContext.setConvertElementIn(_convertElementIn);
                     jobContext.setElementLogging(checkElementLogging());
                     jobContext.setExecutionContext(context);
@@ -254,6 +283,13 @@
                 logger.info("-- step:createDummyFeatureFile --");
                 createDummyFeatureFile(context);
             }
+
+            disconnect();
+            Date endTime = cal.getTime();
+            Date time = new Date(endTime.getTime() - startTime.getTime());
+            // public static final String DATE_FORMAT_NOW = "yyyy-MM-dd HH:mm:ss";
+            // SimpleDateFormat sdf = new SimpleDateFormat(DATE_FORMAT_NOW);
+            logger.warn("use time = " + time);
         } catch (SQLException e)
         {
             logger.warn(e.getMessage(), e);
@@ -272,15 +308,15 @@
      * @param jobContext job context
      * @throws SQLException sql exception
      */
-    private void copyConnectivity(OracleConvertShapefilesJobContext jobContext) throws SQLException
+    private void copyConnectivity(OracleConvertPostGISJobContext jobContext) throws SQLException
     {
         OracleConnection connection = jobContext.getOracleConnection();
         Statement stmt = connection.createStatement();
-        stmt.execute(OracleConvertShapefilesJobContext.TRUNCATE_CONNECTIVITY_WEBCHECK);
-        stmt.execute(OracleConvertShapefilesJobContext.COPY_CONNECTIVITY_TO_WEBCHECK);
+        stmt.execute(AbstractOracleJobContext.TRUNCATE_CONNECTIVITY_WEBCHECK);
+        stmt.execute(AbstractOracleJobContext.COPY_CONNECTIVITY_TO_WEBCHECK);
     }
 
-    private void exetcuteConvert(OracleConvertShapefilesJobContext jobContext,
+    private void exetcuteConvert(OracleConvertPostGISJobContext jobContext,
                                  String querySchema, String dataPath) throws SQLException
     {
         int order = 0;
@@ -429,7 +465,7 @@
         return orderedMap;
     }
 
-    protected void queryIgsetElement(OracleConvertShapefilesJobContext jobContext,
+    protected void queryIgsetElement(OracleConvertPostGISJobContext jobContext,
                                      String srcschema, String srctable) throws SQLException
     {
         OracleConnection connection = jobContext.getOracleConnection();
@@ -471,7 +507,7 @@
         stmtSrc.close();
     }
 
-    protected void queryRawElement(OracleConvertShapefilesJobContext jobContext,
+    protected void queryRawElement(OracleConvertPostGISJobContext jobContext,
                                    String srcschema, String srctable) throws SQLException
     {
         OracleConnection connection = jobContext.getOracleConnection();
@@ -583,7 +619,8 @@
      * �����ഫ���޹��ɪ��u�@
      *
      * @param context �u�@��������
-     * @throws org.quartz.JobExecutionException exception
+     * @throws org.quartz.JobExecutionException
+     *          exception
      */
     private void convertIndexDesignFile(JobExecutionContext context) throws JobExecutionException
     {
@@ -609,7 +646,8 @@
 
         for (File dgnFile : dgnFiles)
         {
-            IndexDgnConvertShpJobContext convertContext = new IndexDgnConvertShpJobContext(getDataPath());
+            IndexDgnConvertPostGISJobContext convertContext =
+                    new IndexDgnConvertPostGISJobContext(getDataPath(), getTargetDataStore());
             logger.debug("--- start dgnfile-" + dgnFile.toString() + " ---");
             try
             {
@@ -656,7 +694,7 @@
         }
     }
 
-    protected void scanIndexDgnElement(IndexDgnConvertShpJobContext convertContext)
+    protected void scanIndexDgnElement(IndexDgnConvertPostGISJobContext convertContext)
             throws Dgn7fileException, IOException, IllegalAttributeException, SchemaException
     {
         Dgn7fileReader reader = convertContext.getReader();
@@ -699,7 +737,8 @@
         logger.debug("ElementRecord Count=" + count);
     }
 
-    private void processIndexElement(Element element, IndexDgnConvertShpJobContext convertContext) throws IllegalAttributeException, SchemaException
+    private void processIndexElement(Element element, IndexDgnConvertPostGISJobContext convertContext)
+            throws IllegalAttributeException, SchemaException
     {
         if (element instanceof TextElement)
         {
@@ -712,7 +751,8 @@
      * �����ഫ��L�]�p���ɪ��u�@
      *
      * @param context jobContext
-     * @throws org.quartz.JobExecutionException exception
+     * @throws org.quartz.JobExecutionException
+     *          exception
      */
     private void convertOtherDesignFile(JobExecutionContext context) throws JobExecutionException
     {
@@ -738,7 +778,8 @@
 
         for (File dgnFile : dgnFiles)
         {
-            GeneralDgnConvertShpJobContext convertContext = new GeneralDgnConvertShpJobContext(getDataPath());
+            GeneralDgnConvertPostGISJobContext convertContext =
+                    new GeneralDgnConvertPostGISJobContext(getDataPath(), getTargetDataStore());
             logger.info("--- start dgnfile-" + dgnFile.toString() + " ---");
             try
             {
@@ -785,7 +826,7 @@
         }
     }
 
-    public void scanOtherDgnElement(GeneralDgnConvertShpJobContext convertContext)
+    public void scanOtherDgnElement(GeneralDgnConvertPostGISJobContext convertContext)
             throws Dgn7fileException, IOException, IllegalAttributeException, SchemaException
     {
         Dgn7fileReader reader = convertContext.getReader();
@@ -828,15 +869,16 @@
         logger.debug("ElementRecord Count=" + count);
     }
 
-    private void processOtherElement(Element element, GeneralDgnConvertShpJobContext convertContext)
+    private void processOtherElement(Element element, GeneralDgnConvertPostGISJobContext convertContext)
             throws IllegalAttributeException, SchemaException
     {
         convertContext.putFeatureCollection(element);
     }
 
-    private void clearOutputDirectory()
+    private void clearOutputDatabase()
     {
-        File outDataPath = new File(getDataPath(), OracleConvertShapefilesJobContext.SHPOUTPATH);
+        /*
+        File outDataPath = new File(getDataPath(), OracleConvertPostGISJobContext.SHPOUTPATH);
         if (outDataPath.exists() && outDataPath.isDirectory())
         {
             deleteFilesInPath(outDataPath);
@@ -851,6 +893,7 @@
         {
             deleteFilesInPath(outDataPath);
         }
+        */
     }
 
     private void deleteFilesInPath(File outDataPath)
@@ -911,7 +954,8 @@
 
         for (File dgnFile : dgnFiles)
         {
-            FeatureDgnConvertShpJobContext convertContext = new FeatureDgnConvertShpJobContext(getDataPath(), _filterPath);
+            FeatureDgnConvertPostGISJobContext convertContext =
+                    new FeatureDgnConvertPostGISJobContext(getDataPath(), getTargetDataStore(), _filterPath);
             logger.info("--- start dgnfile-" + dgnFile.toString() + " ---");
             try
             {
@@ -958,7 +1002,7 @@
         }
     }
 
-    public void scanFeatureDgnElement(FeatureDgnConvertShpJobContext convertContext)
+    public void scanFeatureDgnElement(FeatureDgnConvertPostGISJobContext convertContext)
             throws Dgn7fileException, IOException, IllegalAttributeException, SchemaException
     {
         Dgn7fileReader reader = convertContext.getReader();
@@ -1001,7 +1045,7 @@
         logger.debug("ElementRecord Count=" + count);
     }
 
-    private void processFeatureElement(Element element, FeatureDgnConvertShpJobContext convertContext)
+    private void processFeatureElement(Element element, FeatureDgnConvertPostGISJobContext convertContext)
             throws IllegalAttributeException, SchemaException
     {
         convertContext.putFeatureCollection(element);
@@ -1022,4 +1066,39 @@
         }
         */
     }
+
+    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 (!dataStoreFactory.canProcess(pgProperties))
+        {
+            getLogger().warn("cannot process properties-");
+            throw new JobExecutionException("cannot process properties-");
+        }
+        try
+        {
+            targetDataStore = (PostgisDataStore) dataStoreFactory.createDataStore(pgProperties);
+        } catch (IOException e)
+        {
+            getLogger().warn(e.getMessage(), e);
+            throw new JobExecutionException(e.getMessage(), e);
+        }
+    }
 }

--
Gitblit v0.0.0-SNAPSHOT