From 94e0f911454190575358dca175fb9c3dd878fa49 Mon Sep 17 00:00:00 2001
From: ?? ? <ulysseskao@ximple.com.tw>
Date: Mon, 25 Aug 2008 01:26:16 +0800
Subject: [PATCH] update for EOFM-152

---
 xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/jobs/DataRepositoryStatus.java        |   11 +
 xdgnjobs/ximple-dgnio/src/main/java/com/ximple/io/dgn7/TextNodeElement.java                     |   73 ++++++-----
 .gitattributes                                                                                  |    1 
 xdgnjobs/ximple-dgnio/src/main/java/com/ximple/io/dgn7/ComplexChainElement.java                 |   64 +++++-----
 xdgnjobs/ximple-dgnio/src/main/java/com/ximple/io/dgn7/ComplexShapeElement.java                 |   64 +++++-----
 xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/jobs/OracleConvertDgn2PostGISJob.java |   95 +++++++++++++++
 xdgnjobs/ximple-dgnio/src/main/java/com/ximple/io/dgn7/ComplexElement.java                      |    2 
 7 files changed, 207 insertions(+), 103 deletions(-)

diff --git a/.gitattributes b/.gitattributes
index acb8a46..a668ae7 100644
--- a/.gitattributes
+++ b/.gitattributes
@@ -76,6 +76,7 @@
 xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/filter/TypeCompLevelIdDispatchableFilter.java svneol=native#text/plain
 xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/filter/TypeIdDispatchableFilter.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/DataRepositoryStatus.java -text
 xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/jobs/DummyFeatureConvertJobContext.java svneol=native#text/plain
 xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/jobs/OracleConvertDgn2MySQLJob.java svneol=native#text/plain
 xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/jobs/OracleConvertDgn2OraSDOJob.java svneol=native#text/plain
diff --git a/xdgnjobs/ximple-dgnio/src/main/java/com/ximple/io/dgn7/ComplexChainElement.java b/xdgnjobs/ximple-dgnio/src/main/java/com/ximple/io/dgn7/ComplexChainElement.java
index 9b722d7..5fc5209 100644
--- a/xdgnjobs/ximple-dgnio/src/main/java/com/ximple/io/dgn7/ComplexChainElement.java
+++ b/xdgnjobs/ximple-dgnio/src/main/java/com/ximple/io/dgn7/ComplexChainElement.java
@@ -56,9 +56,14 @@
         return list.toArray();
     }
 
-    public boolean add(Object o)
+    public <T> T[] toArray(T[] ts)
     {
-        return list.add((Element) o);
+        return list.toArray(ts);
+    }
+
+    public boolean add(Element element)
+    {
+        return list.add(element);
     }
 
     public boolean remove(Object o)
@@ -66,14 +71,29 @@
         return list.remove(o);
     }
 
-    public boolean addAll(Collection c)
+    public boolean containsAll(Collection<?> objects)
     {
-        return list.addAll(c);
+        return list.containsAll(objects);
     }
 
-    public boolean addAll(int index, Collection c)
+    public boolean addAll(Collection<? extends Element> elements)
     {
-        return list.addAll(index, c);
+        return list.addAll(elements);
+    }
+
+    public boolean addAll(int i, Collection<? extends Element> elements)
+    {
+        return list.addAll(i, elements);
+    }
+
+    public boolean removeAll(Collection<?> objects)
+    {
+        return list.removeAll(objects);
+    }
+
+    public boolean retainAll(Collection<?> objects)
+    {
+        return list.retainAll(objects);
     }
 
     public void clear()
@@ -81,22 +101,22 @@
         list.clear();
     }
 
-    public Object get(int index)
+    public Element get(int index)
     {
         return list.get(index);
     }
 
-    public Object set(int index, Object element)
+    public Element set(int i, Element element)
     {
-        return list.set(index, (Element) element);
+        return list.set(i, element);
     }
 
-    public void add(int index, Object element)
+    public void add(int i, Element element)
     {
-        list.add(index, (Element) element);
+        list.add(i, element);
     }
 
