You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cayenne.apache.org by aa...@apache.org on 2009/04/15 14:39:52 UTC

svn commit: r765159 - in /cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src: main/java/org/apache/cayenne/access/dbsync/ main/java/org/apache/cayenne/conf/ test/java/org/apache/cayenne/access/dbsync/

Author: aadamchik
Date: Wed Apr 15 12:39:51 2009
New Revision: 765159

URL: http://svn.apache.org/viewvc?rev=765159&view=rev
Log:
CAY-1193 Auto load schema on startup

SchemaUpdateStrategy8.txt patch by Olga... still work in progress

Added:
    cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/access/dbsync/BaseSchemaUpdateStrategy.java
      - copied, changed from r765056, cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/access/dbsync/SkipSchemaUpdateStrategy.java
Modified:
    cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/access/dbsync/CreateIfNoSchemaStrategy.java
    cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/access/dbsync/SchemaUpdateStrategy.java
    cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/access/dbsync/SkipSchemaUpdateStrategy.java
    cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/access/dbsync/ThrowOnPartialSchemaStrategy.java
    cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/conf/RuntimeLoadDelegate.java
    cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/java/org/apache/cayenne/access/dbsync/SchemaUpdateStrategyTest.java

Copied: cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/access/dbsync/BaseSchemaUpdateStrategy.java (from r765056, cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/access/dbsync/SkipSchemaUpdateStrategy.java)
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/access/dbsync/BaseSchemaUpdateStrategy.java?p2=cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/access/dbsync/BaseSchemaUpdateStrategy.java&p1=cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/access/dbsync/SkipSchemaUpdateStrategy.java&r1=765056&r2=765159&rev=765159&view=diff
==============================================================================
--- cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/access/dbsync/SkipSchemaUpdateStrategy.java (original)
+++ cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/access/dbsync/BaseSchemaUpdateStrategy.java Wed Apr 15 12:39:51 2009
@@ -18,27 +18,24 @@
  ****************************************************************/
 package org.apache.cayenne.access.dbsync;
 
+import java.sql.SQLException;
+
 import org.apache.cayenne.access.DataNode;
 
 /**
- * A SchemaUpdateStrategy that does nothing. This is usually the default strategy, as in
- * most cases DB schema management is outside the scope of Cayenne.
- * 
  * @since 3.0
  */
