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();