You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cayenne.apache.org by ol...@apache.org on 2009/12/23 12:34:36 UTC

svn commit: r893477 - in /cayenne/main/branches/STABLE-3.0/framework/cayenne-jdk1.5-unpublished/src: main/java/org/apache/cayenne/access/ main/java/org/apache/cayenne/access/dbsync/ test/java/org/apache/cayenne/access/dbsync/

Author: oltka
Date: Wed Dec 23 11:34:36 2009
New Revision: 893477

URL: http://svn.apache.org/viewvc?rev=893477&view=rev
Log:
CAY-1344

(cherry picked from commit db69bc14c14fec4d5d1cfc942319732d3bc28968)

Modified:
    cayenne/main/branches/STABLE-3.0/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/access/DataNode.java
    cayenne/main/branches/STABLE-3.0/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/access/dbsync/BaseSchemaUpdateStrategy.java
    cayenne/main/branches/STABLE-3.0/framework/cayenne-jdk1.5-unpublished/src/test/java/org/apache/cayenne/access/dbsync/SchemaUpdateStrategyTest.java

Modified: cayenne/main/branches/STABLE-3.0/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/access/DataNode.java
URL: http://svn.apache.org/viewvc/cayenne/main/branches/STABLE-3.0/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/access/DataNode.java?rev=893477&r1=893476&r2=893477&view=diff
==============================================================================
--- cayenne/main/branches/STABLE-3.0/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/access/DataNode.java (original)
+++ cayenne/main/branches/STABLE-3.0/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/access/DataNode.java Wed Dec 23 11:34:36 2009
@@ -245,11 +245,6 @@
         Connection connection = null;
 
         try {
-            
-            if (schemaUpdateStrategy != null) {
-                schemaUpdateStrategy.updateSchema(this);
-            }
-            
             connection = this.getDataSource().getConnection();
         }
         catch (Exception globalEx) {
@@ -356,7 +351,11 @@
         final String CONNECTION_RESOURCE_PREFIX = "DataNode.Connection.";
 
         public Connection getConnection() throws SQLException {
+            if (schemaUpdateStrategy != null) {
+                schemaUpdateStrategy.updateSchema(DataNode.this);
+            }
             Transaction t = Transaction.getThreadTransaction();
+            
             if (t != null) {
                 String key = CONNECTION_RESOURCE_PREFIX + name;
                 Connection c = t.getConnection(key);
@@ -372,12 +371,15 @@
                 return new TransactionConnectionDecorator(c);
             }
 
+           
             return dataSource.getConnection();
         }
 
         public Connection getConnection(String username, String password)
                 throws SQLException {
-
+            if (schemaUpdateStrategy != null) {
+                schemaUpdateStrategy.updateSchema(DataNode.this);
+            }
             Transaction t = Transaction.getThreadTransaction();
             if (t != null) {
                 String key = CONNECTION_RESOURCE_PREFIX + name;

Modified: cayenne/main/branches/STABLE-3.0/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/access/dbsync/BaseSchemaUpdateStrategy.java
URL: http://svn.apache.org/viewvc/cayenne/main/branches/STABLE-3.0/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/access/dbsync/BaseSchemaUpdateStrategy.java?rev=893477&r1=893476&r2=893477&view=diff
==============================================================================
--- cayenne/main/branches/STABLE-3.0/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/access/dbsync/BaseSchemaUpdateStrategy.java (original)
+++ cayenne/main/branches/STABLE-3.0/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/access/dbsync/BaseSchemaUpdateStrategy.java Wed Dec 23 11:34:36 2009
@@ -28,16 +28,29 @@
 public abstract class BaseSchemaUpdateStrategy implements SchemaUpdateStrategy {
 
     protected volatile boolean run;
+    protected volatile ThreadLocal<Boolean> threadRunInProgress;
+
+    public BaseSchemaUpdateStrategy() {
+        super();
+        threadRunInProgress = new ThreadLocal<Boolean>();
+    }
 
     /**
      * @since 3.0
      */
     public void updateSchema(DataNode dataNode) throws SQLException {
-        if (!run) {
+
+        if (!run && (threadRunInProgress.get() == null || !threadRunInProgress.get())) {
             synchronized (this) {
                 if (!run) {
-                    processSchemaUpdate(dataNode);
-                    run = true;
+                    try {
+                        threadRunInProgress.set(true);
+                        processSchemaUpdate(dataNode);
+                        run = true;
+                    }
+                    finally {
+                        threadRunInProgress.set(false);
+                    }
                 }
             }
         }

Modified: cayenne/main/branches/STABLE-3.0/framework/cayenne-jdk1.5-unpublished/src/test/java/org/apache/cayenne/access/dbsync/SchemaUpdateStrategyTest.java
URL: http://svn.apache.org/viewvc/cayenne/main/branches/STABLE-3.0/framework/cayenne-jdk1.5-unpublished/src/test/java/org/apache/cayenne/access/dbsync/SchemaUpdateStrategyTest.java?rev=893477&r1=893476&r2=893477&view=diff
==============================================================================
--- cayenne/main/branches/STABLE-3.0/framework/cayenne-jdk1.5-unpublished/src/test/java/org/apache/cayenne/access/dbsync/SchemaUpdateStrategyTest.java (original)
+++ cayenne/main/branches/STABLE-3.0/framework/cayenne-jdk1.5-unpublished/src/test/java/org/apache/cayenne/access/dbsync/SchemaUpdateStrategyTest.java Wed Dec 23 11:34:36 2009
@@ -44,6 +44,7 @@
 import org.apache.cayenne.query.Query;
 import org.apache.cayenne.query.SQLTemplate;
 import org.apache.cayenne.unit.CayenneCase;
+import org.apache.cayenne.unit.CayenneResources;
 import org.xml.sax.InputSource;
 
 public class SchemaUpdateStrategyTest extends CayenneCase {
@@ -140,7 +141,7 @@
         try {
             dataNode.performQueries(Collections.singletonList((Query) query), observer);
             Map<String, Boolean> nameTables = getNameTablesInDB(dataNode);
-            assertTrue(nameTables.get("sus1")!=null || nameTables.get("SUS1")!=null );
+            assertTrue(nameTables.get("sus1") != null || nameTables.get("SUS1") != null);
             int sizeDB2 = getNameTablesInDB(dataNode).size();
             assertEquals(2, sizeDB2 - sizeDB);
             dataNode.performQueries(Collections.singletonList((Query) query), observer);
@@ -274,7 +275,7 @@
         DataNode dataNode = new DataNode();
         dataNode.setDataMaps(colection);
         dataNode.setAdapter(adapter);
-        dataNode.setDataSource(getNode().getDataSource());
+        dataNode.setDataSource(CayenneResources.getResources().getDataSource());
         dataNode.setDataSourceFactory(getNode().getDataSourceFactory());
         dataNode.setSchemaUpdateStrategyName(getNode().getSchemaUpdateStrategyName());
         dataNode.setEntityResolver(new EntityResolver(colection));
@@ -300,14 +301,8 @@
             dataNode.setSchemaUpdateStrategy((SchemaUpdateStrategy) Class.forName(
                     dataNode.getSchemaUpdateStrategyName()).newInstance());
         }
-        catch (InstantiationException e) {
-            e.printStackTrace();
-        }
-        catch (IllegalAccessException e) {
-            e.printStackTrace();
-        }
-        catch (ClassNotFoundException e) {
-            e.printStackTrace();
+        catch (Exception e) {
+            throw new CayenneRuntimeException(e);
         }
     }
 
@@ -343,14 +338,14 @@
             rs.close();
         }
         catch (SQLException e) {
-            e.printStackTrace();
+            throw new CayenneRuntimeException(e);
         }
         finally {
             try {
                 con.close();
             }
             catch (SQLException e) {
-                e.printStackTrace();
+                throw new CayenneRuntimeException(e);
             }
         }
         return nameTables;