From 5b261e3bb6b78f60993243a653caf0e35fc5fb34 Mon Sep 17 00:00:00 2001
From: Dennis Kao <ulysseskao@gmail.com>
Date: Mon, 23 Dec 2013 09:37:30 +0800
Subject: [PATCH] update geotools version

---
 xdgnjobs/pom.xml                                                                                                     |    2 
 xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/jobs/OracleIncrementDgn2PostGISJob.java                    |   66 +++++++
 xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/jobs/context/postgis/OracleIncrementPostGISJobContext.java |  388 ++++++++++++++++++++++++++++++++++++++++++++++++
 3 files changed, 447 insertions(+), 9 deletions(-)

diff --git a/xdgnjobs/pom.xml b/xdgnjobs/pom.xml
index de1a923..632f5e6 100644
--- a/xdgnjobs/pom.xml
+++ b/xdgnjobs/pom.xml
@@ -19,7 +19,7 @@
     <src.output>${basedir}/target</src.output>
     <java5>1.6</java5>
     <xdgnio.version>2.1.1</xdgnio.version>
-    <gt.version>10.2.x</gt.version>
+    <gt.version>10.3.x</gt.version>
     <failIfNoTests>false</failIfNoTests>
     <stress.skip.pattern></stress.skip.pattern>
     <online.skip.pattern></online.skip.pattern>
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 4466bf3..e11ac63 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
@@ -1,7 +1,65 @@
 package com.ximple.eofms.jobs;
 
