From 10445847ed1bfa5755127e828b603a3cdd49c5e3 Mon Sep 17 00:00:00 2001
From: ?? ? <ulysseskao@ximple.com.tw>
Date: Wed, 07 May 2008 12:58:22 +0800
Subject: [PATCH] update for EOFM-75

---
 xdgnjobs/ximple-jobcarrier/src/main/resources/quartz_jobs.xml                                       |    2 
 xdgnjobs/ximple-dgnio/src/main/java/com/ximple/io/dgn7/ShapeElement.java                            |   18 ++
 xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/jobs/AbstractOracleDatabaseJob.java       |   32 +++++
 xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/jobs/IndexDgnConvertJobContext.java       |    4 
 xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/jobs/OracleConvertJobContext.java         |    4 
 xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/jobs/OracleConvertDgn2ShpJob.java         |  145 +++++++++++++++++------
 xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/jobs/GeneralDgnConvertJobContext.java     |  131 ++++++++++++++++++---
 xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/jobs/TWD97GeometryConverterDecorator.java |    1 
 8 files changed, 266 insertions(+), 71 deletions(-)

diff --git a/xdgnjobs/ximple-dgnio/src/main/java/com/ximple/io/dgn7/ShapeElement.java b/xdgnjobs/ximple-dgnio/src/main/java/com/ximple/io/dgn7/ShapeElement.java
index 146f94f..16b930c 100644
--- a/xdgnjobs/ximple-dgnio/src/main/java/com/ximple/io/dgn7/ShapeElement.java
+++ b/xdgnjobs/ximple-dgnio/src/main/java/com/ximple/io/dgn7/ShapeElement.java
@@ -2,6 +2,9 @@
 
 //~--- non-JDK imports --------------------------------------------------------
 
+import org.apache.log4j.Logger;
+
+import com.vividsolutions.jts.geom.Coordinate;
 import com.vividsolutions.jts.geom.Geometry;
 import com.vividsolutions.jts.geom.GeometryFactory;
 import com.vividsolutions.jts.geom.LinearRing;
