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 bt...@apache.org on 2020/04/21 02:56:47 UTC

[james-project] 11/19: [Refactoring] move methods/attributes out of SeparatingDataLineFilter to its only subclass

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 ceca8ea5b64a35faebd40324249b5e675d23812a
Author: Matthieu Baechler <ma...@apache.org>
AuthorDate: Fri Apr 3 15:53:34 2020 +0200

    [Refactoring] move methods/attributes out of SeparatingDataLineFilter to its only subclass
---
 .../smtp/core/AbstractAddHeadersFilter.java        | 153 ---------------------
 .../smtp/core/ReceivedDataLineFilter.java          | 110 ++++++++++++++-
 2 files changed, 105 insertions(+), 158 deletions(-)

diff --git a/protocols/smtp/src/main/java/org/apache/james/protocols/smtp/core/AbstractAddHeadersFilter.java b/protocols/smtp/src/main/java/org/apache/james/protocols/smtp/core/AbstractAddHeadersFilter.java
deleted file mode 100644
index 8f0e8e3..0000000
--- a/protocols/smtp/src/main/java/org/apache/james/protocols/smtp/core/AbstractAddHeadersFilter.java
+++ /dev/null
@@ -1,153 +0,0 @@
-/****************************************************************
- * 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.protocols.smtp.core;
-
-import java.io.UnsupportedEncodingException;
-import java.nio.ByteBuffer;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.List;
-import java.util.concurrent.atomic.AtomicInteger;
-
-import org.apache.james.protocols.api.ProtocolSession;
-import org.apache.james.protocols.api.ProtocolSession.State;
-import org.apache.james.protocols.api.Response;
-import org.apache.james.protocols.api.handler.LineHandler;
-import org.apache.james.protocols.smtp.SMTPSession;
-
-/**
- * Abstract base class for {@link SeparatingDataLineFilter} implementations that add headers to a message
- * 
- *
- */
-public abstract class AbstractAddHeadersFilter extends SeparatingDataLineFilter {
-
-    private static final AtomicInteger COUNTER = new AtomicInteger(0);
-    
-    private final ProtocolSession.AttachmentKey<Boolean> headersPrefixAdded = ProtocolSession.AttachmentKey.of("HEADERS_PREFIX_ADDED" + COUNTER.incrementAndGet(), Boolean.class);
-    private final ProtocolSession.AttachmentKey<Boolean> headersSuffixAdded = ProtocolSession.AttachmentKey.of("HEADERS_SUFFIX_ADDED" + COUNTER.incrementAndGet(), Boolean.class);
-
-    enum Location {
-        Prefix,
-        Suffix
-    }
-    
-    /**
-     * Return the {@link Location} to add the headers in
-     * 
-     * @return location
-     */
-    protected abstract Location getLocation();
-    
-    
-    @Override
-    protected Response onSeparatorLine(SMTPSession session, ByteBuffer line, LineHandler<SMTPSession> next) {
-        if (getLocation() == Location.Suffix && !session.getAttachment(headersSuffixAdded, State.Transaction).isPresent()) {
-            session.setAttachment(headersSuffixAdded, Boolean.TRUE, State.Transaction);
-            return addHeaders(session, line, next);
-        }
-        return super.onSeparatorLine(session, line, next);
-    }
-
-    @Override
-    protected Response onHeadersLine(SMTPSession session, ByteBuffer line, LineHandler<SMTPSession> next) {
-        if (getLocation() == Location.Prefix && !session.getAttachment(headersPrefixAdded, State.Transaction).isPresent()) {
-            session.setAttachment(headersPrefixAdded, Boolean.TRUE, State.Transaction);
-            return addHeaders(session, line, next);
-        }
-        return super.onHeadersLine(session, line, next);
-    }
-   
-    /**
-     * Add headers to the message
-     *
-     * @return response
-     */
-    private Response addHeaders(SMTPSession session, ByteBuffer line, LineHandler<SMTPSession> next) {
-        Response response;
-        for (Header header: headers(session)) {
-            response = header.transferTo(session, next);
-            if (response != null) {
-                return response;
-            }
-        }
-        return next.onLine(session, line);
-    }
-    
-    /**
-     * Return the {@link Header}'s to operate on
-     * 
-     * @return headers
-     */
-    protected abstract Collection<Header> headers(SMTPSession session);
-    
-    public static final class Header {
-        public static final String MULTI_LINE_PREFIX = "          ";
-        
-        public final String name;
-        public final List<String> values = new ArrayList<>();
-                
-        public Header(String name, String value) {
-            this.name = name;
-            this.values.add(value);
-        }
-        
-        /**
-         * Add the value to the header
-         */
-        public Header add(String value) {
-            values.add(value);
-            return this;
-        }
-        
-        
-        /**
-         * Transfer the content of the {@link Header} to the given {@link LineHandler}.
-         * 
-         * This is done for each line of the {@link Header} until the end is reached or the {@link LineHandler#onLine(org.apache.james.protocols.api.ProtocolSession, ByteBuffer)}
-         * return <code>non-null</code>
-         *
-         * @return response
-         */
-        public Response transferTo(SMTPSession session, LineHandler<SMTPSession> handler) {
-            String charset = session.getCharset().name();
-
-            try {
-                Response response = null;
-                for (int i = 0; i < values.size(); i++) {
-                    String line;
-                    if (i == 0) {
-                        line = name + ": " + values.get(i);
-                    } else {
-                        line = MULTI_LINE_PREFIX + values.get(i);
-                    }
-                    response = handler.onLine(session, ByteBuffer.wrap((line + session.getLineDelimiter()).getBytes(charset)));
-                    if (response != null) {
-                        break;
-                    }
-                }
-                return response;
-            } catch (UnsupportedEncodingException e) {
-                throw new RuntimeException("NO " + charset + " support ?", e);
-            }
-        }
-    }
-    
-    
-}
diff --git a/protocols/smtp/src/main/java/org/apache/james/protocols/smtp/core/ReceivedDataLineFilter.java b/protocols/smtp/src/main/java/org/apache/james/protocols/smtp/core/ReceivedDataLineFilter.java
index 3c24277..e08369c 100644
--- a/protocols/smtp/src/main/java/org/apache/james/protocols/smtp/core/ReceivedDataLineFilter.java
+++ b/protocols/smtp/src/main/java/org/apache/james/protocols/smtp/core/ReceivedDataLineFilter.java
@@ -18,25 +18,33 @@
  ****************************************************************/
 package org.apache.james.protocols.smtp.core;
 