-public class SkipSchemaUpdateStrategy implements SchemaUpdateStrategy {
+public abstract class BaseSchemaUpdateStrategy implements SchemaUpdateStrategy {
 
-    /**
-     * @since 3.0
-     */
-    public void updateSchema(DataNode dataNode) {
-        // does nothing
-    }
+    protected BaseSchemaUpdateStrategy currentSchema;
+
+    protected abstract BaseSchemaUpdateStrategy getSchema();
 
     /**
      * @since 3.0
      */
-    public void generateUpdateSchema(DataNode dataNode) {
-        // does nothing
-    }
+    public void generateUpdateSchema(DataNode dataNode) throws SQLException {
+            getSchema().generateUpdateSchema(dataNode);
+             currentSchema = new SkipSchemaUpdateStrategy();
+     };
 }

Modified: cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/access/dbsync/CreateIfNoSchemaStrategy.java
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/access/dbsync/CreateIfNoSchemaStrategy.java?rev=765159&r1=765158&r2=765159&view=diff
==============================================================================
--- cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/access/dbsync/CreateIfNoSchemaStrategy.java (original)
+++ cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/access/dbsync/CreateIfNoSchemaStrategy.java Wed Apr 15 12:39:51 2009
@@ -37,13 +37,12 @@
 /**
  * @since 3.0
  */
-public class CreateIfNoSchemaStrategy implements SchemaUpdateStrategy {
+public class CreateIfNoSchemaStrategy extends BaseSchemaUpdateStrategy {
 
     final Log logObj = LogFactory.getLog(CreateIfNoSchemaStrategy.class);
 
-    private SchemaUpdateStrategy currentSchema;
-
-    private SchemaUpdateStrategy getSchema() {
+    @Override
+    protected BaseSchemaUpdateStrategy getSchema() {
         return currentSchema;
     }
 
@@ -51,11 +50,13 @@
         currentSchema = this;
     }
 
-    public void updateSchema(DataNode dataNode) {
-        getSchema().generateUpdateSchema(dataNode);
+    public void updateSchema(DataNode dataNode) throws SQLException {
+        super.generateUpdateSchema(dataNode);
     }
 
-    public void generateUpdateSchema(DataNode dataNode) {
+  
+    @Override
+    public void generateUpdateSchema(DataNode dataNode) throws SQLException {
 
         Map<String, Boolean> nameTables = getNameTablesInDB(dataNode);
         Collection<DbEntity> entities = dataNode.getEntityResolver().getDbEntities();
@@ -74,7 +75,6 @@
             logObj
                     .info("DbGenerator no create, because one of the tables, modeled in Cayenne, already exist in DB");
         }
-        currentSchema = new SkipSchemaUpdateStrategy();
     }
 
     private synchronized void generate(DataNode dataNode) {
@@ -98,33 +98,36 @@
 
     /**
      * Returns all the table names in database.
+     * 
+     * @throws SQLException
      */
-    protected Map<String, Boolean> getNameTablesInDB(DataNode dataNode) {
+    protected Map<String, Boolean> getNameTablesInDB(DataNode dataNode)
+            throws SQLException {
         String tableLabel = dataNode.getAdapter().tableTypeForTable();
         Connection con = null;
         Map<String, Boolean> nameTables = new HashMap<String, Boolean>();
+        con = dataNode.getDataSource().getConnection();
+
         try {
-            con = dataNode.getDataSource().getConnection();
             ResultSet rs = con.getMetaData().getTables(null, null, "%", new String[] {
                 tableLabel
             });
 
-            while (rs.next()) {
-                String name = rs.getString("TABLE_NAME");
-                nameTables.put(name, false);
-            }
-            rs.close();
-        }
-        catch (SQLException e) {
-            throw new CayenneRuntimeException(e);
-        }
-        finally {
             try {
-                con.close();
+
+                while (rs.next()) {
+                    String name = rs.getString("TABLE_NAME");
+                    nameTables.put(name, false);
+                }
             }
-            catch (SQLException e) {
-                logObj.info("error: " + e);
+            finally {
+                rs.close();
             }
+
+        }
+        finally {
+
+            con.close();
         }
         return nameTables;
     }

Modified: cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/access/dbsync/SchemaUpdateStrategy.java
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/access/dbsync/SchemaUpdateStrategy.java?rev=765159&r1=765158&r2=765159&view=diff
==============================================================================
--- cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/access/dbsync/SchemaUpdateStrategy.java (original)
+++ cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/access/dbsync/SchemaUpdateStrategy.java Wed Apr 15 12:39:51 2009
@@ -18,6 +18,8 @@
  ****************************************************************/
 package org.apache.cayenne.access.dbsync;
 
+import java.sql.SQLException;
+
 import org.apache.cayenne.access.DataNode;
 
 /**
@@ -27,7 +29,5 @@
  */
 public interface SchemaUpdateStrategy {
 
-    void updateSchema(DataNode dataNode);
-
-    void generateUpdateSchema(DataNode dataNode);
+    void updateSchema(DataNode dataNode) throws SQLException;
 }

Modified: cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/access/dbsync/SkipSchemaUpdateStrategy.java
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/access/dbsync/SkipSchemaUpdateStrategy.java?rev=765159&r1=765158&r2=765159&view=diff
==============================================================================
--- cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/access/dbsync/SkipSchemaUpdateStrategy.java (original)
+++ cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/access/dbsync/SkipSchemaUpdateStrategy.java Wed Apr 15 12:39:51 2009
@@ -26,7 +26,7 @@
  * 
  * @since 3.0
  */
-public class SkipSchemaUpdateStrategy implements SchemaUpdateStrategy {
+public class SkipSchemaUpdateStrategy extends BaseSchemaUpdateStrategy {
 
     /**
      * @since 3.0
@@ -38,7 +38,13 @@
     /**
      * @since 3.0
      */
+    @Override
     public void generateUpdateSchema(DataNode dataNode) {
         // does nothing
     }
+
+    @Override
+    protected BaseSchemaUpdateStrategy getSchema() {
+        return this;
+    }
 }

Modified: cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/access/dbsync/ThrowOnPartialSchemaStrategy.java
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/access/dbsync/ThrowOnPartialSchemaStrategy.java?rev=765159&r1=765158&r2=765159&view=diff
==============================================================================
--- cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/access/dbsync/ThrowOnPartialSchemaStrategy.java (original)
+++ cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/access/dbsync/ThrowOnPartialSchemaStrategy.java Wed Apr 15 12:39:51 2009
@@ -18,6 +18,7 @@
  ****************************************************************/
 package org.apache.cayenne.access.dbsync;
 
+import java.sql.SQLException;
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.Iterator;
@@ -33,11 +34,10 @@
 /**
  * @since 3.0
  */
-public class ThrowOnPartialSchemaStrategy implements SchemaUpdateStrategy {
+public class ThrowOnPartialSchemaStrategy extends BaseSchemaUpdateStrategy {
 
-    protected SchemaUpdateStrategy currentSchema;
-
-    protected SchemaUpdateStrategy getSchema() {
+    @Override
+    public BaseSchemaUpdateStrategy getSchema() {
         return currentSchema;
     }
 
@@ -49,15 +49,17 @@
     }
 
     /**
+     * @throws SQLException 
      * @since 3.0
      */
-    public void updateSchema(DataNode dataNode) {
-        getSchema().generateUpdateSchema(dataNode);
+    public void updateSchema(DataNode dataNode) throws SQLException {
+        super.generateUpdateSchema(dataNode);
     }
 
     /**
      * @since 3.0
      */
+    @Override
     public void generateUpdateSchema(DataNode dataNode) {
         String errorMessage = null;
         List<String> mergerOnlyTable = new ArrayList<String>();
@@ -93,8 +95,6 @@
             }
         }
         analyser(dataNode, mergerOnlyTable, errorMessage, entitiesSize);
-
-        currentSchema = new SkipSchemaUpdateStrategy();
     }
 
     protected synchronized void analyser(
@@ -118,7 +118,6 @@
                     err += "expect table " + mergerOnlyTable.get(0);
                 }
             }
-
             throw new CayenneRuntimeException(err);
         }
     }

Modified: cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/conf/RuntimeLoadDelegate.java
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/conf/RuntimeLoadDelegate.java?rev=765159&r1=765158&r2=765159&view=diff
==============================================================================
--- cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/conf/RuntimeLoadDelegate.java (original)
+++ cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/conf/RuntimeLoadDelegate.java Wed Apr 15 12:39:51 2009
@@ -294,21 +294,31 @@
         node.setDataSourceLocation(dataSource);
         node.setSchemaUpdateStrategyName(schemaUpdateStrategy);
 
-
-        // load DataSource
+        SchemaUpdateStrategy confSchema = config.getSchemaUpdateStrategy();
+        ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
+        SchemaUpdateStrategy localSchema;
         try {
-
-            SchemaUpdateStrategy confSchema = config.getSchemaUpdateStrategy();
-            ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
-            SchemaUpdateStrategy localSchema = (confSchema != null)
+            localSchema = (confSchema != null)
                     ? confSchema
                     : (SchemaUpdateStrategy) Class.forName(
                             schemaUpdateStrategy,
                             true,
                             classLoader).newInstance();
-
             node.setSchemaUpdateStrategy(localSchema);
-            
+        }
+        catch (InstantiationException e) {
+            logger.info("Error: ", e);
+        }
+        catch (IllegalAccessException e) {
+            logger.info("Error: ", e);
+        }
+        catch (ClassNotFoundException e) {
+            logger.info("Error: ", e);
+        }
+        
+        // load DataSource
+        try {
+
             // use DomainHelper factory if it exists, if not - use factory specified
             // in configuration data
             DataSourceFactory confFactory = config.getDataSourceFactory(factory);

Modified: cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/java/org/apache/cayenne/access/dbsync/SchemaUpdateStrategyTest.java
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/java/org/apache/cayenne/access/dbsync/SchemaUpdateStrategyTest.java?rev=765159&r1=765158&r2=765159&view=diff
==============================================================================
--- cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/java/org/apache/cayenne/access/dbsync/SchemaUpdateStrategyTest.java (original)
+++ cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/java/org/apache/cayenne/access/dbsync/SchemaUpdateStrategyTest.java Wed Apr 15 12:39:51 2009
@@ -97,11 +97,17 @@
         assertNotNull(map);
         MockOperationObserver observer = new MockOperationObserver();
         DataNode dataNode = createDataNode(map);
-        
+
         setStrategy(ThrowOnPartialSchemaStrategy.class.getName(), dataNode);
-        
+
         try {
             dataNode.performQueries(Collections.singletonList((Query) query), observer);
+        }
+        catch (CayenneRuntimeException e) {
+            assertNotNull(e);
+        }
+
+        try {
             dataNode.performQueries(Collections.singletonList((Query) query), observer);
         }
         catch (CayenneRuntimeException e) {
@@ -183,26 +189,32 @@
         assertNotNull(map);
         MockOperationObserver observer = new MockOperationObserver();
         DataNode dataNode = createDataNode(map);
-      
+
+        DataNode dataNode2 = createDataNode(map);
+
         try {
-      
+
             int sizeDB = getNameTablesInDB(dataNode).size();
             entity = createOneTable(dataNode);
             int sizeDB2 = getNameTablesInDB(dataNode).size();
             assertEquals(1, sizeDB2 - sizeDB);
-            DataNode dataNode2 = createDataNode(map);
-
             setStrategy(strategy, dataNode2);
+            dataNode2.performQueries(Collections.singletonList((Query) query), observer);
 
+        }
+        catch (CayenneRuntimeException e) {
+            assertNotNull(e);
+        }
+        try {
             dataNode2.performQueries(Collections.singletonList((Query) query), observer);
-           
         }
         catch (CayenneRuntimeException e) {
             assertNotNull(e);
         }
         finally {
+
             if (entity != null) {
-                
+
                 Collection<String> template2 = dataNode.getAdapter().dropTableStatements(
                         entity);
                 Iterator<String> it = template2.iterator();