@@ -15,6 +18,8 @@
  */
 public class ShapeElement extends LineStringElement implements GeometryConverter
 {
+    static final Logger logger = Logger.getLogger(ShapeElement.class);
+
     public ShapeElement(short[] raw)
     {
         super(raw);
@@ -22,10 +27,15 @@
 
     public Geometry toGeometry(GeometryFactory factory)
     {
-        LinearRing ring = factory.createLinearRing(this.getVertices());
-        return factory.createPolygon(ring, null);
-
-        // return factory.createPolygon(ring, null);
+        try
+        {
+            LinearRing ring = factory.createLinearRing(this.getVertices());
+            return factory.createPolygon(ring, null);
+        } catch (IllegalArgumentException e)
+        {
+            logger.warn(e.getMessage(), e);
+            return null;
+        }
     }
 
     public static class ElementHandler extends Element.ElementHandler
diff --git a/xdgnjobs/ximple-jobcarrier/src/main/resources/quartz_jobs.xml b/xdgnjobs/ximple-jobcarrier/src/main/resources/quartz_jobs.xml
index 53991c5..4a2345d 100644
--- a/xdgnjobs/ximple-jobcarrier/src/main/resources/quartz_jobs.xml
+++ b/xdgnjobs/ximple-jobcarrier/src/main/resources/quartz_jobs.xml
@@ -46,7 +46,7 @@
         </entry>
         <entry>
           <key>CONVERTDB</key>
-          <value>true</value>
+          <value>false</value>
         </entry>
         <entry>
           <key>CONVERTFILE</key>
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 67c898b..b8b0a28 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
@@ -211,4 +211,36 @@
     {
         return _testCount;
     }
+
+    public String getConvertDB()
+    {
+        return _convertDB;
+    }
+
+    public void setConvertDB(String convertDB)
+    {
+        _convertDB = convertDB;
+    }
+
+    public String getConvertFile()
+    {
+        return _convertFile;
+    }
+
+    public void setConvertFile(String convertFile)
+    {
+        _convertFile = convertFile;
+    }
+
+    public boolean checkConvertDB()
+    {
+        return _convertDB != null && !_convertDB.equalsIgnoreCase("false") &&
+                !_convertDB.equalsIgnoreCase("no") && !_convertDB.equalsIgnoreCase("0");
+    }
+
+    public boolean checkConvertFile()
+    {
+        return _convertFile != null && !_convertFile.equalsIgnoreCase("false") &&
+                !_convertFile.equalsIgnoreCase("no") && !_convertFile.equalsIgnoreCase("0");
+    }
 }
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 715b4f2..0e1fc7a 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
@@ -29,10 +29,12 @@
 import com.vividsolutions.jts.geom.GeometryFactory;
 
 import com.ximple.eofms.util.DefaultColorTable;
+import com.ximple.io.dgn7.ArcElement;
 import com.ximple.io.dgn7.Element;
 import com.ximple.io.dgn7.FrammeAttributeData;
 import com.ximple.io.dgn7.LineElement;
 import com.ximple.io.dgn7.LineStringElement;
+import com.ximple.io.dgn7.ShapeElement;
 import com.ximple.io.dgn7.TextElement;
 import com.ximple.io.dgn7.UserAttributeData;
 
@@ -65,13 +67,22 @@
     public void putFeatureCollection(Element element) throws IllegalAttributeException, SchemaException
     {
         FeatureType ft = lookupFeatureType(element);
-        if (ft == null)
+        if (ft != null)
         {
             Feature feature = createFeature(ft, element);
             if (feature == null)
             {
-                logger.info("cannot craete feature." + element.toString() + "'" +
-                        ((TextElement) element).getText() + "'");
+                if (element instanceof TextElement)
+                    logger.info("cannot craete feature." + element.toString() + "'" +
+                            ((TextElement) element).getText() + "'");
+                else if (element instanceof ShapeElement)
+                    logger.info("cannot craete feature." + element.toString() + "'" +
+                            ((ShapeElement) element).getVerticeSize() + "'" +
+                            ((ShapeElement) element).getStartPoint());
+                else if (element instanceof LineStringElement)
+                    logger.info("cannot craete feature." + element.toString() + "'" +
+                            ((LineStringElement) element).getVerticeSize() + "'" +
+                            ((LineStringElement) element).getStartPoint());
                 return;
             }
 
@@ -126,7 +137,7 @@
             while (it.hasNext())
             {
                 FeatureType featureType = (FeatureType) it.next();
-                File sfile = new File(getDataOutPath() + "\\" + featureType.getTypeName());
+                File sfile = new File(getDataOutPath() + File.separator + featureType.getTypeName());
                 logger.debug("Begin Save shapefile:" + sfile.toURI());
 
                 FeatureWriter writer;
@@ -180,7 +191,7 @@
             {
                 outPath.mkdir();
             }
-            dataOut = getDataPath() + SHPOUTPATH;
+            dataOut = outPath.toString();
         }
         return dataOut;
     }
@@ -215,6 +226,19 @@
         return typeBuilder.getFeatureType();
     }
 
+    public FeatureType createArcFeatureElement(String featureName) throws SchemaException
+    {
+        if (typeBuilder == null)
+        {
+            typeBuilder = FeatureTypeBuilder.newInstance(featureName);
+            typeBuilder.addType(AttributeTypeFactory.newAttributeType("GEOM", Geometry.class));
+            typeBuilder.addType(AttributeTypeFactory.newAttributeType("SYMCOLOR", String.class));
+            typeBuilder.addType(AttributeTypeFactory.newAttributeType("SYMWEIGHT", Integer.class));
+            typeBuilder.addType(AttributeTypeFactory.newAttributeType("SYMSTYLE", Integer.class));
+        }
+        return typeBuilder.getFeatureType();
+    }
+
     public Feature createFeature(FeatureType featureType, Element element) throws IllegalAttributeException
     {
         DefaultColorTable colorTable = (DefaultColorTable) DefaultColorTable.getInstance();
@@ -222,17 +246,42 @@
         {
             TextElement textElement = (TextElement) element;
             convertDecorator.setConverter(textElement);
-            Feature feature = featureType.create(new Object[]{
-                    convertDecorator.toGeometry(geometryFactory),
-                    colorTable.getColorCode(textElement.getColorIndex()),
-                    textElement.getFontIndex(),
-                    textElement.getJustification(),
-                    textElement.getTextHeight(),
-                    textElement.getTextWidth(),
-                    textElement.getRotationAngle(),
-                    textElement.getText()
-            });
-            return feature;
+            Geometry geom = convertDecorator.toGeometry(geometryFactory);
+            if (geom != null)
+            {
+                return featureType.create(new Object[]{
+                        geom,
+                        colorTable.getColorCode(textElement.getColorIndex()),
+                        textElement.getFontIndex(),
+                        textElement.getJustification(),
+                        textElement.getTextHeight(),
+                        textElement.getTextWidth(),
+                        textElement.getRotationAngle(),
+                        textElement.getText()
+                });
+            } else
+            {
+                logger.info("geometry is null." + element.toString());
+            }
+            return null;
+        } else if (element instanceof ShapeElement)
+        {
+            ShapeElement shapeElement = (ShapeElement) element;
+            convertDecorator.setConverter(shapeElement);
+            Geometry geom = convertDecorator.toGeometry(geometryFactory);
+            if (geom != null)
+            {
+                return featureType.create(new Object[]{
+                        geom,
+                        colorTable.getColorCode(shapeElement.getColorIndex()),
+                        shapeElement.getWeight(),
+                        shapeElement.getLineStyle()
+                });
+            } else
+            {
+                logger.info("geometry is null." + element.toString());
+            }
+            return null;
         } else if (element instanceof LineStringElement)
         {
             LineStringElement linestring = (LineStringElement) element;
@@ -248,13 +297,30 @@
         {
             LineElement line = (LineElement) element;
             convertDecorator.setConverter(line);
-            Feature feature = featureType.create(new Object[]{
-                    convertDecorator.toGeometry(geometryFactory),
-                    colorTable.getColorCode(line.getColorIndex()),
-                    line.getWeight(),
-                    line.getLineStyle()
-            });
-            return feature;
+            Geometry geom = convertDecorator.toGeometry(geometryFactory);
+            if (geom != null)
+                return featureType.create(new Object[]{
+                        geom,
+                        colorTable.getColorCode(line.getColorIndex()),
+                        line.getWeight(),
+                        line.getLineStyle()
+                });
+            return null;
+        /*
+        } else if (element instanceof ArcElement)
+        {
+            ArcElement arcElement = (ArcElement) element;
+            convertDecorator.setConverter(arcElement);
+            Geometry geom = convertDecorator.toGeometry(geometryFactory);
+            if (geom != null)
+                return featureType.create(new Object[]{
+                        geom,
+                        colorTable.getColorCode(arcElement.getColorIndex()),
+                        arcElement.getWeight(),
+                        arcElement.getLineStyle()
+                });
+            return null;
+        */
         }
         return null;
     }
@@ -273,6 +339,7 @@
         }
         return featureBaseName;
     }
