You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cayenne.apache.org by to...@apache.org on 2008/01/18 15:23:57 UTC
svn commit: r613170 - in
/cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src:
main/java/org/apache/cayenne/merge/ test/java/org/apache/cayenne/merge/
test/resources/dml/
Author: torehalset
Date: Fri Jan 18 06:23:57 2008
New Revision: 613170
URL: http://svn.apache.org/viewvc?rev=613170&view=rev
Log:
CAY-885: merge changes between model and db
CAY-966: ObjRelationsship's are not removed processing DropColumnToModel
DropColumnToModel will also drop ObjAttribute mapped to that column.
TODO: ObjRelationship
Added:
cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/java/org/apache/cayenne/merge/DropColumnToModelTest.java
cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/java/org/apache/cayenne/merge/MergeCase.java
cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/resources/dml/merge.MergeCase.xml
Removed:
cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/resources/dml/merge.MergerFactoryTest.xml
Modified:
cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/merge/DbMerger.java
cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/merge/DropColumnToModel.java
cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/java/org/apache/cayenne/merge/MergerFactoryTest.java
Modified: cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/merge/DbMerger.java
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/merge/DbMerger.java?rev=613170&r1=613169&r2=613170&view=diff
==============================================================================
--- cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/merge/DbMerger.java (original)
+++ cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/merge/DbMerger.java Fri Jan 18 06:23:57 2008
@@ -110,8 +110,9 @@
}
dbEntityToDropByName.remove(detectedEntity.getName());
+ checkRelationshipsToDrop(adapter, tokens, dbEntity, detectedEntity);
checkRows(tokens, dbEntity, detectedEntity);
- checkRelationships(adapter, tokens, dbEntity, detectedEntity);
+ checkRelationshipsToAdd(adapter, tokens, dbEntity, detectedEntity);
}
// drop table
@@ -202,7 +203,7 @@
}
}
- private void checkRelationships(
+ private void checkRelationshipsToDrop(
DbAdapter adapter,
List<MergerToken> tokens,
DbEntity dbEntity,
@@ -247,7 +248,14 @@
tokens.add(token);
}
}
+ }
+ private void checkRelationshipsToAdd(
+ DbAdapter adapter,
+ List<MergerToken> tokens,
+ DbEntity dbEntity,
+ DbEntity detectedEntity) {
+
// relationships to add
for (DbRelationship rel : dbEntity.getRelationships()) {
if (findDbRelationship(detectedEntity, rel) == null) {
@@ -260,7 +268,7 @@
}
}
}
-
+
/**
* case insensitive search for a {@link DbEntity} in a {@link DataMap} by name
*/
Modified: cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/merge/DropColumnToModel.java
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/merge/DropColumnToModel.java?rev=613170&r1=613169&r2=613170&view=diff
==============================================================================
--- cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/merge/DropColumnToModel.java (original)
+++ cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/merge/DropColumnToModel.java Fri Jan 18 06:23:57 2008
@@ -20,9 +20,11 @@
import org.apache.cayenne.map.DbAttribute;
import org.apache.cayenne.map.DbEntity;
+import org.apache.cayenne.map.ObjAttribute;
+import org.apache.cayenne.map.ObjEntity;
/**
- * A {@link MergerToken} to remove a {@link DbAttribute} from a {@link DbEntity}
+ * A {@link MergerToken} to remove a {@link DbAttribute} from a {@link DbEntity}.
*
* @author halset
*/
@@ -41,6 +43,17 @@
}
public void execute(MergerContext mergerContext) {
+ // remove ObjAttribute mapped to same column
+ for (ObjEntity objEntity : entity.getDataMap().getObjEntities()) {
+ if (objEntity.getDbEntity().equals(entity)) {
+ ObjAttribute objAttribute = objEntity.getAttributeForDbAttribute(column);
+ if (objAttribute != null) {
+ objEntity.removeAttribute(objAttribute.getName());
+ }
+ }
+ }
+
+ // remove DbAttribute
entity.removeAttribute(column.getName());
}
Added: cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/java/org/apache/cayenne/merge/DropColumnToModelTest.java
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/java/org/apache/cayenne/merge/DropColumnToModelTest.java?rev=613170&view=auto
==============================================================================
--- cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/java/org/apache/cayenne/merge/DropColumnToModelTest.java (added)
+++ cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/java/org/apache/cayenne/merge/DropColumnToModelTest.java Fri Jan 18 06:23:57 2008
@@ -0,0 +1,211 @@
+/*****************************************************************
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ ****************************************************************/
+package org.apache.cayenne.merge;
+
+import java.sql.Types;
+import java.util.List;
+
+import org.apache.cayenne.access.DataContext;
+import org.apache.cayenne.map.DbAttribute;
+import org.apache.cayenne.map.DbEntity;
+import org.apache.cayenne.map.DbJoin;
+import org.apache.cayenne.map.DbRelationship;
+import org.apache.cayenne.map.ObjAttribute;
+import org.apache.cayenne.map.ObjEntity;
+
+public class DropColumnToModelTest extends MergeCase {
+
+ public void XXtestSimpleColumn() throws Exception {
+ dropTableIfPresent(node, "NEW_TABLE");
+
+ assertTokensAndExecute(node, map, 0, 0);
+
+ DbEntity dbEntity = new DbEntity("NEW_TABLE");
+
+ DbAttribute column1 = new DbAttribute("ID", Types.INTEGER, dbEntity);
+ column1.setMandatory(true);
+ column1.setPrimaryKey(true);
+ dbEntity.addAttribute(column1);
+
+ DbAttribute column2 = new DbAttribute("NAME", Types.VARCHAR, dbEntity);
+ column2.setMaxLength(10);
+ column2.setMandatory(false);
+ dbEntity.addAttribute(column2);
+
+ map.addDbEntity(dbEntity);
+
+ assertTokensAndExecute(node, map, 1, 0);
+ assertTokensAndExecute(node, map, 0, 0);
+
+ ObjEntity objEntity = new ObjEntity("NewTable");
+ objEntity.setDbEntity(dbEntity);
+ ObjAttribute oatr1 = new ObjAttribute("name");
+ oatr1.setDbAttributePath(column2.getName());
+ oatr1.setType("java.lang.String");
+ objEntity.addAttribute(oatr1);
+ map.addObjEntity(objEntity);
+
+ // force drop name column in db
+ MergerToken token = mergerFactory().createDropColumToDb(dbEntity, column2);
+ execute(token);
+
+ List<MergerToken> tokens = createMergeTokens();
+ assertEquals(1, tokens.size());
+ token = tokens.get(0);
+ if (token.getDirection().isToDb()) {
+ token = token.createReverse(mergerFactory());
+ }
+ assertTrue(token instanceof DropColumnToModel);
+ execute(token);
+ assertNull(dbEntity.getAttribute(column2.getName()));
+ assertNull(objEntity.getAttribute(oatr1.getName()));
+
+ DataContext ctxt = createDataContext();
+
+ // clear up
+ map.removeObjEntity(objEntity.getName(), true);
+ map.removeDbEntity(dbEntity.getName(), true);
+ ctxt.getEntityResolver().clearCache();
+ assertNull(map.getObjEntity(objEntity.getName()));
+ assertNull(map.getDbEntity(dbEntity.getName()));
+ assertFalse(map.getDbEntities().contains(dbEntity));
+
+ assertTokensAndExecute(node, map, 1, 0);
+ assertTokensAndExecute(node, map, 0, 0);
+ }
+
+ public void testForreignKey() throws Exception {
+ dropTableIfPresent(node, "NEW_TABLE");
+ dropTableIfPresent(node, "NEW_TABLE2");
+
+ assertTokensAndExecute(node, map, 0, 0);
+
+ DbEntity dbEntity1 = new DbEntity("NEW_TABLE");
+
+ DbAttribute e1col1 = new DbAttribute("ID", Types.INTEGER, dbEntity1);
+ e1col1.setMandatory(true);
+ e1col1.setPrimaryKey(true);
+ dbEntity1.addAttribute(e1col1);
+
+ DbAttribute e1col2 = new DbAttribute("NAME", Types.VARCHAR, dbEntity1);
+ e1col2.setMaxLength(10);
+ e1col2.setMandatory(false);
+ dbEntity1.addAttribute(e1col2);
+
+ map.addDbEntity(dbEntity1);
+
+ DbEntity dbEntity2 = new DbEntity("NEW_TABLE2");
+ DbAttribute e2col1 = new DbAttribute("ID", Types.INTEGER, dbEntity2);
+ e2col1.setMandatory(true);
+ e2col1.setPrimaryKey(true);
+ dbEntity2.addAttribute(e2col1);
+ DbAttribute e2col2 = new DbAttribute("FK", Types.INTEGER, dbEntity2);
+ dbEntity2.addAttribute(e2col2);
+ DbAttribute e2col3 = new DbAttribute("NAME", Types.VARCHAR, dbEntity2);
+ e2col3.setMaxLength(10);
+ dbEntity2.addAttribute(e2col3);
+
+ map.addDbEntity(dbEntity2);
+
+ // create db relationships
+ DbRelationship rel1To2 = new DbRelationship("rel1To2");
+ rel1To2.setSourceEntity(dbEntity1);
+ rel1To2.setTargetEntity(dbEntity2);
+ rel1To2.setToMany(true);
+ rel1To2.addJoin(new DbJoin(rel1To2, e1col1.getName(), e2col2.getName()));
+ dbEntity1.addRelationship(rel1To2);
+ DbRelationship rel2To1 = new DbRelationship("rel2To1");
+ rel2To1.setSourceEntity(dbEntity2);
+ rel2To1.setTargetEntity(dbEntity1);
+ rel2To1.setToMany(false);
+ rel2To1.addJoin(new DbJoin(rel2To1, e2col2.getName(), e1col1.getName()));
+ dbEntity2.addRelationship(rel2To1);
+
+ assertTokensAndExecute(node, map, 4, 0);
+ assertTokensAndExecute(node, map, 0, 0);
+
+ ObjEntity objEntity1 = new ObjEntity("NewTable");
+ objEntity1.setDbEntity(dbEntity1);
+ ObjAttribute oatr1 = new ObjAttribute("name");
+ oatr1.setDbAttributePath(e1col2.getName());
+ oatr1.setType("java.lang.String");
+ objEntity1.addAttribute(oatr1);
+ map.addObjEntity(objEntity1);
+
+ ObjEntity objEntity2 = new ObjEntity("NewTable2");
+ objEntity2.setDbEntity(dbEntity1);
+ ObjAttribute o2a1 = new ObjAttribute("name");
+ o2a1.setDbAttributePath(e1col2.getName());
+ o2a1.setType("java.lang.String");
+ objEntity2.addAttribute(o2a1);
+ map.addObjEntity(objEntity1);
+
+ // remove relationship and fk from model, merge to db and add to model
+ dbEntity2.removeRelationship(rel2To1.getName());
+ dbEntity1.removeRelationship(rel1To2.getName());
+ dbEntity2.removeAttribute(e2col2.getName());
+ List<MergerToken> tokens = createMergeTokens();
+ assertTokens(tokens, 2, 1);
+ for (MergerToken token : tokens) {
+ if (token.getDirection().isToDb()) {
+ execute(token);
+ }
+ }
+ assertTokensAndExecute(0, 0);
+ dbEntity2.addRelationship(rel2To1);
+ dbEntity1.addRelationship(rel1To2);
+ dbEntity2.addAttribute(e2col2);
+
+ // try do use the merger to remove the relationship in the model
+ tokens = createMergeTokens();
+ assertTokens(tokens, 2, 0);
+ // TODO: reversing the following two tokens should also reverse the order
+ MergerToken token0 = tokens.get(0).createReverse(mergerFactory());
+ MergerToken token1 = tokens.get(1).createReverse(mergerFactory());
+ assertTrue(token0 instanceof DropColumnToModel);
+ assertTrue(token1 instanceof DropRelationshipToModel);
+ execute(token1);
+ execute(token0);
+ assertNull(dbEntity2.getAttribute(e2col2.getName()));
+ // TODO: assertTrue(dbEntity1.getRelationships().isEmpty());
+ assertTrue(dbEntity2.getRelationships().isEmpty());
+ // assertNull(objEntity.getAttribute(oatr1.getName()));
+ // TODO: test that relationship is gone
+
+
+ // clear up
+ DataContext ctxt = createDataContext();
+ dbEntity1.removeRelationship(rel1To2.getName());
+ dbEntity2.removeRelationship(rel2To1.getName());
+ map.removeObjEntity(objEntity1.getName(), true);
+ map.removeDbEntity(dbEntity1.getName(), true);
+ map.removeObjEntity(objEntity2.getName(), true);
+ map.removeDbEntity(dbEntity2.getName(), true);
+ ctxt.getEntityResolver().clearCache();
+ assertNull(map.getObjEntity(objEntity1.getName()));
+ assertNull(map.getDbEntity(dbEntity1.getName()));
+ assertNull(map.getObjEntity(objEntity2.getName()));
+ assertNull(map.getDbEntity(dbEntity2.getName()));
+ assertFalse(map.getDbEntities().contains(dbEntity1));
+ assertFalse(map.getDbEntities().contains(dbEntity2));
+
+ assertTokensAndExecute(2, 0);
+ assertTokensAndExecute(0, 0);
+ }
+}
Added: cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/java/org/apache/cayenne/merge/MergeCase.java
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/java/org/apache/cayenne/merge/MergeCase.java?rev=613170&view=auto
==============================================================================
--- cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/java/org/apache/cayenne/merge/MergeCase.java (added)
+++ cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/java/org/apache/cayenne/merge/MergeCase.java Fri Jan 18 06:23:57 2008
@@ -0,0 +1,242 @@
+/*****************************************************************
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ ****************************************************************/
+package org.apache.cayenne.merge;
+
+import java.sql.Connection;
+import java.sql.SQLException;
+import java.sql.Statement;
+import java.sql.Types;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+
+import org.apache.cayenne.access.DataNode;
+import org.apache.cayenne.access.QueryLogger;
+import org.apache.cayenne.dba.DbAdapter;
+import org.apache.cayenne.map.DataMap;
+import org.apache.cayenne.map.DbAttribute;
+import org.apache.cayenne.map.DbEntity;
+import org.apache.cayenne.unit.CayenneCase;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+
+public class MergeCase extends CayenneCase {
+
+ protected DataNode node;
+ protected DataMap map;
+
+ private final Log logObj = LogFactory.getLog(getClass());
+
+ private static List<String> tableNames = Arrays.asList(
+ "ARTIST",
+ "PAINTING",
+ "NEW_TABLE",
+ "NEW_TABLE2");
+
+ public DbMerger createMerger() {
+ return new DbMerger() {
+
+ @Override
+ public boolean includeTableName(String tableName) {
+ return tableNames.contains(tableName.toUpperCase());
+ }
+ };
+ }
+
+ public List<MergerToken> createMergeTokens() {
+ return createMerger().createMergeTokens(node, map);
+ }
+
+ @Override
+ protected void setUp() throws Exception {
+ super.setUp();
+
+ // getAccessStack().dropSchema();
+ // getAccessStack().dropPKSupport();
+
+ deleteTestData();
+ createTestData("testArtists");
+ node = getDomain().getDataNodes().iterator().next();
+ map = getDomain().getMap("testmap");
+
+ filterDataMap(node, map);
+
+ List<MergerToken> tokens = createMergeTokens();
+ execute(tokens);
+
+ assertTokensAndExecute(0, 0);
+ }
+
+ /**
+ * Remote binary pk {@link DbEntity} for {@link DbAdapter} not supporting that and so
+ * on.
+ */
+ private void filterDataMap(DataNode node, DataMap map) {
+ // copied from AbstractAccessStack.dbEntitiesInInsertOrder
+ boolean excludeLOB = !getAccessStackAdapter().supportsLobs();
+ boolean excludeBinPK = !getAccessStackAdapter().supportsBinaryPK();
+
+ if (!(excludeLOB || excludeBinPK)) {
+ return;
+ }
+
+ List<DbEntity> entitiesToRemove = new ArrayList<DbEntity>();
+
+ for (DbEntity ent : map.getDbEntities()) {
+
+ if (excludeBinPK) {
+ for (DbAttribute attr : ent.getAttributes()) {
+ // check for BIN PK or FK to BIN Pk
+ if (attr.getType() == Types.BINARY
+ || attr.getType() == Types.VARBINARY
+ || attr.getType() == Types.LONGVARBINARY) {
+
+ if (attr.isPrimaryKey() || attr.isForeignKey()) {
+ entitiesToRemove.add(ent);
+ break;
+ }
+ }
+ }
+
+ }
+ }
+
+ for (DbEntity e : entitiesToRemove) {
+ logObj.info("filter away " + e.getName());
+ map.removeDbEntity(e.getName(), true);
+ }
+
+ }
+
+ protected void execute(List<MergerToken> tokens) throws Exception {
+ MergerContext mergerContext = new ExecutingMergerContext(map, node);
+ for (MergerToken tok : tokens) {
+ tok.execute(mergerContext);
+ }
+ }
+
+ protected void execute(MergerToken token) throws Exception {
+ MergerContext mergerContext = new ExecutingMergerContext(map, node);
+ token.execute(mergerContext);
+ }
+
+ protected void executeSql(String sql) throws Exception {
+ Connection conn = null;
+ Statement st = null;
+ try {
+ QueryLogger.log(sql);
+ conn = getConnection();
+ st = conn.createStatement();
+ st.execute(sql);
+ }
+ catch (SQLException e) {
+ QueryLogger.logQueryError(e);
+ throw e;
+ }
+ finally {
+ if (st != null) {
+ st.close();
+ }
+ if (conn != null) {
+ conn.close();
+ }
+ }
+ }
+
+ protected void assertTokens(
+ List<MergerToken> tokens,
+ int expectedToDb,
+ int expectedToModel) {
+ int actualToDb = 0;
+ int actualToModel = 0;
+ for (MergerToken token : tokens) {
+ if (token.getDirection().isToDb()) {
+ actualToDb++;
+ }
+ else if (token.getDirection().isToModel()) {
+ actualToModel++;
+ }
+ }
+ logTokens(tokens);
+ assertEquals("tokens to db", expectedToDb, actualToDb);
+ assertEquals("tokens to model", expectedToModel, actualToModel);
+ }
+
+ protected void assertTokensAndExecute(
+ DataNode node,
+ DataMap map,
+ int expectedToDb,
+ int expectedToModel) {
+ List<MergerToken> tokens = createMergeTokens();
+
+ assertTokens(tokens, expectedToDb, expectedToModel);
+ if (!tokens.isEmpty()) {
+ try {
+ execute(tokens);
+ }
+ catch (Exception e) {
+ fail(e.getMessage());
+ }
+ }
+ }
+
+ protected void assertTokensAndExecute(int expectedToDb, int expectedToModel) {
+ List<MergerToken> tokens = createMergeTokens();
+
+ assertTokens(tokens, expectedToDb, expectedToModel);
+ if (!tokens.isEmpty()) {
+ try {
+ execute(tokens);
+ }
+ catch (Exception e) {
+ fail(e.getMessage());
+ }
+ }
+ }
+
+ protected void logTokens(List<MergerToken> tokens) {
+ for (MergerToken token : tokens) {
+ logObj.info("token: " + token.toString());
+ }
+ }
+
+ protected MergerFactory mergerFactory() {
+ return node.getAdapter().mergerFactory();
+ }
+
+ protected void dropTableIfPresent(DataNode node, String tableName) {
+ DbEntity entity = new DbEntity(tableName);
+ AbstractToDbToken t = (AbstractToDbToken) mergerFactory().createDropTableToDb(
+ entity);
+ try {
+ for (String sql : t.createSql(node.getAdapter())) {
+ executeSql(sql);
+ }
+ }
+ catch (Exception e) {
+ }
+ }
+
+ @Override
+ protected void tearDown() throws Exception {
+ super.tearDown();
+ // TODO: make this work deleteTestData();
+ }
+
+}
Modified: cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/java/org/apache/cayenne/merge/MergerFactoryTest.java
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/java/org/apache/cayenne/merge/MergerFactoryTest.java?rev=613170&r1=613169&r2=613170&view=diff
==============================================================================
--- cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/java/org/apache/cayenne/merge/MergerFactoryTest.java (original)
+++ cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/java/org/apache/cayenne/merge/MergerFactoryTest.java Fri Jan 18 06:23:57 2008
@@ -18,69 +18,18 @@
****************************************************************/
package org.apache.cayenne.merge;
-import java.sql.Connection;
-import java.sql.SQLException;
-import java.sql.Statement;
import java.sql.Types;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.List;
import org.apache.cayenne.CayenneDataObject;
import org.apache.cayenne.access.DataContext;
-import org.apache.cayenne.access.DataNode;
-import org.apache.cayenne.access.QueryLogger;
-import org.apache.cayenne.dba.DbAdapter;
-import org.apache.cayenne.map.DataMap;
import org.apache.cayenne.map.DbAttribute;
import org.apache.cayenne.map.DbEntity;
import org.apache.cayenne.map.DbJoin;
import org.apache.cayenne.map.DbRelationship;
import org.apache.cayenne.map.ObjAttribute;
import org.apache.cayenne.map.ObjEntity;
-import org.apache.cayenne.unit.CayenneCase;
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
-
-public class MergerFactoryTest extends CayenneCase {
-
- private DataNode node;
- private DataMap map;
-
- private List<String> tableNames = Arrays.asList("ARTIST", "PAINTING", "NEW_TABLE");
-
- private static final Log logObj = LogFactory.getLog(MergerFactoryTest.class);
-
- public DbMerger createMerger() {
- return new DbMerger() {
-
- @Override
- public boolean includeTableName(String tableName) {
- return tableNames.contains(tableName.toUpperCase());
- }
- };
- }
-
- @Override
- protected void setUp() throws Exception {
- super.setUp();
-
- // getAccessStack().dropSchema();
- // getAccessStack().dropPKSupport();
-
- deleteTestData();
- createTestData("testArtists");
- node = getDomain().getDataNodes().iterator().next();
- map = getDomain().getMap("testmap");
-
- filterDataMap(node, map);
-
- DbMerger merger = createMerger();
- List<MergerToken> tokens = merger.createMergeTokens(node, map);
- execute(map, node, tokens);
- assertTokensAndExecute(node, map, 0, 0);
- }
+public class MergerFactoryTest extends MergeCase {
public void testAddAndDropColumnToDb() throws Exception {
DbEntity dbEntity = map.getDbEntity("PAINTING");
@@ -349,139 +298,6 @@
assertTokensAndExecute(node, map, 1, 0);
assertTokensAndExecute(node, map, 0, 0);
- }
-
- private void assertTokensAndExecute(
- DataNode node,
- DataMap map,
- int expectedToDb,
- int expectedToModel) throws Exception {
- DbMerger merger = createMerger();
- List<MergerToken> tokens = merger.createMergeTokens(node, map);
-
- assertTokens(tokens, expectedToDb, expectedToModel);
- if (!tokens.isEmpty()) {
- execute(map, node, tokens);
- }
- }
-
- private void assertTokens(
- List<MergerToken> tokens,
- int expectedToDb,
- int expectedToModel) {
- int actualToDb = 0;
- int actualToModel = 0;
- for (MergerToken token : tokens) {
- if (token.getDirection().equals(MergeDirection.TO_DB)) {
- actualToDb++;
- }
- else if (token.getDirection().equals(MergeDirection.TO_MODEL)) {
- actualToModel++;
- }
- }
- logTokens(tokens);
- assertEquals("tokens to db", expectedToDb, actualToDb);
- assertEquals("tokens to model", expectedToModel, actualToModel);
- }
-
- private void logTokens(List<MergerToken> tokens) {
- for (MergerToken token : tokens) {
- logObj.info("token: " + token.toString());
- }
- }
-
- private void dropTableIfPresent(DataNode node, String tableName) {
- DbEntity entity = new DbEntity(tableName);
- AbstractToDbToken t = (AbstractToDbToken) node
- .getAdapter()
- .mergerFactory()
- .createDropTableToDb(entity);
- try {
- for (String sql : t.createSql(node.getAdapter())) {
- executeSql(sql);
- }
- }
- catch (Exception e) {
- }
- }
-
- /**
- * Remote binary pk {@link DbEntity} for {@link DbAdapter} not supporting that and so
- * on.
- */
- private void filterDataMap(DataNode node, DataMap map) {
- // copied from AbstractAccessStack.dbEntitiesInInsertOrder
- boolean excludeLOB = !getAccessStackAdapter().supportsLobs();
- boolean excludeBinPK = !getAccessStackAdapter().supportsBinaryPK();
-
- if (!(excludeLOB || excludeBinPK)) {
- return;
- }
-
- List<DbEntity> entitiesToRemove = new ArrayList<DbEntity>();
-
- for (DbEntity ent : map.getDbEntities()) {
-
- if (excludeBinPK) {
- for (DbAttribute attr : ent.getAttributes()) {
- // check for BIN PK or FK to BIN Pk
- if (attr.getType() == Types.BINARY
- || attr.getType() == Types.VARBINARY
- || attr.getType() == Types.LONGVARBINARY) {
-
- if (attr.isPrimaryKey() || attr.isForeignKey()) {
- entitiesToRemove.add(ent);
- break;
- }
- }
- }
-
- }
- }
-
- for (DbEntity e : entitiesToRemove) {
- logObj.info("filter away " + e.getName());
- map.removeDbEntity(e.getName(), true);
- }
-
- }
-
- private void execute(DataMap map, DataNode node, List<MergerToken> tokens)
- throws Exception {
- MergerContext mergerContext = new ExecutingMergerContext(map, node);
- for (MergerToken tok : tokens) {
- tok.execute(mergerContext);
- }
-
- }
-
- private void executeSql(String sql) throws Exception {
- Connection conn = null;
- Statement st = null;
- try {
- QueryLogger.log(sql);
- conn = getConnection();
- st = conn.createStatement();
- st.execute(sql);
- }
- catch (SQLException e) {
- QueryLogger.logQueryError(e);
- throw e;
- }
- finally {
- if (st != null) {
- st.close();
- }
- if (conn != null) {
- conn.close();
- }
- }
- }
-
- @Override
- protected void tearDown() throws Exception {
- super.tearDown();
- deleteTestData();
- }
+ }
}
Added: cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/resources/dml/merge.MergeCase.xml
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/resources/dml/merge.MergeCase.xml?rev=613170&view=auto
==============================================================================
--- cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/resources/dml/merge.MergeCase.xml (added)
+++ cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/resources/dml/merge.MergeCase.xml Fri Jan 18 06:23:57 2008
@@ -0,0 +1,35 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">
+
+<beans default-lazy-init="true">
+
+ <!-- ARTIST -->
+ <bean id="A1" class="org.apache.cayenne.unit.util.UpdatingSQLTemplate">
+ <constructor-arg type="java.lang.Class"><value>org.apache.art.Artist</value></constructor-arg>
+ <constructor-arg><value>
+ insert into ARTIST (ARTIST_ID, ARTIST_NAME) values (33001, 'artist1')
+ </value></constructor-arg>
+ </bean>
+
+ <bean id="A2" class="org.apache.cayenne.unit.util.UpdatingSQLTemplate">
+ <constructor-arg type="java.lang.Class"><value>org.apache.art.Artist</value></constructor-arg>
+ <constructor-arg><value>
+ insert into ARTIST (ARTIST_ID, ARTIST_NAME) values (33002, 'artist2')
+ </value></constructor-arg>
+ </bean>
+
+ <!-- ======================================= -->
+ <!-- Data Sets -->
+ <!-- ======================================= -->
+
+ <bean id="testArtists" class="java.util.ArrayList">
+ <constructor-arg>
+ <list>
+ <ref bean="A1"/>
+ <ref bean="A2"/>
+ </list>
+ </constructor-arg>
+ </bean>
+
+
+</beans>
\ No newline at end of file