Author: norman
Date: Thu Sep 22 13:27:35 2011
New Revision: 1174122
URL: http://svn.apache.org/viewvc?rev=1174122&view=rev
Log:
Remove return value from ConnectHandler/LineHandler as it makes no sense. Not
sure why I thought it would make sense before.. Beside this I added special
type of FutureResponse which allows to handle Responses in a async fashion.
This is more for the skilled dev but there are use cases (stay tuned)
Added:
james/protocols/trunk/api/src/main/java/org/apache/james/protocols/api/FutureResponse.java
(with props)
Removed:
james/protocols/trunk/impl/src/main/java/org/apache/james/protocols/impl/log/ConnectHandlerResultLogger.java
james/protocols/trunk/impl/src/main/java/org/apache/james/protocols/impl/log/LineHandlerResultLogger.java
Modified:
james/protocols/trunk/api/src/main/java/org/apache/james/protocols/api/handler/AbstractCommandDispatcher.java
james/protocols/trunk/api/src/main/java/org/apache/james/protocols/api/handler/ConnectHandler.java
james/protocols/trunk/api/src/main/java/org/apache/james/protocols/api/handler/ConnectHandlerResultHandler.java
james/protocols/trunk/api/src/main/java/org/apache/james/protocols/api/handler/LineHandler.java
james/protocols/trunk/api/src/main/java/org/apache/james/protocols/api/handler/LineHandlerResultHandler.java
james/protocols/trunk/impl/src/main/java/org/apache/james/protocols/impl/BasicChannelUpstreamHandler.java
james/protocols/trunk/impl/src/main/java/org/apache/james/protocols/impl/LineHandlerUpstreamHandler.java
james/protocols/trunk/smtp/src/main/java/org/apache/james/protocols/smtp/core/DataCmdHandler.java
james/protocols/trunk/smtp/src/main/java/org/apache/james/protocols/smtp/core/WelcomeMessageHandler.java
james/protocols/trunk/smtp/src/main/java/org/apache/james/protocols/smtp/core/esmtp/AuthCmdHandler.java
james/protocols/trunk/smtp/src/main/java/org/apache/james/protocols/smtp/core/fastfail/DNSRBLHandler.java
Added:
james/protocols/trunk/api/src/main/java/org/apache/james/protocols/api/FutureResponse.java
URL:
http://svn.apache.org/viewvc/james/protocols/trunk/api/src/main/java/org/apache/james/protocols/api/FutureResponse.java?rev=1174122&view=auto
==============================================================================
---
james/protocols/trunk/api/src/main/java/org/apache/james/protocols/api/FutureResponse.java
(added)
+++
james/protocols/trunk/api/src/main/java/org/apache/james/protocols/api/FutureResponse.java
Thu Sep 22 13:27:35 2011
@@ -0,0 +1,66 @@
+/****************************************************************
+ * 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;
+
+/**
+ * An special {@link Response} which allows to populate it in an async
fashion. It also allows to register listeners which will get notified once the
+ * {@link FutureResponse} is ready
+ *
+ *
+ */
+public interface FutureResponse extends Response{
+
+ /**
+ * Add a {@link ResponseListener} which will get notified once {@link
#isReady()} is true
+ *
+ * @param listener
+ */
+ public void addListener(ResponseListener listener);
+
+ /**
+ * Remote a {@link ResponseListener}
+ *
+ * @param listener
+ */
+ public void removeListener(ResponseListener listener);
+
+ /**
+ * Return <code>true</code> once the {@link FutureResponse} is ready and
calling any of the get methods will not block any more.
+ *
+ * @return ready
+ */
+ public boolean isReady();
+
+
+ /**
+ * Listener which will get notified once the {@link
FutureResponse#isReady()} returns <code>true</code>
+ *
+ *
+ */
+ public interface ResponseListener {
+
+ /**
+ * The {@link Response} is ready for processing
+ *
+ * @param response
+ */
+ public void onResponse(Response response);
+ }
+}
Propchange:
james/protocols/trunk/api/src/main/java/org/apache/james/protocols/api/FutureResponse.java
------------------------------------------------------------------------------
svn:mime-type = text/plain
Modified:
james/protocols/trunk/api/src/main/java/org/apache/james/protocols/api/handler/AbstractCommandDispatcher.java
URL:
http://svn.apache.org/viewvc/james/protocols/trunk/api/src/main/java/org/apache/james/protocols/api/handler/AbstractCommandDispatcher.java?rev=1174122&r1=1174121&r2=1174122&view=diff
==============================================================================
---
james/protocols/trunk/api/src/main/java/org/apache/james/protocols/api/handler/AbstractCommandDispatcher.java
(original)
+++
james/protocols/trunk/api/src/main/java/org/apache/james/protocols/api/handler/AbstractCommandDispatcher.java
Thu Sep 22 13:27:35 2011
@@ -29,7 +29,10 @@ import java.util.List;
import java.util.Locale;
import org.apache.james.protocols.api.BaseRequest;
+import org.apache.james.protocols.api.FutureResponse;
+import org.apache.james.protocols.api.FutureResponse.ResponseListener;
import org.apache.james.protocols.api.ProtocolSession;
+import org.apache.james.protocols.api.Request;
import org.apache.james.protocols.api.Response;
@@ -125,7 +128,7 @@ public abstract class AbstractCommandDis
* (non-Javadoc)
* @see
org.apache.james.api.protocol.LineHandler#onLine(org.apache.james.api.protocol.ProtocolSession,
byte[])
*/
- public boolean onLine(Session session, byte[] line) {
+ public void onLine(final Session session, byte[] line) {
String curCommandName = null;
String curCommandArgument = null;
String cmdString;
@@ -146,37 +149,55 @@ public abstract class AbstractCommandDis
}
List<CommandHandler<Session>> commandHandlers =
getCommandHandlers(curCommandName, session);
// fetch the command handlers registered to the command
- int count = commandHandlers.size();
- for (int i = 0; i < count; i++) {
- CommandHandler<Session> cHandler = commandHandlers.get(i);
-
- long start = System.currentTimeMillis();
- Response response = cHandler.onCommand(session, new
BaseRequest(curCommandName, curCommandArgument));
- long executionTime = System.currentTimeMillis() - start;
-
- // if the response is received, stop processing of command
- // handlers
- if (response != null) {
-
- // now process the result handlers
- for (int a = 0; a < rHandlers.size(); a++) {
- response = rHandlers.get(a).onResponse(session,
response, executionTime, (CommandHandler<Session>) cHandler);
- }
- session.writeResponse(response);
-
- break;
- }
- }
+
+ BaseRequest request = new BaseRequest(curCommandName,
curCommandArgument);
+ Iterator<CommandHandler<Session>> handlers =
commandHandlers.iterator();
+ executeHandlers(handlers, session, request);
} catch (UnsupportedEncodingException e) {
// Should never happen
session.getLogger().error("Unable to handle encoding" ,e );
}
- return false;
}
+ private void executeHandlers(final Iterator<CommandHandler<Session>>
handlers, final Session session, final Request request) {
+ final CommandHandler<Session> cHandler = handlers.next();
+
+
+ final long start = System.currentTimeMillis();
+ Response response = cHandler.onCommand(session, request);
+ if (response instanceof FutureResponse) {
+ ((FutureResponse) response).addListener(new ResponseListener() {
+
+ public void onResponse(Response response) {
+ long executionTime = System.currentTimeMillis() - start;
+ handleResponse(handlers, session, response, request,
cHandler, executionTime);
+ }
+ });
+ } else {
+ long executionTime = System.currentTimeMillis() - start;
+ handleResponse(handlers, session, response, request, cHandler,
executionTime);
+ }
+ }
+
+ private void handleResponse(Iterator<CommandHandler<Session>> handlers,
Session session, Response response, Request request, CommandHandler<Session>
cHandler, long executionTime) {
+
+ // if the response is received, stop processing of command
+ // handlers
+ if (response != null) {
+
+ // now process the result handlers
+ for (int a = 0; a < rHandlers.size(); a++) {
+ response = rHandlers.get(a).onResponse(session, response,
executionTime, (CommandHandler<Session>) cHandler);
+ }
+ session.writeResponse(response);
+ } else {
+ executeHandlers(handlers, session, request);
+ }
+
+ }
protected String getLineDecodingCharset() {
return "US-ASCII";
}
Modified:
james/protocols/trunk/api/src/main/java/org/apache/james/protocols/api/handler/ConnectHandler.java
URL:
http://svn.apache.org/viewvc/james/protocols/trunk/api/src/main/java/org/apache/james/protocols/api/handler/ConnectHandler.java?rev=1174122&r1=1174121&r2=1174122&view=diff
==============================================================================
---
james/protocols/trunk/api/src/main/java/org/apache/james/protocols/api/handler/ConnectHandler.java
(original)
+++
james/protocols/trunk/api/src/main/java/org/apache/james/protocols/api/handler/ConnectHandler.java
Thu Sep 22 13:27:35 2011
@@ -33,8 +33,7 @@ public interface ConnectHandler<Session
/**
* Handle connection and disconnect if true is returned
*
- * @return disconnect
**/
- boolean onConnect(Session session);
+ void onConnect(Session session);
}
Modified:
james/protocols/trunk/api/src/main/java/org/apache/james/protocols/api/handler/ConnectHandlerResultHandler.java
URL:
http://svn.apache.org/viewvc/james/protocols/trunk/api/src/main/java/org/apache/james/protocols/api/handler/ConnectHandlerResultHandler.java?rev=1174122&r1=1174121&r2=1174122&view=diff
==============================================================================
---
james/protocols/trunk/api/src/main/java/org/apache/james/protocols/api/handler/ConnectHandlerResultHandler.java
(original)
+++
james/protocols/trunk/api/src/main/java/org/apache/james/protocols/api/handler/ConnectHandlerResultHandler.java
Thu Sep 22 13:27:35 2011
@@ -36,8 +36,7 @@ public interface ConnectHandlerResultHan
* @param response
* @param executionTime
* @param handler
- * @return result
*/
- boolean onResponse(ProtocolSession session, boolean response, long
executionTime, ConnectHandler<S> handler);
+ void onResponse(ProtocolSession session, long executionTime,
ConnectHandler<S> handler);
}
Modified:
james/protocols/trunk/api/src/main/java/org/apache/james/protocols/api/handler/LineHandler.java
URL:
http://svn.apache.org/viewvc/james/protocols/trunk/api/src/main/java/org/apache/james/protocols/api/handler/LineHandler.java?rev=1174122&r1=1174121&r2=1174122&view=diff
==============================================================================
---
james/protocols/trunk/api/src/main/java/org/apache/james/protocols/api/handler/LineHandler.java
(original)
+++
james/protocols/trunk/api/src/main/java/org/apache/james/protocols/api/handler/LineHandler.java
Thu Sep 22 13:27:35 2011
@@ -34,8 +34,7 @@ public interface LineHandler<Session ext
*
* @param session not null
* @param line not null
- * @return disconnect
*/
- boolean onLine(Session session, byte[] line);
+ void onLine(Session session, byte[] line);
}
Modified:
james/protocols/trunk/api/src/main/java/org/apache/james/protocols/api/handler/LineHandlerResultHandler.java
URL:
http://svn.apache.org/viewvc/james/protocols/trunk/api/src/main/java/org/apache/james/protocols/api/handler/LineHandlerResultHandler.java?rev=1174122&r1=1174121&r2=1174122&view=diff
==============================================================================
---
james/protocols/trunk/api/src/main/java/org/apache/james/protocols/api/handler/LineHandlerResultHandler.java
(original)
+++
james/protocols/trunk/api/src/main/java/org/apache/james/protocols/api/handler/LineHandlerResultHandler.java
Thu Sep 22 13:27:35 2011
@@ -35,12 +35,11 @@ public interface LineHandlerResultHandle
* Called after the {@link LineHandler} returned a result
*
* @param session
- * @param response
* @param executionTime
* @param handler
* @return result
*/
- boolean onResponse(ProtocolSession session, boolean response, long
executionTime, LineHandler<S> handler);
+ void onResponse(ProtocolSession session, long executionTime,
LineHandler<S> handler);
}
Modified:
james/protocols/trunk/impl/src/main/java/org/apache/james/protocols/impl/BasicChannelUpstreamHandler.java
URL:
http://svn.apache.org/viewvc/james/protocols/trunk/impl/src/main/java/org/apache/james/protocols/impl/BasicChannelUpstreamHandler.java?rev=1174122&r1=1174121&r2=1174122&view=diff
==============================================================================
---
james/protocols/trunk/impl/src/main/java/org/apache/james/protocols/impl/BasicChannelUpstreamHandler.java
(original)
+++
james/protocols/trunk/impl/src/main/java/org/apache/james/protocols/impl/BasicChannelUpstreamHandler.java
Thu Sep 22 13:27:35 2011
@@ -95,16 +95,13 @@ public class BasicChannelUpstreamHandler
ConnectHandler cHandler = connectHandlers.get(i);
long start = System.currentTimeMillis();
- boolean disconnect = connectHandlers.get(i).onConnect(session);
+ connectHandlers.get(i).onConnect(session);
long executionTime = System.currentTimeMillis() - start;
for (int a = 0; a < resultHandlers.size(); a++) {
- disconnect = resultHandlers.get(a).onResponse(session,
disconnect, executionTime, cHandler);
- }
- if (disconnect) {
- ctx.getChannel().disconnect();
- break;
+ resultHandlers.get(a).onResponse(session, executionTime,
cHandler);
}
+
}
}
super.channelConnected(ctx, e);
@@ -151,13 +148,12 @@ public class BasicChannelUpstreamHandler
LineHandler lHandler= (LineHandler) lineHandlers.getLast();
long start = System.currentTimeMillis();
- boolean disconnect = lHandler.onLine(pSession,line);
+ lHandler.onLine(pSession,line);
long executionTime = System.currentTimeMillis() - start;
for (int i = 0; i < resultHandlers.size(); i++) {
- disconnect = resultHandlers.get(i).onResponse(pSession,
disconnect, executionTime, lHandler);
+ resultHandlers.get(i).onResponse(pSession, executionTime,
lHandler);
}
- if (disconnect) ctx.getChannel().disconnect();
}
Modified:
james/protocols/trunk/impl/src/main/java/org/apache/james/protocols/impl/LineHandlerUpstreamHandler.java
URL:
http://svn.apache.org/viewvc/james/protocols/trunk/impl/src/main/java/org/apache/james/protocols/impl/LineHandlerUpstreamHandler.java?rev=1174122&r1=1174121&r2=1174122&view=diff
==============================================================================
---
james/protocols/trunk/impl/src/main/java/org/apache/james/protocols/impl/LineHandlerUpstreamHandler.java
(original)
+++
james/protocols/trunk/impl/src/main/java/org/apache/james/protocols/impl/LineHandlerUpstreamHandler.java
Thu Sep 22 13:27:35 2011
@@ -21,8 +21,6 @@ package org.apache.james.protocols.impl;
import org.apache.james.protocols.api.ProtocolSession;
import org.apache.james.protocols.api.handler.LineHandler;
import org.jboss.netty.buffer.ChannelBuffer;
-import org.jboss.netty.buffer.ChannelBuffers;
-import org.jboss.netty.channel.ChannelFutureListener;
import org.jboss.netty.channel.ChannelHandlerContext;
import org.jboss.netty.channel.ChannelUpstreamHandler;
import org.jboss.netty.channel.MessageEvent;
@@ -55,9 +53,7 @@ public class LineHandlerUpstreamHandler<
buf.getBytes(0, line);
}
- boolean disconnect = handler.onLine(session, line);
- if (disconnect)
ctx.getChannel().write(ChannelBuffers.EMPTY_BUFFER).addListener(ChannelFutureListener.CLOSE);
-
+ handler.onLine(session, line);
}
}
Modified:
james/protocols/trunk/smtp/src/main/java/org/apache/james/protocols/smtp/core/DataCmdHandler.java
URL:
http://svn.apache.org/viewvc/james/protocols/trunk/smtp/src/main/java/org/apache/james/protocols/smtp/core/DataCmdHandler.java?rev=1174122&r1=1174121&r2=1174122&view=diff
==============================================================================
---
james/protocols/trunk/smtp/src/main/java/org/apache/james/protocols/smtp/core/DataCmdHandler.java
(original)
+++
james/protocols/trunk/smtp/src/main/java/org/apache/james/protocols/smtp/core/DataCmdHandler.java
Thu Sep 22 13:27:35 2011
@@ -48,13 +48,12 @@ public class DataCmdHandler implements C
* (non-Javadoc)
* @see
org.apache.james.api.protocol.LineHandler#onLine(org.apache.james.api.protocol.ProtocolSession,
byte[])
*/
- public boolean onLine(SMTPSession session, byte[] line) {
+ public void onLine(SMTPSession session, byte[] line) {
// Discard everything until the end of DATA session
if (line.length == 3 && line[0] == 46) {
session.popLineHandler();
}
- return false;
}
}
@@ -72,9 +71,8 @@ public class DataCmdHandler implements C
* (non-Javadoc)
* @see
org.apache.james.api.protocol.LineHandler#onLine(org.apache.james.api.protocol.ProtocolSession,
byte[])
*/
- public boolean onLine(SMTPSession session, byte[] line) {
+ public void onLine(SMTPSession session, byte[] line) {
filter.onLine(session, line, next);
- return false;
}
}
Modified:
james/protocols/trunk/smtp/src/main/java/org/apache/james/protocols/smtp/core/WelcomeMessageHandler.java
URL:
http://svn.apache.org/viewvc/james/protocols/trunk/smtp/src/main/java/org/apache/james/protocols/smtp/core/WelcomeMessageHandler.java?rev=1174122&r1=1174121&r2=1174122&view=diff
==============================================================================
---
james/protocols/trunk/smtp/src/main/java/org/apache/james/protocols/smtp/core/WelcomeMessageHandler.java
(original)
+++
james/protocols/trunk/smtp/src/main/java/org/apache/james/protocols/smtp/core/WelcomeMessageHandler.java
Thu Sep 22 13:27:35 2011
@@ -41,7 +41,7 @@ public class WelcomeMessageHandler imple
/**
* @see
org.apache.james.smtpserver.protocol.ConnectHandler#onConnect(SMTPSession)
*/
- public boolean onConnect(SMTPSession session) {
+ public void onConnect(SMTPSession session) {
String smtpGreeting = session.getSMTPGreeting();
SMTPResponse welcomeResponse;
@@ -60,8 +60,6 @@ public class WelcomeMessageHandler imple
welcomeResponse = new
SMTPResponse(SMTPRetCode.SERVICE_READY,smtpGreeting);
}
session.writeResponse(welcomeResponse);
-
- return false;
}
protected String getProductName() {
Modified:
james/protocols/trunk/smtp/src/main/java/org/apache/james/protocols/smtp/core/esmtp/AuthCmdHandler.java
URL:
http://svn.apache.org/viewvc/james/protocols/trunk/smtp/src/main/java/org/apache/james/protocols/smtp/core/esmtp/AuthCmdHandler.java?rev=1174122&r1=1174121&r2=1174122&view=diff
==============================================================================
---
james/protocols/trunk/smtp/src/main/java/org/apache/james/protocols/smtp/core/esmtp/AuthCmdHandler.java
(original)
+++
james/protocols/trunk/smtp/src/main/java/org/apache/james/protocols/smtp/core/esmtp/AuthCmdHandler.java
Thu Sep 22 13:27:35 2011
@@ -60,7 +60,7 @@ public class AuthCmdHandler
private abstract class AbstractSMTPLineHandler implements
LineHandler<SMTPSession> {
- public boolean onLine(SMTPSession session, byte[] l) {
+ public void onLine(SMTPSession session, byte[] l) {
SMTPResponse res;
try {
res = handleCommand(session, new String(l,"US-ASCII"));
@@ -68,7 +68,6 @@ public class AuthCmdHandler
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
- return false;
}
Modified:
james/protocols/trunk/smtp/src/main/java/org/apache/james/protocols/smtp/core/fastfail/DNSRBLHandler.java
URL:
http://svn.apache.org/viewvc/james/protocols/trunk/smtp/src/main/java/org/apache/james/protocols/smtp/core/fastfail/DNSRBLHandler.java?rev=1174122&r1=1174121&r2=1174122&view=diff
==============================================================================
---
james/protocols/trunk/smtp/src/main/java/org/apache/james/protocols/smtp/core/fastfail/DNSRBLHandler.java
(original)
+++
james/protocols/trunk/smtp/src/main/java/org/apache/james/protocols/smtp/core/fastfail/DNSRBLHandler.java
Thu Sep 22 13:27:35 2011
@@ -70,9 +70,8 @@ public class DNSRBLHandler implements C
* check if the remote Ip address is block listed
*
**/
- public boolean onConnect(SMTPSession session) {
+ public void onConnect(SMTPSession session) {
checkDNSRBL(session, session.getRemoteIPAddress());
- return false;
}
/**
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]