-/**
- * Created by ulysseskao on 2013/12/23.
- */
-public class OracleIncrementDgn2PostGISJob {
+import java.util.Map;
+
+import com.ximple.eofms.jobs.context.AbstractOracleJobContext;
+import com.ximple.eofms.jobs.context.postgis.OracleIncrementPostGISJobContext;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.geotools.data.DataStore;
+import org.geotools.data.postgis.PostgisNGDataStoreFactory;
+import org.geotools.jdbc.JDBCDataStore;
+import org.quartz.JobExecutionContext;
+import org.quartz.JobExecutionException;
+
+public class OracleIncrementDgn2PostGISJob extends AbstractOracleDatabaseJob {
+    final static Log logger = LogFactory.getLog(OracleIncrementDgn2PostGISJob.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 int FETCHSIZE = 30;
+    private static final int COMMITSIZE = 100;
+
+    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;
+
+    @Override
+    public Log getLogger() {
+        return logger;
+    }
+
+    public DataStore getTargetDataStore() {
+        return targetDataStore;
+    }
+
+    @Override
+    protected AbstractOracleJobContext prepareJobContext(String targetSchemaName, String filterPath, boolean profileMode, boolean useTransform) {
+        return new OracleIncrementPostGISJobContext(getDataPath(),
+            getTargetDataStore(), targetSchemaName, filterPath, profileMode, useTransform);
+    }
+
+    @Override
+    public void execute(JobExecutionContext context) throws JobExecutionException {
+
+    }
+
 }
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 dfb1f90..0a54b0b 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
@@ -1,7 +1,387 @@
 package com.ximple.eofms.jobs.context.postgis;
 
-/**
- * Created by ulysseskao on 2013/12/23.
- */
-public class OracleIncrementPostGISJobContext {
+import java.io.File;
+import java.io.IOException;
+import java.io.UnsupportedEncodingException;
+import java.net.MalformedURLException;
+import java.net.URL;
+import java.sql.BatchUpdateException;
+import java.sql.Connection;
+import java.sql.DriverManager;
+import java.sql.PreparedStatement;
+import java.sql.SQLException;
+import java.sql.Statement;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.Iterator;
+
+import com.vividsolutions.jts.geom.Geometry;
+import com.vividsolutions.jts.util.Assert;
+import com.ximple.eofms.filter.AbstractFLinkageDispatchableFilter;
+import com.ximple.eofms.filter.CreateFeatureTypeEventListener;
+import com.ximple.eofms.filter.ElementDispatcher;
+import com.ximple.eofms.filter.FeatureTypeEvent;
+import com.ximple.eofms.jobs.OracleElementLogger;
+import com.ximple.eofms.util.ElementDigesterUtils;
+import com.ximple.io.dgn7.ComplexElement;
+import com.ximple.io.dgn7.Element;
+import com.ximple.io.dgn7.FrammeAttributeData;
+import org.apache.commons.digester3.Digester;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.apache.commons.transaction.util.CommonsLoggingLogger;
+import org.apache.commons.transaction.util.LoggerFacade;
+import org.geotools.data.DataStore;
+import org.geotools.data.Transaction;
+import org.geotools.data.jdbc.JDBCUtils;
+import org.geotools.feature.SchemaException;
+import org.opengis.feature.simple.SimpleFeature;
+import org.opengis.feature.simple.SimpleFeatureType;
+import org.postgresql.util.PSQLException;
+import org.quartz.JobExecutionContext;
+import org.xml.sax.SAXException;
+
+public class OracleIncrementPostGISJobContext extends AbstractOracleToPostGISJobContext
+    implements CreateFeatureTypeEventListener {
+
+    static Log logger = LogFactory.getLog(OracleConvertPostGISJobContext.class);
+    static final LoggerFacade sLogger = new CommonsLoggingLogger(logger);
+
+    // static PostgisNGDataStoreFactory dataStoreFactory = new PostgisNGDataStoreFactory();
+
+    private OracleElementLogger elmLogger = null;
+
+    static {
+        try {
+            DriverManager.registerDriver(new oracle.jdbc.driver.OracleDriver());
+        } catch (SQLException e) {
+            Assert.shouldNeverReachHere(e.getMessage());
+        }
+    }
+
+    private String _filterConfig;
+
+    private ElementDispatcher elementDispatcher;
+
+    private HashMap<SimpleFeatureType, ArrayList<SimpleFeature>> txFeaturesContext = new HashMap<SimpleFeatureType, ArrayList<SimpleFeature>>();
+
+    private JobExecutionContext executionContext;
+
+    private String currentSchema = null;
+    private boolean schemaChanged = false;
+    private boolean dropTableMode = true;
+    private int accumulate = 0;
+
+    public OracleIncrementPostGISJobContext(String dataPath, DataStore pgDS, String targetSchema, String filterConfig,
+                                          boolean profileMode, boolean useTransform) {
+        super(dataPath, pgDS, targetSchema, profileMode, useTransform);
+        _filterConfig = filterConfig;
+        elementDispatcher = createElementDispatcher();
+        elementDispatcher.addCreateFeatureTypeEventListener(this);
+        // txFeaturesContext = new PessimisticMapWrapper(featuresContext, sLogger);
+    }
+
+    private ElementDispatcher createElementDispatcher() {
+        try {
+            URL filterURL = null;
+            if (_filterConfig != null) {
+                File config = new File(_filterConfig);
+                if (config.exists()) {
+                    filterURL = config.toURI().toURL();
+                }
+            }
+            if (filterURL == null) {
+                // config = new File("conf/DefaultConvertShpFilter.xml");
+                filterURL = this.getClass().getResource("/conf/DefaultConvertShpFilter.xml");
+                // filterURL = this.getClass().getResource("/conf/ConvertShpFilterForLevel.xml");
+            }
+            assert filterURL != null;
+            Digester digester = ElementDigesterUtils.getElementDigester();
+            return (ElementDispatcher) digester.parse(filterURL);
+        } catch (UnsupportedEncodingException e) {
+            logger.info(e.getMessage(), e);
+            throw new RuntimeException(e.getMessage(), e);
+        } catch (MalformedURLException e) {
+            logger.info(e.getMessage(), e);
+            throw new RuntimeException(e.getMessage(), e);
+        } catch (IOException e) {
+            logger.info(e.getMessage(), e);
+            throw new RuntimeException(e.getMessage(), e);
+        } catch (SAXException e) {
+            logger.info(e.getMessage(), e);
+            throw new RuntimeException(e.getMessage(), e);
+        }
+    }
+
+    public void putFeatureCollection(Element element) {
+        assert elementDispatcher != null;
+        // 判斷是否符和條件
+        SimpleFeature feature = elementDispatcher.execute(element, 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() + "|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;
+        }
+
+        if (((Geometry)feature.getDefaultGeometry()).isEmpty()) {
+            boolean isEmptySize = false;
+            FrammeAttributeData linkage =
+                AbstractFLinkageDispatchableFilter.getFeatureLinkage(element);
+            logger.warn("Empty Geom Element:" + element.getElementType().toString() +
+                ":type=" + element.getType() + ":lv=" + element.getLevelIndex() + ":id=" +
+                (linkage == null ? "NULL" : (linkage.getFsc() + "|" + linkage.getComponentID())));
+
+            if (element instanceof ComplexElement) {
+                ComplexElement complex = (ComplexElement) element;
+                logger.warn("----Complex Element size=" + complex.size() + ":" +
+                    (linkage == null ? "NULL" : (linkage.getUfid())));
+                if (complex.size() == 0)
+                    isEmptySize = true;
+            }
+
+            if (getElementLogging() && (!isEmptySize)) {
+                getElementLogger().logElement(element, getCurrentSchema());
+            }
+            return;
+        }
+
+        if (!txFeaturesContext.containsKey(feature.getFeatureType())) {
+            txFeaturesContext.put(feature.getFeatureType(), new ArrayList<SimpleFeature>());
+        }
+        ArrayList<SimpleFeature> arrayList = txFeaturesContext.get(feature.getFeatureType());
+        arrayList.add(feature);
+        accumulate++;
+        if (accumulate > BATCHSIZE) {
+            commitTransaction();
+        }
+    }
+
+    public void startTransaction() {
+    }
+
+    public void commitTransaction() {
+        if (!txFeaturesContext.isEmpty()) {
+            logger.debug("Transaction size = " + txFeaturesContext.size());
+            //txFeaturesContext.commitTransaction();
+        } else {
+            logger.debug("Transaction is empty.");
+        }
+
+        if (!txFeaturesContext.isEmpty()) {
+            updateDataStore();
+        }
+
+        if (this.getElementLogger() != null)
+            this.getElementLogger().flashLogging();
+    }
+
+    public void rollbackTransaction() {
+    }
+
+    public void resetFeatureContext() {
+        txFeaturesContext.clear();
+    }
+
+    private void updateDataStore() {
+        if (isProfileMode()) markUpdateTime();
+        Iterator<SimpleFeatureType> it = txFeaturesContext.keySet().iterator();
+        Connection conn = null;
+        try {
+            conn = getConnection();
+            boolean autoCommit = conn.getAutoCommit();
+            conn.setAutoCommit(false);
+
+            while (it.hasNext()) {
+                SimpleFeatureType featureType = it.next();
+                logger.debug("Begin Save into PostGIS:" + featureType.getTypeName());
+
+                int batchCount = 0;
+                String bindingStmt = makePrepareInsertSql(featureType);
+                ArrayList<SimpleFeature> features = txFeaturesContext.get(featureType);
+                PreparedStatement pstmt = conn.prepareStatement(bindingStmt);
+
+                for (SimpleFeature feature : features) {
+                    try {
+                        // stmt.execute(feature);
+                        bindFeatureParameters(pstmt, feature);
+                        // pstmt.executeUpdate();
+                        pstmt.addBatch();
+                    } catch (PSQLException e) {
+                        if (bindingStmt != null) {
+                            logger.error("Execute:" + bindingStmt);
+                        }
+                        logger.error(e.getServerErrorMessage());
+                        logger.error(e.getMessage(), e);
+                    } catch (NullPointerException e) {
+                        if (bindingStmt != null) {
+                            logger.error("Execute:" + bindingStmt);
+                        }
+                        logger.error(feature.toString());
+                        logger.error(e.getMessage(), e);
+                    } catch (ClassCastException e) {
+                        if (bindingStmt != null) {
+                            logger.error("Execute:" + bindingStmt);
+                        }
+                        for (int i = 0; i < feature.getAttributeCount(); i++) {
+                            logger.info("attr[" + i + "]-" + ((feature.getAttribute(i) == null) ? " NULL" :
+                                feature.getAttribute(i).toString()));
+                        }
+                        logger.error(e.getMessage(), e);
+                    }
+                    batchCount++;
+                }
+
+                int[] numUpdates = pstmt.executeBatch();
+                for (int i = 0; i < numUpdates.length; i++) {
+                    if (numUpdates[i] == -2)
+                        logger.warn("Execution " + i + ": unknown number of rows updated");
+                }
+                conn.commit();
+
+                pstmt.close();
+                features.clear();
+                logger.debug("End Save into PostGIS:" + featureType.getTypeName());
+            }
+            conn.setAutoCommit(autoCommit);
+            JDBCUtils.close(conn, Transaction.AUTO_COMMIT, null);
+            accumulate = 0;
+        } catch (BatchUpdateException e) {
+            JDBCUtils.close(conn, Transaction.AUTO_COMMIT, e);
+            logger.error(e.getMessage(), e);
+            SQLException ex;
+            while ((ex = e.getNextException()) != null) {
+                // logger.warn(ex.getMessage(), ex);
+                logger.warn(ex.getMessage());
+            }
+        } catch (SQLException e) {
+            JDBCUtils.close(conn, Transaction.AUTO_COMMIT, e);
+            logger.error(e.getMessage(), e);
+        } finally {
+            if (isProfileMode()) accumulateUpdateTime();
+        }
+    }
+
+    public JobExecutionContext getExecutionContext() {
+        return executionContext;
+    }
+
+    public void setExecutionContext(JobExecutionContext context) {
+        executionContext = context;
+    }
+
+    /**
+     * �����]�Ƽg�J��
+     *
+     * @throws IOException IO�o�Ϳ�~
+     */
+    public void closeFeatureWriter() throws IOException {
+    }
+
+    protected OracleElementLogger getElementLogger() {
+        if (elmLogger == null) {
+            elmLogger = new OracleElementLogger(getOracleConnection());
+            elmLogger.setDataPath(this.getDataPath());
+        }
+        return elmLogger;
+    }
+
+    public String getCurrentSchema() {
+        return currentSchema;
+    }
+
+    public void setCurrentSchema(String querySchema) {
+        this.currentSchema = querySchema;
+        this.schemaChanged = true;
+    }
+
+    protected Log getLogger() {
+        return logger;
+    }
+
+    public boolean isDropTableMode() {
+        return dropTableMode;
+    }
+
+    public void setDropTableMode(boolean dropTableMode) {
+        this.dropTableMode = dropTableMode;
+    }
+
+    public void createFeatureTypeOccurred(FeatureTypeEvent evt) {
+        try {
+            createOrClearFeatureDataTable(evt.getFeatureType());
+        } catch (SchemaException e) {
+            logger.warn(e.getMessage(), e);
+        }
+    }
+
+    protected void createOrClearFeatureDataTable(SimpleFeatureType featureType) throws SchemaException {
+        String featureName = featureType.getTypeName();
+        Connection conn = null;
+        if (isExistFeature(featureType)) {
+            try {
+                conn = getConnection();
+                if (dropTableMode) {
+                    dropGeometryColumn(conn, getTargetSchema(), featureName,
+                                       (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 {
+            String tempStmt = null;
+            try {
+                conn = getConnection();
+                ArrayList<String> schemaTexts = createNewSchemaTexts(conn, featureType);
+                for (String stmtText : schemaTexts) {
+                    Statement stmt = conn.createStatement();
+                    tempStmt = stmtText;
+                    stmt.execute(stmtText);
+                    stmt.close();
+                }
+                JDBCUtils.close(conn, Transaction.AUTO_COMMIT, null);
+            } catch (IOException e) {
+                JDBCUtils.close(conn, Transaction.AUTO_COMMIT, null);
+                logger.warn("RUN--" + tempStmt);
+                logger.warn(e.getMessage(), e);
+            } catch (SQLException e) {
+                JDBCUtils.close(conn, Transaction.AUTO_COMMIT, e);
+                logger.warn("RUN--" + tempStmt);
+                logger.warn(e.getMessage(), e);
+            }
+        }
+    }
+
+    public boolean isSchemaChanged() {
+        return schemaChanged;
+    }
 }

--
Gitblit v0.0.0-SNAPSHOT