+import java.io.UnsupportedEncodingException;
+import java.nio.ByteBuffer;
 import java.text.DateFormat;
 import java.text.SimpleDateFormat;
+import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Collection;
 import java.util.Date;
 import java.util.List;
 import java.util.Locale;
 import java.util.Optional;
+import java.util.concurrent.atomic.AtomicInteger;
 
 import org.apache.james.core.MailAddress;
+import org.apache.james.protocols.api.ProtocolSession;
 import org.apache.james.protocols.api.ProtocolSession.State;
+import org.apache.james.protocols.api.Response;
+import org.apache.james.protocols.api.handler.LineHandler;
 import org.apache.james.protocols.smtp.SMTPSession;
 
 import com.google.common.collect.ImmutableList;
 
 /**
- * {@link AbstractAddHeadersFilter} which adds the Received header for the message.
+ * {@link SeparatingDataLineFilter} which adds the Received header for the message.
  */
-public class ReceivedDataLineFilter extends AbstractAddHeadersFilter {
+public class ReceivedDataLineFilter extends SeparatingDataLineFilter {
+
     private static final String EHLO = "EHLO";
     private static final String SMTP = "SMTP";
     private static final String ESMTPA = "ESMTPA";
@@ -47,6 +55,10 @@ public class ReceivedDataLineFilter extends AbstractAddHeadersFilter {
         return new SimpleDateFormat("EEE, dd MMM yyyy HH:mm:ss Z (zzz)", Locale.US);
     });
 
+    private static final AtomicInteger COUNTER = new AtomicInteger(0);
+    private final ProtocolSession.AttachmentKey<Boolean> headersPrefixAdded = ProtocolSession.AttachmentKey.of("HEADERS_PREFIX_ADDED" + COUNTER.incrementAndGet(), Boolean.class);
+    private final ProtocolSession.AttachmentKey<Boolean> headersSuffixAdded = ProtocolSession.AttachmentKey.of("HEADERS_SUFFIX_ADDED" + COUNTER.incrementAndGet(), Boolean.class);
+
     /**
      * Return the service type which will be used in the Received headers.
      */
@@ -74,7 +86,6 @@ public class ReceivedDataLineFilter extends AbstractAddHeadersFilter {
     /**
      * The Received header is added in front of the received headers. So returns {@link Location#Suffix}
      */
-    @Override
     protected Location getLocation() {
         return Location.Prefix;
     }
@@ -83,7 +94,6 @@ public class ReceivedDataLineFilter extends AbstractAddHeadersFilter {
      * Returns the Received header for the message.
      */
     @SuppressWarnings("unchecked")
-    @Override
     protected Collection<Header> headers(SMTPSession session) {
 
         StringBuilder headerLineBuffer = new StringBuilder();
@@ -127,5 +137,95 @@ public class ReceivedDataLineFilter extends AbstractAddHeadersFilter {
         return Arrays.asList(header);
     
     }
-    
+
+    @Override
+    protected Response onSeparatorLine(SMTPSession session, ByteBuffer line, LineHandler<SMTPSession> next) {
+        if (getLocation() == Location.Suffix && !session.getAttachment(headersSuffixAdded, State.Transaction).isPresent()) {
+            session.setAttachment(headersSuffixAdded, Boolean.TRUE, State.Transaction);
+            return addHeaders(session, line, next);
+        }
+        return super.onSeparatorLine(session, line, next);
+    }
+
+    @Override
+    protected Response onHeadersLine(SMTPSession session, ByteBuffer line, LineHandler<SMTPSession> next) {
+        if (getLocation() == Location.Prefix && !session.getAttachment(headersPrefixAdded, State.Transaction).isPresent()) {
+            session.setAttachment(headersPrefixAdded, Boolean.TRUE, State.Transaction);
+            return addHeaders(session, line, next);
+        }
+        return super.onHeadersLine(session, line, next);
+    }
+
+    /**
+     * Add headers to the message
+     *
+     * @return response
+     */
+    private Response addHeaders(SMTPSession session, ByteBuffer line, LineHandler<SMTPSession> next) {
+        Response response;
+        for (Header header: headers(session)) {
+            response = header.transferTo(session, next);
+            if (response != null) {
+                return response;
+            }
+        }
+        return next.onLine(session, line);
+    }
+
+    enum Location {
+        Prefix,
+        Suffix
+    }
+
+    public static final class Header {
+        public static final String MULTI_LINE_PREFIX = "          ";
+
+        public final String name;
+        public final List<String> values = new ArrayList<>();
+
+        public Header(String name, String value) {
+            this.name = name;
+            this.values.add(value);
+        }
+
+        /**
+         * Add the value to the header
+         */
+        public Header add(String value) {
+            values.add(value);
+            return this;
+        }
+
+
+        /**
+         * Transfer the content of the {@link Header} to the given {@link LineHandler}.
+         *
+         * This is done for each line of the {@link Header} until the end is reached or the {@link LineHandler#onLine(org.apache.james.protocols.api.ProtocolSession, ByteBuffer)}
+         * return <code>non-null</code>
+         *
+         * @return response
+         */
+        public Response transferTo(SMTPSession session, LineHandler<SMTPSession> handler) {
+            String charset = session.getCharset().name();
+
+            try {
+                Response response = null;
+                for (int i = 0; i < values.size(); i++) {
+                    String line;
+                    if (i == 0) {
+                        line = name + ": " + values.get(i);
+                    } else {
+                        line = MULTI_LINE_PREFIX + values.get(i);
+                    }
+                    response = handler.onLine(session, ByteBuffer.wrap((line + session.getLineDelimiter()).getBytes(charset)));
+                    if (response != null) {
+                        break;
+                    }
+                }
+                return response;
+            } catch (UnsupportedEncodingException e) {
+                throw new RuntimeException("NO " + charset + " support ?", e);
+            }
+        }
+    }
 }


---------------------------------------------------------------------
To unsubscribe, e-mail: server-dev-unsubscribe@james.apache.org
For additional commands, e-mail: server-dev-help@james.apache.org