This is an automated email from the ASF dual-hosted git repository.

btellier pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/james-project.git

commit 20972ed12bd17c50832b29b07382e600d381a1c3
Author: Benoit Tellier <[email protected]>
AuthorDate: Fri Aug 30 13:13:31 2019 +0700

    JAMES-2865 Decoralate SMTP behaviour from each other
    
    Each SMTP behaviour needs knowledge about other ones, which can be
    abstracted away. Leading to cleaner code, and use of only static classes.
---
 .../james/mock/smtp/server/MockMessageHandler.java | 39 +++++++++++++++-------
 1 file changed, 27 insertions(+), 12 deletions(-)

diff --git 
a/server/mailet/mock-smtp-server/src/main/java/org/apache/james/mock/smtp/server/MockMessageHandler.java
 
b/server/mailet/mock-smtp-server/src/main/java/org/apache/james/mock/smtp/server/MockMessageHandler.java
index 70b01ee..668d37f 100644
--- 
a/server/mailet/mock-smtp-server/src/main/java/org/apache/james/mock/smtp/server/MockMessageHandler.java
+++ 
b/server/mailet/mock-smtp-server/src/main/java/org/apache/james/mock/smtp/server/MockMessageHandler.java
@@ -42,12 +42,11 @@ import org.subethamail.smtp.TooMuchDataException;
 public class MockMessageHandler implements MessageHandler {
 
     @FunctionalInterface
-    interface Behavior<T> {
+    private interface Behavior<T> {
         void behave(T input) throws RejectException;
     }
 
-    class MockBehavior<T> implements Behavior<T> {
-
+    private static class MockBehavior<T> implements Behavior<T> {
         private final MockSMTPBehavior behavior;
 
         MockBehavior(MockSMTPBehavior behavior) {
@@ -64,22 +63,37 @@ public class MockMessageHandler implements MessageHandler {
         }
     }
 
-    class SMTPBehaviorRepositoryUpdater<T> implements Behavior<T> {
+    private static class ComposedBehavior<T> implements Behavior<T> {
+        private static class Builder<U> {
+            private final Behavior<U> behavior1;
+
+            private Builder(Behavior<U> behavior1) {
+                this.behavior1 = behavior1;
+            }
+
+            ComposedBehavior<U> andThen(Behavior<U> behavior2) {
+                return new ComposedBehavior<>(behavior1, behavior2);
+            }
+        }
+
+        private static <V> Builder<V> startWith(Behavior<V> behavior1) {
+            return new Builder<>(behavior1);
+        }
 
-        private final SMTPBehaviorRepository behaviorRepository;
-        private final MockBehavior<T> actualBehavior;
+        private final Behavior<T> behavior1;
+        private final Behavior<T> behavior2;
 
-        SMTPBehaviorRepositoryUpdater(SMTPBehaviorRepository 
behaviorRepository, MockSMTPBehavior behavior) {
-            this.behaviorRepository = behaviorRepository;
-            this.actualBehavior = new MockBehavior<>(behavior);
+        private ComposedBehavior(Behavior<T> behavior1, Behavior<T> behavior2) 
{
+            this.behavior1 = behavior1;
+            this.behavior2 = behavior2;
         }
 
         @Override
         public void behave(T input) throws RejectException {
             try {
-                actualBehavior.behave(input);
+                behavior1.behave(input);
             } finally {
-                
behaviorRepository.decreaseRemainingAnswers(actualBehavior.behavior);
+                behavior2.behave(input);
             }
         }
     }
@@ -130,7 +144,8 @@ public class MockMessageHandler implements MessageHandler {
             .filter(behavior -> behavior.getCommand().equals(data))
             .filter(behavior -> behavior.getCondition().matches(dataLine))
             .findFirst()
-            .map(mockBehavior -> new 
SMTPBehaviorRepositoryUpdater<>(behaviorRepository, mockBehavior));
+            .map(behavior -> ComposedBehavior.<T>startWith(new 
MockBehavior<>(behavior))
+                .andThen(any -> 
behaviorRepository.decreaseRemainingAnswers(behavior)));
     }
 
     @Override


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to