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