Author: tchemit Date: 2013-09-29 11:38:41 +0200 (Sun, 29 Sep 2013) New Revision: 1300 Url: http://nuiton.org/projects/eugene/repository/revisions/1300 Log: fixes #2860: Update mavenpom to 4.1 fixes #2861: [SimpleBean] Generate default class helper for each Bean Modified: trunk/eugene-java-templates/src/main/java/org/nuiton/eugene/java/JavaBeanTransformer.java trunk/eugene-java-templates/src/main/java/org/nuiton/eugene/java/JavaTemplatesGeneratorUtil.java trunk/eugene-java-templates/src/main/java/org/nuiton/eugene/java/JavaTemplatesTagValues.java trunk/eugene-java-templates/src/main/java/org/nuiton/eugene/java/SimpleJavaBeanTransformer.java trunk/eugene/src/main/java/org/nuiton/eugene/EugeneTagValues.java trunk/eugene/src/main/java/org/nuiton/eugene/java/JavaGeneratorUtil.java trunk/pom.xml Modified: trunk/eugene/src/main/java/org/nuiton/eugene/EugeneTagValues.java =================================================================== --- trunk/eugene/src/main/java/org/nuiton/eugene/EugeneTagValues.java 2013-09-17 16:44:15 UTC (rev 1299) +++ trunk/eugene/src/main/java/org/nuiton/eugene/EugeneTagValues.java 2013-09-29 09:38:41 UTC (rev 1300) @@ -99,7 +99,7 @@ * Tag value to specify to not generate only the {@code isXXX} methods for * a boolean property. * - * @see JavaGeneratorUtil#getDoNotGenerateBooleanGetMethods(ObjectModel, ObjectModelClassifier) + * @see JavaGeneratorUtil#isDoNotGenerateBooleanGetMethods(ObjectModel, ObjectModelClassifier) * @since 2.4.1 */ @TagValueDefinition(target = {ObjectModel.class, ObjectModelClassifier.class}, Modified: trunk/eugene/src/main/java/org/nuiton/eugene/java/JavaGeneratorUtil.java =================================================================== --- trunk/eugene/src/main/java/org/nuiton/eugene/java/JavaGeneratorUtil.java 2013-09-17 16:44:15 UTC (rev 1299) +++ trunk/eugene/src/main/java/org/nuiton/eugene/java/JavaGeneratorUtil.java 2013-09-29 09:38:41 UTC (rev 1300) @@ -158,10 +158,10 @@ * @see EugeneTagValues#TAG_DO_NOT_GENERATE_BOOLEAN_GET_METHODS * @since 2.4.1 */ - public static String getDoNotGenerateBooleanGetMethods(ObjectModel model, - ObjectModelClassifier classifier) { + public static boolean isDoNotGenerateBooleanGetMethods(ObjectModel model, + ObjectModelClassifier classifier) { String value = findTagValue(EugeneTagValues.TAG_DO_NOT_GENERATE_BOOLEAN_GET_METHODS, classifier, model); - return value; + return value!=null && "true".equals(value); } /** Modified: trunk/eugene-java-templates/src/main/java/org/nuiton/eugene/java/JavaBeanTransformer.java =================================================================== --- trunk/eugene-java-templates/src/main/java/org/nuiton/eugene/java/JavaBeanTransformer.java 2013-09-17 16:44:15 UTC (rev 1299) +++ trunk/eugene-java-templates/src/main/java/org/nuiton/eugene/java/JavaBeanTransformer.java 2013-09-29 09:38:41 UTC (rev 1300) @@ -189,15 +189,13 @@ generateI18nBlockAndConstants(input, output); - String noPCSTagValue = JavaTemplatesGeneratorUtil.getNoPCSTagValue(model, input); - boolean usePCS = StringUtils.isEmpty(noPCSTagValue) || - !"true".equals(noPCSTagValue.trim()); + boolean usePCS = !JavaTemplatesGeneratorUtil.isNoPCS(model, input); - String noGenerateBooleanGetMethods = - JavaTemplatesGeneratorUtil.getDoNotGenerateBooleanGetMethods(model, input); - boolean generateBooleanGetMethods = - StringUtils.isEmpty(noGenerateBooleanGetMethods) || - !"true".equals(noGenerateBooleanGetMethods.trim()); + boolean generateBooleanGetMethods = ! + JavaTemplatesGeneratorUtil.isDoNotGenerateBooleanGetMethods(model, input); +// boolean generateBooleanGetMethods = +// StringUtils.isEmpty(noGenerateBooleanGetMethods) || +// !"true".equals(noGenerateBooleanGetMethods.trim()); // Get available properties List<ObjectModelAttribute> properties = getProperties(input); Modified: trunk/eugene-java-templates/src/main/java/org/nuiton/eugene/java/JavaTemplatesGeneratorUtil.java =================================================================== --- trunk/eugene-java-templates/src/main/java/org/nuiton/eugene/java/JavaTemplatesGeneratorUtil.java 2013-09-17 16:44:15 UTC (rev 1299) +++ trunk/eugene-java-templates/src/main/java/org/nuiton/eugene/java/JavaTemplatesGeneratorUtil.java 2013-09-29 09:38:41 UTC (rev 1300) @@ -59,9 +59,9 @@ * @see JavaTemplatesTagValues#TAG_NO_PCS * @since 2.3 */ - public static String getNoPCSTagValue(ObjectModel model, ObjectModelClassifier classifier) { + public static boolean isNoPCS(ObjectModel model, ObjectModelClassifier classifier) { String value = findTagValue(JavaTemplatesTagValues.TAG_NO_PCS, classifier, model); - return value; + return value != null && "true".equals(value); } /** @@ -122,11 +122,11 @@ * @param model model to seek * @return the none empty value of the found tag value or {@code null} if not found nor empty. * @see JavaTemplatesTagValues#TAG_SIMPLE_BEAN_GENERATE_FACTORY - * @since 2.3 + * @since 2.7.2 */ - public static String getSimpleBeanGenerateFactoryTagValue(ObjectModel model) { + public static boolean isSimpleBeanGenerateFactory(ObjectModel model) { String value = findTagValue(JavaTemplatesTagValues.TAG_SIMPLE_BEAN_GENERATE_FACTORY, null, model); - return value; + return value != null && "true".equals(value); } /** @@ -213,4 +213,21 @@ String value = findTagValue(JavaTemplatesTagValues.TAG_SIMPLE_BEAN_INTERFACE_NAME_SUFFIX, classifier, model); return value; } + + /** + * Obtain the value of the {@link JavaTemplatesTagValues#TAG_SIMPLE_BEAN_GENERATE_DEFAULTS} + * tag value on the given model or classifier. + * <p/> + * It will first look on the model, and then in the given classifier. + * + * @param model model to seek + * @param classifier classifier to seek + * @return the none empty value of the found tag value or {@code null} if not found nor empty. + * @see JavaTemplatesTagValues#TAG_SIMPLE_BEAN_GENERATE_DEFAULTS + * @since 2.6.2 + */ + public static boolean isSimpleBeanGenerateDefaults(ObjectModel model, ObjectModelClassifier classifier) { + String value = findTagValue(JavaTemplatesTagValues.TAG_SIMPLE_BEAN_GENERATE_DEFAULTS, classifier, model); + return value != null && "true".equals(value); + } } Modified: trunk/eugene-java-templates/src/main/java/org/nuiton/eugene/java/JavaTemplatesTagValues.java =================================================================== --- trunk/eugene-java-templates/src/main/java/org/nuiton/eugene/java/JavaTemplatesTagValues.java 2013-09-17 16:44:15 UTC (rev 1299) +++ trunk/eugene-java-templates/src/main/java/org/nuiton/eugene/java/JavaTemplatesTagValues.java 2013-09-29 09:38:41 UTC (rev 1300) @@ -42,7 +42,7 @@ * <p/> * You can globaly use it on the complete model or to a specific classifier. * - * @see JavaTemplatesGeneratorUtil#getNoPCSTagValue(ObjectModel, ObjectModelClassifier) + * @see JavaTemplatesGeneratorUtil#isNoPCS(ObjectModel, ObjectModelClassifier) * @since 2.5.6 */ @ModelPropertiesUtil.TagValueDefinition( @@ -270,11 +270,11 @@ String TAG_SIMPLE_BEAN_INTERFACE_NAME_SUFFIX = "simpleBeanInterfaceNameSuffix"; /** - * To generate an factory of generated simple beans. + * To generate a factory of generated simple beans. * <p/> * You must use it on the complete model. * - * @see JavaTemplatesGeneratorUtil#getSimpleBeanGenerateFactoryTagValue(ObjectModel) + * @see JavaTemplatesGeneratorUtil#isSimpleBeanGenerateFactory(ObjectModel) * @since 2.6.2 */ @ModelPropertiesUtil.TagValueDefinition( @@ -282,4 +282,18 @@ documentation = "To generate a factory of simple bean.\n" + "(only effective with simple bean generator)") String TAG_SIMPLE_BEAN_GENERATE_FACTORY = "simpleBeanGenerateFactory"; + + /** + * To generate a factory of generated simple beans. + * <p/> + * You must use it on the complete model. + * + * @see JavaTemplatesGeneratorUtil#isSimpleBeanGenerateDefaults(ObjectModel, ObjectModelClassifier) + * @since 2.7.2 + */ + @ModelPropertiesUtil.TagValueDefinition( + target = {ObjectModel.class, ObjectModelClassifier.class}, + documentation = "To generate defaults class with simple operations on the type.\n" + + "(only effective with simple bean generator)") + String TAG_SIMPLE_BEAN_GENERATE_DEFAULTS = "simpleBeanGenerateDefaults"; } Modified: trunk/eugene-java-templates/src/main/java/org/nuiton/eugene/java/SimpleJavaBeanTransformer.java =================================================================== --- trunk/eugene-java-templates/src/main/java/org/nuiton/eugene/java/SimpleJavaBeanTransformer.java 2013-09-17 16:44:15 UTC (rev 1299) +++ trunk/eugene-java-templates/src/main/java/org/nuiton/eugene/java/SimpleJavaBeanTransformer.java 2013-09-29 09:38:41 UTC (rev 1300) @@ -38,6 +38,8 @@ import org.nuiton.eugene.models.object.ObjectModelInterface; import org.nuiton.eugene.models.object.ObjectModelJavaModifier; import org.nuiton.eugene.models.object.ObjectModelOperation; +import org.nuiton.util.beans.Binder; +import org.nuiton.util.beans.BinderFactory; import java.io.Serializable; import java.util.ArrayList; @@ -70,6 +72,10 @@ generateBeanFactory(model, className); } + + if (canGenerateBeanDefaults(model, null)) { + generateBeanDefaults(model); + } } @Override @@ -121,11 +127,9 @@ } protected boolean canGenerateFactory(ObjectModel model, String className) { - String generateTagValue = - JavaTemplatesGeneratorUtil.getSimpleBeanGenerateFactoryTagValue(model); - boolean generateFactory = generateTagValue != null && - Boolean.valueOf(generateTagValue); + boolean generateFactory = + JavaTemplatesGeneratorUtil.isSimpleBeanGenerateFactory(model); String defaultPackage = getConfiguration().getProperty(PROP_DEFAULT_PACKAGE); @@ -184,6 +188,43 @@ return canGenerate; } + protected boolean canGenerateBeanDefaults(ObjectModel model, + ObjectModelClass input) { + + boolean withInput = input != null; + + boolean canGenerate = + JavaTemplatesGeneratorUtil.isSimpleBeanGenerateDefaults( + model, input); + + if (canGenerate) { + + if (withInput) { + + // class in not abstract + // class is a bean + + canGenerate = !input.isAbstract() && + JavaTemplatesGeneratorUtil.hasBeanStereotype(input); + + } + } + + return canGenerate; + } + + protected boolean canGenerateBeanAbstractDefaults(ObjectModelClass input, + String className) { + + String classPackage = input.getPackageName(); + + String fqn = classPackage + "." + className; + + boolean canGenerate = !isInClassPath(fqn); + + return canGenerate; + } + protected void generateBeanFactory(ObjectModel model, String className) { String defaultPackage = getConfiguration().getProperty(PROP_DEFAULT_PACKAGE); @@ -201,13 +242,13 @@ ObjectModelOperation operation = addOperation( output, "typeOf" + typeName, - "Class<? extends " + typeName + ">", + "<BeanType extends " + typeName + "> Class<BeanType>", ObjectModelJavaModifier.STATIC, ObjectModelJavaModifier.PUBLIC ); setOperationBody(operation, "" /*{ - return <%=typeBeanName%>.class; + return (Class<BeanType>) <%=typeBeanName%>.class; }*/ ); operation = addOperation( @@ -349,15 +390,16 @@ // Get available properties List<ObjectModelAttribute> properties = getProperties(input); - String noPCSTagValue = JavaTemplatesGeneratorUtil.getNoPCSTagValue(model, input); - boolean usePCS = StringUtils.isEmpty(noPCSTagValue) || - !"true".equals(noPCSTagValue.trim()); + boolean usePCS= !JavaTemplatesGeneratorUtil.isNoPCS(model, input); +// boolean usePCS = StringUtils.isEmpty(noPCSTagValue) || +// !"true".equals(noPCSTagValue.trim()); - String noGenerateBooleanGetMethods = - JavaGeneratorUtil.getDoNotGenerateBooleanGetMethods(model, input); boolean generateBooleanGetMethods = - StringUtils.isEmpty(noGenerateBooleanGetMethods) || - !"true".equals(noGenerateBooleanGetMethods.trim()); + !JavaGeneratorUtil.isDoNotGenerateBooleanGetMethods(model, + input); +// boolean generateBooleanGetMethods = +// StringUtils.isEmpty(noGenerateBooleanGetMethods) || +// !"true".equals(noGenerateBooleanGetMethods.trim()); // Add properties field + javabean methods for (ObjectModelAttribute attr : properties) { @@ -374,7 +416,98 @@ return output; } + protected void generateBeanDefaults(ObjectModel model) { + for (ObjectModelClass aClass : model.getClasses()) { + + boolean generateDefault = canGenerateBeanDefaults(model, aClass); + + if (!generateDefault) { + continue; + } + + String packageName = aClass.getPackageName(); + String typeName = getBeanInterfaceName(aClass); + String typeBeanName = getBeanClassName(aClass); + + String outclassName = typeName + "s"; + String abstractoutclassName = "Abstract" + outclassName; + + if (!isInClassPath(packageName, outclassName)) { + + // generate defaults class + + ObjectModelClass output = createClass(outclassName, packageName); +// addImport(output, packageName + "." + typeName); +// addImport(output, packageName + "." + typeBeanName); + setSuperClass(output, packageName + "." + abstractoutclassName); + if (log.isDebugEnabled()) { + log.debug("will generate " + output.getQualifiedName()); + } + } + + + if (!isInClassPath(packageName, abstractoutclassName)) { + + // generate abstract defaults class + + ObjectModelClass output = createAbstractClass(abstractoutclassName, packageName); + +// addImport(output, packageName + "." + typeName); +// addImport(output, packageName + "." + typeBeanName); + + if (log.isDebugEnabled()) { + log.debug("will generate " + output.getQualifiedName()); + } + + ObjectModelOperation operation = addOperation( + output, + "typeOf" + typeName, + "<BeanType extends " + typeName + "> Class<BeanType>", + ObjectModelJavaModifier.STATIC, + ObjectModelJavaModifier.PUBLIC + ); + setOperationBody(operation, "" + /*{ + return (Class<BeanType>) <%=typeBeanName%>.class; + }*/ + ); + operation = addOperation( + output, + "new" + typeName, + typeName, + ObjectModelJavaModifier.STATIC, + ObjectModelJavaModifier.PUBLIC + ); + setOperationBody(operation, "" + /*{ + return new <%=typeBeanName%>(); + }*/ + ); + + addImport(output, Binder.class); + addImport(output, BinderFactory.class); + operation = addOperation( + output, + "new" + typeName, + "<BeanType extends " + typeName + "> BeanType", + ObjectModelJavaModifier.STATIC, + ObjectModelJavaModifier.PUBLIC + ); + addParameter(operation, "BeanType", "source"); + setOperationBody(operation, "" + /*{ + BeanType result = (BeanType) new<%=typeName%>(); + Class<BeanType> sourceType = typeOf<%=typeName%>(); + Binder<BeanType,BeanType> binder = BinderFactory.newBinder(sourceType); + binder.copy(source, result); + return result; + }*/ + ); + } + } + } + protected Collection<ObjectModelOperation> getPublicOperations(ObjectModelClass clazz) { Collection<ObjectModelOperation> result = new ArrayList<ObjectModelOperation>(); Modified: trunk/pom.xml =================================================================== --- trunk/pom.xml 2013-09-17 16:44:15 UTC (rev 1299) +++ trunk/pom.xml 2013-09-29 09:38:41 UTC (rev 1300) @@ -28,7 +28,7 @@ <parent> <groupId>org.nuiton</groupId> <artifactId>mavenpom4redmineAndCentral</artifactId> - <version>4.0</version> + <version>4.1</version> </parent> <artifactId>eugene</artifactId>