You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cayenne.apache.org by nt...@apache.org on 2017/10/03 09:00:39 UTC

[1/3] cayenne git commit: Use boxed types for nullable primitive fields

Repository: cayenne
Updated Branches:
  refs/heads/master bfada3f1f -> 90327afa5


Use boxed types for nullable primitive fields


Project: http://git-wip-us.apache.org/repos/asf/cayenne/repo
Commit: http://git-wip-us.apache.org/repos/asf/cayenne/commit/f61b163b
Tree: http://git-wip-us.apache.org/repos/asf/cayenne/tree/f61b163b
Diff: http://git-wip-us.apache.org/repos/asf/cayenne/diff/f61b163b

Branch: refs/heads/master
Commit: f61b163b99733c14ffd7530eb2f3d0dfbdd53960
Parents: 75d1264
Author: Nikita Timofeev <st...@gmail.com>
Authored: Wed Sep 27 13:05:25 2017 +0300
Committer: Nikita Timofeev <st...@gmail.com>
Committed: Wed Sep 27 13:05:25 2017 +0300

----------------------------------------------------------------------
 .../resources/templates/v4_1/singleclass.vm     | 35 ++++++++++----
 .../main/resources/templates/v4_1/superclass.vm | 34 ++++++++-----
 .../cayenne/access/OptimisticLockingIT.java     | 50 ++++++++++++--------
 .../locking/auto/_SimpleLockingTestEntity.java  | 41 ++++++++++++++++
 .../primitive/auto/_PrimitivesTestEntity.java   | 22 ++++++---
 .../src/test/resources/cayenne-locking.xml      |  2 +
 .../src/test/resources/cayenne-primitive.xml    |  2 +
 .../src/test/resources/locking.map.xml          |  4 ++
 .../src/test/resources/primitive.map.xml        |  2 +-
 .../cayenne/modeler/CodeTemplateManager.java    | 12 +++--
 10 files changed, 152 insertions(+), 52 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cayenne/blob/f61b163b/cayenne-cgen/src/main/resources/templates/v4_1/singleclass.vm
----------------------------------------------------------------------
diff --git a/cayenne-cgen/src/main/resources/templates/v4_1/singleclass.vm b/cayenne-cgen/src/main/resources/templates/v4_1/singleclass.vm
index d1888e0..40d6ef0 100644
--- a/cayenne-cgen/src/main/resources/templates/v4_1/singleclass.vm
+++ b/cayenne-cgen/src/main/resources/templates/v4_1/singleclass.vm
@@ -101,7 +101,8 @@ public#if("true" == "${object.isAbstract()}") abstract#end class ${subClassName}
 ## Create Fields ##
 ###################
 #foreach( $attr in ${object.DeclaredAttributes} )
-#set ( $type = "$importUtils.formatJavaType(${attr.Type}, false)")
+## don't use primitive type if attribute is nullable
+#set ( $type = "$importUtils.formatJavaType(${attr.Type}, $attr.isMandatory())")
     protected $type $stringUtils.formatVariableName(${attr.Name});
 #end
 
@@ -114,10 +115,12 @@ public#if("true" == "${object.isAbstract()}") abstract#end class ${subClassName}
 #########################################################
 #foreach( $attr in ${object.DeclaredAttributes} )
 #set ( $name = "$stringUtils.formatVariableName(${attr.Name})")
+#set ( $type = "$importUtils.formatJavaType(${attr.Type})")
 ##
 ## setter
+##
 #if ("true" != "${object.isReadOnly()}")
