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/20 01:34:29 UTC
svn commit: r613485 - in
/cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src:
main/java/org/apache/cayenne/merge/CreateTableToModel.java
test/java/org/apache/cayenne/merge/CreateTableToModelTest.java
Author: torehalset
Date: Sat Jan 19 16:34:28 2008
New Revision: 613485
URL: http://svn.apache.org/viewvc?rev=613485&view=rev
Log:
CAY-885: merge changes between model and db
CreateTableToModel now creates ObjEntity as well
Added:
cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/java/org/apache/cayenne/merge/CreateTableToModelTest.java
Modified:
cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/merge/CreateTableToModel.java
Modified: cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/merge/CreateTableToModel.java
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/merge/CreateTableToModel.java?rev=613485&r1=613484&r2=613485&view=diff
==============================================================================
--- cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/merge/CreateTableToModel.java (original)
+++ cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/merge/CreateTableToModel.java Sat Jan 19 16:34:28 2008
@@ -18,8 +18,12 @@
****************************************************************/
package org.apache.cayenne.merge;
+import org.apache.cayenne.CayenneDataObject;
import org.apache.cayenne.map.DataMap;
import org.apache.cayenne.map.DbEntity;
+import org.apache.cayenne.map.ObjEntity;
+import org.apache.cayenne.util.NameConverter;
+import org.apache.cayenne.util.Util;
/**
* A {@link MergerToken} to add a {@link DbEntity} to a {@link DataMap}
@@ -30,12 +34,57 @@
private DbEntity entity;
+ private String objEntityClassName = CayenneDataObject.class.getName();
+
public CreateTableToModel(DbEntity entity) {
this.entity = entity;
}
+ /**
+ * Set the {@link ObjEntity} className if {@link ObjEntity} should be generated with a
+ * special class name. Set to null if the {@link ObjEntity} should be created with a
+ * name based on {@link DataMap#getDefaultPackage()} and {@link ObjEntity#getName()}
+ * <p>
+ * The default value is the class name of {@link CayenneDataObject}
+ */
+ public void setObjEntityClassName(String n) {
+ objEntityClassName = n;
+ }
+
public void execute(MergerContext mergerContext) {
- mergerContext.getDataMap().addDbEntity(entity);
+ DataMap map = mergerContext.getDataMap();
+ map.addDbEntity(entity);
+
+ // create a ObjEntity
+ String objEntityName = NameConverter.underscoredToJava(entity.getName(), true);
+ // this loop will terminate even if no valid name is found
+ // to prevent loader from looping forever (though such case is very unlikely)
+ String baseName = objEntityName;
+ for (int i = 1; i < 1000 && map.getObjEntity(objEntityName) != null; i++) {
+ objEntityName = baseName + i;
+ }
+
+ ObjEntity objEntity = new ObjEntity(objEntityName);
+ objEntity.setDbEntity(entity);
+
+ // try to find a class name for the ObjEntity
+ String className = objEntityClassName;
+ if (className == null) {
+ // we should generate a className based on the objEntityName
+ String packageName = map.getDefaultPackage();
+ if (Util.isEmptyString(packageName)) {
+ packageName = "";
+ }
+ else if (!packageName.endsWith(".")) {
+ packageName = packageName + ".";
+ }
+ className = packageName + objEntityName;
+ }
+
+ objEntity.setClassName(className);
+ map.addObjEntity(objEntity);
+
+ synchronizeWithObjEntity(entity);
}
public String getTokenName() {
Added: cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/java/org/apache/cayenne/merge/CreateTableToModelTest.java
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/java/org/apache/cayenne/merge/CreateTableToModelTest.java?rev=613485&view=auto
==============================================================================
--- cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/java/org/apache/cayenne/merge/CreateTableToModelTest.java (added)
+++ cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/java/org/apache/cayenne/merge/CreateTableToModelTest.java Sat Jan 19 16:34:28 2008
@@ -0,0 +1,91 @@
+/*****************************************************************
+ * 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.Collections;
+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.ObjEntity;
+
+public class CreateTableToModelTest extends MergeCase {
+
+ public void testAddTable() 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);
+
+ // for the new entity to the db
+ execute(mergerFactory().createCreateTableToDb(dbEntity));
+
+ List<MergerToken> tokens = createMergeTokens();
+ assertEquals(1, tokens.size());
+ MergerToken token = tokens.get(0);
+ if (token.getDirection().isToDb()) {
+ token = token.createReverse(mergerFactory());
+ }
+ assertTrue(token.getClass().getName(), token instanceof CreateTableToModel);
+ logTokens(Collections.singletonList(token));
+ execute(token);
+
+ ObjEntity objEntity = null;
+ for (ObjEntity candiate : map.getObjEntities()) {
+ if (candiate.getDbEntity().getName().equalsIgnoreCase(dbEntity.getName())) {
+ objEntity = candiate;
+ break;
+ }
+ }
+ assertNotNull(objEntity);
+
+ assertEquals(1, objEntity.getAttributes().size());
+ assertEquals("java.lang.String", objEntity
+ .getAttributes()
+ .iterator()
+ .next()
+ .getType());
+
+ 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);
+ }
+
+}