From 0bd011e9dda3aabf6bbe3b9fad3f855a1ff2fae6 Mon Sep 17 00:00:00 2001
From: ?? ? <ulysseskao@ximple.com.tw>
Date: Mon, 26 May 2008 14:06:48 +0800
Subject: [PATCH] update for EOFM-106

---
 xdgnjobs/ximple-jobcarrier/src/main/resources/quartz_jobs.xml                                   |   10 +
 xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/jobs/AbstractOracleDatabaseJob.java   |   20 ++
 .gitattributes                                                                                  |    1 
 xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/jobs/OracleConvertJobContext.java     |   37 +++
 xdgnjobs/ximple-spatialjob/src/main/resources/conf/DefaultConvertShpFilter.xml                  |    2 
 xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/jobs/OracleConvertDgn2ShpJob.java     |  138 ++++++++++++++
 xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/jobs/FeatureDgnConvertJobContext.java |  280 +++++++++++++++++++++++++++++++
 xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/jobs/GeneralDgnConvertJobContext.java |   17 +
 xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/filter/CreateLineStringStrategy.java  |   18 ++
 9 files changed, 510 insertions(+), 13 deletions(-)

diff --git a/.gitattributes b/.gitattributes
index a9bb174..8b69adf 100644
--- a/.gitattributes
+++ b/.gitattributes
@@ -64,6 +64,7 @@
 xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/jobs/AbstractDgnFileJobContext.java svneol=native#text/plain
 xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/jobs/AbstractOracleDatabaseJob.java svneol=native#text/plain
 xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/jobs/AbstractOracleJobContext.java svneol=native#text/plain
+xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/jobs/FeatureDgnConvertJobContext.java svneol=native#text/plain
 xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/jobs/GeneralDgnConvertJobContext.java svneol=native#text/plain
 xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/jobs/IndexDgnConvertJobContext.java svneol=native#text/plain
 xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/jobs/OracleConvertDgn2ShpJob.java svneol=native#text/plain
diff --git a/xdgnjobs/ximple-jobcarrier/src/main/resources/quartz_jobs.xml b/xdgnjobs/ximple-jobcarrier/src/main/resources/quartz_jobs.xml
index 0997e76..0604eb4 100644
--- a/xdgnjobs/ximple-jobcarrier/src/main/resources/quartz_jobs.xml
+++ b/xdgnjobs/ximple-jobcarrier/src/main/resources/quartz_jobs.xml
@@ -20,6 +20,12 @@
           <key>SHPDATA_DIR</key>
           <value>g:\temp\data</value>
         </entry>
+        <!--
+        <entry>
+          <key>SHPFILTER_CONF</key>
+          <value></value>
+        </entry>
+        -->
         <entry>
           <key>ORAHOST</key>
           <value>192.168.11.200</value>
@@ -53,6 +59,10 @@
           <value>true</value>
         </entry>
         <entry>
+          <key>CONVERTELEMIN</key>
+          <value>false</value>
+        </entry>
+        <entry>
           <key>ELEMLOG</key>
           <value>true</value>
         </entry>
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 e20fced..58ff341 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
@@ -22,6 +22,7 @@
 import com.ximple.io.dgn7.LineElement;
 import com.ximple.io.dgn7.LineStringElement;
 import com.ximple.io.dgn7.UserAttributeData;
+import com.ximple.io.dgn7.ArcElement;
 
 public class CreateLineStringStrategy implements CreateFeatureTypeStrategy
 {
@@ -121,7 +122,24 @@
                     lineElement.getLineStyle()
             });
             return feature;
+        } else if (element instanceof ArcElement)
+        {
+            ArcElement lineStringElement = (ArcElement) element;
+            convertDecorator.setConverter(lineStringElement);
+            Feature feature = featureType.create(new Object[]{
+                    convertDecorator.toGeometry(geometryFactory),
+                    (int) fLinkage.getFsc(),
+                    (long) fLinkage.getUfid(),
+                    (int) fLinkage.getComponentID(),
+                    0,
+                    lineStringElement.getLevelIndex(),
+                    colorTable.getColorCode(lineStringElement.getColorIndex()),
+                    lineStringElement.getWeight(),
+                    lineStringElement.getLineStyle()
+            });
+            return feature;
         }