-    public void set${stringUtils.capitalized($attr.Name)}($importUtils.formatJavaType(${attr.Type}) $name) {
+    public void set${stringUtils.capitalized($attr.Name)}($type $name) {
         beforePropertyWrite("${attr.Name}", this.$name, $name);
         this.$name = $name;
     }
@@ -125,16 +128,26 @@ public#if("true" == "${object.isAbstract()}") abstract#end class ${subClassName}
 #end
 ##
 ## getter
+##
 #if ( $importUtils.isBoolean(${attr.Type}) )
     public boolean is${stringUtils.capitalized($attr.Name)}() {
 #else
-    public $importUtils.formatJavaType(${attr.Type}) get${stringUtils.capitalized($attr.Name)}() {
+    public $type get${stringUtils.capitalized($attr.Name)}() {
 #end
         beforePropertyRead("${attr.Name}");
-        return this.$stringUtils.formatVariableName(${attr.Name});
+#if ($importUtils.isPrimitive($type) && !$attr.isMandatory())
+        if(this.$name == null) {
+#if ($importUtils.isBoolean($type))
+            return false;
+#else
+            return 0;
+#end
+        }
+#end
+        return this.$name;
     }
 
-#end
+#end## of foreach declared attribute
 ##
 ## Create list add/remove/get methods
 #foreach( $rel in ${object.DeclaredRelationships} )
@@ -214,10 +227,16 @@ public#if("true" == "${object.isAbstract()}") abstract#end class ${subClassName}
 
         switch (propName) {
 #foreach( $attr in ${object.DeclaredAttributes} )
-#set ( $type = "$importUtils.formatJavaType(${attr.Type}, false)")
+#set ( $type = "$importUtils.formatJavaType(${attr.Type}, $attr.isMandatory())")
 #set ( $name = "$stringUtils.formatVariableName(${attr.Name})")
             case "${attr.Name}":
+#if ( $importUtils.isBoolean($type) )
+                this.${name} = val == null ? false : ($type)val;
+#elseif ($importUtils.isPrimitive($type))
+                this.${name} = val == null ? 0 : ($type)val;
+#else
                 this.${name} = ($type)val;
+#end
                 break;
 #end
 #foreach( $rel in ${object.DeclaredRelationships} )
@@ -246,7 +265,7 @@ public#if("true" == "${object.isAbstract()}") abstract#end class ${subClassName}
         super.writeState(out);
 #foreach( $attr in ${object.DeclaredAttributes} )
 #set ( $name = "$stringUtils.formatVariableName(${attr.Name})")
-#set ( $type = "$importUtils.formatJavaType(${attr.Type})")
+#set ( $type = "$importUtils.formatJavaType(${attr.Type}, $attr.isMandatory())")
 #if($importUtils.isPrimitive($type))
         out.write${stringUtils.capitalized($type)}(this.$name);
 #else
@@ -263,7 +282,7 @@ public#if("true" == "${object.isAbstract()}") abstract#end class ${subClassName}
         super.readState(in);
 #foreach( $attr in ${object.DeclaredAttributes} )
 #set ( $name = "$stringUtils.formatVariableName(${attr.Name})")
-#set ( $type = "$importUtils.formatJavaType(${attr.Type})")
+#set ( $type = "$importUtils.formatJavaType(${attr.Type}, $attr.isMandatory())")
 #if($importUtils.isPrimitive($type))
         this.$name = in.read${stringUtils.capitalized($type)}();
 #else

http://git-wip-us.apache.org/repos/asf/cayenne/blob/f61b163b/cayenne-cgen/src/main/resources/templates/v4_1/superclass.vm
----------------------------------------------------------------------
diff --git a/cayenne-cgen/src/main/resources/templates/v4_1/superclass.vm b/cayenne-cgen/src/main/resources/templates/v4_1/superclass.vm
index 8f8bcfe..97c9716 100644
--- a/cayenne-cgen/src/main/resources/templates/v4_1/superclass.vm
+++ b/cayenne-cgen/src/main/resources/templates/v4_1/superclass.vm
@@ -109,7 +109,8 @@ public abstract class ${superClassName} extends ${baseClassName} {
 ## Create Fields ##
 ###################
 #foreach( $attr in ${object.DeclaredAttributes} )
-#set ( $type = "$importUtils.formatJavaType(${attr.Type})")
+## don't use primitive type if attribute is nullable
+#set ( $type = "$importUtils.formatJavaType(${attr.Type}, $attr.isMandatory())")
     protected $type $stringUtils.formatVariableName(${attr.Name});
 #end
 
@@ -122,10 +123,12 @@ public abstract class ${superClassName} extends ${baseClassName} {
 #########################################################
 #foreach( $attr in ${object.DeclaredAttributes} )
 #set ( $name = "$stringUtils.formatVariableName(${attr.Name})")
+#set ( $type = "$importUtils.formatJavaType(${attr.Type})")
 ##
 ## setter
+##
 #if ("true" != "${object.isReadOnly()}")
-    public void set${stringUtils.capitalized($attr.Name)}($importUtils.formatJavaType(${attr.Type}) $name) {
+    public void set${stringUtils.capitalized($attr.Name)}($type $name) {
         beforePropertyWrite("${attr.Name}", this.$name, $name);
         this.$name = $name;
     }
@@ -133,16 +136,26 @@ public abstract class ${superClassName} extends ${baseClassName} {
 #end
 ##
 ## getter
+##
 #if ( $importUtils.isBoolean(${attr.Type}) )
 	public boolean is${stringUtils.capitalized($attr.Name)}() {
 #else
-    public $importUtils.formatJavaType(${attr.Type}) get${stringUtils.capitalized($attr.Name)}() {
+    public $type get${stringUtils.capitalized($attr.Name)}() {
 #end
         beforePropertyRead("${attr.Name}");
-        return this.$stringUtils.formatVariableName(${attr.Name});
+#if ($importUtils.isPrimitive($type) && !$attr.isMandatory())
+        if(this.$name == null) {
+#if ($importUtils.isBoolean($type))
+            return false;
+#else
+            return 0;
+#end
+        }
+#end
+        return this.$name;
     }
 
-#end
+#end## of foreach declared attribute
 ##
 ## Create list add/remove/get methods
 #foreach( $rel in ${object.DeclaredRelationships} )
@@ -220,13 +233,12 @@ public abstract class ${superClassName} extends ${baseClassName} {
 
         switch (propName) {
 #foreach( $attr in ${object.DeclaredAttributes} )
-#set ( $type = "$importUtils.formatJavaType(${attr.Type}, false)")
-#set ( $realType = "$importUtils.formatJavaType(${attr.Type})")
+#set ( $type = "$importUtils.formatJavaType(${attr.Type}, $attr.isMandatory())")
 #set ( $name = "$stringUtils.formatVariableName(${attr.Name})")
             case "${attr.Name}":
-#if ( $importUtils.isBoolean($realType) )
+#if ( $importUtils.isBoolean($type) )
                 this.${name} = val == null ? false : ($type)val;
-#elseif ($importUtils.isPrimitive($realType))
+#elseif ($importUtils.isPrimitive($type))
                 this.${name} = val == null ? 0 : ($type)val;
 #else
                 this.${name} = ($type)val;
@@ -259,7 +271,7 @@ public abstract class ${superClassName} extends ${baseClassName} {
         super.writeState(out);
 #foreach( $attr in ${object.DeclaredAttributes} )
 #set ( $name = "$stringUtils.formatVariableName(${attr.Name})")
-#set ( $type = "$importUtils.formatJavaType(${attr.Type})")
+#set ( $type = "$importUtils.formatJavaType(${attr.Type}, $attr.isMandatory())")
 #if($importUtils.isPrimitive($type))
         out.write${stringUtils.capitalized($type)}(this.$name);
 #else
@@ -276,7 +288,7 @@ public abstract class ${superClassName} extends ${baseClassName} {
         super.readState(in);
 #foreach( $attr in ${object.DeclaredAttributes} )
 #set ( $name = "$stringUtils.formatVariableName(${attr.Name})")
-#set ( $type = "$importUtils.formatJavaType(${attr.Type})")
+#set ( $type = "$importUtils.formatJavaType(${attr.Type}, $attr.isMandatory())")
 #if($importUtils.isPrimitive($type))
         this.$name = in.read${stringUtils.capitalized($type)}();
 #else

http://git-wip-us.apache.org/repos/asf/cayenne/blob/f61b163b/cayenne-server/src/test/java/org/apache/cayenne/access/OptimisticLockingIT.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/test/java/org/apache/cayenne/access/OptimisticLockingIT.java b/cayenne-server/src/test/java/org/apache/cayenne/access/OptimisticLockingIT.java
index a34b803..f389f34 100644
--- a/cayenne-server/src/test/java/org/apache/cayenne/access/OptimisticLockingIT.java
+++ b/cayenne-server/src/test/java/org/apache/cayenne/access/OptimisticLockingIT.java
@@ -20,6 +20,7 @@
 package org.apache.cayenne.access;
 
 import org.apache.cayenne.di.Inject;
+import org.apache.cayenne.query.ObjectSelect;
 import org.apache.cayenne.query.Ordering;
 import org.apache.cayenne.query.SelectQuery;
 import org.apache.cayenne.query.SortOrder;
@@ -58,8 +59,8 @@ public class OptimisticLockingIT extends ServerCase {
     @Before
     public void setUp() throws Exception {
         tSimpleLockingTest = new TableHelper(dbHelper, "SIMPLE_LOCKING_TEST");
-        tSimpleLockingTest.setColumns("LOCKING_TEST_ID", "NAME", "DESCRIPTION")
-                .setColumnTypes(Types.INTEGER, Types.VARCHAR, Types.VARCHAR);
+        tSimpleLockingTest.setColumns("LOCKING_TEST_ID", "NAME", "DESCRIPTION", "INT_COLUMN_NOTNULL")
+                .setColumnTypes(Types.INTEGER, Types.VARCHAR, Types.VARCHAR, Types.INTEGER);
 
         tRelLockingTest = new TableHelper(dbHelper, "REL_LOCKING_TEST");
         tRelLockingTest.setColumns(
@@ -72,33 +73,21 @@ public class OptimisticLockingIT extends ServerCase {
     }
 
     protected void createSimpleLockingDataSet() throws Exception {
-        tLockingHelper.delete().execute();
-        tRelLockingTest.delete().execute();
-        tSimpleLockingTest.delete().execute();
-        tSimpleLockingTest.insert(1, "LockTest1", null);
+        tSimpleLockingTest.insert(1, "LockTest1", null, 1);
     }
 
     protected void createLockingOnNullDataSet() throws Exception {
-        tLockingHelper.delete().execute();
-        tRelLockingTest.delete().execute();
-        tSimpleLockingTest.delete().execute();
-        tSimpleLockingTest.insert(1, null, null);
+        tSimpleLockingTest.insert(1, null, null, 0);
     }
 
     protected void createLockingOnMixedDataSet() throws Exception {
-        tLockingHelper.delete().execute();
-        tRelLockingTest.delete().execute();
-        tSimpleLockingTest.delete().execute();
-        tSimpleLockingTest.insert(1, null, null);
-        tSimpleLockingTest.insert(2, "LockTest2", null);
-        tSimpleLockingTest.insert(3, "LockTest3", "Another Lock Test");
+        tSimpleLockingTest.insert(1, null, null, 1);
+        tSimpleLockingTest.insert(2, "LockTest2", null, 2);
+        tSimpleLockingTest.insert(3, "LockTest3", "Another Lock Test", 3);
     }
 
     protected void createLockingOnToOneDataSet() throws Exception {
-        tLockingHelper.delete().execute();
-        tRelLockingTest.delete().execute();
-        tSimpleLockingTest.delete().execute();
-        tSimpleLockingTest.insert(1, "LockTest1", null);
+        tSimpleLockingTest.insert(1, "LockTest1", null, 2);
         tRelLockingTest.insert(5, 1, "Rel Test 1");
         tLockingHelper.insert(1, 5, "Locking Helper 1");
     }
@@ -265,6 +254,27 @@ public class OptimisticLockingIT extends ServerCase {
     }
 
     @Test
+    public void testSuccessSimpleLockingNullablePrimitiveColumn() throws Exception {
+        createSimpleLockingDataSet();
+
+        SimpleLockingTestEntity object = ObjectSelect.query(SimpleLockingTestEntity.class).selectOne(context);
+
+        // we should have NULL value in primitive column
+        assertEquals(0, object.getIntColumnNull());
+        assertNull(object.readPropertyDirectly("intColumnNull"));
+
+        // change object and save... no optimistic lock failure expected
+        object.setDescription("first update");
+        object.setIntColumnNotnull(2);
+        context.commitChanges();
+
+        // update values once more
+        object.setDescription("second update");
+        object.setIntColumnNull(3);
+        context.commitChanges();
+    }
+
+    @Test
     public void testSuccessSimpleLockingOnUpdateFollowedByInvalidate() throws Exception {
         createSimpleLockingDataSet();
 

http://git-wip-us.apache.org/repos/asf/cayenne/blob/f61b163b/cayenne-server/src/test/java/org/apache/cayenne/testdo/locking/auto/_SimpleLockingTestEntity.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/test/java/org/apache/cayenne/testdo/locking/auto/_SimpleLockingTestEntity.java b/cayenne-server/src/test/java/org/apache/cayenne/testdo/locking/auto/_SimpleLockingTestEntity.java
index a74e312..47ce6e0 100644
--- a/cayenne-server/src/test/java/org/apache/cayenne/testdo/locking/auto/_SimpleLockingTestEntity.java
+++ b/cayenne-server/src/test/java/org/apache/cayenne/testdo/locking/auto/_SimpleLockingTestEntity.java
@@ -20,9 +20,13 @@ public abstract class _SimpleLockingTestEntity extends BaseDataObject {
     public static final String LOCKING_TEST_ID_PK_COLUMN = "LOCKING_TEST_ID";
 
     public static final Property<String> DESCRIPTION = Property.create("description", String.class);
+    public static final Property<Integer> INT_COLUMN_NOTNULL = Property.create("intColumnNotnull", Integer.class);
+    public static final Property<Integer> INT_COLUMN_NULL = Property.create("intColumnNull", Integer.class);
     public static final Property<String> NAME = Property.create("name", String.class);
 
     protected String description;
+    protected int intColumnNotnull;
+    protected Integer intColumnNull;
     protected String name;
 
 
@@ -36,6 +40,29 @@ public abstract class _SimpleLockingTestEntity extends BaseDataObject {
         return this.description;
     }
 
+    public void setIntColumnNotnull(int intColumnNotnull) {
+        beforePropertyWrite("intColumnNotnull", this.intColumnNotnull, intColumnNotnull);
+        this.intColumnNotnull = intColumnNotnull;
+    }
+
+    public int getIntColumnNotnull() {
+        beforePropertyRead("intColumnNotnull");
+        return this.intColumnNotnull;
+    }
+
+    public void setIntColumnNull(int intColumnNull) {
+        beforePropertyWrite("intColumnNull", this.intColumnNull, intColumnNull);
+        this.intColumnNull = intColumnNull;
+    }
+
+    public int getIntColumnNull() {
+        beforePropertyRead("intColumnNull");
+        if(this.intColumnNull == null) {
+            return 0;
+        }
+        return this.intColumnNull;
+    }
+
     public void setName(String name) {
         beforePropertyWrite("name", this.name, name);
         this.name = name;
@@ -55,6 +82,10 @@ public abstract class _SimpleLockingTestEntity extends BaseDataObject {
         switch(propName) {
             case "description":
                 return this.description;
+            case "intColumnNotnull":
+                return this.intColumnNotnull;
+            case "intColumnNull":
+                return this.intColumnNull;
             case "name":
                 return this.name;
             default:
@@ -72,6 +103,12 @@ public abstract class _SimpleLockingTestEntity extends BaseDataObject {
             case "description":
                 this.description = (String)val;
                 break;
+            case "intColumnNotnull":
+                this.intColumnNotnull = val == null ? 0 : (int)val;
+                break;
+            case "intColumnNull":
+                this.intColumnNull = (Integer)val;
+                break;
             case "name":
                 this.name = (String)val;
                 break;
@@ -92,6 +129,8 @@ public abstract class _SimpleLockingTestEntity extends BaseDataObject {
     protected void writeState(ObjectOutputStream out) throws IOException {
         super.writeState(out);
         out.writeObject(this.description);
+        out.writeInt(this.intColumnNotnull);
+        out.writeObject(this.intColumnNull);
         out.writeObject(this.name);
     }
 
@@ -99,6 +138,8 @@ public abstract class _SimpleLockingTestEntity extends BaseDataObject {
     protected void readState(ObjectInputStream in) throws IOException, ClassNotFoundException {
         super.readState(in);
         this.description = (String)in.readObject();
+        this.intColumnNotnull = in.readInt();
+        this.intColumnNull = (Integer)in.readObject();
         this.name = (String)in.readObject();
     }
 

http://git-wip-us.apache.org/repos/asf/cayenne/blob/f61b163b/cayenne-server/src/test/java/org/apache/cayenne/testdo/primitive/auto/_PrimitivesTestEntity.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/test/java/org/apache/cayenne/testdo/primitive/auto/_PrimitivesTestEntity.java b/cayenne-server/src/test/java/org/apache/cayenne/testdo/primitive/auto/_PrimitivesTestEntity.java
index 6750a4f..1493844 100644
--- a/cayenne-server/src/test/java/org/apache/cayenne/testdo/primitive/auto/_PrimitivesTestEntity.java
+++ b/cayenne-server/src/test/java/org/apache/cayenne/testdo/primitive/auto/_PrimitivesTestEntity.java
@@ -23,8 +23,8 @@ public abstract class _PrimitivesTestEntity extends BaseDataObject {
     public static final Property<Character> CHAR_COLUMN = Property.create("charColumn", Character.class);
     public static final Property<Integer> INT_COLUMN = Property.create("intColumn", Integer.class);
 
-    protected boolean booleanColumn;
-    protected char charColumn;
+    protected Boolean booleanColumn;
+    protected Character charColumn;
     protected int intColumn;
 
 
@@ -35,6 +35,9 @@ public abstract class _PrimitivesTestEntity extends BaseDataObject {
 
 	public boolean isBooleanColumn() {
         beforePropertyRead("booleanColumn");
+        if(this.booleanColumn == null) {
+            return false;
+        }
         return this.booleanColumn;
     }
 
@@ -45,6 +48,9 @@ public abstract class _PrimitivesTestEntity extends BaseDataObject {
 
     public char getCharColumn() {
         beforePropertyRead("charColumn");
+        if(this.charColumn == null) {
+            return 0;
+        }
         return this.charColumn;
     }
 
@@ -84,13 +90,13 @@ public abstract class _PrimitivesTestEntity extends BaseDataObject {
 
         switch (propName) {
             case "booleanColumn":
-                this.booleanColumn = val == null ? false : (Boolean)val;
+                this.booleanColumn = (Boolean)val;
                 break;
             case "charColumn":
-                this.charColumn = val == null ? 0 : (Character)val;
+                this.charColumn = (Character)val;
                 break;
             case "intColumn":
-                this.intColumn = val == null ? 0 : (Integer)val;
+                this.intColumn = val == null ? 0 : (int)val;
                 break;
             default:
                 super.writePropertyDirectly(propName, val);
@@ -108,14 +114,16 @@ public abstract class _PrimitivesTestEntity extends BaseDataObject {
     @Override
     protected void writeState(ObjectOutputStream out) throws IOException {
         super.writeState(out);
-        out.writeBoolean(this.booleanColumn);
+        out.writeObject(this.booleanColumn);
+        out.writeObject(this.charColumn);
         out.writeInt(this.intColumn);
     }
 
     @Override
     protected void readState(ObjectInputStream in) throws IOException, ClassNotFoundException {
         super.readState(in);
-        this.booleanColumn = in.readBoolean();
+        this.booleanColumn = (Boolean)in.readObject();
+        this.charColumn = (Character)in.readObject();
         this.intColumn = in.readInt();
     }
 

http://git-wip-us.apache.org/repos/asf/cayenne/blob/f61b163b/cayenne-server/src/test/resources/cayenne-locking.xml
----------------------------------------------------------------------
diff --git a/cayenne-server/src/test/resources/cayenne-locking.xml b/cayenne-server/src/test/resources/cayenne-locking.xml
index 7a12f1d..8a7c266 100644
--- a/cayenne-server/src/test/resources/cayenne-locking.xml
+++ b/cayenne-server/src/test/resources/cayenne-locking.xml
@@ -1,5 +1,7 @@
 <?xml version="1.0" encoding="utf-8"?>
 <domain xmlns="http://cayenne.apache.org/schema/10/domain"
+	 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+	 xsi:schemaLocation="http://cayenne.apache.org/schema/10/domain http://cayenne.apache.org/schema/10/domain.xsd"
 	 project-version="10">
 	<map name="locking"/>
 </domain>

http://git-wip-us.apache.org/repos/asf/cayenne/blob/f61b163b/cayenne-server/src/test/resources/cayenne-primitive.xml
----------------------------------------------------------------------
diff --git a/cayenne-server/src/test/resources/cayenne-primitive.xml b/cayenne-server/src/test/resources/cayenne-primitive.xml
index 35c4154..9ec85b7 100644
--- a/cayenne-server/src/test/resources/cayenne-primitive.xml
+++ b/cayenne-server/src/test/resources/cayenne-primitive.xml
@@ -1,5 +1,7 @@
 <?xml version="1.0" encoding="utf-8"?>
 <domain xmlns="http://cayenne.apache.org/schema/10/domain"
+	 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+	 xsi:schemaLocation="http://cayenne.apache.org/schema/10/domain http://cayenne.apache.org/schema/10/domain.xsd"
 	 project-version="10">
 	<map name="primitive"/>
 </domain>

http://git-wip-us.apache.org/repos/asf/cayenne/blob/f61b163b/cayenne-server/src/test/resources/locking.map.xml
----------------------------------------------------------------------
diff --git a/cayenne-server/src/test/resources/locking.map.xml b/cayenne-server/src/test/resources/locking.map.xml
index 54df6d1..cba073c 100644
--- a/cayenne-server/src/test/resources/locking.map.xml
+++ b/cayenne-server/src/test/resources/locking.map.xml
@@ -16,6 +16,8 @@
 	</db-entity>
 	<db-entity name="SIMPLE_LOCKING_TEST">
 		<db-attribute name="DESCRIPTION" type="VARCHAR" length="200"/>
+		<db-attribute name="INT_COLUMN_NOTNULL" type="INTEGER" isMandatory="true"/>
+		<db-attribute name="INT_COLUMN_NULL" type="INTEGER"/>
 		<db-attribute name="LOCKING_TEST_ID" type="INTEGER" isPrimaryKey="true" isMandatory="true"/>
 		<db-attribute name="NAME" type="VARCHAR" length="100"/>
 	</db-entity>
@@ -27,6 +29,8 @@
 	</obj-entity>
 	<obj-entity name="SimpleLockingTestEntity" className="org.apache.cayenne.testdo.locking.SimpleLockingTestEntity" lock-type="optimistic" dbEntityName="SIMPLE_LOCKING_TEST">
 		<obj-attribute name="description" type="java.lang.String" db-attribute-path="DESCRIPTION"/>
+		<obj-attribute name="intColumnNotnull" type="int" lock="true" db-attribute-path="INT_COLUMN_NOTNULL"/>
+		<obj-attribute name="intColumnNull" type="int" lock="true" db-attribute-path="INT_COLUMN_NULL"/>
 		<obj-attribute name="name" type="java.lang.String" lock="true" db-attribute-path="NAME"/>
 	</obj-entity>
 	<db-relationship name="toRelLockingTest" source="LOCKING_HELPER" target="REL_LOCKING_TEST">

http://git-wip-us.apache.org/repos/asf/cayenne/blob/f61b163b/cayenne-server/src/test/resources/primitive.map.xml
----------------------------------------------------------------------
diff --git a/cayenne-server/src/test/resources/primitive.map.xml b/cayenne-server/src/test/resources/primitive.map.xml
index 965b717..35df1d7 100644
--- a/cayenne-server/src/test/resources/primitive.map.xml
+++ b/cayenne-server/src/test/resources/primitive.map.xml
@@ -12,7 +12,7 @@
 		<db-attribute name="BOOLEAN_COLUMN" type="BOOLEAN"/>
 		<db-attribute name="CHAR_COLUMN" type="CHAR" length="1"/>
 		<db-attribute name="ID" type="INTEGER" isPrimaryKey="true" isMandatory="true"/>
-		<db-attribute name="INT_COLUMN" type="INTEGER"/>
+		<db-attribute name="INT_COLUMN" type="INTEGER" isMandatory="true"/>
 	</db-entity>
 	<obj-entity name="PrimitivesTestEntity" className="org.apache.cayenne.testdo.primitive.PrimitivesTestEntity" dbEntityName="PRIMITIVES_TEST">
 		<obj-attribute name="booleanColumn" type="boolean" db-attribute-path="BOOLEAN_COLUMN"/>

http://git-wip-us.apache.org/repos/asf/cayenne/blob/f61b163b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/CodeTemplateManager.java
----------------------------------------------------------------------
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/CodeTemplateManager.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/CodeTemplateManager.java
index b914b9b..c72934d 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/CodeTemplateManager.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/CodeTemplateManager.java
@@ -39,6 +39,7 @@ public class CodeTemplateManager {
 
 	public static final String STANDARD_SERVER_SUPERCLASS = "Standard Server Superclass";
 	public static final String STANDARD_SERVER_SUBCLASS = "Standard Server Subclass";
+	public static final String SINGLE_SERVER_CLASS = "Single Server class";
 	static final String STANDARD_CLIENT_SUPERCLASS = "Standard Client Superclass";
 	static final String STANDARD_CLIENT_SUBCLASS = "Standard Client Subclass";
 
@@ -64,6 +65,7 @@ public class CodeTemplateManager {
 		standardSubclassTemplates = new ArrayList<>(3);
 		standardSubclassTemplates.add(STANDARD_SERVER_SUBCLASS);
 		standardSubclassTemplates.add(STANDARD_CLIENT_SUBCLASS);
+		standardSubclassTemplates.add(SINGLE_SERVER_CLASS);
 
 		updateCustomTemplates(getTemplatePreferences(application));
 
@@ -72,23 +74,23 @@ public class CodeTemplateManager {
 		standardTemplates.put(STANDARD_CLIENT_SUPERCLASS, ClientClassGenerationAction.SUPERCLASS_TEMPLATE);
 		standardTemplates.put(STANDARD_SERVER_SUBCLASS, ClassGenerationAction.SUBCLASS_TEMPLATE);
 		standardTemplates.put(STANDARD_CLIENT_SUBCLASS, ClientClassGenerationAction.SUBCLASS_TEMPLATE);
+		standardTemplates.put(SINGLE_SERVER_CLASS, ClassGenerationAction.SINGLE_CLASS_TEMPLATE);
 	}
 
 	/**
 	 * Updates custom templates from preferences.
 	 */
 	public void updateCustomTemplates(Preferences preference) {
-		String[] keys = null;
+		String[] keys = {};
 		try {
 			keys = preference.childrenNames();
 		} catch (BackingStoreException e) {
 			logger.warn("Error reading preferences");
 		}
 		this.customTemplates = new HashMap<>(keys.length, 1);
-
-		for (int j = 0; j < keys.length; j++) {
-			FSPath path = new FSPath(preference.node(keys[j]));
-			customTemplates.put(keys[j], path.getPath());
+		for (String key : keys) {
+			FSPath path = new FSPath(preference.node(key));
+			customTemplates.put(key, path.getPath());
 		}
 	}
 


[3/3] cayenne git commit: Merge remote-tracking branch 'remotes/parent/pr/243' into asf-master

Posted by nt...@apache.org.
Merge remote-tracking branch 'remotes/parent/pr/243' into asf-master


Project: http://git-wip-us.apache.org/repos/asf/cayenne/repo
Commit: http://git-wip-us.apache.org/repos/asf/cayenne/commit/90327afa
Tree: http://git-wip-us.apache.org/repos/asf/cayenne/tree/90327afa
Diff: http://git-wip-us.apache.org/repos/asf/cayenne/diff/90327afa

Branch: refs/heads/master
Commit: 90327afa5676c7b4f454a70f2ab0a6494d074b07
Parents: bfada3f 6c871b3
Author: Nikita Timofeev <st...@gmail.com>
Authored: Tue Oct 3 11:58:40 2017 +0300
Committer: Nikita Timofeev <st...@gmail.com>
Committed: Tue Oct 3 11:58:40 2017 +0300

----------------------------------------------------------------------
 .../resources/templates/v4_1/singleclass.vm     | 35 ++++++++++----
 .../main/resources/templates/v4_1/superclass.vm | 34 ++++++++-----
 .../cayenne/access/OptimisticLockingIT.java     | 50 ++++++++++++--------
 .../batch/InsertBatchTranslatorIT.java          | 11 +++--
 .../locking/auto/_SimpleLockingTestEntity.java  | 41 ++++++++++++++++
 .../primitive/auto/_PrimitivesTestEntity.java   | 22 ++++++---
 .../src/test/resources/cayenne-locking.xml      |  2 +
 .../src/test/resources/cayenne-primitive.xml    |  2 +
 .../src/test/resources/locking.map.xml          |  4 ++
 .../src/test/resources/primitive.map.xml        |  2 +-
 .../cayenne/modeler/CodeTemplateManager.java    | 12 +++--
 11 files changed, 159 insertions(+), 56 deletions(-)
----------------------------------------------------------------------



[2/3] cayenne git commit: Use boxed types for nullable primitive fields

Posted by nt...@apache.org.
Use boxed types for nullable primitive fields


Project: http://git-wip-us.apache.org/repos/asf/cayenne/repo
Commit: http://git-wip-us.apache.org/repos/asf/cayenne/commit/6c871b3f
Tree: http://git-wip-us.apache.org/repos/asf/cayenne/tree/6c871b3f
Diff: http://git-wip-us.apache.org/repos/asf/cayenne/diff/6c871b3f

Branch: refs/heads/master
Commit: 6c871b3f68294a909b5feb573e237cd0fada753e
Parents: f61b163
Author: Nikita Timofeev <st...@gmail.com>
Authored: Wed Sep 27 14:11:04 2017 +0300
Committer: Nikita Timofeev <st...@gmail.com>
Committed: Wed Sep 27 14:11:04 2017 +0300

----------------------------------------------------------------------
 .../access/translator/batch/InsertBatchTranslatorIT.java | 11 +++++++----
 1 file changed, 7 insertions(+), 4 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cayenne/blob/6c871b3f/cayenne-server/src/test/java/org/apache/cayenne/access/translator/batch/InsertBatchTranslatorIT.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/test/java/org/apache/cayenne/access/translator/batch/InsertBatchTranslatorIT.java b/cayenne-server/src/test/java/org/apache/cayenne/access/translator/batch/InsertBatchTranslatorIT.java
index ce66e95..93371f2 100644
--- a/cayenne-server/src/test/java/org/apache/cayenne/access/translator/batch/InsertBatchTranslatorIT.java
+++ b/cayenne-server/src/test/java/org/apache/cayenne/access/translator/batch/InsertBatchTranslatorIT.java
@@ -71,7 +71,7 @@ public class InsertBatchTranslatorIT extends ServerCase {
         InsertBatchTranslator builder = new InsertBatchTranslator(insertQuery, adapter);
         String generatedSql = builder.getSql();
         assertNotNull(generatedSql);
-        assertEquals("INSERT INTO " + entity.getName() + " (DESCRIPTION, LOCKING_TEST_ID, NAME) VALUES (?, ?, ?)",
+        assertEquals("INSERT INTO " + entity.getName() + " (DESCRIPTION, INT_COLUMN_NOTNULL, INT_COLUMN_NULL, LOCKING_TEST_ID, NAME) VALUES (?, ?, ?, ?, ?)",
                 generatedSql);
     }
 
@@ -91,9 +91,12 @@ public class InsertBatchTranslatorIT extends ServerCase {
             String charStart = unitAdapter.getIdentifiersStartQuote();
             String charEnd = unitAdapter.getIdentifiersEndQuote();
             assertNotNull(generatedSql);
-            assertEquals("INSERT INTO " + charStart + entity.getName() + charEnd + " (" + charStart + "DESCRIPTION"
-                    + charEnd + ", " + charStart + "LOCKING_TEST_ID" + charEnd + ", " + charStart + "NAME" + charEnd
-                    + ") VALUES (?, ?, ?)", generatedSql);
+            assertEquals("INSERT INTO " + charStart + entity.getName() + charEnd
+                    + " (" + charStart + "DESCRIPTION" + charEnd + ", "
+                    + charStart + "INT_COLUMN_NOTNULL" + charEnd + ", "
+                    + charStart + "INT_COLUMN_NULL" + charEnd + ", "
+                    + charStart + "LOCKING_TEST_ID" + charEnd + ", "
+                    + charStart + "NAME" + charEnd + ") VALUES (?, ?, ?, ?, ?)", generatedSql);
         } finally {
             entity.getDataMap().setQuotingSQLIdentifiers(false);
         }