This is an automated email from the ASF dual-hosted git repository. rouazana pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/james-project.git
commit 2e109d3922b68f08969cf4b0b8ff78923a6e19f5 Author: Gautier DI FOLCO <gdifo...@linagora.com> AuthorDate: Tue May 12 15:24:53 2020 +0200 JAMES-3179 Fix MailetMatcherDescriptor equals --- .../james/mailet/AbstractMailetdocsReport.java | 12 +- .../james/mailet/DefaultDescriptorsExtractor.java | 37 ++++--- .../james/mailet/MailetMatcherDescriptor.java | 121 +++++++++++++++------ .../mailet/DefaultDescriptorsExtractorTest.java | 39 ++++--- .../james/mailet/MailetMatcherDescriptorTest.java | 31 ++++++ 5 files changed, 166 insertions(+), 74 deletions(-) diff --git a/mailet/mailetdocs-maven-plugin/src/main/java/org/apache/james/mailet/AbstractMailetdocsReport.java b/mailet/mailetdocs-maven-plugin/src/main/java/org/apache/james/mailet/AbstractMailetdocsReport.java index 44b6ce2..9035413 100644 --- a/mailet/mailetdocs-maven-plugin/src/main/java/org/apache/james/mailet/AbstractMailetdocsReport.java +++ b/mailet/mailetdocs-maven-plugin/src/main/java/org/apache/james/mailet/AbstractMailetdocsReport.java @@ -31,7 +31,6 @@ import org.apache.maven.reporting.AbstractMavenReport; import org.apache.maven.reporting.MavenReportException; import com.github.steveash.guavate.Guavate; -import com.google.common.base.Strings; /** * <p> @@ -189,7 +188,7 @@ public abstract class AbstractMailetdocsReport extends AbstractMavenReport { getSink().anchor_(); getSink().sectionTitle2_(); - if (descriptor.getInfo() != null) { + descriptor.getInfo().ifPresent(info -> { getSink().paragraph(); if (descriptor.getType() == MailetMatcherDescriptor.Type.MAILET) { getSink().text("Mailet Info: "); @@ -199,17 +198,14 @@ public abstract class AbstractMailetdocsReport extends AbstractMavenReport { getSink().text("Info: "); } getSink().bold(); - getSink().text(descriptor.getInfo()); + getSink().text(descriptor.getInfo().orElse("")); getSink().bold_(); getSink().lineBreak(); getSink().paragraph_(); - } + }); getSink().paragraph(); - String classDocs = descriptor.getClassDocs(); - if (!Strings.isNullOrEmpty(classDocs)) { - getSink().rawText(classDocs); - } + descriptor.getClassDocs().ifPresent(classDocs -> getSink().rawText(classDocs)); getSink().paragraph_(); getSink().section2_(); diff --git a/mailet/mailetdocs-maven-plugin/src/main/java/org/apache/james/mailet/DefaultDescriptorsExtractor.java b/mailet/mailetdocs-maven-plugin/src/main/java/org/apache/james/mailet/DefaultDescriptorsExtractor.java index eaba5f0..c927e7b 100644 --- a/mailet/mailetdocs-maven-plugin/src/main/java/org/apache/james/mailet/DefaultDescriptorsExtractor.java +++ b/mailet/mailetdocs-maven-plugin/src/main/java/org/apache/james/mailet/DefaultDescriptorsExtractor.java @@ -28,6 +28,7 @@ import java.util.ArrayList; import java.util.Collection; import java.util.LinkedList; import java.util.List; +import java.util.Optional; import java.util.Set; import org.apache.james.mailet.MailetMatcherDescriptor.Type; @@ -154,36 +155,33 @@ public class DefaultDescriptorsExtractor { private MailetMatcherDescriptor describeMatcher(Log log, final JavaClass nextClass, String nameOfNextClass, final Class<?> klass) { - - final MailetMatcherDescriptor result = buildDescriptor(log, nextClass, - nameOfNextClass, klass, "getMatcherInfo", MailetMatcherDescriptor.Type.MATCHER); + + MailetMatcherDescriptor result = MailetMatcherDescriptor.builder() + .name(nextClass.getName()) + .fullyQualifiedClassName(nameOfNextClass) + .type(Type.MATCHER) + .info(fetchInfo(log, nameOfNextClass, klass, "getMatcherInfo", Type.MATCHER)) + .classDocs(nextClass.getComment()) + .experimental(isExperimental(nextClass)); log.info("Found a Matcher: " + klass.getName()); return result; } - private MailetMatcherDescriptor buildDescriptor(Log log, JavaClass nextClass, - final String nameOfClass, Class<?> klass, - final String infoMethodName, Type type) { - final MailetMatcherDescriptor result = new MailetMatcherDescriptor(); - result.setName(nextClass.getName()); - result.setFullyQualifiedName(nameOfClass); - result.setClassDocs(nextClass.getComment()); - result.setType(type); - result.setExperimental(isExperimental(nextClass)); - + private Optional<String> fetchInfo(Log log, String nameOfClass, Class<?> klass, String infoMethodName, Type type) { try { final Object instance = klass.newInstance(); final String info = (String) klass.getMethod(infoMethodName).invoke(instance); if (info != null && info.length() > 0) { - result.setInfo(info); + return Optional.of(info); } } catch (InstantiationException | IllegalAccessException | IllegalArgumentException | InvocationTargetException | SecurityException | NoSuchMethodException e) { handleInfoLoadFailure(log, nameOfClass, type, e); } - return result; + + return Optional.empty(); } @@ -212,8 +210,13 @@ public class DefaultDescriptorsExtractor { final JavaClass nextClass, String nameOfNextClass, final Class<?> klass) { - final MailetMatcherDescriptor result = buildDescriptor(log, nextClass, - nameOfNextClass, klass, "getMailetInfo", MailetMatcherDescriptor.Type.MAILET); + final MailetMatcherDescriptor result = MailetMatcherDescriptor.builder() + .name(nextClass.getName()) + .fullyQualifiedClassName(nameOfNextClass) + .type(Type.MAILET) + .info(fetchInfo(log, nameOfNextClass, klass, "getMailetInfo", Type.MAILET)) + .classDocs(nextClass.getComment()) + .experimental(isExperimental(nextClass)); log.info("Found a Mailet: " + klass.getName()); return result; diff --git a/mailet/mailetdocs-maven-plugin/src/main/java/org/apache/james/mailet/MailetMatcherDescriptor.java b/mailet/mailetdocs-maven-plugin/src/main/java/org/apache/james/mailet/MailetMatcherDescriptor.java index 5a368f6..c14e603 100644 --- a/mailet/mailetdocs-maven-plugin/src/main/java/org/apache/james/mailet/MailetMatcherDescriptor.java +++ b/mailet/mailetdocs-maven-plugin/src/main/java/org/apache/james/mailet/MailetMatcherDescriptor.java @@ -19,8 +19,11 @@ package org.apache.james.mailet; +import java.util.Optional; + import com.google.common.base.MoreObjects; import com.google.common.base.Objects; +import com.google.common.base.Strings; /** * Simple bean to describe a mailet or a matcher @@ -56,66 +59,116 @@ public class MailetMatcherDescriptor { } } - private String fullyQualifiedClassName; + public interface Builder { + @FunctionalInterface + interface RequiresName { + RequiresFullyQualifiedClassName name(String name); + } - private String name; + @FunctionalInterface + interface RequiresFullyQualifiedClassName { + RequiresType fullyQualifiedClassName(String fullyQualifiedClassName); + } - private String info; + @FunctionalInterface + interface RequiresType { + RequiresInfo type(Type type); + } - private String classDocs; + @FunctionalInterface + interface RequiresInfo { + default RequiresClassDocs info(String info) { + if (Strings.isNullOrEmpty(info)) { + return noInfo(); + } - private Type type; + return info(Optional.of(info)); + } - private boolean experimental; + default RequiresClassDocs noInfo() { + return info(Optional.empty()); + } - public String getFullyQualifiedName() { - return fullyQualifiedClassName; - } + RequiresClassDocs info(Optional<String> info); + } + + @FunctionalInterface + interface RequiresClassDocs { + default RequiresExperimental classDocs(String classDocs) { + if (Strings.isNullOrEmpty(classDocs)) { + return noClassDocs(); + } + + return classDocs(Optional.of(classDocs)); + } + + default RequiresExperimental noClassDocs() { + return classDocs(Optional.empty()); + } + + RequiresExperimental classDocs(Optional<String> classDocs); + } + + @FunctionalInterface + interface RequiresExperimental { + default MailetMatcherDescriptor isExperimental() { + return experimental(true); + } + + default MailetMatcherDescriptor isNotExperimental() { + return experimental(false); + } + + MailetMatcherDescriptor experimental(boolean experimental); + } - public void setFullyQualifiedName(String fqName) { - this.fullyQualifiedClassName = fqName; } - public String getName() { - return name; + public static Builder.RequiresName builder() { + return name -> fullyQualifiedClassName -> type -> info -> classDocs -> experimental -> + new MailetMatcherDescriptor(name, fullyQualifiedClassName, type, info, classDocs, experimental); } - public void setName(String name) { + private final String name; + private final String fullyQualifiedClassName; + private final Type type; + private final Optional<String> info; + private final Optional<String> classDocs; + private final boolean experimental; + + private MailetMatcherDescriptor(String name, String fullyQualifiedClassName, Type type, Optional<String> info, Optional<String> classDocs, boolean experimental) { this.name = name; + this.fullyQualifiedClassName = fullyQualifiedClassName; + this.type = type; + this.info = info; + this.classDocs = classDocs; + this.experimental = experimental; } - public String getInfo() { - return info; + public String getFullyQualifiedName() { + return fullyQualifiedClassName; } - public void setInfo(String info) { - this.info = info; + public String getName() { + return name; } - public String getClassDocs() { - return classDocs; + public Optional<String> getInfo() { + return info; } - public void setClassDocs(String classDocs) { - this.classDocs = classDocs; + public Optional<String> getClassDocs() { + return classDocs; } public Type getType() { return type; } - public void setType(Type type) { - this.type = type; - } - public boolean isExperimental() { return experimental; } - public void setExperimental(boolean experimental) { - this.experimental = experimental; - } - @Override public String toString() { return MoreObjects.toStringHelper(MailetMatcherDescriptor.class) @@ -128,11 +181,17 @@ public class MailetMatcherDescriptor { } @Override - public boolean equals(Object obj) { + public final int hashCode() { + return Objects.hashCode(fullyQualifiedClassName, name, info, classDocs, type, experimental); + } + + @Override + public final boolean equals(Object obj) { if (obj instanceof MailetMatcherDescriptor) { MailetMatcherDescriptor other = (MailetMatcherDescriptor) obj; return Objects.equal(this.fullyQualifiedClassName, other.fullyQualifiedClassName) && Objects.equal(this.name, other.name) + && Objects.equal(this.classDocs, other.classDocs) && Objects.equal(this.info, other.info) && Objects.equal(this.type, other.type) && Objects.equal(this.experimental, other.experimental); diff --git a/mailet/mailetdocs-maven-plugin/src/test/java/org/apache/james/mailet/DefaultDescriptorsExtractorTest.java b/mailet/mailetdocs-maven-plugin/src/test/java/org/apache/james/mailet/DefaultDescriptorsExtractorTest.java index 35fa063..e9058d7 100644 --- a/mailet/mailetdocs-maven-plugin/src/test/java/org/apache/james/mailet/DefaultDescriptorsExtractorTest.java +++ b/mailet/mailetdocs-maven-plugin/src/test/java/org/apache/james/mailet/DefaultDescriptorsExtractorTest.java @@ -54,18 +54,20 @@ public class DefaultDescriptorsExtractorTest { List<MailetMatcherDescriptor> descriptors = testee.extract(mavenProject, log) .descriptors(); - MailetMatcherDescriptor experimentalMailet = new MailetMatcherDescriptor(); - experimentalMailet.setFullyQualifiedName("org.apache.james.mailet.experimental.ExperimentalMailet"); - experimentalMailet.setName("ExperimentalMailet"); - experimentalMailet.setInfo(null); - experimentalMailet.setType(Type.MAILET); - experimentalMailet.setExperimental(true); - MailetMatcherDescriptor nonExperimentalMailet = new MailetMatcherDescriptor(); - nonExperimentalMailet.setFullyQualifiedName("org.apache.james.mailet.experimental.NonExperimentalMailet"); - nonExperimentalMailet.setName("NonExperimentalMailet"); - nonExperimentalMailet.setInfo(null); - nonExperimentalMailet.setType(Type.MAILET); - nonExperimentalMailet.setExperimental(false); + MailetMatcherDescriptor experimentalMailet = MailetMatcherDescriptor.builder() + .name("ExperimentalMailet") + .fullyQualifiedClassName("org.apache.james.mailet.experimental.ExperimentalMailet") + .type(Type.MAILET) + .noInfo() + .noClassDocs() + .isExperimental(); + MailetMatcherDescriptor nonExperimentalMailet = MailetMatcherDescriptor.builder() + .name("NonExperimentalMailet") + .fullyQualifiedClassName("org.apache.james.mailet.experimental.NonExperimentalMailet") + .type(Type.MAILET) + .noInfo() + .noClassDocs() + .isNotExperimental(); assertThat(descriptors).containsOnly(experimentalMailet, nonExperimentalMailet); } @@ -78,12 +80,13 @@ public class DefaultDescriptorsExtractorTest { List<MailetMatcherDescriptor> descriptors = testee.extract(mavenProject, log) .descriptors(); - MailetMatcherDescriptor notExcludedMailet = new MailetMatcherDescriptor(); - notExcludedMailet.setFullyQualifiedName("org.apache.james.mailet.excluded.NotExcludedFromDocumentationMailet"); - notExcludedMailet.setName("NotExcludedFromDocumentationMailet"); - notExcludedMailet.setInfo(null); - notExcludedMailet.setType(Type.MAILET); - notExcludedMailet.setExperimental(false); + MailetMatcherDescriptor notExcludedMailet = MailetMatcherDescriptor.builder() + .name("NotExcludedFromDocumentationMailet") + .fullyQualifiedClassName("org.apache.james.mailet.excluded.NotExcludedFromDocumentationMailet") + .type(Type.MAILET) + .noInfo() + .noClassDocs() + .isNotExperimental(); assertThat(descriptors).containsOnly(notExcludedMailet); } diff --git a/mailet/mailetdocs-maven-plugin/src/test/java/org/apache/james/mailet/MailetMatcherDescriptorTest.java b/mailet/mailetdocs-maven-plugin/src/test/java/org/apache/james/mailet/MailetMatcherDescriptorTest.java new file mode 100644 index 0000000..4759bcb --- /dev/null +++ b/mailet/mailetdocs-maven-plugin/src/test/java/org/apache/james/mailet/MailetMatcherDescriptorTest.java @@ -0,0 +1,31 @@ +/**************************************************************** + * Licensed to the Apache Software Foundation (ASF) under one * + * or more contributor license agreements. See the NOTICE file * + * distributed with this work for additional information * + * regarding copyright ownership. The ASF licenses this file * + * to you under the Apache License, Version 2.0 (the * + * "License"); you may not use this file except in compliance * + * with the License. You may obtain a copy of the License at * + * * + * http://www.apache.org/licenses/LICENSE-2.0 * + * * + * Unless required by applicable law or agreed to in writing, * + * software distributed under the License is distributed on an * + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * + * KIND, either express or implied. See the License for the * + * specific language governing permissions and limitations * + * under the License. * + ***************************************************************/ + +package org.apache.james.mailet; + +import org.junit.jupiter.api.Test; + +import nl.jqno.equalsverifier.EqualsVerifier; + +class MailetMatcherDescriptorTest { + @Test + void shouldRespectBeanContract() { + EqualsVerifier.forClass(MailetMatcherDescriptor.class).verify(); + } +} \ No newline at end of file --------------------------------------------------------------------- To unsubscribe, e-mail: server-dev-unsubscr...@james.apache.org For additional commands, e-mail: server-dev-h...@james.apache.org