+
         return null;
     }
 }
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 9593ded..f3f98b9 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
@@ -26,6 +26,7 @@
     private static final String SPATAILSCHEMA = "ORGSCHEMA";
     private static final String CONVERTDB = "CONVERTDB";
     private static final String CONVERTFILE = "CONVERTFILE";
+    private static final String CONVERTELEMIN = "CONVERTELEMIN";
     private static final String ELEMLOG = "ELEMLOG";
     private static final String ORAHOST = "ORAHOST";
     private static final String ORAINST = "ORAINST";
@@ -44,6 +45,7 @@
     protected String _password;
     protected String _convertDB;
     protected String _convertFile;
+    protected String _convertElementIn;
     protected String _elementLogging;
     protected ArrayList<String> _orgSchema = new ArrayList<String>();
     protected boolean _testMode = false;
@@ -66,6 +68,7 @@
         _password = dataMap.getString(ORAPASS);
         _convertDB = dataMap.getString(CONVERTDB);
         _convertFile = dataMap.getString(CONVERTFILE);
+        _convertElementIn = dataMap.getString(CONVERTELEMIN);
         _elementLogging = dataMap.getString(ELEMLOG);
 
         Log logger = getLogger();
@@ -78,6 +81,7 @@
         logger.info("ORAPASS=" + _password);
         logger.info("CONVERTDB=" + _convertDB);
         logger.info("CONVERTFILE=" + _convertFile);
+        logger.info("CONVERTELEMIN=" + _convertElementIn);
         logger.info("ELEMLOG=" + _elementLogging);
 
         String strSchema = dataMap.getString(SPATAILSCHEMA);
@@ -246,6 +250,16 @@
         _convertFile = convertFile;
     }
 
+    public String getConvertElementIn()
+    {
+        return _convertElementIn;
+    }
+
+    public void setConvertElementIn(String convertElementIn)
+    {
+        _convertElementIn = convertElementIn;
+    }
+
     public boolean checkConvertDB()
     {
         return _convertDB != null && !_convertDB.equalsIgnoreCase("false") &&
@@ -258,6 +272,12 @@
                 !_convertFile.equalsIgnoreCase("no") && !_convertFile.equalsIgnoreCase("0");
     }
 