-    public Object remove(int index)
+    public Element remove(int index)
     {
         return list.remove(index);
     }
@@ -124,26 +144,6 @@
     public List subList(int fromIndex, int toIndex)
     {
         return list.subList(fromIndex, toIndex);
-    }
-
-    public boolean retainAll(Collection c)
-    {
-        return list.retainAll(c);
-    }
-
-    public boolean removeAll(Collection c)
-    {
-        return list.removeAll(c);
-    }
-
-    public boolean containsAll(Collection c)
-    {
-        return list.containsAll(c);
-    }
-
-    public Object[] toArray(Object[] a)
-    {
-        return list.toArray(a);
     }
 
     public Geometry toGeometry(GeometryFactory factory)
diff --git a/xdgnjobs/ximple-dgnio/src/main/java/com/ximple/io/dgn7/ComplexElement.java b/xdgnjobs/ximple-dgnio/src/main/java/com/ximple/io/dgn7/ComplexElement.java
index 08fa5ae..299bb04 100644
--- a/xdgnjobs/ximple-dgnio/src/main/java/com/ximple/io/dgn7/ComplexElement.java
+++ b/xdgnjobs/ximple-dgnio/src/main/java/com/ximple/io/dgn7/ComplexElement.java
@@ -11,6 +11,6 @@
  * @version 0.1
  * @since 2006/5/18 �U�� 04:17:37
  */
-public interface ComplexElement extends List
+public interface ComplexElement extends List<Element>
 {
 }
diff --git a/xdgnjobs/ximple-dgnio/src/main/java/com/ximple/io/dgn7/ComplexShapeElement.java b/xdgnjobs/ximple-dgnio/src/main/java/com/ximple/io/dgn7/ComplexShapeElement.java
index f34dc57..a4389e4 100644
--- a/xdgnjobs/ximple-dgnio/src/main/java/com/ximple/io/dgn7/ComplexShapeElement.java
+++ b/xdgnjobs/ximple-dgnio/src/main/java/com/ximple/io/dgn7/ComplexShapeElement.java
@@ -57,9 +57,14 @@
         return list.toArray();
     }
 
-    public boolean add(Object o)
+    public <T> T[] toArray(T[] ts)
     {
-        return list.add((Element) o);
+        return list.toArray(ts);
+    }
+
+    public boolean add(Element element)
+    {
+        return list.add(element);
     }
 
     public boolean remove(Object o)
@@ -67,14 +72,29 @@
         return list.remove(o);
     }
 
-    public boolean addAll(Collection c)
+    public boolean containsAll(Collection<?> objects)
     {
-        return list.addAll(c);
+        return list.containsAll(objects);
     }
 
-    public boolean addAll(int index, Collection c)
+    public boolean addAll(Collection<? extends Element> elements)
     {
-        return list.addAll(index, c);
+        return list.addAll(elements);
+    }
+
+    public boolean addAll(int i, Collection<? extends Element> elements)
+    {
+        return list.addAll(i, elements);
+    }
+
+    public boolean removeAll(Collection<?> objects)
+    {
+        return list.removeAll(objects);
+    }
+
+    public boolean retainAll(Collection<?> objects)
+    {
+        return list.retainAll(objects);
     }
 
     public void clear()
@@ -82,22 +102,22 @@
         list.clear();
     }
 
-    public Object get(int index)
+    public Element get(int index)
     {
         return list.get(index);
     }
 
-    public Object set(int index, Object element)
+    public Element set(int i, Element element)
     {
-        return list.set(index, (Element) element);
+        return list.set(i, element);
     }
 
-    public void add(int index, Object element)
+    public void add(int i, Element element)
     {
-        list.add(index, (Element) element);
+        list.add(i, element);
     }
 
-    public Object remove(int index)
+    public Element remove(int index)
     {
         return list.remove(index);
     }
