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 2018/10/19 12:23:26 UTC

[4/7] cayenne git commit: CAY-2478 cgen: Generate properties for PK optional PK properties generation

CAY-2478 cgen: Generate properties for PK
  optional PK properties generation


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

Branch: refs/heads/master
Commit: 8e75733bf652c5d2d59c7532c3ebabd2d89bcc3e
Parents: c0a6190
Author: Nikita Timofeev <st...@gmail.com>
Authored: Fri Oct 19 14:58:23 2018 +0300
Committer: Nikita Timofeev <st...@gmail.com>
Committed: Fri Oct 19 14:58:23 2018 +0300

----------------------------------------------------------------------
 .../java/org/apache/cayenne/gen/Artifact.java   | 21 ++++++++++----------
 .../cayenne/gen/ClassGenerationAction.java      | 20 +++++++++++++++++++
 .../org/apache/cayenne/gen/EntityUtils.java     |  5 ++++-
 .../org/apache/cayenne/gen/ImportUtils.java     | 13 ++++++++++++
 .../resources/templates/v4_1/singleclass.vm     | 16 ++++++++++-----
 .../main/resources/templates/v4_1/superclass.vm | 15 +++++++++-----
 .../dialog/codegen/CustomModeController.java    |  4 ++++
 .../modeler/dialog/codegen/CustomModePanel.java |  8 ++++++++
 .../codegen/CustomPreferencesUpdater.java       | 18 ++++++++++++++++-
 9 files changed, 98 insertions(+), 22 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cayenne/blob/8e75733b/cayenne-cgen/src/main/java/org/apache/cayenne/gen/Artifact.java
