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 <stari...@gmail.com> Authored: Fri Oct 19 14:58:23 2018 +0300 Committer: Nikita Timofeev <stari...@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); }