Tony CHEMIT pushed to branch develop-9.0.x at ultreiaio / ird-observe Commits: d4dcac81 by Tony Chemit at 2023-02-14T09:28:46+01:00 Dto autoTrim - review some missing autoTrim (mainly on comment) - - - - - 8 changed files: - toolkit/api/src/main/java/fr/ird/observe/dto/BusinessDto.java - toolkit/api/src/main/java/fr/ird/observe/dto/IdDto.java - toolkit/api/src/main/java/fr/ird/observe/dto/data/ContainerDto.java - toolkit/api/src/main/java/fr/ird/observe/dto/data/EditableDto.java - toolkit/api/src/main/java/fr/ird/observe/dto/data/SimpleDto.java - toolkit/api/src/main/java/fr/ird/observe/dto/data/WithSimpleComment.java - + toolkit/templates/src/main/java/fr/ird/observe/toolkit/templates/dto/AutoTrimGenerator.java - toolkit/templates/src/main/java/fr/ird/observe/toolkit/templates/dto/DtoTransformer.java Changes: ===================================== toolkit/api/src/main/java/fr/ird/observe/dto/BusinessDto.java ===================================== @@ -34,9 +34,7 @@ import java.util.Collection; import java.util.Date; import java.util.Objects; import java.util.Optional; -import java.util.function.Consumer; import java.util.function.Predicate; -import java.util.function.Supplier; /** * Created on 21/07/2021. ===================================== toolkit/api/src/main/java/fr/ird/observe/dto/IdDto.java ===================================== @@ -128,7 +128,7 @@ public abstract class IdDto extends AbstractJavaBean implements ObserveDto, DtoR public void autoTrim() { } - protected void autoTrim(Supplier<String> getter, Consumer<String> setter) { + public static void autoTrim(Supplier<String> getter, Consumer<String> setter) { String stringValue = getter.get(); if (stringValue != null) { String stringTrimmedValue = stringValue.trim(); ===================================== toolkit/api/src/main/java/fr/ird/observe/dto/data/ContainerDto.java ===================================== @@ -81,4 +81,9 @@ public abstract class ContainerDto<C extends ContainerChildDto> extends DataDto firePropertyChange(PROPERTY_CHILDREN, oldValue, children); } + @Override + public void autoTrim() { + super.autoTrim(); + WithSimpleComment.super.autoTrim(); + } } ===================================== toolkit/api/src/main/java/fr/ird/observe/dto/data/EditableDto.java ===================================== @@ -55,6 +55,6 @@ public abstract class EditableDto extends DataDto implements WithSimpleComment { @Override public void autoTrim() { super.autoTrim(); - autoTrim(this::getComment, this::setComment); + WithSimpleComment.super.autoTrim(); } } ===================================== toolkit/api/src/main/java/fr/ird/observe/dto/data/SimpleDto.java ===================================== @@ -46,4 +46,9 @@ public abstract class SimpleDto extends DataDto implements WithSimpleComment { firePropertyChange(PROPERTY_COMMENT, oldValue, comment); } + @Override + public void autoTrim() { + super.autoTrim(); + WithSimpleComment.super.autoTrim(); + } } ===================================== toolkit/api/src/main/java/fr/ird/observe/dto/data/WithSimpleComment.java ===================================== @@ -22,6 +22,7 @@ package fr.ird.observe.dto.data; * #L% */ +import fr.ird.observe.dto.IdDto; import fr.ird.observe.dto.ObserveDto; import io.ultreia.java4all.bean.JavaBean; @@ -37,4 +38,8 @@ public interface WithSimpleComment extends JavaBean, ObserveDto { void setComment(String comment); + default void autoTrim() { + IdDto.autoTrim(this::getComment, this::setComment); + } + } ===================================== toolkit/templates/src/main/java/fr/ird/observe/toolkit/templates/dto/AutoTrimGenerator.java ===================================== @@ -0,0 +1,108 @@ +package fr.ird.observe.toolkit.templates.dto; + +/*- + * #%L + * ObServe Toolkit :: Templates + * %% + * Copyright (C) 2008 - 2023 IRD, Ultreia.io + * %% + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public + * License along with this program. If not, see + * <http://www.gnu.org/licenses/gpl-3.0.html>. + * #L% + */ + + +/*{generator option: parentheses = false}*/ +/*{generator option: writeString = +}*/ + +import fr.ird.observe.toolkit.templates.TemplateContract; +import fr.ird.observe.toolkit.templates.validation.ValidationTagValues; +import io.ultreia.java4all.lang.Strings; +import org.nuiton.eugene.GeneratorUtil; +import org.nuiton.eugene.models.object.ObjectModel; +import org.nuiton.eugene.models.object.ObjectModelAttribute; +import org.nuiton.eugene.models.object.ObjectModelClass; +import org.nuiton.eugene.models.object.ObjectModelJavaModifier; +import org.nuiton.eugene.models.object.ObjectModelOperation; + +import java.util.Collection; +import java.util.LinkedList; +import java.util.List; +import java.util.function.BiPredicate; + +/** + * To generate autoTrim method on a class. + * <p> + * Created on 14/02/2023. + * + * @author Tony Chemit - dev@tchemit.fr + * @since 9.0.25 + */ +public class AutoTrimGenerator { + + private final ValidationTagValues validationTagValues; + private final TemplateContract template; + private final ObjectModel model; + + private final BiPredicate<ObjectModelClass, ObjectModelAttribute> compositeAttributePredicate; + + public AutoTrimGenerator(ValidationTagValues validationTagValues, + TemplateContract template, + ObjectModel model, + BiPredicate<ObjectModelClass, ObjectModelAttribute> compositeAttributePredicate) { + this.validationTagValues = validationTagValues; + this.template = template; + this.model = model; + this.compositeAttributePredicate = compositeAttributePredicate; + } + + public void generate(ObjectModelClass input, ObjectModelClass output) { + Collection<ObjectModelAttribute> attributes = new LinkedList<>(input.getAttributes()); + + List<String> stringPropertyNames = TemplateContract.getProperties(input, attributes, (c, a) -> "String".equals(GeneratorUtil.getSimpleName(a.getType())) && validationTagValues.isNotBlank(model.getTagValuesStore(), c, a)); + List<String> compositionPropertyNames = TemplateContract.getProperties(input, attributes, (c, a) -> !GeneratorUtil.isNMultiplicity(a) && compositeAttributePredicate.test(c, a)); + List<String> multipleCompositionPropertyNames = TemplateContract.getProperties(input, attributes, (c, a) -> GeneratorUtil.isNMultiplicity(a) && compositeAttributePredicate.test(c, a)); + if (stringPropertyNames.isEmpty() + && compositionPropertyNames.isEmpty() + && multipleCompositionPropertyNames.isEmpty()) { + return; + } + + ObjectModelOperation autoTrimMethod = template.addOperation(output, "autoTrim", void.class.getName(), ObjectModelJavaModifier.PUBLIC); + template.addAnnotation(output, autoTrimMethod, Override.class); + StringBuilder content = new StringBuilder(""/*{ + super.autoTrim();}*/); + for (String property : stringPropertyNames) { + String capitalize = Strings.capitalize(property); + content.append(""/*{ + autoTrim(this::get<%=capitalize%>, this::set<%=capitalize%>);}*/); + } + for (String property : compositionPropertyNames) { + String capitalize = Strings.capitalize(property); + content.append(""/*{ + if (get<%=capitalize%>() != null) { + get<%=capitalize%>().autoTrim(); + }}*/); + } + for (String property : multipleCompositionPropertyNames) { + String capitalize = Strings.capitalize(property); + content.append(""/*{ + if (isNot<%=capitalize%>Empty()) { + get<%=capitalize%>().forEach(c -> c.autoTrim()); + }}*/); + } + template.setOperationBody(autoTrimMethod, ""/*{<%=content.toString()%> + }*/); + } +} ===================================== toolkit/templates/src/main/java/fr/ird/observe/toolkit/templates/dto/DtoTransformer.java ===================================== @@ -38,6 +38,7 @@ import fr.ird.observe.dto.data.DataGroupByType; import fr.ird.observe.dto.data.EditableDto; import fr.ird.observe.dto.data.InlineDataDto; import fr.ird.observe.dto.data.LayoutAware; +import fr.ird.observe.dto.data.NoValidationDto; import fr.ird.observe.dto.data.OpenableDto; import fr.ird.observe.dto.data.RootOpenableDto; import fr.ird.observe.dto.data.UsingLayout; @@ -132,6 +133,7 @@ public class DtoTransformer extends BeanTransformer implements TemplateContract private Map<String, String> decomposeTimes; private Map<String, String> decomposeDates; private String currentTimestampPropertyName; + private AutoTrimGenerator autoTrimGenerator; public static String getCoordinateField(boolean before, String coordinatePrefix, String type) { return Introspector.decapitalize(before ? (type + coordinatePrefix) : (coordinatePrefix + type)); @@ -530,28 +532,16 @@ public class DtoTransformer extends BeanTransformer implements TemplateContract return <%=content%>; }*/); } - Collection<ObjectModelAttribute> attributes = new LinkedList<>(input.getAttributes()); - List<String> notBlankString = TemplateContract.getProperties(input, attributes, (c, a) -> validationTagValues.isNotBlank(tagValuesStore, c, a) && "String".equals(GeneratorUtil.getSimpleName(a.getType()))); - addAutoTrim(output, notBlankString); - return output; - } - - private void addAutoTrim(ObjectModelClass output, List<String> notBlankString) { - if (notBlankString.isEmpty()) { - return; + if (autoTrimGenerator == null) { + autoTrimGenerator = new AutoTrimGenerator(validationTagValues, this, model, (c, a) -> { + ObjectModelClass aClass = model.getClass(a.getType()); + return aClass != null + && aClass.getSuperclasses().stream().anyMatch(i -> model.getClass(i.getQualifiedName()) != null) + && aClass.getInterfaces().stream().noneMatch(i -> i.getQualifiedName().equals(NoValidationDto.class.getName())); + }); } - - ObjectModelOperation autoTrimMethod = addOperation(output, "autoTrim", void.class, ObjectModelJavaModifier.PUBLIC); - addAnnotation(output, autoTrimMethod, Override.class); - StringBuilder content = new StringBuilder(""); - for (String property : notBlankString) { - String capitalize = Strings.capitalize(property); - content.append(""/*{ - super.autoTrim(); - autoTrim(this::get<%=capitalize%>, this::set<%=capitalize%>);}*/); - } - setOperationBody(autoTrimMethod, ""/*{<%=content.toString()%> - }*/); + autoTrimGenerator.generate(input, output); + return output; } void addGroupBy(ObjectModelClass input, String... groupByList) { View it on GitLab: https://gitlab.com/ultreiaio/ird-observe/-/commit/d4dcac813496ff349c66ad4f25... -- View it on GitLab: https://gitlab.com/ultreiaio/ird-observe/-/commit/d4dcac813496ff349c66ad4f25... You're receiving this email because of your account on gitlab.com.