+    public boolean checkConvertElementIn()
+    {
+        return _convertElementIn != null && !_convertElementIn.equalsIgnoreCase("false") &&
+                !_convertElementIn.equalsIgnoreCase("no") && !_convertElementIn.equalsIgnoreCase("0");
+    }
+
     public String getElementLogging()
     {
         return _elementLogging;
diff --git a/xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/jobs/FeatureDgnConvertJobContext.java b/xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/jobs/FeatureDgnConvertJobContext.java
new file mode 100644
index 0000000..1796bb8
--- /dev/null
+++ b/xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/jobs/FeatureDgnConvertJobContext.java
@@ -0,0 +1,280 @@
+package com.ximple.eofms.jobs;
+
+import java.io.File;
+import java.io.IOException;
+import java.io.UnsupportedEncodingException;
+import java.net.MalformedURLException;
+import java.net.URL;
+import java.nio.charset.Charset;
+import java.util.ArrayList;
+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 com.ximple.eofms.filter.AbstractFLinkageDispatchableFilter;
+import com.ximple.eofms.filter.ElementDispatcher;
+import com.ximple.io.dgn7.Element;
+import com.ximple.io.dgn7.FrammeAttributeData;
+import com.ximple.io.dgn7.UserAttributeData;
+import com.ximple.io.dgn7.ComplexElement;
+
+public class FeatureDgnConvertJobContext extends AbstractDgnFileJobContext
+{
+    static final Log logger = LogFactory.getLog(IndexDgnConvertJobContext.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, FeatureWriter> featuresWriterContext = new HashMap<String, FeatureWriter>();
+
+    private PessimisticMapWrapper txFeaturesContext;
+
+    private ElementDispatcher elementDispatcher;
+    private String _filterConfig;
+
+    public FeatureDgnConvertJobContext(String dataPath, String filterConfig)
+    {
+        super(dataPath);
+        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);
+            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;
+            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) throws IllegalAttributeException, SchemaException
+    {
+        assert elementDispatcher != null;
+
+        if (element == null)
+        {
+            logger.warn("Unknown Element:" + null);
+            return;
+        }
+
+        // �P�_�O�_�ũM����
+        Feature feature = elementDispatcher.execute(element);
+        if (feature == null)
+        {
+            FrammeAttributeData linkage =
+                    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)
+            {
+                ComplexElement complex = (ComplexElement) element;
+                logger.warn("----Complex Element size=" + complex.size());
+            }
+
+            return;
+        }
+
+        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 commitTransaction()
+    {
+        if (!txFeaturesContext.isEmpty())
+        {
+            logger.debug("Transaction size = " + txFeaturesContext.size());
+            //txFeaturesContext.commitTransaction();
+        } else
+        {
+            logger.debug("Transaction is empty.");
+        }
+
+        if (!featuresContext.isEmpty())
+        {
+            updateDataStore();
+        }
+    }
+
+    public void rollbackTransaction()
+    {
+        //txFeaturesContext.rollbackTransaction();
+        if (!featuresContext.isEmpty())
+        {
+            updateDataStore();
+        }
+    }
+
+    private void updateDataStore()
+    {
+        Iterator it = featuresContext.keySet().iterator();
+
+        try
+        {
+            while (it.hasNext())
+            {
+                FeatureType featureType = (FeatureType) 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()))
+                {
+                    writer = featuresWriterContext.get(featureType.getTypeName());
+                } 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.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"));
+                        writer = shapefileDataStore.getFeatureWriterAppend(featureType.getTypeName(),
+                                Transaction.AUTO_COMMIT);
+                    }
+                    featuresWriterContext.put(featureType.getTypeName(), writer);
+                }
+
+                ArrayList<Feature> features = 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 shapefile:" + sfile.toURI());
+            }
+            featuresContext.clear();
+        } catch (MalformedURLException e)
+        {
+            logger.error(e.getMessage(), e);
+        } catch (IllegalAttributeException e)
+        {
+            logger.error(e.getMessage(), e);
+        } catch (IOException e)
+        {
+            logger.error(e.getMessage(), e);
+        }
+    }
+
+    public String getDataOutPath()
+    {
+        if (dataOut == null)
+        {
+            File outPath = new File(getDataPath(), SHPOUTPATH);
+            if (!outPath.exists())
+            {
+                outPath.mkdir();
+            } else if (!outPath.isDirectory())
+            {
+                outPath.mkdir();
+            }
+            dataOut = outPath.toString();
+        }
+        return dataOut;
+    }
+
+    public void closeFeatureWriter() throws IOException {
+
+        for (FeatureWriter featureWriter : this.featuresWriterContext.values())
+        {
+            featureWriter.close();
+        }
+
+        this.featuresWriterContext.clear();
+    }
+
+    protected FrammeAttributeData getFeatureLinkage(Element element)
+    {
+        if (!element.hasUserAttributeData())
+            return null;
+
+        List<UserAttributeData> usrDatas = element.getUserAttributeData();
+        for (UserAttributeData anUsrData : usrDatas)
+        {
+            if (anUsrData instanceof FrammeAttributeData)
+            {
+                return (FrammeAttributeData) anUsrData;
+            }
+        }
+        return null;
+    }
+}
+
diff --git a/xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/jobs/GeneralDgnConvertJobContext.java b/xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/jobs/GeneralDgnConvertJobContext.java
index 93e587c..7783243 100644
--- a/xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/jobs/GeneralDgnConvertJobContext.java
+++ b/xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/jobs/GeneralDgnConvertJobContext.java
@@ -165,10 +165,19 @@
                     ShapefileDataStore shapefileDataStore = new ShapefileDataStore(sfile.toURI().toURL(),
                             true, Charset.forName("UTF-8"));
                     */
