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);
+    }
+
+}