Author: norman
Date: Fri Nov 18 17:15:10 2011
New Revision: 1203750
URL: http://svn.apache.org/viewvc?rev=1203750&view=rev
Log:
Add some generic mutable ProtocolHandlerChain implementation and fix some
javadocs
Added:
james/protocols/trunk/api/src/main/java/org/apache/james/protocols/api/handler/ProtocolHandlerChainImpl.java
Modified:
james/protocols/trunk/api/src/main/java/org/apache/james/protocols/api/Protocol.java
james/protocols/trunk/api/src/main/java/org/apache/james/protocols/api/ProtocolSession.java
james/protocols/trunk/api/src/main/java/org/apache/james/protocols/api/ProtocolTransport.java
james/protocols/trunk/api/src/main/java/org/apache/james/protocols/api/handler/AbstractProtocolHandlerChain.java
james/protocols/trunk/lmtp/src/main/java/org/apache/james/protocols/lmtp/LMTPProtocolHandlerChain.java
james/protocols/trunk/smtp/src/main/java/org/apache/james/protocols/smtp/SMTPProtocolHandlerChain.java
Modified:
james/protocols/trunk/api/src/main/java/org/apache/james/protocols/api/Protocol.java
URL:
http://svn.apache.org/viewvc/james/protocols/trunk/api/src/main/java/org/apache/james/protocols/api/Protocol.java?rev=1203750&r1=1203749&r2=1203750&view=diff
==============================================================================
---
james/protocols/trunk/api/src/main/java/org/apache/james/protocols/api/Protocol.java
(original)
+++
james/protocols/trunk/api/src/main/java/org/apache/james/protocols/api/Protocol.java
Fri Nov 18 17:15:10 2011
@@ -41,6 +41,11 @@ public interface Protocol {
*/
ProtocolSession newSession(ProtocolTransport transport);
+ /**
+ * Returns <code>true</code> if STARTTLS is supported
+ *
+ * @return starttlsSupported
+ */
boolean isStartTLSSupported();
}
Modified:
james/protocols/trunk/api/src/main/java/org/apache/james/protocols/api/ProtocolSession.java
URL:
http://svn.apache.org/viewvc/james/protocols/trunk/api/src/main/java/org/apache/james/protocols/api/ProtocolSession.java?rev=1203750&r1=1203749&r2=1203750&view=diff
==============================================================================
---
james/protocols/trunk/api/src/main/java/org/apache/james/protocols/api/ProtocolSession.java
(original)
+++
james/protocols/trunk/api/src/main/java/org/apache/james/protocols/api/ProtocolSession.java
Fri Nov 18 17:15:10 2011
@@ -79,9 +79,19 @@ public interface ProtocolSession {
String getRemoteIPAddress();
- InetSocketAddress getLocalAddress();
-
+ /**
+ * Return the {@link InetSocketAddress} of the remote peer
+ *
+ * @return address
+ */
InetSocketAddress getRemoteAddress();
+
+ /**
+ * Return the {@link InetSocketAddress} of the local bound address
+ *
+ * @return local
+ */
+ InetSocketAddress getLocalAddress();
/**
* Return the ID for the session
Modified:
james/protocols/trunk/api/src/main/java/org/apache/james/protocols/api/ProtocolTransport.java
URL:
http://svn.apache.org/viewvc/james/protocols/trunk/api/src/main/java/org/apache/james/protocols/api/ProtocolTransport.java?rev=1203750&r1=1203749&r2=1203750&view=diff
==============================================================================
---
james/protocols/trunk/api/src/main/java/org/apache/james/protocols/api/ProtocolTransport.java
(original)
+++
james/protocols/trunk/api/src/main/java/org/apache/james/protocols/api/ProtocolTransport.java
Fri Nov 18 17:15:10 2011
@@ -36,6 +36,11 @@ public interface ProtocolTransport {
*/
InetSocketAddress getRemoteAddress();
+ /**
+ * Return the {@link InetSocketAddress} of the local bound address
+ *
+ * @return local
+ */
InetSocketAddress getLocalAddress();
Modified:
james/protocols/trunk/api/src/main/java/org/apache/james/protocols/api/handler/AbstractProtocolHandlerChain.java
URL:
http://svn.apache.org/viewvc/james/protocols/trunk/api/src/main/java/org/apache/james/protocols/api/handler/AbstractProtocolHandlerChain.java?rev=1203750&r1=1203749&r2=1203750&view=diff
==============================================================================
---
james/protocols/trunk/api/src/main/java/org/apache/james/protocols/api/handler/AbstractProtocolHandlerChain.java
(original)
+++
james/protocols/trunk/api/src/main/java/org/apache/james/protocols/api/handler/AbstractProtocolHandlerChain.java
Fri Nov 18 17:15:10 2011
@@ -31,11 +31,11 @@ import java.util.List;
public abstract class AbstractProtocolHandlerChain implements
ProtocolHandlerChain{
/**
- * Return a List of all Handlers
+ * Return an immutable List of all Handlers
*
* @return handlerList
*/
- protected abstract List<Object> getHandlers();
+ protected abstract List<ProtocolHandler> getHandlers();
/**
* @see
org.apache.james.protocols.api.handler.ProtocolHandlerChain#getHandlers(java.lang.Class)
@@ -43,7 +43,7 @@ public abstract class AbstractProtocolHa
@SuppressWarnings("unchecked")
public <T> LinkedList<T> getHandlers(Class<T> type) {
LinkedList<T> result = new LinkedList<T>();
- List<Object> handlers = getHandlers();
+ List<ProtocolHandler> handlers = getHandlers();
for (Iterator<?> i = handlers.iterator(); i.hasNext(); ) {
Object handler = i.next();
if (type.isInstance(handler)) {
@@ -59,8 +59,8 @@ public abstract class AbstractProtocolHa
*
* @throws WiringException
*/
- public final void wireExtensibleHandlers() throws WiringException {
- List<Object> handlers = getHandlers();
+ public void wireExtensibleHandlers() throws WiringException {
+ List<ProtocolHandler> handlers = getHandlers();
for (Iterator<?> h = handlers.iterator(); h.hasNext(); ) {
Object handler = h.next();
if (handler instanceof ExtensibleHandler) {
Added:
james/protocols/trunk/api/src/main/java/org/apache/james/protocols/api/handler/ProtocolHandlerChainImpl.java
URL:
http://svn.apache.org/viewvc/james/protocols/trunk/api/src/main/java/org/apache/james/protocols/api/handler/ProtocolHandlerChainImpl.java?rev=1203750&view=auto
==============================================================================
---
james/protocols/trunk/api/src/main/java/org/apache/james/protocols/api/handler/ProtocolHandlerChainImpl.java
(added)
+++
james/protocols/trunk/api/src/main/java/org/apache/james/protocols/api/handler/ProtocolHandlerChainImpl.java
Fri Nov 18 17:15:10 2011
@@ -0,0 +1,273 @@
+/****************************************************************
+ * 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.api.handler;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.Iterator;
+import java.util.List;
+import java.util.ListIterator;
+
+/**
+ * {@link AbstractProtocolHandlerChain} which is mutable till the {@link
#wireExtensibleHandlers()} is called. After that all operations
+ * which try to modify the instance will throw and {@link
UnsupportedOperationException}
+ *
+ *
+ */
+public class ProtocolHandlerChainImpl extends AbstractProtocolHandlerChain
implements List<ProtocolHandler>{
+
+ private final List<ProtocolHandler> handlers = new
ArrayList<ProtocolHandler>();
+ private volatile boolean readyOnly = false;
+
+
+ /**
+ * Once this is called all tries to modify this {@link
ProtocolHandlerChainImpl} will throw an {@link UnsupportedOperationException}
+ */
+ @Override
+ public void wireExtensibleHandlers() throws WiringException {
+ super.wireExtensibleHandlers();
+ readyOnly = true;
+ }
+
+ protected final boolean isReadyOnly() {
+ return readyOnly;
+ }
+
+ public boolean add(ProtocolHandler handler) {
+ if (readyOnly) {
+ throw new UnsupportedOperationException("Ready-only");
+ }
+ return handlers.add(handler);
+ }
+
+ @Override
+ protected List<ProtocolHandler> getHandlers() {
+ if (!readyOnly) {
+ throw new IllegalStateException("wireExtensibleHandler
must be called first!");
+ }
+ return Collections.unmodifiableList(handlers);
+ }
+
+ @Override
+ public int size() {
+ return handlers.size();
+ }
+
+ @Override
+ public boolean isEmpty() {
+ return handlers.isEmpty();
+ }
+
+ @Override
+ public boolean contains(Object o) {
+ return handlers.contains(o);
+ }
+
+ @Override
+ public Iterator<ProtocolHandler> iterator() {
+ return new ProtocolHandlerIterator(handlers.listIterator());
+ }
+
+ @Override
+ public Object[] toArray() {
+ return handlers.toArray();
+ }
+
+ @Override
+ public <T> T[] toArray(T[] a) {
+ return handlers.toArray(a);
+ }
+
+ @Override
+ public boolean remove(Object o) {
+ if (readyOnly) {
+ throw new UnsupportedOperationException("Ready-only");
+ }
+ return handlers.remove(o);
+ }
+
+ @Override
+ public boolean containsAll(Collection<?> c) {
+ return handlers.containsAll(c);
+ }
+
+ @Override
+ public boolean addAll(Collection<? extends ProtocolHandler> c) {
+ if (readyOnly) {
+ throw new UnsupportedOperationException("Ready-only");
+ }
+ return handlers.addAll(c);
+ }
+
+ @Override
+ public boolean addAll(int index, Collection<? extends ProtocolHandler>
c) {
+ if (readyOnly) {
+ throw new UnsupportedOperationException("Ready-only");
+ }
+ return handlers.addAll(index, c);
+ }
+
+ @Override
+ public boolean removeAll(Collection<?> c) {
+ if (readyOnly) {
+ throw new UnsupportedOperationException("Ready-only");
+ }
+ return handlers.removeAll(c);
+ }
+
+ @Override
+ public boolean retainAll(Collection<?> c) {
+ return handlers.retainAll(c);
+ }
+
+ @Override
+ public void clear() {
+ if (readyOnly) {
+ throw new UnsupportedOperationException("Ready-only");
+ }
+ handlers.clear();
+ }
+
+ @Override
+ public ProtocolHandler get(int index) {
+ return (ProtocolHandler) handlers.get(index);
+ }
+
+ @Override
+ public ProtocolHandler set(int index, ProtocolHandler element) {
+ if (readyOnly) {
+ throw new UnsupportedOperationException("Ready-only");
+ }
+ return (ProtocolHandler) handlers.set(index, element);
+ }
+
+ @Override
+ public void add(int index, ProtocolHandler element) {
+ if (readyOnly) {
+ throw new UnsupportedOperationException("Ready-only");
+ }
+ handlers.add(index, element);
+ }
+
+ @Override
+ public ProtocolHandler remove(int index) {
+ if (readyOnly) {
+ throw new UnsupportedOperationException("Ready-only");
+ }
+ return (ProtocolHandler) handlers.remove(index);
+ }
+
+ @Override
+ public int indexOf(Object o) {
+ return handlers.indexOf(o);
+ }
+
+ @Override
+ public int lastIndexOf(Object o) {
+ return handlers.lastIndexOf(o);
+ }
+
+ @Override
+ public ListIterator<ProtocolHandler> listIterator() {
+ return new ProtocolHandlerIterator(handlers.listIterator());
+ }
+
+ @Override
+ public ListIterator<ProtocolHandler> listIterator(int index) {
+ return new
ProtocolHandlerIterator(handlers.listIterator(index));
+ }
+
+ @Override
+ public List<ProtocolHandler> subList(int fromIndex, int toIndex) {
+ List<ProtocolHandler> sList = new ArrayList<ProtocolHandler>();
+ for (Object handler: handlers.subList(fromIndex, toIndex)) {
+ sList.add((ProtocolHandler) handler);
+ }
+ if (readyOnly) {
+ return Collections.unmodifiableList(sList);
+ }
+ return sList;
+ }
+
+ private final class ProtocolHandlerIterator implements
ListIterator<ProtocolHandler> {
+ private final ListIterator<ProtocolHandler> handlers;
+
+ public ProtocolHandlerIterator(ListIterator<ProtocolHandler>
handlers) {
+ this.handlers = handlers;
+ }
+
+ @Override
+ public boolean hasNext() {
+ return handlers.hasNext();
+ }
+
+ @Override
+ public ProtocolHandler next() {
+ return (ProtocolHandler) handlers.next();
+ }
+
+ @Override
+ public boolean hasPrevious() {
+ return handlers.hasPrevious();
+ }
+
+ @Override
+ public ProtocolHandler previous() {
+ return handlers.previous();
+ }
+
+ @Override
+ public int nextIndex() {
+ return handlers.nextIndex();
+ }
+
+ @Override
+ public int previousIndex() {
+ return handlers.previousIndex();
+ }
+
+ @Override
+ public void remove() {
+ if (readyOnly) {
+ throw new
UnsupportedOperationException("Ready-only");
+ }
+ handlers.previousIndex();
+ }
+
+ @Override
+ public void set(ProtocolHandler e) {
+ if (readyOnly) {
+ throw new
UnsupportedOperationException("Ready-only");
+ }
+ handlers.set(e);
+ }
+
+ @Override
+ public void add(ProtocolHandler e) {
+ if (readyOnly) {
+ throw new
UnsupportedOperationException("Ready-only");
+ }
+ handlers.add(e);
+ }
+
+ }
+
+}
Modified:
james/protocols/trunk/lmtp/src/main/java/org/apache/james/protocols/lmtp/LMTPProtocolHandlerChain.java
URL:
http://svn.apache.org/viewvc/james/protocols/trunk/lmtp/src/main/java/org/apache/james/protocols/lmtp/LMTPProtocolHandlerChain.java?rev=1203750&r1=1203749&r2=1203750&view=diff
==============================================================================
---
james/protocols/trunk/lmtp/src/main/java/org/apache/james/protocols/lmtp/LMTPProtocolHandlerChain.java
(original)
+++
james/protocols/trunk/lmtp/src/main/java/org/apache/james/protocols/lmtp/LMTPProtocolHandlerChain.java
Fri Nov 18 17:15:10 2011
@@ -21,6 +21,7 @@ package org.apache.james.protocols.lmtp;
import java.util.ArrayList;
import java.util.List;
+import org.apache.james.protocols.api.handler.ProtocolHandler;
import org.apache.james.protocols.api.handler.WiringException;
import org.apache.james.protocols.smtp.SMTPProtocolHandlerChain;
import org.apache.james.protocols.smtp.core.DataCmdHandler;
@@ -44,8 +45,8 @@ public class LMTPProtocolHandlerChain ex
}
@Override
- protected List<Object> initDefaultHandlers() {
- List<Object> defaultHandlers = new ArrayList<Object>();
+ protected List<ProtocolHandler> initDefaultHandlers() {
+ List<ProtocolHandler> defaultHandlers = new
ArrayList<ProtocolHandler>();
defaultHandlers.add(new SMTPCommandDispatcherLineHandler());
defaultHandlers.add(new ExpnCmdHandler());
defaultHandlers.add(new LhloCmdHandler());
Modified:
james/protocols/trunk/smtp/src/main/java/org/apache/james/protocols/smtp/SMTPProtocolHandlerChain.java
URL:
http://svn.apache.org/viewvc/james/protocols/trunk/smtp/src/main/java/org/apache/james/protocols/smtp/SMTPProtocolHandlerChain.java?rev=1203750&r1=1203749&r2=1203750&view=diff
==============================================================================
---
james/protocols/trunk/smtp/src/main/java/org/apache/james/protocols/smtp/SMTPProtocolHandlerChain.java
(original)
+++
james/protocols/trunk/smtp/src/main/java/org/apache/james/protocols/smtp/SMTPProtocolHandlerChain.java
Fri Nov 18 17:15:10 2011
@@ -19,11 +19,12 @@
package org.apache.james.protocols.smtp;
import java.util.ArrayList;
-import java.util.Collections;
+import java.util.Collection;
import java.util.List;
-import org.apache.james.protocols.api.handler.AbstractProtocolHandlerChain;
+import org.apache.james.protocols.api.handler.ProtocolHandler;
import org.apache.james.protocols.api.handler.ProtocolHandlerChain;
+import org.apache.james.protocols.api.handler.ProtocolHandlerChainImpl;
import org.apache.james.protocols.api.handler.WiringException;
import org.apache.james.protocols.smtp.core.DataCmdHandler;
import org.apache.james.protocols.smtp.core.DataLineMessageHookHandler;
@@ -46,34 +47,48 @@ import org.apache.james.protocols.smtp.c
import org.apache.james.protocols.smtp.core.esmtp.StartTlsCmdHandler;
import org.apache.james.protocols.smtp.hook.AuthHook;
import org.apache.james.protocols.smtp.hook.Hook;
-import org.apache.james.protocols.smtp.hook.MessageHook;
/**
* This {@link ProtocolHandlerChain} implementation add all needed handlers to
* the chain to act as full blown SMTPServer. By default messages will just get
* rejected after the DATA command.
*
- * If you want to accept the messagejust add a {@link MessageHook}
- * implementation to the chain and handle the queuing
+ *
+ *
*
*
*
*/
-public class SMTPProtocolHandlerChain extends AbstractProtocolHandlerChain {
- private final List<Object> defaultHandlers = new ArrayList<Object>();
- private final List<Hook> hooks = new ArrayList<Hook>();
- private final List<Object> handlers = new ArrayList<Object>();
- private boolean authHandler = false;
+public class SMTPProtocolHandlerChain extends ProtocolHandlerChainImpl {
+ private volatile boolean authHandler = false;
- public SMTPProtocolHandlerChain() throws WiringException {
- defaultHandlers.addAll(initDefaultHandlers());
- copy();
+ public SMTPProtocolHandlerChain() {
+ this(true);
+ }
+
- wireExtensibleHandlers();
+ public SMTPProtocolHandlerChain(boolean addDefault) {
+ if (addDefault) {
+ addAll(initDefaultHandlers());
+ }
}
- protected List<Object> initDefaultHandlers() {
- List<Object> defaultHandlers = new ArrayList<Object>();
+ /**
+ * Add all default handlers to the chain and the given {@link Hook}'s.
After that {@link #wireExtensibleHandlers()} is called
+ *
+ * @param hooks
+ * @throws WiringException
+ */
+ public SMTPProtocolHandlerChain(Hook... hooks) throws WiringException {
+ this(true);
+ for (int i = 0; i < hooks.length; i++) {
+ add(hooks[i]);
+ }
+ wireExtensibleHandlers();
+ }
+
+ protected List<ProtocolHandler> initDefaultHandlers() {
+ List<ProtocolHandler> defaultHandlers = new
ArrayList<ProtocolHandler>();
defaultHandlers.add(new SMTPCommandDispatcherLineHandler());
defaultHandlers.add(new ExpnCmdHandler());
defaultHandlers.add(new EhloCmdHandler());
@@ -96,74 +111,44 @@ public class SMTPProtocolHandlerChain ex
}
- /**
- * Add the hook to the chain
- *
- * @param hook
- * @throws WiringException
- */
- public final synchronized void addHook(Hook hook) throws WiringException {
- if (hook instanceof AuthHook && !authHandler) {
- defaultHandlers.add(new AuthCmdHandler());
+ private boolean checkForAuth(ProtocolHandler handler) {
+ if (handler instanceof AuthHook && !authHandler) {
+ if (!add(new AuthCmdHandler())) {
+ return false;
+ }
authHandler = true;
}
- addHook(hooks.size(), hook);
- }
-
- /**
- * Add the hook to the chain on the given index
- *
- * @param index
- * @param hook
- * @throws WiringException
- */
- public final synchronized void addHook(int index, Hook hook) throws
WiringException {
- hooks.add(index, hook);
- copy();
- wireExtensibleHandlers();
-
+ return true;
}
-
- /**
- * Remove the Hook found on the given index from the chain
- *
- * @param index
- * @return hook
- * @throws WiringException
- */
- public final synchronized Hook removeHook(int index) throws
WiringException {
- Hook hook = hooks.remove(index);
- handlers.remove(hook);
- wireExtensibleHandlers();
- return hook;
-
+ public boolean add(ProtocolHandler handler) {
+ checkForAuth(handler);
+ return super.add(handler);
}
- /**
- * Return the index of the given hook
- *
- * @param hook
- * @return index
- */
- public synchronized int getIndexOfHook(Hook hook) {
- return hooks.indexOf(hook);
+ @Override
+ public boolean addAll(Collection<? extends ProtocolHandler> c) {
+ for (ProtocolHandler handler: c) {
+ if (!checkForAuth(handler)) {
+ return false;
+ }
+ }
+ return super.addAll(c);
}
- /**
- * @see
- *
org.apache.james.protocols.api.handler.AbstractProtocolHandlerChain#getHandlers()
- */
@Override
- protected synchronized List<Object> getHandlers() {
- return Collections.unmodifiableList(handlers);
+ public boolean addAll(int index, Collection<? extends ProtocolHandler> c) {
+ for (ProtocolHandler handler: c) {
+ if (!checkForAuth(handler)) {
+ return false;
+ }
+ }
+ return super.addAll(index, c);
}
- /**
- * Copy the lists
- */
- private void copy() {
- handlers.clear();
- handlers.addAll(defaultHandlers);
- handlers.addAll(hooks);
+ @Override
+ public void add(int index, ProtocolHandler element) {
+ checkForAuth(element);
+ super.add(index, element);
}
+
}
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]