From 5c0e9634ef20452c9fc66bb14a469e0a05369899 Mon Sep 17 00:00:00 2001
From: ?? ? <ulysseskao@ximple.com.tw>
Date: Fri, 16 May 2008 12:25:44 +0800
Subject: [PATCH] update for EOFM-90

---
 .gitattributes                                                                                  |    1 
 xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/jobs/OracleConvertJobContext.java     |   61 ++++++--
 xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/jobs/OracleConvertDgn2ShpJob.java     |    1 
 xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/jobs/GeneralDgnConvertJobContext.java |    3 
 xdgnjobs/ximple-dgnio/src/main/java/com/ximple/io/dgn7/Element.java                             |    1 
 xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/filter/CreateSymbolStrategy.java      |   14 +
 xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/filter/CreateTextStrategy.java        |   28 ++-
 xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/jobs/OracleElementLogging.java        |  288 +++++++++++++++++++++++++++++++++++++++++
 8 files changed, 367 insertions(+), 30 deletions(-)

diff --git a/.gitattributes b/.gitattributes
index 369280b..0117d12 100644
--- a/.gitattributes
+++ b/.gitattributes
@@ -68,6 +68,7 @@
 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
 xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/jobs/OracleConvertJobContext.java svneol=native#text/plain
+xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/jobs/OracleElementLogging.java svneol=native#text/plain
 xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/jobs/OracleUpgradeBlob2UDTJob.java svneol=native#text/plain
 xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/jobs/OracleUpgradeJobContext.java svneol=native#text/plain
 xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/jobs/TWD97GeometryConverterDecorator.java svneol=native#text/plain
diff --git a/xdgnjobs/ximple-dgnio/src/main/java/com/ximple/io/dgn7/Element.java b/xdgnjobs/ximple-dgnio/src/main/java/com/ximple/io/dgn7/Element.java
index 78c9bee..1a19a06 100644
--- a/xdgnjobs/ximple-dgnio/src/main/java/com/ximple/io/dgn7/Element.java
+++ b/xdgnjobs/ximple-dgnio/src/main/java/com/ximple/io/dgn7/Element.java
@@ -274,6 +274,7 @@
 
         public void write(ByteBuffer buffer, Object element)
         {
+            buffer.put(((Element) element).rawBuffer);
         }
 
         public int getLength(Object element)