@@ -125,26 +145,6 @@
     public List subList(int fromIndex, int toIndex)
     {
         return list.subList(fromIndex, toIndex);
-    }
-
-    public boolean retainAll(Collection c)
-    {
-        return list.retainAll(c);
-    }
-
-    public boolean removeAll(Collection c)
-    {
-        return list.removeAll(c);
-    }
-
-    public boolean containsAll(Collection c)
-    {
-        return list.containsAll(c);
-    }
-
-    public Object[] toArray(Object[] a)
-    {
-        return list.toArray(a);
     }
 
     public Geometry toGeometry(GeometryFactory factory)
diff --git a/xdgnjobs/ximple-dgnio/src/main/java/com/ximple/io/dgn7/TextNodeElement.java b/xdgnjobs/ximple-dgnio/src/main/java/com/ximple/io/dgn7/TextNodeElement.java
index 4061dde..f82e526 100644
--- a/xdgnjobs/ximple-dgnio/src/main/java/com/ximple/io/dgn7/TextNodeElement.java
+++ b/xdgnjobs/ximple-dgnio/src/main/java/com/ximple/io/dgn7/TextNodeElement.java
@@ -28,7 +28,7 @@
 {
     private static final Logger logger = Logger.getLogger(TextElement.class);
 
-    private ArrayList list = new ArrayList();
+    private ArrayList<Element> list = new ArrayList<Element>();
 
     public TextNodeElement(byte[] raw)
     {
@@ -50,7 +50,7 @@
         return list.contains(o);
     }
 
-    public Iterator iterator()
+    public Iterator<Element> iterator()
     {
         return list.iterator();
     }
@@ -60,9 +60,14 @@
         return list.toArray();
     }
 
-    public boolean add(Object o)
+    public <T> T[] toArray(T[] ts)
     {
-        return list.add(o);
+        return list.toArray(ts);
+    }
+
+    public boolean add(Element element)
+    {
+        return list.add(element);
     }
 
     public boolean remove(Object o)
@@ -70,14 +75,29 @@
         return list.remove(o);
     }
 
-    public boolean addAll(Collection c)
+    public boolean containsAll(Collection<?> objects)
     {
-        return list.addAll(c);
+        return list.containsAll(objects);
     }
 
-    public boolean addAll(int index, Collection c)
+    public boolean addAll(Collection<? extends Element> elements)
     {
-        return list.addAll(index, c);
+        return list.addAll(elements);
+    }
+
+    public boolean addAll(int i, Collection<? extends Element> elements)
+    {
+        return list.addAll(i, elements);
+    }
+
+    public boolean removeAll(Collection<?> objects)
+    {
+        return list.removeAll(objects);
+    }
+
+    public boolean retainAll(Collection<?> objects)
+    {
+        return list.retainAll(objects);
     }
 
     public void clear()
@@ -85,22 +105,22 @@
         list.clear();
     }
 
-    public Object get(int index)
+    public Element get(int index)
     {
         return list.get(index);
     }
 
-    public Object set(int index, Object element)
+    public Element set(int index, Element element)
     {
         return list.set(index, element);
     }
 
-    public void add(int index, Object element)
+    public void add(int index, Element element)
     {
         list.add(index, element);
     }
 
-    public Object remove(int index)
+    public Element remove(int index)
     {
         return list.remove(index);
     }
@@ -115,44 +135,29 @@
         return list.lastIndexOf(o);
     }
 
-    public ListIterator listIterator()
+    public ListIterator<Element> listIterator()
     {
         return list.listIterator();
     }
 
-    public ListIterator listIterator(int index)
+    public ListIterator<Element> listIterator(int index)
     {
         return list.listIterator(index);
     }
 
-    public List subList(int fromIndex, int toIndex)
+    public List<Element> subList(int fromIndex, int toIndex)
     {
         return list.subList(fromIndex, toIndex);
     }
 