+
     private FeatureType lookupFeatureType(Element element) throws SchemaException, IllegalAttributeException
     {
         String typeName;
@@ -282,6 +349,14 @@
             if (!featureTypes.containsKey(typeName))
             {
                 featureTypes.put(typeName, createPointFeatureElement(typeName));
+            }
+            return featureTypes.get(typeName);
+        } else if (element instanceof ShapeElement)
+        {
+            typeName = getFeatureBaseName() + "R";
+            if (!featureTypes.containsKey(typeName))
+            {
+                featureTypes.put(typeName, createLineFeatureElement(typeName));
             }
             return featureTypes.get(typeName);
         } else if (element instanceof LineStringElement)
@@ -300,6 +375,16 @@
                 featureTypes.put(typeName, createLineFeatureElement(typeName));
             }
             return featureTypes.get(typeName);
+        /*
+        } else if (element instanceof ArcElement)
+        {
+            typeName = getFeatureBaseName() + "A";
+            if (!featureTypes.containsKey(typeName))
+            {
+                featureTypes.put(typeName, createArcFeatureElement(typeName));
+            }
+            return featureTypes.get(typeName);
+        */
         }
 
         return null;
diff --git a/xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/jobs/IndexDgnConvertJobContext.java b/xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/jobs/IndexDgnConvertJobContext.java
index 27b1a9d..77e3c23 100644
--- a/xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/jobs/IndexDgnConvertJobContext.java
+++ b/xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/jobs/IndexDgnConvertJobContext.java
@@ -121,7 +121,7 @@
             while (it.hasNext())
             {
                 FeatureType featureType = (FeatureType) it.next();
-                File sfile = new File(getDataOutPath() + "\\" + featureType.getTypeName());
+                File sfile = new File(getDataOutPath() + File.separator + featureType.getTypeName());
                 logger.debug("Begin Save shapefile:" + sfile.toURI());
 
                 FeatureWriter writer;
@@ -176,7 +176,7 @@
             {
                 outPath.mkdir();
             }
-            dataOut = getDataPath() + SHPOUTPATH;
+            dataOut = outPath.toString();
         }
         return dataOut;
     }
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 bfeefe4..9a33e99 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
@@ -95,31 +95,42 @@
 
         try
         {
+            logger.info("-- step:clearOutputDirectory --");
+            clearOutputDirectory();
             boolean bFirst = true;
-            for (String orgSchema : _orgSchema)
+            if (checkConvertDB())
             {
-                OracleConvertJobContext jobContext = (OracleConvertJobContext) prepareJobContext(_filterPath);
-                jobContext.setConnectionInfo(_oracleHost, _oraclePort, _oracleInstance);
-                jobContext.setLogin(_username, _password);
-                jobContext.setShapeData(_dataPath);
-                jobContext.setConvertDB(_convertDB);
-                jobContext.setConvertFile(_convertFile);
-                jobContext.setExecutionContext(context);
+                logger.info("-- step:convertOracleDB --");
+                for (String orgSchema : _orgSchema)
+                {
+                    OracleConvertJobContext jobContext = (OracleConvertJobContext) prepareJobContext(_filterPath);
+                    jobContext.setConnectionInfo(_oracleHost, _oraclePort, _oracleInstance);
+                    jobContext.setLogin(_username, _password);
+                    jobContext.setShapeData(_dataPath);
+                    jobContext.setConvertDB(_convertDB);
+                    jobContext.setConvertFile(_convertFile);
+                    jobContext.setExecutionContext(context);
 
-                if (bFirst)
-                    copyConnectivity(jobContext);
-                else
-                    bFirst = false;
+                    if (bFirst)
+                        copyConnectivity(jobContext);
+                    else
+                        bFirst = false;
 
-                logger.info("----- start schema:" + orgSchema + " -----");
-                exetcuteConvert(jobContext, orgSchema, _dataPath);
+                    logger.info("----- start schema:" + orgSchema + " -----");
+                    exetcuteConvert(jobContext, orgSchema, _dataPath);
 
-                //close all open filewriter instance
-                jobContext.closeFeatureWrite();
+                    //close all open filewriter instance
+                    jobContext.closeFeatureWrite();
+                }
             }
 
-            convertIndexDesignFile(context);
-            convertOtherDesignFile(context);
+            if (checkConvertFile())
+            {
+                logger.info("-- step:convertIndexDesignFile --");
+                convertIndexDesignFile(context);
+                logger.info("-- step:convertOtherDesignFile --");
+                convertOtherDesignFile(context);
+            }
         } catch (SQLException e)
         {
             logger.warn(e.getMessage(), e);
@@ -129,10 +140,12 @@
             logger.warn(ex.getMessage(), ex);
             throw new JobExecutionException("IO error. " + ex.getMessage(), ex);
         }