-                    ShapefileDataStore shapefileDataStore = new IndexedShapefileDataStore(sfile.toURI().toURL(),
-                            null, true, true, IndexedShapefileDataStore.TREE_QIX, Charset.forName("UTF-8"));
-                    shapefileDataStore.createSchema(featureType);
-                    writer = shapefileDataStore.getFeatureWriter(featureType.getTypeName(), Transaction.AUTO_COMMIT);
+                    if (!sfile.exists())
+                    {
+                        ShapefileDataStore shapefileDataStore = new IndexedShapefileDataStore(sfile.toURI().toURL(),
+                                null, true, true, IndexedShapefileDataStore.TREE_QIX, Charset.forName("UTF-8"));
+                        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"));
+                        writer = shapefileDataStore.getFeatureWriterAppend(featureType.getTypeName(),
+                                Transaction.AUTO_COMMIT);
+                    }
                     featuresWriterContext.put(featureType.getTypeName(), writer);
                 }
 
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 2e91dda..bc01df6 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
@@ -110,6 +110,7 @@
                     jobContext.setShapeData(_dataPath);
                     jobContext.setConvertDB(_convertDB);
                     jobContext.setConvertFile(_convertFile);
+                    jobContext.setConvertElementIn(_convertElementIn);
                     jobContext.setElementLogging(checkElementLogging());
                     jobContext.setExecutionContext(context);
 
@@ -132,6 +133,12 @@
                 convertIndexDesignFile(context);
                 logger.info("-- step:convertOtherDesignFile --");
                 convertOtherDesignFile(context);
+            }
+
+            if (checkConvertElementIn())
+            {
+                logger.info("-- step:convertFeatureDesignFile --");
+                convertFeatureDesignFile(context);
             }
         } catch (SQLException e)
         {
@@ -462,6 +469,7 @@
      * �����ഫ���޹��ɪ��u�@
      *
      * @param context �u�@��������
+     * @throws org.quartz.JobExecutionException exception
      */
     private void convertIndexDesignFile(JobExecutionContext context) throws JobExecutionException
     {
@@ -589,20 +597,21 @@
     /**
      * �����ഫ��L�]�p���ɪ��u�@
      *
-     * @param context
+     * @param context jobContext
+     * @throws org.quartz.JobExecutionException exception
      */
     private void convertOtherDesignFile(JobExecutionContext context) throws JobExecutionException
     {
         File otherDir = new File(getDataPath(), "other");
         if (!otherDir.exists())
         {
-            logger.info("index dir=" + otherDir + " not exist.");
+            logger.info("other dir=" + otherDir + " not exist.");
             return;
         }
 
         if (!otherDir.isDirectory())
         {
-            logger.info("index dir=" + otherDir + " is not a directory.");
+            logger.info("other dir=" + otherDir + " is not a directory.");
         }
 
         File[] dgnFiles = otherDir.listFiles(new FilenameFilter()
@@ -705,7 +714,8 @@
         logger.debug("ElementRecord Count=" + count);
     }
 
-    private void processOtherElement(Element element, GeneralDgnConvertJobContext convertContext) throws IllegalAttributeException, SchemaException
+    private void processOtherElement(Element element, GeneralDgnConvertJobContext convertContext)
+            throws IllegalAttributeException, SchemaException
     {
         convertContext.putFeatureCollection(element);
     }
@@ -762,4 +772,124 @@
             }
         }
     }
