From 94ae08701bbd7585a0b7e5a92d1975965a503c03 Mon Sep 17 00:00:00 2001
From: Dennis Kao <ulysseskao@gmail.com>
Date: Wed, 15 Jan 2014 11:28:52 +0800
Subject: [PATCH] Merge branch 'origin/2.1.x'

---
 xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/jobs/DummyFeatureConvertJobContext.java |  231 +++++++++++++++++++++++----------------------------------
 1 files changed, 94 insertions(+), 137 deletions(-)

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 10f3c5e..394509b 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
@@ -10,26 +10,7 @@
 import java.util.HashMap;
 import java.util.Iterator;
 import java.util.List;
-
-import org.apache.commons.digester.Digester;
-import org.apache.commons.digester.xmlrules.DigesterLoader;
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
-import org.apache.commons.transaction.memory.PessimisticMapWrapper;
-import org.apache.commons.transaction.util.CommonsLoggingLogger;
-import org.apache.commons.transaction.util.LoggerFacade;
-import org.geotools.data.FeatureWriter;
-import org.geotools.data.Transaction;
-import org.geotools.data.shapefile.ShapefileDataStore;
-import org.geotools.data.shapefile.indexed.IndexedShapefileDataStore;
-import org.geotools.feature.Feature;
-import org.geotools.feature.FeatureType;
-import org.geotools.feature.IllegalAttributeException;
-import org.geotools.feature.SchemaException;
-import org.geotools.feature.SimpleFeature;
-import org.xml.sax.SAXException;
-
-import com.vividsolutions.jts.geom.GeometryFactory;
+import java.util.TimeZone;
 
 import com.ximple.eofms.filter.AbstractFLinkageDispatchableFilter;
 import com.ximple.eofms.filter.ElementDispatchableFilter;
@@ -38,21 +19,34 @@
 import com.ximple.eofms.filter.TypeCompLevelIdDispatchableFilter;
 import com.ximple.eofms.filter.TypeIdDispatchableFilter;
 import com.ximple.eofms.jobs.context.AbstractDgnFileJobContext;
+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 com.ximple.io.dgn7.UserAttributeData;
+import org.apache.commons.digester3.Digester;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.apache.commons.transaction.memory.PessimisticMapWrapper;
+import org.apache.commons.transaction.util.CommonsLoggingLogger;
+import org.apache.commons.transaction.util.LoggerFacade;
+import org.geotools.data.FeatureWriter;
+import org.geotools.data.Transaction;
+import org.geotools.data.shapefile.ShapefileDataStore;
+import org.geotools.feature.SchemaException;
+import org.opengis.feature.IllegalAttributeException;
+import org.opengis.feature.simple.SimpleFeature;
+import org.opengis.feature.simple.SimpleFeatureType;
+import org.xml.sax.SAXException;
 