diff --git a/xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/filter/CreateSymbolStrategy.java b/xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/filter/CreateSymbolStrategy.java
index 0dff6a6..44cae9d 100644
--- a/xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/filter/CreateSymbolStrategy.java
+++ b/xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/filter/CreateSymbolStrategy.java
@@ -80,11 +80,15 @@
         {
             TextElement txtElement = (TextElement) element;
             double angle = txtElement.getRotationAngle();
-            angle -= 270.0;
-            angle = -angle;
-            angle = ((angle < 0.0) ? (angle + 360.0) : angle);
-            angle = ((angle > 360.0) ? (angle - 360.0) : (angle));
-
+            /*
+            if (angle != 0.0)
+            {
+                angle -= 270.0;
+                angle = -angle;
+                angle = ((angle < 0.0) ? (angle + 360.0) : angle);
+                angle = ((angle > 360.0) ? (angle - 360.0) : (angle));
+            }
+            */
             if (txtElement.getText().length() == 0)
             {
                 logger.info("CreateSymbolStrategy cannot conver " + element.toString() +
diff --git a/xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/filter/CreateTextStrategy.java b/xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/filter/CreateTextStrategy.java
index 2f7c92e..0dd716a 100644
--- a/xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/filter/CreateTextStrategy.java
+++ b/xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/filter/CreateTextStrategy.java
@@ -81,10 +81,15 @@
         {
             TextElement txtElement = (TextElement) element;
             double angle = txtElement.getRotationAngle();
-            angle -= 270.0;
-            angle = -angle;
-            angle = ((angle < 0.0) ? (angle + 360.0) : angle);
-            angle = ((angle > 360.0) ? (angle - 360.0) : (angle));
+            /*
+            if (angle != 0.0)
+            {
+                angle -= 270.0;
+                angle = -angle;
+                angle = ((angle < 0.0) ? (angle + 360.0) : angle);
+                angle = ((angle > 360.0) ? (angle - 360.0) : (angle));
+            }
+            */
             convertDecorator.setConverter(txtElement);
             Feature feature = featureType.create(new Object[]{
                     convertDecorator.toGeometry(geometryFactory),
@@ -106,7 +111,6 @@
         } else if (element instanceof TextNodeElement)
         {
             TextNodeElement nodeElement = (TextNodeElement) element;
-            convertDecorator.setConverter(nodeElement);
             String[] texts = nodeElement.getTextArray();
             StringBuffer sb = new StringBuffer();
             for (String text : texts)
@@ -117,10 +121,16 @@
             }
 
             double angle = nodeElement.getRotationAngle();
-            angle -= 270.0;
-            angle = -angle;
-            angle = ((angle < 0.0) ? (angle + 360.0) : angle);
-            angle = ((angle > 360.0) ? (angle - 360.0) : (angle));
+            /*
+            if (angle != 0.0)
+            {
+                angle -= 270.0;
+                angle = -angle;
+                angle = ((angle < 0.0) ? (angle + 360.0) : angle);
+                angle = ((angle > 360.0) ? (angle - 360.0) : (angle));
+            }
+            */
+            convertDecorator.setConverter(nodeElement);
             Feature feature = featureType.create(new Object[]{
                     convertDecorator.toGeometry(geometryFactory),
                     (int) fLinkage.getFsc(),
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 73c7ac1..798c86e 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
@@ -273,6 +273,7 @@
             TextElement textElement = (TextElement) element;
             convertDecorator.setConverter(textElement);
             Geometry geom = convertDecorator.toGeometry(geometryFactory);
+            double angle = textElement.getRotationAngle();
             if (geom != null)
             {
                 return featureType.create(new Object[]{
@@ -282,7 +283,7 @@
                         textElement.getJustification(),
                         textElement.getTextHeight(),
                         textElement.getTextWidth(),
-                        textElement.getRotationAngle(),
+                        angle,
                         textElement.getText()
                 });
             } else
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 fb26630..46f2df1 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
@@ -171,6 +171,7 @@
         int current = 0;
 
         //jobContext.startTransaction();
+        jobContext.setCurrentSchema(querySchema);
         jobContext.getExecutionContext().put("ConvertDgn2ShpJobProgress", 0);
         for (OrderedMapIterator it = map.orderedMapIterator(); it.hasNext();)
         {
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 fc184f8..ee1cf24 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
@@ -44,6 +44,8 @@
 
     static final String SHPOUTPATH = "shpout";
 
+    private OracleElementLogging elmLogger = null;
+
     static
     {
         try
@@ -68,6 +70,8 @@
     private String dataOut = null;
     private String _convertDB = null;
     private String _convertFile = null;
+    private String currentSchema = null;
+    private boolean schemaChanged = false;
 
     public OracleConvertJobContext(String filterConfig)
     {
@@ -97,7 +101,7 @@
             {
                 // config = new File("conf/DefaultConvertShpFilter.xml");
                 filterURL = this.getClass().getResource("/conf/DefaultConvertShpFilter.xml");
-               // filterURL = this.getClass().getResource("/conf/ConvertShpFilterForLevel.xml");
+                // filterURL = this.getClass().getResource("/conf/ConvertShpFilterForLevel.xml");
             }
             assert filterURL != null;
             return (ElementDispatcher) digester.parse(filterURL);
@@ -133,6 +137,7 @@
                     ":type=" + element.getType() + ":lv=" + element.getLevelIndex() + ":id=" +
                     (linkage == null ? "NULL" : (linkage.getFsc() + "|" + linkage.getComponentID())));
 
+            getElementLogging().logElement(element, getCurrentSchema());
             return;
         }
 
@@ -146,15 +151,15 @@
 
     public void startTransaction()
     {
-       //txFeaturesContext.startTransaction();
+        //txFeaturesContext.startTransaction();
     }
 
     public void commitTransaction()
     {
-       if (!txFeaturesContext.isEmpty())
-       {
+        if (!txFeaturesContext.isEmpty())
+        {
             logger.debug("Transaction size = " + txFeaturesContext.size());
-           //txFeaturesContext.commitTransaction();
+            //txFeaturesContext.commitTransaction();
         } else
         {
             logger.debug("Transaction is empty.");
@@ -164,11 +169,14 @@
         {
             updateDataStore();
         }
+
+        if (this.getElementLogging() != null)
+            this.getElementLogging().flashLogging();
     }
 
     public void rollbackTransaction()
     {
-       //txFeaturesContext.rollbackTransaction();
+        //txFeaturesContext.rollbackTransaction();
         if (!featuresContext.isEmpty())
         {
             updateDataStore();
@@ -188,16 +196,15 @@
                 logger.debug("Begin Save shapefile:" + sfile.toURI());
 
                 FeatureWriter writer = null;
-                if(featuresWriterContext.containsKey(featureType.getTypeName()))
+                if (featuresWriterContext.containsKey(featureType.getTypeName()))
                 {
-                    writer = featuresWriterContext.get(featureType.getTypeName()) ;
-                }
-                else
+                    writer = featuresWriterContext.get(featureType.getTypeName());
+                } else
                 {
-                  ShapefileDataStore shapefileDataStore = new ShapefileDataStore(sfile.toURI().toURL());
-                  shapefileDataStore.createSchema(featureType);
-                  writer = shapefileDataStore.getFeatureWriter(featureType.getTypeName(), Transaction.AUTO_COMMIT);
-                  featuresWriterContext.put(featureType.getTypeName() , writer);
+                    ShapefileDataStore shapefileDataStore = new ShapefileDataStore(sfile.toURI().toURL());
+                    shapefileDataStore.createSchema(featureType);
+                    writer = shapefileDataStore.getFeatureWriter(featureType.getTypeName(), Transaction.AUTO_COMMIT);
+                    featuresWriterContext.put(featureType.getTypeName(), writer);
                 }
 
                 ArrayList features = (ArrayList) featuresContext.get(featureType);
@@ -236,9 +243,11 @@
 
     /**
      * �����]�Ƽg�J��
+     *
      * @throws IOException IO�o�Ϳ��~
      */
-    public void closeFeatureWriter() throws IOException {
+    public void closeFeatureWriter() throws IOException
+    {
 
         for (FeatureWriter featureWriter : this.featuresWriterContext.values())
         {
@@ -250,6 +259,7 @@
 
     /**
      * ���o��ƿ�X���|
+     *
      * @return ���|���r��
      */
     public String getDataOutPath()
@@ -278,4 +288,25 @@
     {
         _convertFile = convertFile;
     }
+
+    private OracleElementLogging getElementLogging()
+    {
+        if (elmLogger == null)
+        {
+            elmLogger = new OracleElementLogging(getOracleConnection());
+            elmLogger.setDataPath(this.getDataPath());
+        }
+        return elmLogger;
+    }
+
+    public String getCurrentSchema()
+    {
+        return currentSchema;
+    }
+
+    public void setCurrentSchema(String querySchema)
+    {
+        this.currentSchema = querySchema;
+        this.schemaChanged = true;
+    }
 }
diff --git a/xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/jobs/OracleElementLogging.java b/xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/jobs/OracleElementLogging.java
new file mode 100644
index 0000000..827f0e0
--- /dev/null
+++ b/xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/jobs/OracleElementLogging.java
@@ -0,0 +1,288 @@
+package com.ximple.eofms.jobs;
+
+import java.io.File;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.nio.ByteBuffer;
+import java.nio.channels.FileChannel;
+import java.sql.Connection;
+import java.sql.ResultSet;
+import java.sql.SQLException;
+import java.sql.Statement;
+import java.sql.Types;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+
+import com.vividsolutions.jts.util.Assert;
+
+import oracle.sql.BLOB;
+
+import com.ximple.eofms.util.PrintfFormat;
+import com.ximple.io.dgn7.ArcElement;
+import com.ximple.io.dgn7.ComplexChainElement;
+import com.ximple.io.dgn7.ComplexShapeElement;
+import com.ximple.io.dgn7.Element;
+import com.ximple.io.dgn7.EllipseElement;
+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.TextNodeElement;
+
+public class OracleElementLogging
+{
+    static Log logger = LogFactory.getLog(OracleElementLogging.class);
+    private static final String ELMOUTPATH = "elmout";
+    private static final String TAB_IGDSSEED = "SD$IGDSSET_SEED";
+
+    private Connection connection;
+    private String dataOut = null;
+    private String dataPath;
+    private String currentSchema;
+    private boolean schemaChanged;
+    private FileOutputStream fos = null;
+    private FileChannel fch = null;
+    private int logCount = 0;
+
+    public OracleElementLogging(Connection connection)
+    {
+        this.connection = connection;
+    }
+
+    public String getDataOutPath()
+    {
+        if (dataOut == null)
+        {
+            File outPath = new File(getDataPath(), ELMOUTPATH);
+            if (!outPath.exists())
+            {
+                outPath.mkdir();
+            } else if (!outPath.isDirectory())
+            {
+                outPath.mkdir();
+            }
+            dataOut = outPath.toString();
+        }
+        return dataOut;
+    }
+
+    public String getDataPath()
+    {
+        return dataPath;
+    }
+
+    public void setDataPath(String dataPath)
+    {
+        this.dataPath = dataPath;
+    }
+
+    public void logElement(Element element, String currentSchema)
+    {
+        if (this.currentSchema.equalsIgnoreCase(currentSchema))
+        {
+            schemaChanged = true;
+            this.currentSchema = currentSchema;
+            try
+            {
+                createNewStream();
+            } catch (IOException e)
+            {
+                logger.warn(e.getMessage(), e);
+                return;
+            } catch (SQLException e)
+            {
+                logger.warn(e.getMessage(), e);
+                return;
+            }
+        }
+
+        if (fch != null)
+        {
+            ByteBuffer buf = null;
+            if (element instanceof LineElement)
+            {
+                int size = LineElement.ElementHandler.getInstance().getLength(element);
+                buf = ByteBuffer.allocate(size * 2);
+                LineElement.ElementHandler.getInstance().write(buf, element);
+            } else if (element instanceof ShapeElement)
+            {
+                int size = ShapeElement.ElementHandler.getInstance().getLength(element);
+                buf = ByteBuffer.allocate(size * 2);
+                ShapeElement.ElementHandler.getInstance().write(buf, element);
+            } else if (element instanceof LineStringElement)
+            {
+                int size = LineStringElement.ElementHandler.getInstance().getLength(element);
+                buf = ByteBuffer.allocate(size * 2);
+                LineStringElement.ElementHandler.getInstance().write(buf, element);
+            } else if (element instanceof ComplexChainElement)
+            {
+                int size = ComplexChainElement.ElementHandler.getInstance().getLength(element);
+                buf = ByteBuffer.allocate(size * 2);
+                ComplexChainElement.ElementHandler.getInstance().write(buf, element);
+            } else if (element instanceof ComplexShapeElement)
+            {
+                int size = ComplexShapeElement.ElementHandler.getInstance().getLength(element);
+                buf = ByteBuffer.allocate(size * 2);
+                ComplexShapeElement.ElementHandler.getInstance().write(buf, element);
+            } else if (element instanceof ArcElement)
+            {
+                int size = ArcElement.ElementHandler.getInstance().getLength(element);
+                buf = ByteBuffer.allocate(size * 2);
+                ArcElement.ElementHandler.getInstance().write(buf, element);
+            } else if (element instanceof EllipseElement)
+            {
+                int size = EllipseElement.ElementHandler.getInstance().getLength(element);
+                buf = ByteBuffer.allocate(size * 2);
+                EllipseElement.ElementHandler.getInstance().write(buf, element);
+            } else if (element instanceof TextElement)
+            {
+                int size = TextElement.ElementHandler.getInstance().getLength(element);
+                buf = ByteBuffer.allocate(size * 2);
+                TextElement.ElementHandler.getInstance().write(buf, element);
+            } else if (element instanceof TextNodeElement)
+            {
+                int size = TextNodeElement.ElementHandler.getInstance().getLength(element);
+                buf = ByteBuffer.allocate(size * 2);
+                TextNodeElement.ElementHandler.getInstance().write(buf, element);
+            }
+
+            if ((buf != null) && (fch != null))
+            {
+                try
+                {
+                    fch.write(buf);
+                } catch (IOException e)
+                {
+                    logger.warn(e.getMessage(), e);
+                }
+            }
+        }
+    }
+
+    private void createNewStream() throws IOException, SQLException
+    {
+        if (fos != null)
+        {
+            putEndOfFileElement();
+            fos.close();
+            fos = null;
+            fch = null;
+        }
+
+        File logFile = new File(getDataOutPath(), this.currentSchema + ".dgn");
+        while (logFile.exists())
+        {
+            logFile = new File(getDataOutPath(), this.currentSchema + "-"
+                    + (++logCount) +".dgn");
+        }
+        fos = new FileOutputStream(logFile);
+        fch = fos.getChannel();
+
+        prepareOutputElementStream();
+        schemaChanged = false;
+    }
+
+    private void putEndOfFileElement() throws IOException
+    {
+        if (fch == null)
+            return;
+        ByteBuffer bf = ByteBuffer.allocate(4);
+        bf.putInt(-1);
+        fch.write(bf);
+    }
+
+    private void prepareOutputElementStream() throws SQLException, IOException
+    {
+        if (connection == null)
+        {
+            logger.warn("connection is null");
+            return;
+        }
+        String fetchSrcStmtFmt = "SELECT IGDSELM FROM \"%s\".\"%s\" ORDER BY ROWID";
+        PrintfFormat spf = new PrintfFormat(fetchSrcStmtFmt);
+        String fetchSrcStmt = spf.sprintf(new Object[]{currentSchema, TAB_IGDSSEED});
+        Statement stmtSrc = connection.createStatement(ResultSet.TYPE_FORWARD_ONLY, ResultSet.CONCUR_READ_ONLY);
+        ResultSet rsSrc = stmtSrc.executeQuery(fetchSrcStmt);
+
+        while (rsSrc.next())
+        {
+            byte[] raw;
+
+            if (rsSrc.getMetaData().getColumnType(1) == Types.BLOB)
+            {
+                BLOB blob = (BLOB) rsSrc.getBlob(1);
+
+                raw = getBytesFromBLOB(blob);
+                blob.close();
+            } else
+            {
+                raw = rsSrc.getBytes(1);
+            }
+
+            if (raw != null)
+            {
+                putElementIntoStream(raw);
+            }
+        }
+    }
+
+    private void putElementIntoStream(byte[] raw) throws IOException
+    {
+        if (fch != null)
+            fch.write(ByteBuffer.wrap(raw));
+    }
+
+    protected static byte[] getBytesFromBLOB(BLOB blob) throws SQLException
+    {
+        byte[] raw = null;
+
+        int optimalSize = blob.getChunkSize();
+        byte[] chunk = new byte[optimalSize];
+        InputStream is = blob.getBinaryStream(0);
+        ByteBuffer buffer = null;    // ByteBuffer.allocate(optimalSize);
+        int len = 0;
+
+        try
+        {
+            while ((len = (is.read(chunk))) != -1)
+            {
+                if (buffer != null)
+                {
+                    buffer.limit(buffer.limit() + len);
+                } else
+                {
+                    buffer = ByteBuffer.allocate(len);
+                }
+
+                buffer.put(chunk);
+            }
+
+            is.close();
+            buffer.position(0);
+            raw = buffer.array();
+        } catch (IOException e)
+        {
+            logger.warn(e.getMessage(), e);
+            Assert.shouldNeverReachHere();
+        }
+        return raw;
+    }
+
+    public void flashLogging()
+    {
+        if (fos != null)
+        {
+            try
+            {
+                fos.close();
+            } catch (IOException e)
+            {
+                logger.warn(e.getMessage(), e);
+            }
+            fos = null;
+            fch = null;
+        }
+    }
+}

--
Gitblit v0.0.0-SNAPSHOT