+
+    private void convertFeatureDesignFile(JobExecutionContext context) throws JobExecutionException
+    {
+        File elminDir = new File(getDataPath(), "elmin");
+        if (!elminDir.exists())
+        {
+            logger.info("elmin dir=" + elminDir + " not exist.");
+            return;
+        }
+
+        if (!elminDir.isDirectory())
+        {
+            logger.info("elmin dir=" + elminDir + " is not a directory.");
+        }
+
+        File[] dgnFiles = elminDir.listFiles(new FilenameFilter()
+        {
+            public boolean accept(File dir, String name)
+            {
+                return name.toLowerCase().endsWith(".dgn");
+            }
+        });
+
+        for (File dgnFile : dgnFiles)
+        {
+            FeatureDgnConvertJobContext convertContext = new FeatureDgnConvertJobContext(getDataPath(), _filterPath);
+            logger.info("--- start dgnfile-" + dgnFile.toString() + " ---");
+            try
+            {
+                convertContext.setExecutionContext(context);
+                String dgnPaths[] = StringUtils.splitToArray(dgnFile.toString(), File.separator);
+                convertContext.setFilename(dgnPaths[dgnPaths.length - 1]);
+
+                FileInputStream fs = new FileInputStream(dgnFile);
+                FileChannel fc = fs.getChannel();
+                Dgn7fileReader reader = new Dgn7fileReader(fc, new Lock());
+                convertContext.setReader(reader);
+
+                scanFeatureDgnElement(convertContext);
+
+                convertContext.commitTransaction();
+                convertContext.closeFeatureWriter();
+                System.gc();
+            } catch (FileNotFoundException e)
+            {
+                convertContext.rollbackTransaction();
+                logger.warn(e.getMessage(), e);
+                throw new JobExecutionException(e.getMessage(), e);
+            } catch (Dgn7fileException e)
+            {
+                convertContext.rollbackTransaction();
+                logger.warn(e.getMessage(), e);
+                throw new JobExecutionException(e.getMessage(), e);
+            } catch (IOException e)
+            {
+                convertContext.rollbackTransaction();
+                logger.warn(e.getMessage(), e);
+                throw new JobExecutionException(e.getMessage(), e);
+            } catch (IllegalAttributeException e)
+            {
+                convertContext.rollbackTransaction();
+                logger.warn(e.getMessage(), e);
+                throw new JobExecutionException(e.getMessage(), e);
+            } catch (SchemaException e)
+            {
+                convertContext.rollbackTransaction();
+                logger.warn(e.getMessage(), e);
+                throw new JobExecutionException(e.getMessage(), e);
+            }
+        }
+    }
+
+    public void scanFeatureDgnElement(FeatureDgnConvertJobContext convertContext)
+            throws Dgn7fileException, IOException, IllegalAttributeException, SchemaException
+    {
+        Dgn7fileReader reader = convertContext.getReader();
+        int count = 0;
+        Element lastComplex = null;
+        while (reader.hasNext())
+        {
+            Dgn7fileReader.Record record = reader.nextElement();
+            if (record.element() != null)
+            {
+                Element element = (Element) record.element();
+                ElementType type = element.getElementType();
+
+                if ((!type.isComplexElement()) && (!element.isComponentElement()))
+                {
+                    lastComplex = null;
+
+                    processFeatureElement(element, convertContext);
+                } else if (element.isComponentElement())
+                {
+                    if (lastComplex != null)
+                    {
+                        ((ComplexElement) lastComplex).add(element);
+                    }
+                } else if (type.isComplexElement())
+                {
+                    if (lastComplex == null)
+                    {
+                        lastComplex = element;
+                    } else
+                    {
+                        processFeatureElement(element, convertContext);
+                        lastComplex = element;
+                    }
+                }
+            }
+            count++;
+        }
+
+        logger.debug("ElementRecord Count=" + count);
+    }
+
+    private void processFeatureElement(Element element, FeatureDgnConvertJobContext convertContext)
+            throws IllegalAttributeException, SchemaException
+    {
+        convertContext.putFeatureCollection(element);
+    }
 }