-    public boolean retainAll(Collection c)
-    {
-        return list.retainAll(c);
-    }
-
-    public boolean removeAll(Collection c)
-    {
-        return list.removeAll(c);
-    }
-
-    public boolean containsAll(Collection c)
-    {
-        return list.containsAll(c);
-    }
-
-    public Object[] toArray(Object[] a)
+    public Element[] toArray(Element[] a)
     {
         return list.toArray(a);
     }
 
     public String[] getTextArray()
     {
-        ArrayList list = new ArrayList();
+        ArrayList<String> list = new ArrayList<String>();
 
         for (ListIterator it = listIterator(); it.hasNext();)
         {
@@ -164,7 +169,7 @@
             }
         }
 
-        return (String[]) list.toArray(new String[list.size()]);
+        return list.toArray(new String[list.size()]);
     }
 
     public Geometry toGeometry(GeometryFactory factory)
@@ -366,7 +371,7 @@
         for (Object o : this)
         {
             TextElement textElm = (TextElement) o;
-            other.add(textElm.clone());
+            other.add((Element) textElm.clone());
         }
 
         return other;
diff --git a/xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/jobs/DataRepositoryStatus.java b/xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/jobs/DataRepositoryStatus.java
new file mode 100644
index 0000000..855785e
--- /dev/null
+++ b/xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/jobs/DataRepositoryStatus.java
@@ -0,0 +1,11 @@
+package com.ximple.eofms.jobs;
+
+public interface DataRepositoryStatus
+{
+    public static final short VSSTATUS_UNKNOWN  = 0x0000;
+    public static final short VSSTATUS_USING    = 0x0100;
+    public static final short VSSTATUS_CONFIG   = 0x0020;
+    public static final short VSSTATUS_LINKVIEW = 0x0010;
+    public static final short VSSTATUS_READY    = 0x0002;
+    public static final short VSSTATUS_COVERT   = 0x0001;
+}
diff --git a/xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/jobs/OracleConvertDgn2PostGISJob.java b/xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/jobs/OracleConvertDgn2PostGISJob.java
index 003668e..3aa6279 100644
--- a/xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/jobs/OracleConvertDgn2PostGISJob.java
+++ b/xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/jobs/OracleConvertDgn2PostGISJob.java
@@ -17,6 +17,7 @@
 import java.util.Date;
 import java.util.Map;
 import java.util.TreeMap;
+import java.util.ArrayList;
 
 import org.apache.commons.collections.OrderedMap;
 import org.apache.commons.collections.OrderedMapIterator;
@@ -270,6 +271,7 @@
             logger.warn(ex.getMessage(), ex);
             throw new JobExecutionException("IO error. " + ex.getMessage(), ex);
         }
+        updateRepoStatusToReady(targetSchemaName);
         logger.info(jobName + " end at " + new Date());
     }
 