----------------------------------------------------------------------
diff --git a/cayenne-cgen/src/main/java/org/apache/cayenne/gen/Artifact.java b/cayenne-cgen/src/main/java/org/apache/cayenne/gen/Artifact.java
index fcd9118..d16bf6e 100644
--- a/cayenne-cgen/src/main/java/org/apache/cayenne/gen/Artifact.java
+++ b/cayenne-cgen/src/main/java/org/apache/cayenne/gen/Artifact.java
@@ -28,20 +28,21 @@ import org.apache.velocity.VelocityContext;
  */
 public interface Artifact {
 
-    public static String STRING_UTILS_KEY = "stringUtils";
-    public static String IMPORT_UTILS_KEY = "importUtils";
+    String STRING_UTILS_KEY = "stringUtils";
+    String IMPORT_UTILS_KEY = "importUtils";
 
     /**
      * Root object, such as ObjEntity or Embeddable, etc.
      */
-    public static String OBJECT_KEY = "object";
-    public static String SUPER_CLASS_KEY = "superClassName";
-    public static String SUPER_PACKAGE_KEY = "superPackageName";
-    public static String SUB_CLASS_KEY = "subClassName";
-    public static String SUB_PACKAGE_KEY = "subPackageName";
-    public static String BASE_CLASS_KEY = "baseClassName";
-    public static String BASE_PACKAGE_KEY = "basePackageName";
-    public static String CREATE_PROPERTY_NAMES = "createPropertyNames";
+    String OBJECT_KEY = "object";
+    String SUPER_CLASS_KEY = "superClassName";
+    String SUPER_PACKAGE_KEY = "superPackageName";
+    String SUB_CLASS_KEY = "subClassName";
+    String SUB_PACKAGE_KEY = "subPackageName";
+    String BASE_CLASS_KEY = "baseClassName";
+    String BASE_PACKAGE_KEY = "basePackageName";
+    String CREATE_PROPERTY_NAMES = "createPropertyNames";
+    String CREATE_PK_PROPERTIES = "createPKProperties";
 
     TemplateType[] getTemplateTypes(ArtifactGenerationMode mode);
 

http://git-wip-us.apache.org/repos/asf/cayenne/blob/8e75733b/cayenne-cgen/src/main/java/org/apache/cayenne/gen/ClassGenerationAction.java
----------------------------------------------------------------------
diff --git a/cayenne-cgen/src/main/java/org/apache/cayenne/gen/ClassGenerationAction.java b/cayenne-cgen/src/main/java/org/apache/cayenne/gen/ClassGenerationAction.java
index ecaddac..0eaf66b 100644
--- a/cayenne-cgen/src/main/java/org/apache/cayenne/gen/ClassGenerationAction.java
+++ b/cayenne-cgen/src/main/java/org/apache/cayenne/gen/ClassGenerationAction.java
@@ -82,6 +82,11 @@ public class ClassGenerationAction {
 	protected boolean createPropertyNames;
 	protected boolean force; // force run generator
 
+	/**
+	 * @since 4.1
+	 */
+	protected boolean createPKProperties;
+
 	// runtime ivars
 	protected VelocityContext context;
 	protected Map<String, Template> templateCache;
@@ -189,6 +194,7 @@ public class ClassGenerationAction {
 		context.put(Artifact.STRING_UTILS_KEY, stringUtils);
 
 		context.put(Artifact.CREATE_PROPERTY_NAMES, createPropertyNames);
+		context.put(Artifact.CREATE_PK_PROPERTIES, createPKProperties);
 	}
 
 	/**
@@ -585,4 +591,18 @@ public class ClassGenerationAction {
 	public void setForce(boolean force) {
 		this.force = force;
 	}
+
+	/**
+	 * @since 4.1
+	 */
+	public boolean isCreatePKProperties() {
+		return createPKProperties;
+	}
+
+	/**
+	 * @since 4.1
+	 */
+	public void setCreatePKProperties(boolean createPKProperties) {
+		this.createPKProperties = createPKProperties;
+	}
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/8e75733b/cayenne-cgen/src/main/java/org/apache/cayenne/gen/EntityUtils.java
----------------------------------------------------------------------
diff --git a/cayenne-cgen/src/main/java/org/apache/cayenne/gen/EntityUtils.java b/cayenne-cgen/src/main/java/org/apache/cayenne/gen/EntityUtils.java
index 51eefdc..e5ea590 100644
--- a/cayenne-cgen/src/main/java/org/apache/cayenne/gen/EntityUtils.java
+++ b/cayenne-cgen/src/main/java/org/apache/cayenne/gen/EntityUtils.java
@@ -24,7 +24,9 @@ import java.util.Objects;
 
 import org.apache.cayenne.CayenneRuntimeException;
 import org.apache.cayenne.ObjectId;
+import org.apache.cayenne.dba.TypesMapping;
 import org.apache.cayenne.map.DataMap;
+import org.apache.cayenne.map.DbAttribute;
 import org.apache.cayenne.map.DbEntity;
 import org.apache.cayenne.map.MappingNamespace;
 import org.apache.cayenne.map.ObjAttribute;
@@ -265,9 +267,10 @@ public class EntityUtils {
     }
 
     /**
-     * @since 4.1
      * Checks is the db attribute declared for some object attribute.
      * @param id - db attribute
+     *
+     * @since 4.1
      */
     public boolean declaresDbAttribute(String id) {
         return objEntity.getAttributes().stream().filter(Objects::nonNull).anyMatch(a -> id.equals(a.getDbAttributePath()));

http://git-wip-us.apache.org/repos/asf/cayenne/blob/8e75733b/cayenne-cgen/src/main/java/org/apache/cayenne/gen/ImportUtils.java
----------------------------------------------------------------------
diff --git a/cayenne-cgen/src/main/java/org/apache/cayenne/gen/ImportUtils.java b/cayenne-cgen/src/main/java/org/apache/cayenne/gen/ImportUtils.java
index 275a535..6072356 100644
--- a/cayenne-cgen/src/main/java/org/apache/cayenne/gen/ImportUtils.java
+++ b/cayenne-cgen/src/main/java/org/apache/cayenne/gen/ImportUtils.java
@@ -19,6 +19,8 @@
 
 package org.apache.cayenne.gen;
 
+import org.apache.cayenne.dba.TypesMapping;
+import org.apache.cayenne.map.DbAttribute;
 import org.apache.cayenne.map.ObjAttribute;
 import org.apache.cayenne.util.Util;
 
@@ -277,4 +279,15 @@ public class ImportUtils {
 
 		return outputBuffer.toString();
 	}
+
+	/**
+	 * @param attribute db attribute
+	 * @return name of the java type
+	 *
+	 * @since 4.1
+	 */
+	public String dbAttributeToJavaType(DbAttribute attribute) {
+		String javaTypeName = TypesMapping.getJavaBySqlType(attribute.getType());
+		return formatJavaType(javaTypeName);
+	}
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/8e75733b/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 d2ce30a..db9fb36 100644
--- a/cayenne-cgen/src/main/resources/templates/v4_1/singleclass.vm
+++ b/cayenne-cgen/src/main/resources/templates/v4_1/singleclass.vm
@@ -39,7 +39,7 @@ ${importUtils.addType("${basePackageName}.${baseClassName}")}##
 ${importUtils.addType("java.io.IOException")}##
 ${importUtils.addType("java.io.ObjectInputStream")}##
 ${importUtils.addType("java.io.ObjectOutputStream")}##
-#if( $object.DbEntity )
+#if( $createPKProperties )
 ${importUtils.addType("org.apache.cayenne.exp.ExpressionFactory")}##
 #end
 #if((${object.DeclaredAttributes} && !${object.DeclaredAttributes.isEmpty()}) || (${object.DeclaredRelationships} && !${object.DeclaredRelationships.isEmpty()}))
@@ -72,13 +72,19 @@ public#if("true" == "${object.isAbstract()}") abstract#end class ${subClassName}
 #end
 
 #end
+###########################
+## Create PK properties  ##
+###########################
 #if( $object.DbEntity )
-#foreach( $idAttr in ${object.DbEntity.PrimaryKeys} )
-    #if(!${entityUtils.declaresDbAttribute($idAttr.Name)})
-    public static final Property<Integer> ${stringUtils.capitalizedAsConstant($idAttr.Name)}_PK_COLUMN = Property.create(ExpressionFactory.dbPathExp("db:${idAttr.Name}"), Integer.class);
+    #foreach( $idAttr in ${object.DbEntity.PrimaryKeys} )
+        #if( $createPKProperties && !${importUtils.declaresDbAttribute($idAttr.Name)})
+            #set ( $type = "$importUtils.dbAttributeToJavaType($idAttr)")
+    public static final Property<$type> ${stringUtils.capitalizedAsConstant($idAttr.Name)}_PK_COLUMN = Property.create(ExpressionFactory.dbPathExp("db:${idAttr.Name}"), ${type}.class});
+        #else
+    public static final String ${stringUtils.capitalizedAsConstant($idAttr.Name)}_PK_COLUMN = "${idAttr.Name}";
+        #end
     #end
 #end
-#end
 
 #######################
 ## Create Properties ##

http://git-wip-us.apache.org/repos/asf/cayenne/blob/8e75733b/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 df3d656..559c89d 100644
--- a/cayenne-cgen/src/main/resources/templates/v4_1/superclass.vm
+++ b/cayenne-cgen/src/main/resources/templates/v4_1/superclass.vm
@@ -41,7 +41,7 @@ ${importUtils.addType("${basePackageName}.${baseClassName}")}##
 ${importUtils.addType("java.io.IOException")}##
 ${importUtils.addType("java.io.ObjectInputStream")}##
 ${importUtils.addType("java.io.ObjectOutputStream")}##
-#if( $object.DbEntity )
+#if( $createPKProperties )
 ${importUtils.addType("org.apache.cayenne.exp.ExpressionFactory")}##
 #end
 #if((${object.DeclaredAttributes} && !${object.DeclaredAttributes.isEmpty()}) || (${object.DeclaredRelationships} && !${object.DeclaredRelationships.isEmpty()}))
@@ -80,13 +80,18 @@ public abstract class ${superClassName} extends ${baseClassName} {
 #end
 
 #end
+###########################
+## Create PK properties  ##
+###########################
 #if( $object.DbEntity )
-#foreach( $idAttr in ${object.DbEntity.PrimaryKeys} )
-    #if(!${entityUtils.declaresDbAttribute($idAttr.Name)})
-    public static final Property<Integer> ${stringUtils.capitalizedAsConstant($idAttr.Name)}_PK_COLUMN = Property.create(ExpressionFactory.dbPathExp("db:${idAttr.Name}"), Integer.class);
+    #foreach( $idAttr in ${object.DbEntity.PrimaryKeys} )
+        #if( $createPKProperties && !${importUtils.declaresDbAttribute($idAttr.Name)})
+            #set ( $type = "$importUtils.dbAttributeToJavaType($idAttr)")
+    public static final Property<$type> ${stringUtils.capitalizedAsConstant($idAttr.Name)}_PK_PROPERTY = Property.create(ExpressionFactory.dbPathExp("db:${idAttr.Name}"), ${type}.class);
+        #end
+    public static final String ${stringUtils.capitalizedAsConstant($idAttr.Name)}_PK_COLUMN = "${idAttr.Name}";
     #end
 #end
-#end
 
 #######################
 ## Create Properties ##

http://git-wip-us.apache.org/repos/asf/cayenne/blob/8e75733b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/codegen/CustomModeController.java
----------------------------------------------------------------------
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/codegen/CustomModeController.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/codegen/CustomModeController.java
index 67df44b..3ec4778 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/codegen/CustomModeController.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/codegen/CustomModeController.java
@@ -125,6 +125,9 @@ public class CustomModeController extends GeneratorController {
 		builder.bindToStateChange(view.getCreatePropertyNames(), "customPreferencesUpdater.createPropertyNames")
 				.updateView();
 
+		builder.bindToStateChange(view.getCreatePKProperties(), "customPreferencesUpdater.createPKProperties")
+				.updateView();
+
 		updateTemplates();
 	}
 
@@ -208,6 +211,7 @@ public class CustomModeController extends GeneratorController {
 			generator.setUsePkgPath(view.getUsePackagePath().isSelected());
 			generator.setMakePairs(view.getPairs().isSelected());
 			generator.setCreatePropertyNames(view.getCreatePropertyNames().isSelected());
+			generator.setCreatePKProperties(view.getCreatePKProperties().isSelected());
 
 			if (!Util.isEmptyString(view.getOutputPattern().getText())) {
 				generator.setOutputPattern(view.getOutputPattern().getText());

http://git-wip-us.apache.org/repos/asf/cayenne/blob/8e75733b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/codegen/CustomModePanel.java
----------------------------------------------------------------------
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/codegen/CustomModePanel.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/codegen/CustomModePanel.java
index b020a2e..7dd2e79 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/codegen/CustomModePanel.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/codegen/CustomModePanel.java
@@ -39,6 +39,7 @@ public class CustomModePanel extends GeneratorControllerPanel {
     private JCheckBox usePackagePath;
     private JTextField outputPattern;
     private JCheckBox createPropertyNames;
+    private JCheckBox createPKProperties;
 
     private ActionLink manageTemplatesLink;
 
@@ -51,6 +52,7 @@ public class CustomModePanel extends GeneratorControllerPanel {
         this.usePackagePath = new JCheckBox();
         this.outputPattern = new JTextField();
         this.createPropertyNames = new JCheckBox();
+        this.createPKProperties = new JCheckBox();
         this.manageTemplatesLink = new ActionLink("Customize Templates...");
         manageTemplatesLink.setFont(manageTemplatesLink.getFont().deriveFont(10f));
 
@@ -84,6 +86,9 @@ public class CustomModePanel extends GeneratorControllerPanel {
         builder.append("Create Property Names:", createPropertyNames);
         builder.nextLine();
 
+        builder.append("Create PK Properties:", createPKProperties);
+        builder.nextLine();
+
         setLayout(new BorderLayout());
         add(builder.getPanel(), BorderLayout.CENTER);
 
@@ -126,4 +131,7 @@ public class CustomModePanel extends GeneratorControllerPanel {
         return createPropertyNames;
     }
 
+    public JCheckBox getCreatePKProperties() {
+        return createPKProperties;
+    }
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/8e75733b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/codegen/CustomPreferencesUpdater.java
----------------------------------------------------------------------
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/codegen/CustomPreferencesUpdater.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/codegen/CustomPreferencesUpdater.java
index 6764a97..1d8d4f9 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/codegen/CustomPreferencesUpdater.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/codegen/CustomPreferencesUpdater.java
@@ -36,7 +36,8 @@ public class CustomPreferencesUpdater {
         USE_PACKAGE_PATH,
         MODE,
         OUTPUT_PATTERN,
-        CREATE_PROPERTY_NAMES
+        CREATE_PROPERTY_NAMES,
+        CREATE_PK_PROPERTIES
     }
 
     private static final String OVERWRITE = "overwrite";
@@ -45,6 +46,7 @@ public class CustomPreferencesUpdater {
     private static final String MODE = "mode";
     private static final String OUTPUT_PATTERN = "outputPattern";
     private static final String CREATE_PROPERTY_NAMES = "createPropertyNames";
+    private static final String CREATE_PK_PROPERTIES = "createPKProperties";
 
     private Map<DataMap, DataMapDefaults> mapPreferences;
 
@@ -117,6 +119,14 @@ public class CustomPreferencesUpdater {
         updatePreferences(Property.CREATE_PROPERTY_NAMES, createPropertyNames);
     }
 
+    public Boolean getCreatePKProperties() {
+        return (Boolean) getProperty(Property.CREATE_PK_PROPERTIES);
+    }
+
+    public void setCreatePKProperties(Boolean createPKProperties) {
+        updatePreferences(Property.CREATE_PK_PROPERTIES, createPKProperties);
+    }
+
     private Object getProperty(Property property) {
         Object obj = null;
 
@@ -148,6 +158,9 @@ public class CustomPreferencesUpdater {
                 case CREATE_PROPERTY_NAMES:
                     obj = entry.getValue().getBooleanProperty(CREATE_PROPERTY_NAMES);
                     break;
+                case CREATE_PK_PROPERTIES:
+                    obj = entry.getValue().getBooleanProperty(CREATE_PK_PROPERTIES);
+                    break;
                 default:
                     throw new IllegalArgumentException("Bad type property: " + property);
             }
@@ -185,6 +198,9 @@ public class CustomPreferencesUpdater {
                 case CREATE_PROPERTY_NAMES:
                     entry.getValue().setBooleanProperty(CREATE_PROPERTY_NAMES, (Boolean) value);
                     break;
+                case CREATE_PK_PROPERTIES:
+                    entry.getValue().setBooleanProperty(CREATE_PK_PROPERTIES, (Boolean) value);
+                    break;
                 default:
                     throw new IllegalArgumentException("Bad type property: " + property);
             }