-public class DummyFeatureConvertJobContext extends AbstractDgnFileJobContext
-{
+public class DummyFeatureConvertJobContext extends AbstractDgnFileJobContext {
     static final Log logger = LogFactory.getLog(DummyFeatureConvertJobContext.class);
     static final LoggerFacade sLogger = new CommonsLoggingLogger(logger);
-    static final GeometryFactory geometryFactory = new GeometryFactory();
     static final String SHPOUTPATH = "shpout";
 
     private String dataOut = null;
 
-    private HashMap<String, ArrayList<Feature>> featuresContext = new HashMap<String, ArrayList<Feature>>();
+    private HashMap<String, ArrayList<SimpleFeature>> featuresContext = new HashMap<String, ArrayList<SimpleFeature>>();
     private HashMap<String, FeatureWriter> featuresWriterContext = new HashMap<String, FeatureWriter>();
 
     private PessimisticMapWrapper txFeaturesContext;
@@ -60,78 +54,62 @@
     private ElementDispatcher elementDispatcher;
     private String _filterConfig;
 
-    public DummyFeatureConvertJobContext(String dataPath, String filterConfig)
-    {
-        super(dataPath);
+    public DummyFeatureConvertJobContext(String dataPath, String filterConfig, boolean profileMode,
+                                         boolean useTransform) {
+        super(dataPath, profileMode, useTransform);
         txFeaturesContext = new PessimisticMapWrapper(featuresContext, sLogger);
         _filterConfig = filterConfig;
         elementDispatcher = createElementDispatcher();
     }
 
-    private ElementDispatcher createElementDispatcher()
-    {
-        try
-        {
-            URL rulesURL = ElementDispatcher.class.getResource("ElementDispatcherRules.xml");
-            assert rulesURL != null;
-            Digester digester = DigesterLoader.createDigester(rulesURL);
+    private ElementDispatcher createElementDispatcher() {
+        try {
             URL filterURL = null;
-            if (_filterConfig != null)
-            {
+            if (_filterConfig != null) {
                 File config = new File(_filterConfig);
-                if (config.exists())
-                {
+                if (config.exists()) {
                     filterURL = config.toURI().toURL();
                 }
             }
-            if (filterURL == null)
-            {
+            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)
-        {
+        } catch (UnsupportedEncodingException e) {
             logger.info(e.getMessage(), e);
             throw new RuntimeException(e.getMessage(), e);
-        } catch (MalformedURLException e)
-        {
+        } catch (MalformedURLException e) {
             logger.info(e.getMessage(), e);
             throw new RuntimeException(e.getMessage(), e);
-        } catch (IOException e)
-        {
+        } catch (IOException e) {
             logger.info(e.getMessage(), e);
             throw new RuntimeException(e.getMessage(), e);
-        } catch (SAXException e)
-        {
+        } catch (SAXException e) {
             logger.info(e.getMessage(), e);
             throw new RuntimeException(e.getMessage(), e);
         }
     }
 
-    public void putFeatureCollection(Element element) throws IllegalAttributeException, SchemaException
-    {
+    public void putFeatureCollection(Element element) throws IllegalAttributeException, SchemaException {
         assert elementDispatcher != null;
 
-        if (element == null)
-        {
+        if (element == null) {
             logger.warn("Unknown Element:" + null);
             return;
         }
 
-        // �P�_�O�_�ũM����
-        Feature feature = elementDispatcher.execute(element, true);
-        if (feature == null)
-        {
+        SimpleFeature feature = elementDispatcher.execute(element, getDistId(), isTransformed());
+        if (feature == null) {
             FrammeAttributeData linkage =
-                    AbstractFLinkageDispatchableFilter.getFeatureLinkage(element);
+                AbstractFLinkageDispatchableFilter.getFeatureLinkage(element);
             logger.warn("Unknown Element:" + element.getElementType().toString() +
-                    ":type=" + element.getType() + ":lv=" + element.getLevelIndex() + ":id=" +
-                    (linkage == null ? "NULL" : (linkage.getFsc() + "|" + linkage.getComponentID())));
-            if (element instanceof ComplexElement)
-            {
+                ":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());
             }
@@ -139,131 +117,116 @@
             return;
         }
 
-        if (!txFeaturesContext.containsKey(feature.getFeatureType()))
-        {
+        if (!txFeaturesContext.containsKey(feature.getFeatureType())) {
             txFeaturesContext.put(feature.getFeatureType(), new ArrayList());
         }
         ArrayList arrayList = (ArrayList) txFeaturesContext.get(feature.getFeatureType());
         arrayList.add(feature);
     }
 
-    public void startTransaction()
-    {
+    public void startTransaction() {
         assert elementDispatcher != null;
-        for (ElementDispatchableFilter filter : elementDispatcher.getRules())
-        {
-            if (filter instanceof TypeCompIdDispatchableFilter)
-            {
+        for (ElementDispatchableFilter filter : elementDispatcher.getRules()) {
+            if (filter instanceof TypeCompIdDispatchableFilter) {
                 ((TypeCompIdDispatchableFilter) filter).getCreateStrategy();
-            } else if (filter instanceof TypeCompLevelIdDispatchableFilter)
-            {
+            } else if (filter instanceof TypeCompLevelIdDispatchableFilter) {
                 ((TypeCompIdDispatchableFilter) filter).getCreateStrategy();
-            } else if (filter instanceof TypeIdDispatchableFilter)
-            {
+            } else if (filter instanceof TypeIdDispatchableFilter) {
                 ((TypeCompIdDispatchableFilter) filter).getCreateStrategy();
             }
         }
     }
 
-    public void commitTransaction()
-    {
-        if (!txFeaturesContext.isEmpty())
-        {
+    public void commitTransaction() {
+        if (!txFeaturesContext.isEmpty()) {
             logger.debug("Transaction size = " + txFeaturesContext.size());
             //txFeaturesContext.commitTransaction();
-        } else
-        {
+        } else {
             logger.debug("Transaction is empty.");
         }
 
-        if (!featuresContext.isEmpty())
-        {
+        if (!featuresContext.isEmpty()) {
             updateDataStore();
         }
     }
 
-    public void rollbackTransaction()
-    {
+    public void rollbackTransaction() {
         //txFeaturesContext.rollbackTransaction();
-        if (!featuresContext.isEmpty())
-        {
+        if (!featuresContext.isEmpty()) {
             updateDataStore();
         }
     }
 
-    private void updateDataStore()
-    {
+    private void updateDataStore() {
+        if (isProfileMode()) markUpdateTime();
         Iterator it = featuresContext.keySet().iterator();
 
-        try
-        {
-            while (it.hasNext())
-            {
-                FeatureType featureType = (FeatureType) it.next();
+        try {
+            while (it.hasNext()) {
+                SimpleFeatureType featureType = (SimpleFeatureType) it.next();
                 File sfile = new File(getDataOutPath() + File.separator + featureType.getTypeName());
                 logger.debug("Begin Save shapefile:" + sfile.toURI());
 
                 FeatureWriter writer;
-                if (featuresWriterContext.containsKey(featureType.getTypeName()))
-                {
+                if (featuresWriterContext.containsKey(featureType.getTypeName())) {
                     writer = featuresWriterContext.get(featureType.getTypeName());
-                } else
-                {
+                } else {
                     // ShapefileDataStore shapefileDataStore = new ShapefileDataStore(sfile.toURI().toURL());
                     /*
                     ShapefileDataStore shapefileDataStore = new ShapefileDataStore(sfile.toURI().toURL(),
                             true, Charset.forName("UTF-8"));
                     */
-                    if (!sfile.exists())
-                    {
-                        ShapefileDataStore shapefileDataStore = new IndexedShapefileDataStore(sfile.toURI().toURL(),
-                                null, true, true, IndexedShapefileDataStore.TREE_QIX, Charset.forName("UTF-8"));
+                    ShapefileDataStore shapefileDataStore = new ShapefileDataStore(sfile.toURI().toURL());
+                    /*
+                    if(namespace != null) {
+                        shapefileDataStore.setNamespaceURI(namespace.toString());
+                    }
+                    */
+                    shapefileDataStore.setMemoryMapped(true);
+                    // shapefileDataStore.setBufferCachingEnabled(cacheMemoryMaps);
+                    shapefileDataStore.setCharset(Charset.forName("UTF-8"));
+                    shapefileDataStore.setTimeZone(TimeZone.getDefault());
+                    shapefileDataStore.setIndexed(true);
+                    shapefileDataStore.setIndexCreationEnabled(true);
+
+                    if (!sfile.exists()) {
                         shapefileDataStore.createSchema(featureType);
                         writer = shapefileDataStore.getFeatureWriter(featureType.getTypeName(),
-                                Transaction.AUTO_COMMIT);
-                    } else
-                    {
-                        ShapefileDataStore shapefileDataStore = new IndexedShapefileDataStore(sfile.toURI().toURL(),
-                                null, true, true, IndexedShapefileDataStore.TREE_QIX, Charset.forName("UTF-8"));
+                                                                     Transaction.AUTO_COMMIT);
+                    } else {
                         writer = shapefileDataStore.getFeatureWriterAppend(featureType.getTypeName(),
-                                Transaction.AUTO_COMMIT);
+                                                                           Transaction.AUTO_COMMIT);
                     }
                     featuresWriterContext.put(featureType.getTypeName(), writer);
                 }
 
-                ArrayList<Feature> features = featuresContext.get(featureType);
+                ArrayList<SimpleFeature> features = featuresContext.get(featureType);
                 Iterator itFeature = features.iterator();
-                while (itFeature.hasNext())
-                {
-                    Feature feature = (Feature) itFeature.next();
-                    ((SimpleFeature) writer.next()).setAttributes(feature.getAttributes(null));
+                while (itFeature.hasNext()) {
+                    SimpleFeature feature = (SimpleFeature) itFeature.next();
+                    ((SimpleFeature) writer.next()).setAttributes(feature.getAttributes());
                 }
                 //writer.close();
                 logger.debug("End Save shapefile:" + sfile.toURI());
             }
             featuresContext.clear();
-        } catch (MalformedURLException e)
-        {
+        } catch (MalformedURLException e) {
             logger.error(e.getMessage(), e);
-        } catch (IllegalAttributeException e)
-        {
+        } catch (IllegalAttributeException e) {
             logger.error(e.getMessage(), e);
-        } catch (IOException e)
-        {
+        } catch (IOException e) {
             logger.error(e.getMessage(), e);
+        } finally {
+            if (isProfileMode()) accumulateUpdateTime();
         }
     }
 
-    public String getDataOutPath()
-    {
-        if (dataOut == null)
-        {
+    public String getDataOutPath() {
+        if (dataOut == null) {
             File outPath = new File(getDataPath(), SHPOUTPATH);
-            if (!outPath.exists())
-            {
+            if (!outPath.exists()) {
                 outPath.mkdir();
-            } else if (!outPath.isDirectory())
-            {
+            } else if (!outPath.isDirectory()) {
                 outPath.mkdir();
             }
             dataOut = outPath.toString();
@@ -271,35 +234,29 @@
         return dataOut;
     }
 
-    public void closeFeatureWriter() throws IOException
-    {
+    public void closeFeatureWriter() throws IOException {
 
-        for (FeatureWriter featureWriter : this.featuresWriterContext.values())
-        {
+        for (FeatureWriter featureWriter : this.featuresWriterContext.values()) {
             featureWriter.close();
         }
 
         this.featuresWriterContext.clear();
     }
 
-    protected FrammeAttributeData getFeatureLinkage(Element element)
-    {
+    protected FrammeAttributeData getFeatureLinkage(Element element) {
         if (!element.hasUserAttributeData())
             return null;
 
         List<UserAttributeData> usrDatas = element.getUserAttributeData();
-        for (UserAttributeData anUsrData : usrDatas)
-        {
-            if (anUsrData instanceof FrammeAttributeData)
-            {
+        for (UserAttributeData anUsrData : usrDatas) {
+            if (anUsrData instanceof FrammeAttributeData) {
                 return (FrammeAttributeData) anUsrData;
             }
         }
         return null;
     }
 
-    public Log getLogger()
-    {
+    public Log getLogger() {
         return logger;
     }
 }

--
Gitblit v0.0.0-SNAPSHOT