diff --git a/xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/jobs/OracleConvertJobContext.java b/xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/jobs/OracleConvertJobContext.java
index 1be632b..0ede50b 100644
--- a/xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/jobs/OracleConvertJobContext.java
+++ b/xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/jobs/OracleConvertJobContext.java
@@ -37,6 +37,7 @@
 import com.ximple.eofms.filter.ElementDispatcher;
 import com.ximple.io.dgn7.Element;
 import com.ximple.io.dgn7.FrammeAttributeData;
+import com.ximple.io.dgn7.ComplexElement;
 
 
 public class OracleConvertJobContext extends AbstractOracleJobContext
@@ -74,6 +75,7 @@
     private String _convertFile = null;
     private String currentSchema = null;
     private boolean schemaChanged = false;
+    private String _convertElementIn = null;
 
     public OracleConvertJobContext(String filterConfig)
     {
@@ -133,14 +135,25 @@
         Feature feature = elementDispatcher.execute(element);
         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" : (linkage.getFsc() + "|" + linkage.getComponentID())));
 
-            if (getElementLogging())
+            if (element instanceof ComplexElement)
+            {
+                ComplexElement complex = (ComplexElement) element;
+                logger.warn("----Complex Element size=" + complex.size() + ":" +
+                        (linkage == null ? "NULL" : (linkage.getUfid())));
+                isEmptySize = true;
+            }
+
+            if (getElementLogging() && (!isEmptySize))
+            {
                 getElementLogger().logElement(element, getCurrentSchema());
+            }
             return;
         }
 
@@ -208,10 +221,19 @@
                     ShapefileDataStore shapefileDataStore = new ShapefileDataStore(sfile.toURI().toURL(),
                             true, Charset.forName("UTF-8"));
                     */
-                    ShapefileDataStore shapefileDataStore = new IndexedShapefileDataStore(sfile.toURI().toURL(),
-                            null, true, true, IndexedShapefileDataStore.TREE_QIX, Charset.forName("UTF-8"));
-                    shapefileDataStore.createSchema(featureType);
-                    writer = shapefileDataStore.getFeatureWriter(featureType.getTypeName(), Transaction.AUTO_COMMIT);
+                    if (!sfile.exists())
+                    {
+                        ShapefileDataStore shapefileDataStore = new IndexedShapefileDataStore(sfile.toURI().toURL(),
+                                null, true, true, IndexedShapefileDataStore.TREE_QIX, Charset.forName("UTF-8"));
+                        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"));
+                        writer = shapefileDataStore.getFeatureWriterAppend(featureType.getTypeName(),
+                                Transaction.AUTO_COMMIT);
+                    }
                     featuresWriterContext.put(featureType.getTypeName(), writer);
                 }
 
@@ -317,4 +339,9 @@
         this.currentSchema = querySchema;
         this.schemaChanged = true;
     }
+
+    public void setConvertElementIn(String convertElementIn)
+    {
+        _convertElementIn = convertElementIn;
+    }
 }
diff --git a/xdgnjobs/ximple-spatialjob/src/main/resources/conf/DefaultConvertShpFilter.xml b/xdgnjobs/ximple-spatialjob/src/main/resources/conf/DefaultConvertShpFilter.xml
index 9b584fa..7e23b2c 100644
--- a/xdgnjobs/ximple-spatialjob/src/main/resources/conf/DefaultConvertShpFilter.xml
+++ b/xdgnjobs/ximple-spatialjob/src/main/resources/conf/DefaultConvertShpFilter.xml
@@ -283,6 +283,7 @@
     <description>�q�������u</description>
     <elementCriterion>
       <elementType>4</elementType>
+      <elementType>17</elementType>
     </elementCriterion>
     <LineTextCreateStrategy/>
   </TypeCompFilter>
@@ -1196,6 +1197,7 @@
     <description>�޸�</description>
     <elementCriterion>
       <elementType>12</elementType>
+      <elementType>16</elementType>
     </elementCriterion>
     <LineCreateStrategy/>
   </TypeCompFilter>

--
Gitblit v0.0.0-SNAPSHOT