+        logger.info(jobName + " end at " + new Date());
     }
 
     /**
      * Connectivity�ƻs�@�Ӫ����A�b�d�߹q�y��V�ɥΨӤ��OMS��Ʈw���q���s����(Connectivity)
+     *
      * @param jobContext
      * @throws SQLException
      */
@@ -219,25 +232,25 @@
         {
             rs = stmt.executeQuery(fetchStmt);
 
-        while (rs.next())
-        {
-            int size = rs.getMetaData().getColumnCount();
-            Object[] values = new Object[size];
-
-            for (int i = 0; i < size; i++)
+            while (rs.next())
             {
-                values[i] = rs.getObject(i + 1);
+                int size = rs.getMetaData().getColumnCount();
+                Object[] values = new Object[size];
+
+                for (int i = 0; i < size; i++)
+                {
+                    values[i] = rs.getObject(i + 1);
+                }
+
+                Integer key = ((BigDecimal) values[0]).intValue();
+                String name = (String) values[1];
+
+                Pair pair = (Pair) orderedMap.get(key);
+                if (pair == null)
+                    orderedMap.put(key, new Pair(name, null));
+                else
+                    pair.first = name;
             }
-
-            Integer key = ((BigDecimal) values[0]).intValue();
-            String name = (String) values[1];
-
-            Pair pair = (Pair) orderedMap.get(key);
-            if (pair == null)
-                orderedMap.put(key, new Pair(name, null));
-            else
-                pair.first = name;
-        }
         } catch (SQLException e)
         {
             logger.error(e.toString(), e);
@@ -444,6 +457,7 @@
 
     /**
      * �����ഫ���޹��ɪ��u�@
+     *
      * @param context �u�@��������
      */
     private void convertIndexDesignFile(JobExecutionContext context) throws JobExecutionException
@@ -471,10 +485,11 @@
         for (File dgnFile : dgnFiles)
         {
             IndexDgnConvertJobContext convertContext = new IndexDgnConvertJobContext(getDataPath());
+            logger.debug("--- start dgnfile-" + dgnFile.toString() + " ---");
             try
             {
                 convertContext.setExecutionContext(context);
-                String dgnPaths[] = StringUtils.splitToArray(dgnFile.toString(), File.pathSeparator);
+                String dgnPaths[] = StringUtils.splitToArray(dgnFile.toString(), File.separator);
                 convertContext.setFilename(dgnPaths[dgnPaths.length - 1]);
 
                 FileInputStream fs = new FileInputStream(dgnFile);
@@ -485,6 +500,7 @@
                 scanIndexDgnElement(convertContext);
 
                 convertContext.commitTransaction();
+                System.gc();
             } catch (FileNotFoundException e)
             {
                 convertContext.rollbackTransaction();
@@ -568,6 +584,7 @@
 
     /**
      * �����ഫ��L�]�p���ɪ��u�@
+     *
      * @param context
      */
     private void convertOtherDesignFile(JobExecutionContext context) throws JobExecutionException
@@ -595,10 +612,11 @@
         for (File dgnFile : dgnFiles)
         {
             GeneralDgnConvertJobContext convertContext = new GeneralDgnConvertJobContext(getDataPath());
+            logger.info("--- start dgnfile-" + dgnFile.toString() + " ---");
             try
             {
                 convertContext.setExecutionContext(context);
-                String dgnPaths[] = StringUtils.splitToArray(dgnFile.toString(), File.pathSeparator);
+                String dgnPaths[] = StringUtils.splitToArray(dgnFile.toString(), File.separator);
                 convertContext.setFilename(dgnPaths[dgnPaths.length - 1]);
 
                 FileInputStream fs = new FileInputStream(dgnFile);
@@ -683,9 +701,58 @@
 
     private void processOtherElement(Element element, GeneralDgnConvertJobContext convertContext) throws IllegalAttributeException, SchemaException
     {
-        if (element instanceof TextElement)
+        convertContext.putFeatureCollection(element);
+    }
+
+    private void clearOutputDirectory()
+    {
+        File outDataPath = new File(getDataPath(), OracleConvertJobContext.SHPOUTPATH);
+        if (outDataPath.exists() && outDataPath.isDirectory())
         {
-            convertContext.putFeatureCollection(element);
+            deleteFilesInPath(outDataPath);
+        }
+        outDataPath = new File(getDataPath(), IndexDgnConvertJobContext.SHPOUTPATH);
+        if (outDataPath.exists() && outDataPath.isDirectory())
+        {
+            deleteFilesInPath(outDataPath);
+        }
+        outDataPath = new File(getDataPath(), GeneralDgnConvertJobContext.SHPOUTPATH);
+        if (outDataPath.exists() && outDataPath.isDirectory())
+        {
+            deleteFilesInPath(outDataPath);
+        }
+    }
+
+    private void deleteFilesInPath(File outDataPath)
+    {
+        deleteFilesInPath(outDataPath, true);
+    }
+    private void deleteFilesInPath(File outDataPath, boolean removeSubDir)
+    {
+        if (!outDataPath.isDirectory())
+        {
+            return;
+        }
+        File[] files = outDataPath.listFiles();
+        for (File file : files)
+        {
+            if (file.isFile())
+            {
+                if (!file.delete())
+                {
+                    logger.info("Cannot delete file-" + file.toString());
+                }
+            } else if (file.isDirectory())
+            {
+                deleteFilesInPath(file, removeSubDir);
+                if (removeSubDir)
+                {
+                    if (file.delete())
+                    {
+                        logger.info("Cannot delete dir-" + file.toString());
+                    }
+                }
+            }
         }
     }
 }
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 e03f510..8c0b679 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
@@ -42,7 +42,7 @@
     static Log logger = LogFactory.getLog(OracleConvertJobContext.class);
     static final LoggerFacade sLogger = new CommonsLoggingLogger(logger);
 
-    private static final String SHPOUTPATH = "shpout";
+    static final String SHPOUTPATH = "shpout";
 
     static
     {
@@ -183,7 +183,7 @@
             while (it.hasNext())
             {
                 FeatureType featureType = (FeatureType) it.next();
-                File sfile = new File(getDataOutPath() + "\\" + featureType.getTypeName());
+                File sfile = new File(getDataOutPath() + File.separator + featureType.getTypeName());
                 logger.debug("Begin Save shapefile:" + sfile.toURI());
 
                 FeatureWriter writer = null;
diff --git a/xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/jobs/TWD97GeometryConverterDecorator.java b/xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/jobs/TWD97GeometryConverterDecorator.java
index e45d248..cca5810 100644
--- a/xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/jobs/TWD97GeometryConverterDecorator.java
+++ b/xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/jobs/TWD97GeometryConverterDecorator.java
@@ -36,6 +36,7 @@
         coordinatesFilter.reset();
 
         Geometry geom = converter.toGeometry(factory);
+        if (geom == null) return null;
         geom.apply(coordinatesFilter);
         return geom;
     }

--
Gitblit v0.0.0-SNAPSHOT