@@ -1158,6 +1160,7 @@
     {
         if (targetDataStore == null) return null;
         Connection connection = null;
+        Statement stmt = null;
         ResultSet rs = null;
         String targetSchema = null;
         boolean needCreate = false;
@@ -1168,12 +1171,58 @@
             if (!rs.next()) needCreate = true;
             if (needCreate)
                 createXGeosVersionTable(connection, _pgSchema);
+            rs.close();
+            rs = null;
 
-            StringBuilder sbSQL = new StringBuilder();
+            StringBuilder sbSQL = new StringBuilder("SELECT ");
+            sbSQL.append("'vsschema', 'vsstatus' FROM ");
+            sbSQL.append(encodeSchemaTableName(_pgSchema, XGVERSION_NAME)).append(' ');
+            sbSQL.append("ORDER BY vsid");
+            stmt = connection.createStatement();
+            rs = stmt.executeQuery(sbSQL.toString());
+            ArrayList<Object[]> tmpSchemas = new ArrayList<Object[]>();
+            int i = 0;
+            int current = 0;
+            while (rs.next())
+            {
+                Object[] values = new Object[2];
+                values[0] = rs.getObject(1);
+                values[1] = rs.getObject(2);
+                tmpSchemas.add(values);
+                if ((((Short)values[1]) & DataRepositoryStatus.VSSTATUS_USING) != 0)
+                {
+                    current = i;
+                }
+                i++;
+            }
+
+            if (current < (tmpSchemas.size() - 1))
+            {
+                Object[] values = tmpSchemas.get(current + 1);
+                targetSchema = (String) values[0];
+            } else {
+                Object[] values = tmpSchemas.get(0);
+                targetSchema = (String) values[0];
+            }
+
+            sbSQL = new StringBuilder("UPDATE ");
+            sbSQL.append(encodeSchemaTableName(_pgSchema, XGVERSION_NAME)).append(' ');
+            sbSQL.append(" SET 'vsstatus' = ");
+            sbSQL.append(DataRepositoryStatus.VSSTATUS_COVERT);
+            sbSQL.append(" WHERE 'vsschema' = ");
+            sbSQL.append(targetSchema);
+            int count = stmt.executeUpdate(sbSQL.toString());
+            if (count != 1)
+            {
+                logger.info("update status for " + targetSchema + " update result count="
+                            + count);
+            }
         } catch (SQLException e) {
             logger.warn(e.getMessage(), e);
         } finally {
-        if (connection != null) try { connection.close(); } catch (SQLException e) {};
+            if (rs != null) try { rs.close(); } catch (SQLException e) {};
+            if (stmt != null) try { stmt.close(); } catch (SQLException e) {};
+            if (connection != null) try { connection.close(); } catch (SQLException e) {};
         }
         return targetSchema;
     }
@@ -1210,16 +1259,54 @@
             sql = new StringBuilder("INSERT INTO ");
             sql.append(encodeSchemaTableName(pgSchema, XGVERSION_NAME));
             sql.append(" ('vsschema', 'vsstatus' ) VALUES (");
-            sql.append("'gisrepo1', 0 ");
+            sql.append("'gisrepo1', ");
+            sql.append(DataRepositoryStatus.VSSTATUS_UNKNOWN).append(" )");
             stmt.executeUpdate(sql.toString());
 
             sql = new StringBuilder("INSERT INTO ");
             sql.append(encodeSchemaTableName(pgSchema, XGVERSION_NAME));
             sql.append(" ('vsschema', 'vsstatus' ) VALUES (");
-            sql.append("'gisrepo2', 0 ");
+            sql.append("'gisrepo2', ");
+            sql.append(DataRepositoryStatus.VSSTATUS_UNKNOWN).append(" )");
             stmt.executeUpdate(sql.toString());
         } finally {
             if (stmt != null) stmt.close();
         }
     }
+
+    private void updateRepoStatusToReady(String targetSchema)
+    {
+        if (targetDataStore == null) return;
+        Connection connection = null;
+        Statement stmt = null;
+        ResultSet rs = null;
+        boolean needCreate = false;
+        try
+        {
+            StringBuilder sbSQL = new StringBuilder("UPDATE ");
+            sbSQL.append(encodeSchemaTableName(_pgSchema, XGVERSION_NAME)).append(' ');
+            sbSQL.append(" SET 'vsstatus' = ");
+            sbSQL.append(DataRepositoryStatus.VSSTATUS_READY);
+            sbSQL.append(" WHERE 'vsschema' = ");
+            sbSQL.append(targetSchema);
+
+            connection = targetDataStore.getConnection(Transaction.AUTO_COMMIT);
+            stmt = connection.createStatement();
+            int count = stmt.executeUpdate(sbSQL.toString());
+            if (count != 1)
+            {
+                logger.info("update status for " + targetSchema + " update result count="
+                            + count);
+            }
+        } catch (SQLException e) {
+            logger.warn(e.getMessage(), e);
+        } catch (IOException e)
+        {
+            logger.warn(e.getMessage(), e);
+        } finally {
+            if (rs != null) try { rs.close(); } catch (SQLException e) {};
+            if (stmt != null) try { stmt.close(); } catch (SQLException e) {};
+            if (connection != null) try { connection.close(); } catch (SQLException e) {};
+        }
+    }
 }

--
Gitblit v0.0.0-SNAPSHOT