You are viewing a plain text version of this content. The canonical link for it is here.
Posted to server-dev@james.apache.org by ro...@apache.org on 2020/06/08 13:15:59 UTC

[james-project] 05/30: JAMES-3179 Fix MailetMatcherDescriptor equals

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 <gd...@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-unsubscribe@james.apache.org
For additional commands, e-mail: server-dev-help@james.apache.org