You are viewing a plain text version of this content. The canonical link for it is here.
Posted to java-dev@axis.apache.org by as...@apache.org on 2007/06/21 14:21:48 UTC

svn commit: r549457 [2/3] - in /webservices/axis2/trunk/java/modules: kernel/ kernel/src/org/apache/axis2/transport/nhttp/ kernel/src/org/apache/axis2/transport/nhttp/util/ parent/

Added: webservices/axis2/trunk/java/modules/kernel/src/org/apache/axis2/transport/nhttp/HttpCoreNIOSSLSender.java
URL: http://svn.apache.org/viewvc/webservices/axis2/trunk/java/modules/kernel/src/org/apache/axis2/transport/nhttp/HttpCoreNIOSSLSender.java?view=auto&rev=549457
==============================================================================
--- webservices/axis2/trunk/java/modules/kernel/src/org/apache/axis2/transport/nhttp/HttpCoreNIOSSLSender.java (added)
+++ webservices/axis2/trunk/java/modules/kernel/src/org/apache/axis2/transport/nhttp/HttpCoreNIOSSLSender.java Thu Jun 21 05:21:46 2007
@@ -0,0 +1,176 @@
+///*
+// *  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.axis2.transport.nhttp;
+//
+//import org.apache.commons.logging.LogFactory;
+//import org.apache.commons.logging.Log;
+//import org.apache.http.nio.reactor.IOEventDispatch;
+//import org.apache.http.nio.NHttpClientHandler;
+//import org.apache.http.impl.nio.reactor.SSLIOSessionHandler;
+//import org.apache.http.params.HttpParams;
+//import org.apache.axis2.AxisFault;
+//import org.apache.axis2.description.Parameter;
+//import org.apache.axis2.description.TransportOutDescription;
+//import org.apache.axiom.om.OMElement;
+//
+//import javax.net.ssl.*;
+//import javax.xml.namespace.QName;
+//import java.security.GeneralSecurityException;
+//import java.security.KeyStore;
+//import java.net.URL;
+//import java.net.SocketAddress;
+//import java.net.InetSocketAddress;
+//import java.io.IOException;
+//
+//public class HttpCoreNIOSSLSender extends HttpCoreNIOSender{
+//
+//    private static final Log log = LogFactory.getLog(HttpCoreNIOSSLSender.class);
+//
+//    protected IOEventDispatch getEventDispatch(
+//        NHttpClientHandler handler, SSLContext sslContext,
+//        SSLIOSessionHandler sslIOSessionHandler, HttpParams params) {
+//        return new SSLClientIOEventDispatch(handler, sslContext, sslIOSessionHandler, params);
+//    }
+//
+//    /**
+//     * Create the SSLContext to be used by this listener
+//     * @param transportOut the Axis2 transport configuration
+//     * @return the SSLContext to be used
+//     */
+//    protected SSLContext getSSLContext(TransportOutDescription transportOut) throws AxisFault {
+//
+//        KeyManager[] keymanagers  = null;
+//        TrustManager[] trustManagers = null;
+//
+//        Parameter keyParam    = transportOut.getParameter("keystore");
+//        Parameter trustParam  = transportOut.getParameter("truststore");
+//
+//        if (keyParam != null) {
+//            OMElement ksEle      = keyParam.getParameterElement().getFirstElement();
+//            String location      = ksEle.getFirstChildWithName(new QName("Location")).getText();
+//            String type          = ksEle.getFirstChildWithName(new QName("Type")).getText();
+//            String storePassword = ksEle.getFirstChildWithName(new QName("Password")).getText();
+//            String keyPassword   = ksEle.getFirstChildWithName(new QName("KeyPassword")).getText();
+//
+//            try {
+//                KeyStore keyStore = KeyStore.getInstance(type);
+//                URL url = getClass().getClassLoader().getResource(location);
+//                log.debug("Loading Key Store from URL : " + url);
+//
+//                keyStore.load(url.openStream(), storePassword.toCharArray());
+//                KeyManagerFactory kmfactory = KeyManagerFactory.getInstance(
+//                    KeyManagerFactory.getDefaultAlgorithm());
+//                kmfactory.init(keyStore, keyPassword.toCharArray());
+//                keymanagers = kmfactory.getKeyManagers();
+//
+//            } catch (GeneralSecurityException gse) {
+//                log.error("Error loading Key store : " + location, gse);
+//                throw new AxisFault("Error loading Key store : " + location, gse);
+//            } catch (IOException ioe) {
+//                log.error("Error opening Key store : " + location, ioe);
+//                throw new AxisFault("Error opening Key store : " + location, ioe);
+//            }
+//        }
+//
+//        if (trustParam != null) {
+//            OMElement tsEle      = trustParam.getParameterElement().getFirstElement();
+//            String location      = tsEle.getFirstChildWithName(new QName("Location")).getText();
+//            String type          = tsEle.getFirstChildWithName(new QName("Type")).getText();
+//            String storePassword = tsEle.getFirstChildWithName(new QName("Password")).getText();
+//
+//            try {
+//                KeyStore trustStore = KeyStore.getInstance(type);
+//                URL url = getClass().getClassLoader().getResource(location);
+//                log.debug("Loading Trust Key Store from URL : " + url);
+//
+//                trustStore.load(url.openStream(), storePassword.toCharArray());
+//                TrustManagerFactory trustManagerfactory = TrustManagerFactory.getInstance(
+//                    TrustManagerFactory.getDefaultAlgorithm());
+//                trustManagerfactory.init(trustStore);
+//                trustManagers = trustManagerfactory.getTrustManagers();
+//
+//            } catch (GeneralSecurityException gse) {
+//                log.error("Error loading Key store : " + location, gse);
+//                throw new AxisFault("Error loading Key store : " + location, gse);
+//            } catch (IOException ioe) {
+//                log.error("Error opening Key store : " + location, ioe);
+//                throw new AxisFault("Error opening Key store : " + location, ioe);
+//            }
+//        }
+//
+//        try {
+//            SSLContext sslcontext = SSLContext.getInstance("TLS");
+//            sslcontext.init(keymanagers, trustManagers, null);
+//            return sslcontext;
+//
+//        } catch (GeneralSecurityException gse) {
+//            log.error("Unable to create SSL context with the given configuration", gse);
+//            throw new AxisFault("Unable to create SSL context with the given configuration", gse);
+//        }
+//    }
+//
+//    /**
+//     * Create the SSLIOSessionHandler to initialize the host name verification at the following
+//     * levels, through an Axis2 transport configuration parameter as follows:
+//     * HostnameVerifier - Default, DefaultAndLocalhost, Strict, AllowAll
+//     *
+//     * @param transportOut the Axis2 transport configuration
+//     * @return the SSLIOSessionHandler to be used
+//     * @throws AxisFault if a configuration error occurs
+//     */
+//    protected SSLIOSessionHandler getSSLIOSessionHandler(TransportOutDescription transportOut) throws AxisFault {
+//
+//        final Parameter hostnameVerifier = transportOut.getParameter("HostnameVerifier");
+//
+//        return new SSLIOSessionHandler() {
+//
+//            public void initalize(SSLEngine sslengine, HttpParams params) {
+//            }
+//
+//            public void verify(SocketAddress remoteAddress, SSLSession session)
+//                throws SSLException {
+//
+//                String address = null;
+//                if (remoteAddress instanceof InetSocketAddress) {
+//                    address = ((InetSocketAddress) remoteAddress).getHostName();
+//                } else {
+//                    address = remoteAddress.toString();
+//                }
+//
+//                boolean valid = false;
+//                if (hostnameVerifier != null) {
+//                    if ("Strict".equals(hostnameVerifier.getValue())) {
+//                        valid = HostnameVerifier.STRICT.verify(address, session);
+//                    } else if ("AllowAll".equals(hostnameVerifier.getValue())) {
+//                        valid = HostnameVerifier.ALLOW_ALL.verify(address, session);
+//                    } else if ("DefaultAndLocalhost".equals(hostnameVerifier.getValue())) {
+//                        valid = HostnameVerifier.DEFAULT_AND_LOCALHOST.verify(address, session);
+//                    }
+//                } else {
+//                    valid = HostnameVerifier.DEFAULT.verify(address, session);
+//                }
+//
+//                if (!valid) {
+//                    throw new SSLException("Host name verification failed for host : " + address);
+//                }
+//            }
+//        };
+//    }
+//}

Added: webservices/axis2/trunk/java/modules/kernel/src/org/apache/axis2/transport/nhttp/HttpCoreNIOSender.java
URL: http://svn.apache.org/viewvc/webservices/axis2/trunk/java/modules/kernel/src/org/apache/axis2/transport/nhttp/HttpCoreNIOSender.java?view=auto&rev=549457
==============================================================================
--- webservices/axis2/trunk/java/modules/kernel/src/org/apache/axis2/transport/nhttp/HttpCoreNIOSender.java (added)
+++ webservices/axis2/trunk/java/modules/kernel/src/org/apache/axis2/transport/nhttp/HttpCoreNIOSender.java Thu Jun 21 05:21:46 2007
@@ -0,0 +1,465 @@
+/*
+ *  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.axis2.transport.nhttp;
+
+import java.io.IOException;
+import java.io.InterruptedIOException;
+import java.io.OutputStream;
+import java.net.InetSocketAddress;
+import java.net.MalformedURLException;
+import java.net.URL;
+import java.util.Iterator;
+import java.util.Map;
+
+import javax.net.ssl.SSLContext;
+import javax.xml.stream.XMLStreamException;
+
+import org.apache.axiom.om.OMOutputFormat;
+import org.apache.axis2.AxisFault;
+import org.apache.axis2.Constants;
+import org.apache.axis2.util.MessageContextBuilder;
+import org.apache.axis2.util.Utils;
+import org.apache.axis2.addressing.AddressingConstants;
+import org.apache.axis2.addressing.EndpointReference;
+import org.apache.axis2.context.ConfigurationContext;
+import org.apache.axis2.context.MessageContext;
+import org.apache.axis2.description.TransportOutDescription;
+import org.apache.axis2.engine.AxisEngine;
+import org.apache.axis2.engine.MessageReceiver;
+import org.apache.axis2.handlers.AbstractHandler;
+import org.apache.axis2.transport.OutTransportInfo;
+import org.apache.axis2.transport.TransportSender;
+import org.apache.axis2.transport.TransportUtils;
+import org.apache.axis2.transport.MessageFormatter;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.apache.http.HttpHost;
+import org.apache.http.HttpResponse;
+import org.apache.http.HttpStatus;
+import org.apache.http.impl.nio.reactor.DefaultConnectingIOReactor;
+//import org.apache.http.impl.nio.reactor.SSLIOSessionHandler;
+import org.apache.http.nio.NHttpClientConnection;
+import org.apache.http.nio.NHttpClientHandler;
+import org.apache.http.nio.reactor.ConnectingIOReactor;
+import org.apache.http.nio.reactor.IOEventDispatch;
+import org.apache.http.nio.reactor.SessionRequest;
+import org.apache.http.nio.reactor.SessionRequestCallback;
+import org.apache.http.params.BasicHttpParams;
+import org.apache.http.params.HttpConnectionParams;
+import org.apache.http.params.HttpParams;
+import org.apache.http.params.HttpProtocolParams;
+import org.apache.http.protocol.HTTP;
+
+/**
+ * NIO transport sender for Axis2 based on HttpCore and NIO extensions
+ */
+public class HttpCoreNIOSender extends AbstractHandler implements TransportSender {
+
+    private static final Log log = LogFactory.getLog(HttpCoreNIOSender.class);
+
+    /** The Axis2 configuration context */
+    private ConfigurationContext cfgCtx;
+    /** The IOReactor */
+    private ConnectingIOReactor ioReactor = null;
+    /** The client handler */
+    private NHttpClientHandler handler = null;
+    /** The session request callback that calls back to the message receiver with errors */
+    private final SessionRequestCallback sessionRequestCallback = getSessionRequestCallback();
+    /** The SSL Context to be used */
+    private SSLContext sslContext = null;
+    /** The SSL session handler that manages hostname verification etc */
+//    private SSLIOSessionHandler sslIOSessionHandler = null;
+
+    /**
+     * Initialize the transport sender, and execute reactor in new seperate thread
+     * @param cfgCtx the Axis2 configuration context
+     * @param transportOut the description of the http/s transport from Axis2 configuration
+     * @throws AxisFault thrown on an error
+     */
+    public void init(ConfigurationContext cfgCtx, TransportOutDescription transportOut) throws AxisFault {
+        this.cfgCtx = cfgCtx;
+
+        // is this an SSL Sender?
+        sslContext = getSSLContext(transportOut);
+        //sslIOSessionHandler = getSSLIOSessionHandler(transportOut);
+
+        // start the Sender in a new seperate thread
+        Thread t = new Thread(new Runnable() {
+            public void run() {
+                executeClientEngine();
+            }
+        }, "HttpCoreNIOSender");
+        t.start();
+        log.info((sslContext == null ? "HTTP" : "HTTPS") + " Sender starting");
+    }
+
+    /**
+     * Configure and start the IOReactor
+     */
+    private void executeClientEngine() {
+
+        HttpParams params = getClientParameters();
+        try {
+            ioReactor = new DefaultConnectingIOReactor(
+                NHttpConfiguration.getInstance().getClientIOWorkers(), params);
+        } catch (IOException e) {
+            log.error("Error starting the IOReactor", e);
+        }
+
+        handler = new ClientHandler(cfgCtx, params);
+        IOEventDispatch ioEventDispatch = getEventDispatch(
+            handler, sslContext, /*sslIOSessionHandler,*/ params);
+
+        try {
+            ioReactor.execute(ioEventDispatch);
+        } catch (InterruptedIOException ex) {
+            log.fatal("Reactor Interrupted");
+        } catch (IOException e) {
+            log.fatal("Encountered an I/O error: " + e.getMessage(), e);
+        }
+        log.info("Sender Shutdown");
+    }
+
+    /**
+     * Return the IOEventDispatch implementation to be used. This is overridden by the
+     * SSL sender
+     * @param handler
+     * @param sslContext
+     * @param params
+     * @return
+     */
+    protected IOEventDispatch getEventDispatch(
+        NHttpClientHandler handler, SSLContext sslContext,
+        /*SSLIOSessionHandler sslIOSessionHandler,*/ HttpParams params) {
+        return new PlainClientIOEventDispatch(handler, params);
+    }
+
+    /**
+     * Always return null, as this implementation does not support outgoing SSL
+     * @param transportOut
+     * @return null
+     * @throws AxisFault
+     */
+    protected SSLContext getSSLContext(TransportOutDescription transportOut) throws AxisFault {
+        return null;
+    }
+
+    /**
+     * Create the SSL IO Session handler to be used by this listener
+     * @param transportOut
+     * @return always null
+     */
+//    protected SSLIOSessionHandler getSSLIOSessionHandler(TransportOutDescription transportOut)
+//        throws AxisFault {
+//        return null;
+//    }
+
+    /**
+     * get HTTP protocol parameters to which the sender must adhere to
+     * @return the applicable HTTP protocol parameters
+     */
+    private HttpParams getClientParameters() {
+        NHttpConfiguration cfg = NHttpConfiguration.getInstance();
+        HttpParams params = new BasicHttpParams();
+        params
+            .setIntParameter(HttpConnectionParams.SO_TIMEOUT,
+                cfg.getProperty(HttpConnectionParams.SO_TIMEOUT, 60000))
+            .setIntParameter(HttpConnectionParams.CONNECTION_TIMEOUT,
+                cfg.getProperty(HttpConnectionParams.CONNECTION_TIMEOUT, 10000))
+            .setIntParameter(HttpConnectionParams.SOCKET_BUFFER_SIZE,
+                cfg.getProperty(HttpConnectionParams.SOCKET_BUFFER_SIZE, 8 * 1024))
+            .setBooleanParameter(HttpConnectionParams.STALE_CONNECTION_CHECK,
+                cfg.getProperty(HttpConnectionParams.STALE_CONNECTION_CHECK, 0) == 1)
+            .setBooleanParameter(HttpConnectionParams.TCP_NODELAY,
+                cfg.getProperty(HttpConnectionParams.TCP_NODELAY, 1) == 1)
+            .setParameter(HttpProtocolParams.USER_AGENT, "Synapse-HttpComponents-NIO");
+        return params;
+    }
+
+    /**
+     * transport sender invocation from Axis2 core
+     * @param msgContext message to be sent
+     * @return the invocation response (always InvocationResponse.CONTINUE)
+     * @throws AxisFault on error
+     */
+    public InvocationResponse invoke(MessageContext msgContext) throws AxisFault {
+
+        // remove unwanted HTTP headers (if any from the current message)
+        removeUnwantedHeaders(msgContext);
+
+        EndpointReference epr = Util.getDestinationEPR(msgContext);
+        if (epr != null) {
+            if (!AddressingConstants.Final.WSA_NONE_URI.equals(epr.getAddress())) {
+                sendAsyncRequest(epr, msgContext);
+            } else {
+                handleException("Cannot send message to " + AddressingConstants.Final.WSA_NONE_URI);
+            }
+        } else {
+            if (msgContext.getProperty(Constants.OUT_TRANSPORT_INFO) != null) {
+                if (msgContext.getProperty(Constants.OUT_TRANSPORT_INFO) instanceof ServerWorker) {
+                    sendAsyncResponse(msgContext);
+                } else {
+                    sendUsingOutputStream(msgContext);
+                }
+            } else {
+                handleException("No valid destination EPR or OutputStream to send message");
+            }
+        }
+
+        if (msgContext.getOperationContext() != null) {
+            msgContext.getOperationContext().setProperty(
+                Constants.RESPONSE_WRITTEN, Constants.VALUE_TRUE);
+        }
+
+        return InvocationResponse.CONTINUE;
+    }
+
+    /**
+     * Remove unwanted headers from the http response of outgoing request. These are headers which
+     * should be dictated by the transport and not the user. We remove these as these may get
+     * copied from the request messages
+     * @param msgContext the Axis2 Message context from which these headers should be removed
+     */
+    private void removeUnwantedHeaders(MessageContext msgContext) {
+        Map headers = (Map) msgContext.getProperty(MessageContext.TRANSPORT_HEADERS);
+        if (headers != null && !headers.isEmpty()) {
+            headers.remove(HTTP.CONN_DIRECTIVE);
+            headers.remove(HTTP.TRANSFER_ENCODING);
+            headers.remove(HTTP.DATE_DIRECTIVE);
+            headers.remove(HTTP.SERVER_DIRECTIVE);
+            headers.remove(HTTP.CONTENT_TYPE);
+            headers.remove(HTTP.CONTENT_LEN);
+            headers.remove(HTTP.USER_AGENT);
+        }
+    }
+
+    /**
+     * Send the request message asynchronously to the given EPR
+     * @param epr the destination EPR for the message
+     * @param msgContext the message being sent
+     * @throws AxisFault on error
+     */
+    private void sendAsyncRequest(EndpointReference epr, MessageContext msgContext) throws AxisFault {
+        try {
+            URL url = new URL(epr.getAddress());
+            int port = url.getPort();
+            if (port == -1) {
+                // use default
+                if ("http".equals(url.getProtocol())) {
+                    port = 80;
+                } else if ("https".equals(url.getProtocol())) {
+                    port = 443;
+                }
+            }
+            HttpHost httpHost = new HttpHost(url.getHost(), port, url.getProtocol());
+
+            Axis2HttpRequest axis2Req = new Axis2HttpRequest(epr, httpHost, msgContext);
+
+            NHttpClientConnection conn = ConnectionPool.getConnection(url.getHost(), port);
+
+            if (conn == null) {
+                ioReactor.connect(new InetSocketAddress(url.getHost(), port),
+                    null, axis2Req, sessionRequestCallback);
+                log.debug("A new connection established");
+            } else {
+                ((ClientHandler) handler).submitRequest(conn, axis2Req);
+                log.debug("An existing connection reused");
+            }
+
+            axis2Req.streamMessageContents();
+
+        } catch (MalformedURLException e) {
+            handleException("Malformed destination EPR : " + epr.getAddress(), e);
+        } catch (IOException e) {
+            handleException("IO Error while submiting request message for sending", e);
+        }
+    }
+
+    /**
+     * Send the passed in response message, asynchronously
+     * @param msgContext the message context to be sent
+     * @throws AxisFault on error
+     */
+    private void sendAsyncResponse(MessageContext msgContext) throws AxisFault {
+
+        // remove unwanted HTTP headers (if any from the current message)
+        removeUnwantedHeaders(msgContext);
+        
+        ServerWorker worker = (ServerWorker) msgContext.getProperty(Constants.OUT_TRANSPORT_INFO);
+        HttpResponse response = worker.getResponse();
+
+        OMOutputFormat format = Util.getOMOutputFormat(msgContext);
+        MessageFormatter messageFormatter = TransportUtils.getMessageFormatter(msgContext);
+        response.setHeader(
+            HTTP.CONTENT_TYPE,
+            messageFormatter.getContentType(msgContext, format, msgContext.getSoapAction()));
+
+        // return http 500 when a SOAP fault is returned
+        if (msgContext.getEnvelope().getBody().hasFault()) {
+            response.setStatusCode(HttpStatus.SC_INTERNAL_SERVER_ERROR);
+        }
+
+        // if this is a dummy message to handle http 202 case with non-blocking IO
+        // set the status code to 202 and the message body to an empty byte array (see below)
+        if (Utils.isExplicitlyTrue(msgContext, NhttpConstants.SC_ACCEPTED) &&
+                msgContext.getProperty(
+                    //org.apache.sandesha2.Sandesha2Constants.MessageContextProperties.SEQUENCE_ID
+                    "WSRMSequenceId") == null) {
+            response.setStatusCode(HttpStatus.SC_ACCEPTED);
+        }
+
+        // set any transport headers
+        Map transportHeaders = (Map) msgContext.getProperty(MessageContext.TRANSPORT_HEADERS);
+        if (transportHeaders != null && !transportHeaders.values().isEmpty()) {
+            Iterator iter = transportHeaders.keySet().iterator();
+            while (iter.hasNext()) {
+                Object header = iter.next();
+                Object value = transportHeaders.get(header);
+                if (value != null && header instanceof String && value instanceof String) {
+                    response.setHeader((String) header, (String) value);
+                }
+            }
+        }
+        worker.getServiceHandler().commitResponse(worker.getConn(), response);
+
+        OutputStream out = worker.getOutputStream();
+        try {
+            if (Utils.isExplicitlyTrue(msgContext, NhttpConstants.SC_ACCEPTED) &&
+                msgContext.getProperty(
+                    //Sandesha2Constants.MessageContextProperties.SEQUENCE_ID
+                    "WSRMSequenceId") == null) {
+                // see comment above on the reasoning
+                out.write(new byte[0]);
+            } else {
+                messageFormatter.writeTo(msgContext, format, out, true);
+            }
+            out.close();
+        } catch (IOException e) {
+            handleException("IO Error sending response message", e);
+        }
+
+        try {
+            worker.getIs().close();
+        } catch (IOException ignore) {}        
+    }
+
+    private void sendUsingOutputStream(MessageContext msgContext) throws AxisFault {
+        OMOutputFormat format = Util.getOMOutputFormat(msgContext);
+        MessageFormatter messageFormatter = TransportUtils.getMessageFormatter(msgContext);
+        OutputStream out = (OutputStream) msgContext.getProperty(MessageContext.TRANSPORT_OUT);
+
+        if (msgContext.isServerSide()) {
+            OutTransportInfo transportInfo =
+                (OutTransportInfo) msgContext.getProperty(Constants.OUT_TRANSPORT_INFO);
+
+            if (transportInfo != null) {
+                transportInfo.setContentType(
+                messageFormatter.getContentType(msgContext, format, msgContext.getSoapAction()));
+            } else {
+                throw new AxisFault(Constants.OUT_TRANSPORT_INFO + " has not been set");
+            }
+        }
+
+        try {
+            messageFormatter.writeTo(msgContext, format, out, true);
+            out.close();
+        } catch (IOException e) {
+            handleException("IO Error sending response message", e);
+        }
+    }
+
+
+    public void cleanup(MessageContext msgContext) throws AxisFault {
+        // do nothing
+    }
+
+    public void stop() {
+        try {
+            ioReactor.shutdown();
+            log.info("Sender shut down");
+        } catch (IOException e) {
+            log.warn("Error shutting down IOReactor", e);
+        }
+    }
+
+    /**
+     * Return a SessionRequestCallback which gets notified of a connection failure
+     * or an error during a send operation. This method finds the corresponding
+     * Axis2 message context for the outgoing request, and find the message receiver
+     * and sends a fault message back to the message receiver that is marked as
+     * related to the outgoing request
+     * @return a Session request callback
+     */
+    private static SessionRequestCallback getSessionRequestCallback() {
+        return new SessionRequestCallback() {
+            public void completed(SessionRequest request) {
+            }
+
+            public void failed(SessionRequest request) {
+                handleError(request);
+            }
+
+            public void timeout(SessionRequest request) {
+                handleError(request);
+            }
+
+            public void cancelled(SessionRequest sessionRequest) {
+
+            }
+
+            private void handleError(SessionRequest request) {
+                if (request.getAttachment() != null &&
+                    request.getAttachment() instanceof Axis2HttpRequest) {
+
+                    Axis2HttpRequest axis2Request = (Axis2HttpRequest) request.getAttachment();
+                    MessageContext mc = axis2Request.getMsgContext();
+                    MessageReceiver mr = mc.getAxisOperation().getMessageReceiver();
+
+                    try {
+                        // this fault is NOT caused by the endpoint while processing. so we have to
+                        // inform that this is a sending error (e.g. endpoint failure) and handle it
+                        // differently at the message receiver.
+
+                        Exception exception = request.getException();
+                        MessageContext nioFaultMessageContext =
+                            MessageContextBuilder.createFaultMessageContext(
+                                /** this is not a mistake I do NOT want getMessage()*/
+                                mc, new AxisFault(exception.toString(), exception));
+                        nioFaultMessageContext.setProperty(NhttpConstants.SENDING_FAULT, Boolean.TRUE);
+                        mr.receive(nioFaultMessageContext);
+                        
+                    } catch (AxisFault af) {
+                        log.error("Unable to report back failure to the message receiver", af);
+                    }
+                }
+            }
+        };
+    }
+
+    // -------------- utility methods -------------
+    private void handleException(String msg, Exception e) throws AxisFault {
+        log.error(msg, e);
+        throw new AxisFault(msg, e);
+    }
+
+    private void handleException(String msg) throws AxisFault {
+        log.error(msg);
+        throw new AxisFault(msg);
+    }
+}

Added: webservices/axis2/trunk/java/modules/kernel/src/org/apache/axis2/transport/nhttp/HttpCoreRequestResponseTransport.java
URL: http://svn.apache.org/viewvc/webservices/axis2/trunk/java/modules/kernel/src/org/apache/axis2/transport/nhttp/HttpCoreRequestResponseTransport.java?view=auto&rev=549457
==============================================================================
--- webservices/axis2/trunk/java/modules/kernel/src/org/apache/axis2/transport/nhttp/HttpCoreRequestResponseTransport.java (added)
+++ webservices/axis2/trunk/java/modules/kernel/src/org/apache/axis2/transport/nhttp/HttpCoreRequestResponseTransport.java Thu Jun 21 05:21:46 2007
@@ -0,0 +1,69 @@
+/*
+ *  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.axis2.transport.nhttp;
+
+import org.apache.commons.logging.LogFactory;
+import org.apache.commons.logging.Log;
+import org.apache.axis2.context.MessageContext;
+import org.apache.axis2.AxisFault;
+import org.apache.axis2.Constants;
+import org.apache.axis2.transport.RequestResponseTransport;
+
+/**
+ * This interface is a point of control for Axis2 (and Sandesha2 in particular) to control
+ * the behaviour of a Request-Response transport such as HTTP/s
+ *
+ * For nhttp, this does not make much of a difference, as we are capable of keeping a socket open
+ * and writing to it from a different thread, while letting the initial thread that read the request
+ * go free. However, it seems like Sandesha2 is looking for this interface, and it is not going to
+ * create much of an issue anyway
+ */
+public class HttpCoreRequestResponseTransport implements RequestResponseTransport {
+
+    private static final Log log = LogFactory.getLog(HttpCoreRequestResponseTransport.class);
+    private RequestResponseTransportStatus status = RequestResponseTransportStatus.INITIAL;
+    private MessageContext msgContext = null;
+
+    HttpCoreRequestResponseTransport(MessageContext msgContext) {
+        this.msgContext = msgContext;
+    }
+
+    public void acknowledgeMessage(MessageContext msgContext) throws AxisFault {
+        log.debug("Acking one-way request");
+    }
+
+    public void awaitResponse() throws InterruptedException, AxisFault {
+        log.debug("Returning thread but keeping socket open -- awaiting response");
+        status = RequestResponseTransportStatus.WAITING;
+        msgContext.getOperationContext().setProperty(Constants.RESPONSE_WRITTEN, "SKIP");
+    }
+
+    public void signalResponseReady() {
+        log.debug("Signal response available");
+        status = RequestResponseTransportStatus.SIGNALLED;
+    }
+
+    public RequestResponseTransportStatus getStatus() {
+        return status;
+    }
+
+    public void signalFaultReady(AxisFault fault) {
+    }
+}

Added: webservices/axis2/trunk/java/modules/kernel/src/org/apache/axis2/transport/nhttp/LoggingIOSession.java
URL: http://svn.apache.org/viewvc/webservices/axis2/trunk/java/modules/kernel/src/org/apache/axis2/transport/nhttp/LoggingIOSession.java?view=auto&rev=549457
==============================================================================
--- webservices/axis2/trunk/java/modules/kernel/src/org/apache/axis2/transport/nhttp/LoggingIOSession.java (added)
+++ webservices/axis2/trunk/java/modules/kernel/src/org/apache/axis2/transport/nhttp/LoggingIOSession.java Thu Jun 21 05:21:46 2007
@@ -0,0 +1,181 @@
+/*
+ *  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.axis2.transport.nhttp;
+
+import java.io.IOException;
+import java.net.SocketAddress;
+import java.nio.ByteBuffer;
+import java.nio.channels.ByteChannel;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.apache.http.nio.reactor.IOSession;
+import org.apache.http.nio.reactor.SessionBufferStatus;
+
+/**
+ * Decorator class intended to transparently extend an {@link IOSession} 
+ * with basic event logging capabilities using Commons Logging. 
+ */
+public class LoggingIOSession implements IOSession {
+
+    private static int COUNT = 0;
+    
+    private final Log log;
+    private final IOSession session;
+    private final ByteChannel channel;
+    private final int id;
+    
+    public LoggingIOSession(final IOSession session) {
+        super();
+        if (session == null) {
+            throw new IllegalArgumentException("I/O session may not be null");
+        }
+        this.session = session;
+        this.channel = new LoggingByteChannel();
+        this.id = ++COUNT;
+        this.log = LogFactory.getLog(session.getClass());
+    }
+
+    public ByteChannel channel() {
+        return this.channel;
+    }
+
+    public SocketAddress getLocalAddress() {
+        return this.session.getLocalAddress();
+    }
+
+    public SocketAddress getRemoteAddress() {
+        return this.session.getRemoteAddress();
+    }
+
+    public int getEventMask() {
+        return this.session.getEventMask();
+    }
+
+    public void setEventMask(int ops) {
+        if (this.log.isDebugEnabled()) {
+            this.log.debug("I/O session " + this.id + " " + this.session + ": Set event mask " 
+                    + ops);
+        }
+        this.session.setEventMask(ops);
+    }
+
+    public void setEvent(int op) {
+        if (this.log.isDebugEnabled()) {
+            this.log.debug("I/O session " + this.id + " " + this.session + ": Set event " 
+                    + op);
+        }
+        this.session.setEvent(op);
+    }
+
+    public void clearEvent(int op) {
+        if (this.log.isDebugEnabled()) {
+            this.log.debug("I/O session " + this.id + " " + this.session + ": Clear event " 
+                    + op);
+        }
+        this.session.clearEvent(op);
+    }
+
+    public void close() {
+        if (this.log.isDebugEnabled()) {
+            this.log.debug("I/O session " + this.id + " " + this.session + ": Close");
+        }
+        this.session.close();
+    }
+
+    public boolean isClosed() {
+        return this.session.isClosed();
+    }
+
+    public int getSocketTimeout() {
+        return this.session.getSocketTimeout();
+    }
+
+    public void setSocketTimeout(int timeout) {
+        if (this.log.isDebugEnabled()) {
+            this.log.debug("I/O session " + this.id + " " + this.session + ": Set timeout " 
+                    + timeout);
+        }
+        this.session.setSocketTimeout(timeout);
+    }
+
+    public void setBufferStatus(final SessionBufferStatus status) {
+        this.session.setBufferStatus(status);
+    }
+
+    public boolean hasBufferedInput() {
+        return this.session.hasBufferedInput();
+    }
+
+    public boolean hasBufferedOutput() {
+        return this.session.hasBufferedOutput();
+    }
+
+    public Object getAttribute(final String name) {
+        return this.session.getAttribute(name);
+    }
+
+    public void setAttribute(final String name, final Object obj) {
+        if (this.log.isDebugEnabled()) {
+            this.log.debug("I/O session " + this.id + " " + this.session + ": Set attribute " 
+                    + name);
+        }
+        this.session.setAttribute(name, obj);
+    }
+
+    public Object removeAttribute(final String name) {
+        if (this.log.isDebugEnabled()) {
+            this.log.debug("I/O session " + this.id + " " + this.session + ": Remove attribute " 
+                    + name);
+        }
+        return this.session.removeAttribute(name);
+    }
+
+    class LoggingByteChannel implements ByteChannel {
+
+        public int read(final ByteBuffer dst) throws IOException {
+            int bytesRead = session.channel().read(dst);
+            if (log.isDebugEnabled()) {
+                log.debug("I/O session " + id + " " + session + ": " + bytesRead + " bytes read");
+            }
+            return bytesRead;
+        }
+
+        public int write(final ByteBuffer src) throws IOException {
+            int byteWritten = session.channel().write(src);
+            if (log.isDebugEnabled()) {
+                log.debug("I/O session " + id + " " + session + ": " + byteWritten + " bytes written");
+            }
+            return byteWritten;
+        }
+
+        public void close() throws IOException {
+            if (log.isDebugEnabled()) {
+                log.debug("I/O session " + id + " " + session + ": Channel close");
+            }
+            session.channel().close();
+        }
+
+        public boolean isOpen() {
+            return session.channel().isOpen();
+        }
+        
+    }    
+    
+}
\ No newline at end of file

Added: webservices/axis2/trunk/java/modules/kernel/src/org/apache/axis2/transport/nhttp/LoggingNHttpClientHandler.java
URL: http://svn.apache.org/viewvc/webservices/axis2/trunk/java/modules/kernel/src/org/apache/axis2/transport/nhttp/LoggingNHttpClientHandler.java?view=auto&rev=549457
==============================================================================
--- webservices/axis2/trunk/java/modules/kernel/src/org/apache/axis2/transport/nhttp/LoggingNHttpClientHandler.java (added)
+++ webservices/axis2/trunk/java/modules/kernel/src/org/apache/axis2/transport/nhttp/LoggingNHttpClientHandler.java Thu Jun 21 05:21:46 2007
@@ -0,0 +1,116 @@
+/*
+ *  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.axis2.transport.nhttp;
+
+import java.io.IOException;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.apache.http.HttpException;
+import org.apache.http.HttpResponse;
+import org.apache.http.nio.ContentDecoder;
+import org.apache.http.nio.ContentEncoder;
+import org.apache.http.nio.NHttpClientConnection;
+import org.apache.http.nio.NHttpClientHandler;
+
+/**
+ * Decorator class intended to transparently extend an {@link NHttpClientHandler} 
+ * with basic event logging capabilities using Commons Logging. 
+ */
+public class LoggingNHttpClientHandler implements NHttpClientHandler {
+
+    private final Log log;
+    private final NHttpClientHandler handler;
+    
+    public LoggingNHttpClientHandler(final NHttpClientHandler handler) {
+        super();
+        if (handler == null) {
+            throw new IllegalArgumentException("HTTP client handler may not be null");
+        }
+        this.handler = handler;
+        this.log = LogFactory.getLog(handler.getClass());
+    }
+    
+    public void connected(final NHttpClientConnection conn, final Object attachment) {
+        if (this.log.isDebugEnabled()) {
+            this.log.debug("HTTP connection " + conn + ": Connected (" + attachment + ")");
+        }
+        this.handler.connected(conn, attachment);
+    }
+
+    public void closed(final NHttpClientConnection conn) {
+        if (this.log.isDebugEnabled()) {
+            this.log.debug("HTTP connection " + conn + ": Closed");
+        }
+        this.handler.closed(conn);
+    }
+
+    public void exception(final NHttpClientConnection conn, final IOException ex) {
+        this.log.error("HTTP connection " + conn + ": " + ex.getMessage(), ex);
+        this.handler.exception(conn, ex);
+    }
+
+    public void exception(final NHttpClientConnection conn, final HttpException ex) {
+        this.log.error("HTTP connection " + conn + ": " + ex.getMessage(), ex);
+        this.handler.exception(conn, ex);
+    }
+
+    public void requestReady(final NHttpClientConnection conn) {
+        if (this.log.isDebugEnabled()) {
+            this.log.debug("HTTP connection " + conn + ": Request ready");
+        }
+        this.handler.requestReady(conn);
+    }
+
+    public void outputReady(final NHttpClientConnection conn, final ContentEncoder encoder) {
+        if (this.log.isDebugEnabled()) {
+            this.log.debug("HTTP connection " + conn + ": Output ready");
+        }
+        this.handler.outputReady(conn, encoder);
+        if (this.log.isDebugEnabled()) {
+            this.log.debug("HTTP connection " + conn + ": Content encoder " + encoder);
+        }
+    }
+
+    public void responseReceived(final NHttpClientConnection conn) {
+        if (this.log.isDebugEnabled()) {
+            HttpResponse response = conn.getHttpResponse();
+            this.log.debug("HTTP connection " + conn + ": " + response.getStatusLine());
+        }
+        this.handler.responseReceived(conn);
+    }
+
+    public void inputReady(final NHttpClientConnection conn, final ContentDecoder decoder) {
+        if (this.log.isDebugEnabled()) {
+            this.log.debug("HTTP connection " + conn + ": Input ready");
+        }
+        this.handler.inputReady(conn, decoder);
+        if (this.log.isDebugEnabled()) {
+            this.log.debug("HTTP connection " + conn + ": Content decoder " + decoder);
+        }
+    }
+
+    public void timeout(final NHttpClientConnection conn) {
+        if (this.log.isDebugEnabled()) {
+            this.log.debug("HTTP connection " + conn + ": Timeout");
+        }
+        this.handler.timeout(conn);
+    }
+
+}
\ No newline at end of file

Added: webservices/axis2/trunk/java/modules/kernel/src/org/apache/axis2/transport/nhttp/LoggingNHttpServiceHandler.java
URL: http://svn.apache.org/viewvc/webservices/axis2/trunk/java/modules/kernel/src/org/apache/axis2/transport/nhttp/LoggingNHttpServiceHandler.java?view=auto&rev=549457
==============================================================================
--- webservices/axis2/trunk/java/modules/kernel/src/org/apache/axis2/transport/nhttp/LoggingNHttpServiceHandler.java (added)
+++ webservices/axis2/trunk/java/modules/kernel/src/org/apache/axis2/transport/nhttp/LoggingNHttpServiceHandler.java Thu Jun 21 05:21:46 2007
@@ -0,0 +1,126 @@
+/*
+ *  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.axis2.transport.nhttp;
+
+import java.io.IOException;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.apache.http.HttpException;
+import org.apache.http.HttpRequest;
+import org.apache.http.nio.ContentDecoder;
+import org.apache.http.nio.ContentEncoder;
+import org.apache.http.nio.NHttpServerConnection;
+import org.apache.http.nio.NHttpServiceHandler;
+
+/**
+ * Decorator class intended to transparently extend an {@link NHttpServiceHandler} 
+ * with basic event logging capabilities using Commons Logging. 
+ */
+public class LoggingNHttpServiceHandler implements NHttpServiceHandler {
+
+    private final Log log;
+    private final NHttpServiceHandler handler;
+    
+    public LoggingNHttpServiceHandler(final NHttpServiceHandler handler) {
+        super();
+        if (handler == null) {
+            throw new IllegalArgumentException("HTTP service handler may not be null");
+        }
+        this.handler = handler;
+        this.log = LogFactory.getLog(handler.getClass());
+    }
+    
+    public void connected(final NHttpServerConnection conn) {
+        if (this.log.isDebugEnabled()) {
+            this.log.debug("HTTP connection " + conn + ": Connected");
+        }
+        this.handler.connected(conn);
+    }
+
+    public void closed(final NHttpServerConnection conn) {
+        if (this.log.isDebugEnabled()) {
+            this.log.debug("HTTP connection " + conn + ": Closed");
+        }
+        this.handler.closed(conn);
+    }
+
+    public void exception(final NHttpServerConnection conn, final IOException ex) {
+        if (ex.getMessage().indexOf("Connection reset") != -1 ||
+            ex.getMessage().indexOf("forcibly closed")  != -1) {
+            this.log.warn("HTTP connection " + conn + ": " + ex.getMessage());
+        } else {
+            this.log.error("HTTP connection " + conn + ": " + ex.getMessage(), ex);
+        }
+        this.handler.exception(conn, ex);
+    }
+
+    public void exception(final NHttpServerConnection conn, final HttpException ex) {
+        if (ex.getMessage().indexOf("Connection reset") > 0 ||
+            ex.getMessage().indexOf("forcibly closed") > 0) {
+            this.log.warn("HTTP connection " + conn + ": " + ex.getMessage());
+        } else {
+            this.log.error("HTTP connection " + conn + ": " + ex.getMessage(), ex);
+        }
+        this.handler.exception(conn, ex);
+    }
+
+    public void requestReceived(final NHttpServerConnection conn) {
+        if (this.log.isDebugEnabled()) {
+            HttpRequest request = conn.getHttpRequest();
+            this.log.debug("HTTP connection " + conn + ": " + request.getRequestLine());
+        }
+        this.handler.requestReceived(conn);
+    }
+
+    public void outputReady(final NHttpServerConnection conn, final ContentEncoder encoder) {
+        if (this.log.isDebugEnabled()) {
+            this.log.debug("HTTP connection " + conn + ": Output ready");
+        }
+        this.handler.outputReady(conn, encoder);
+        if (this.log.isDebugEnabled()) {
+            this.log.debug("HTTP connection " + conn + ": Content encoder " + encoder);
+        }
+    }
+
+    public void responseReady(final NHttpServerConnection conn) {
+        if (this.log.isDebugEnabled()) {
+            this.log.debug("HTTP connection " + conn + ": Response ready");
+        }
+        this.handler.responseReady(conn);
+    }
+
+    public void inputReady(final NHttpServerConnection conn, final ContentDecoder decoder) {
+        if (this.log.isDebugEnabled()) {
+            this.log.debug("HTTP connection " + conn + ": Input ready");
+        }
+        this.handler.inputReady(conn, decoder);
+        if (this.log.isDebugEnabled()) {
+            this.log.debug("HTTP connection " + conn + ": Content decoder " + decoder);
+        }
+    }
+
+    public void timeout(final NHttpServerConnection conn) {
+        if (this.log.isDebugEnabled()) {
+            this.log.debug("HTTP connection " + conn + ": Timeout");
+        }
+        this.handler.timeout(conn);
+    }
+
+}
\ No newline at end of file

Added: webservices/axis2/trunk/java/modules/kernel/src/org/apache/axis2/transport/nhttp/NHttpConfiguration.java
URL: http://svn.apache.org/viewvc/webservices/axis2/trunk/java/modules/kernel/src/org/apache/axis2/transport/nhttp/NHttpConfiguration.java?view=auto&rev=549457
==============================================================================
--- webservices/axis2/trunk/java/modules/kernel/src/org/apache/axis2/transport/nhttp/NHttpConfiguration.java (added)
+++ webservices/axis2/trunk/java/modules/kernel/src/org/apache/axis2/transport/nhttp/NHttpConfiguration.java Thu Jun 21 05:21:46 2007
@@ -0,0 +1,138 @@
+/*
+ *  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.axis2.transport.nhttp;
+
+import org.apache.commons.logging.LogFactory;
+import org.apache.commons.logging.Log;
+import org.apache.http.params.HttpConnectionParams;
+
+import java.util.Properties;
+import java.io.IOException;
+import java.net.URL;
+
+/**
+ * Store and manage properties that tune the nhttp transport
+ */
+public class NHttpConfiguration {
+
+    // defaults
+    private static final int WORKERS_CORE_THREADS  = 20;
+    private static final int WORKERS_MAX_THREADS   = 100;
+    private static final int WORKER_KEEP_ALIVE     = 5;
+    private static final int BLOCKING_QUEUE_LENGTH = -1;
+    private static final int IO_WORKER_COUNT = 2;
+    private static final int BUFFER_SIZE           = 2048;
+
+    // server listener
+    private static final String S_T_CORE     = "snd_t_core";
+    private static final String S_T_MAX      = "snd_t_max";
+    private static final String S_T_ALIVE    = "snd_alive_sec";
+    private static final String S_T_QLEN     = "snd_qlen";
+    private static final String S_IO_WORKERS = "snd_io_threads";
+
+    // client sender
+    private static final String C_T_CORE     = "lst_t_core";
+    private static final String C_T_MAX      = "lst_t_max";
+    private static final String C_T_ALIVE    = "lst_alive_sec";
+    private static final String C_T_QLEN     = "lst_qlen";
+    private static final String C_IO_WORKERS = "lst_io_threads";
+
+    // general
+    private static final String G_BUFFER_SIZE  = "nhttp_buffer_size";
+
+    private static final Log log = LogFactory.getLog(NHttpConfiguration.class);
+    private static NHttpConfiguration _instance = new NHttpConfiguration();
+    private Properties props = new Properties();
+
+    private NHttpConfiguration() {
+        try {
+            props.load(getClass().getClassLoader().getResourceAsStream("nhttp.properties"));
+        } catch (Exception ignore) {}
+    }
+
+    public static NHttpConfiguration getInstance() {
+        return _instance;
+    }
+
+    public int getServerCoreThreads() {
+        return getProperty(S_T_CORE, WORKERS_CORE_THREADS);
+    }
+
+    public int getServerMaxThreads() {
+        return getProperty(S_T_MAX, WORKERS_MAX_THREADS);
+    }
+
+    public int getServerKeepalive() {
+        return getProperty(S_T_ALIVE, WORKER_KEEP_ALIVE);
+    }
+
+    public int getServerQueueLen() {
+        return getProperty(S_T_QLEN, BLOCKING_QUEUE_LENGTH);
+    }
+
+    public int getServerIOWorkers() {
+        return getProperty(S_IO_WORKERS, IO_WORKER_COUNT);
+    }
+
+
+    public int getClientCoreThreads() {
+        return getProperty(C_T_CORE, WORKERS_CORE_THREADS);
+    }
+
+    public int getClientMaxThreads() {
+        return getProperty(C_T_MAX, WORKERS_MAX_THREADS);
+    }
+
+    public int getClientKeepalive() {
+        return getProperty(C_T_ALIVE, WORKER_KEEP_ALIVE);
+    }
+
+    public int getClientQueueLen() {
+        return getProperty(C_T_QLEN, BLOCKING_QUEUE_LENGTH);
+    }
+
+    public int getClientIOWorkers() {
+        return getProperty(C_IO_WORKERS, IO_WORKER_COUNT);
+    }
+
+    public int getBufferZise() {
+        return getProperty(G_BUFFER_SIZE, BUFFER_SIZE);
+    }
+
+    /**
+     * Get properties that tune nhttp transport. Preference to system properties
+     * @param name name of the system/config property
+     * @param def default value to return if the property is not set
+     * @return the value of the property to be used
+     */
+    public int getProperty(String name, int def) {
+        String val = System.getProperty(name);
+        if (val == null) {
+            val = props.getProperty(name);
+        }
+
+        if (val != null && Integer.valueOf(val).intValue() > 0) {
+            log.debug("Using nhttp tuning parameter : " + name + " = " + val);
+            return Integer.valueOf(val).intValue();
+        }        
+        return def;
+    }
+
+}

Added: webservices/axis2/trunk/java/modules/kernel/src/org/apache/axis2/transport/nhttp/NhttpConstants.java
URL: http://svn.apache.org/viewvc/webservices/axis2/trunk/java/modules/kernel/src/org/apache/axis2/transport/nhttp/NhttpConstants.java?view=auto&rev=549457
==============================================================================
--- webservices/axis2/trunk/java/modules/kernel/src/org/apache/axis2/transport/nhttp/NhttpConstants.java (added)
+++ webservices/axis2/trunk/java/modules/kernel/src/org/apache/axis2/transport/nhttp/NhttpConstants.java Thu Jun 21 05:21:46 2007
@@ -0,0 +1,25 @@
+/*
+ *  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.axis2.transport.nhttp;
+
+public class NhttpConstants {
+    public static final String SC_ACCEPTED = "SC_ACCEPTED";
+    public static final String SENDING_FAULT = "sending_fault";
+}

Added: webservices/axis2/trunk/java/modules/kernel/src/org/apache/axis2/transport/nhttp/PlainClientIOEventDispatch.java
URL: http://svn.apache.org/viewvc/webservices/axis2/trunk/java/modules/kernel/src/org/apache/axis2/transport/nhttp/PlainClientIOEventDispatch.java?view=auto&rev=549457
==============================================================================
--- webservices/axis2/trunk/java/modules/kernel/src/org/apache/axis2/transport/nhttp/PlainClientIOEventDispatch.java (added)
+++ webservices/axis2/trunk/java/modules/kernel/src/org/apache/axis2/transport/nhttp/PlainClientIOEventDispatch.java Thu Jun 21 05:21:46 2007
@@ -0,0 +1,84 @@
+/*
+ *  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.axis2.transport.nhttp;
+
+import org.apache.http.impl.DefaultHttpResponseFactory;
+import org.apache.http.impl.nio.DefaultNHttpClientConnection;
+import org.apache.http.nio.NHttpClientHandler;
+import org.apache.http.nio.reactor.IOEventDispatch;
+import org.apache.http.nio.reactor.IOSession;
+import org.apache.http.params.HttpParams;
+
+public class PlainClientIOEventDispatch implements IOEventDispatch {
+
+    private static final String NHTTP_CONN = "SYNAPSE.NHTTP_CONN";
+    
+    private final NHttpClientHandler handler;
+    private final HttpParams params;
+    
+    public PlainClientIOEventDispatch(final NHttpClientHandler handler, final HttpParams params) {
+        super();
+        if (handler == null) {
+            throw new IllegalArgumentException("HTTP client handler may not be null");
+        }
+        if (params == null) {
+            throw new IllegalArgumentException("HTTP parameters may not be null");
+        }
+        // Decorate client handler with logging capabilities
+        this.handler = new LoggingNHttpClientHandler(handler);
+        this.params = params;
+    }
+    
+    public void connected(final IOSession session) {
+        // Decorate I/O session with logging capabilities
+        DefaultNHttpClientConnection conn = new DefaultNHttpClientConnection(
+                new LoggingIOSession(session), 
+                new DefaultHttpResponseFactory(),
+                this.params); 
+        session.setAttribute(NHTTP_CONN, conn);
+        
+        Object attachment = session.getAttribute(IOSession.ATTACHMENT_KEY);
+        this.handler.connected(conn, attachment);
+    }
+
+    public void disconnected(final IOSession session) {
+        DefaultNHttpClientConnection conn = (DefaultNHttpClientConnection) session.getAttribute(
+                NHTTP_CONN);
+        this.handler.closed(conn);
+    }
+
+    public void inputReady(final IOSession session) {
+        DefaultNHttpClientConnection conn = (DefaultNHttpClientConnection) session.getAttribute(
+                NHTTP_CONN);
+        conn.consumeInput(this.handler);
+    }
+
+    public void outputReady(final IOSession session) {
+        DefaultNHttpClientConnection conn = (DefaultNHttpClientConnection) session.getAttribute(
+                NHTTP_CONN);
+        conn.produceOutput(this.handler);
+    }
+
+    public void timeout(final IOSession session) {
+        DefaultNHttpClientConnection conn = (DefaultNHttpClientConnection) session.getAttribute(
+                NHTTP_CONN);
+        this.handler.timeout(conn);
+    }
+
+}

Added: webservices/axis2/trunk/java/modules/kernel/src/org/apache/axis2/transport/nhttp/PlainServerIOEventDispatch.java
URL: http://svn.apache.org/viewvc/webservices/axis2/trunk/java/modules/kernel/src/org/apache/axis2/transport/nhttp/PlainServerIOEventDispatch.java?view=auto&rev=549457
==============================================================================
--- webservices/axis2/trunk/java/modules/kernel/src/org/apache/axis2/transport/nhttp/PlainServerIOEventDispatch.java (added)
+++ webservices/axis2/trunk/java/modules/kernel/src/org/apache/axis2/transport/nhttp/PlainServerIOEventDispatch.java Thu Jun 21 05:21:46 2007
@@ -0,0 +1,82 @@
+/*
+ *  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.axis2.transport.nhttp;
+
+import org.apache.http.impl.DefaultHttpRequestFactory;
+import org.apache.http.impl.nio.DefaultNHttpServerConnection;
+import org.apache.http.nio.NHttpServiceHandler;
+import org.apache.http.nio.reactor.IOEventDispatch;
+import org.apache.http.nio.reactor.IOSession;
+import org.apache.http.params.HttpParams;
+
+public class PlainServerIOEventDispatch implements IOEventDispatch {
+
+    private static final String NHTTP_CONN = "SYNAPSE.NHTTP_CONN";
+    
+    private final NHttpServiceHandler handler;
+    private final HttpParams params;
+    
+    public PlainServerIOEventDispatch(final NHttpServiceHandler handler, final HttpParams params) {
+        super();
+        if (handler == null) {
+            throw new IllegalArgumentException("HTTP service handler may not be null");
+        }
+        if (params == null) {
+            throw new IllegalArgumentException("HTTP parameters may not be null");
+        }
+        // Decorate service handler with logging capabilities
+        this.handler = new LoggingNHttpServiceHandler(handler);
+        this.params = params;
+    }
+    
+    public void connected(final IOSession session) {
+        // Decorate I/O session with logging capabilities
+        DefaultNHttpServerConnection conn = new DefaultNHttpServerConnection(
+                new LoggingIOSession(session), 
+                new DefaultHttpRequestFactory(),
+                this.params); 
+        session.setAttribute(NHTTP_CONN, conn);
+        this.handler.connected(conn);
+    }
+
+    public void disconnected(final IOSession session) {
+        DefaultNHttpServerConnection conn = (DefaultNHttpServerConnection) session.getAttribute(
+                NHTTP_CONN);
+        this.handler.closed(conn);
+    }
+
+    public void inputReady(final IOSession session) {
+        DefaultNHttpServerConnection conn = (DefaultNHttpServerConnection) session.getAttribute(
+                NHTTP_CONN);
+        conn.consumeInput(this.handler);
+    }
+
+    public void outputReady(final IOSession session) {
+        DefaultNHttpServerConnection conn = (DefaultNHttpServerConnection) session.getAttribute(
+                NHTTP_CONN);
+        conn.produceOutput(this.handler);
+    }
+
+    public void timeout(final IOSession session) {
+        DefaultNHttpServerConnection conn = (DefaultNHttpServerConnection) session.getAttribute(
+                NHTTP_CONN);
+        this.handler.timeout(conn);
+    }
+
+}

Added: webservices/axis2/trunk/java/modules/kernel/src/org/apache/axis2/transport/nhttp/SSLClientIOEventDispatch.java
URL: http://svn.apache.org/viewvc/webservices/axis2/trunk/java/modules/kernel/src/org/apache/axis2/transport/nhttp/SSLClientIOEventDispatch.java?view=auto&rev=549457
==============================================================================
--- webservices/axis2/trunk/java/modules/kernel/src/org/apache/axis2/transport/nhttp/SSLClientIOEventDispatch.java (added)
+++ webservices/axis2/trunk/java/modules/kernel/src/org/apache/axis2/transport/nhttp/SSLClientIOEventDispatch.java Thu Jun 21 05:21:46 2007
@@ -0,0 +1,157 @@
+///*
+// *  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.axis2.transport.nhttp;
+//
+//import java.io.IOException;
+//
+//import javax.net.ssl.SSLContext;
+//import javax.net.ssl.SSLException;
+//
+//import org.apache.http.impl.DefaultHttpResponseFactory;
+//import org.apache.http.impl.nio.DefaultNHttpClientConnection;
+//import org.apache.http.impl.nio.reactor.SSLIOSession;
+//import org.apache.http.impl.nio.reactor.SSLIOSessionHandler;
+//import org.apache.http.impl.nio.reactor.SSLMode;
+//import org.apache.http.nio.NHttpClientHandler;
+//import org.apache.http.nio.reactor.IOEventDispatch;
+//import org.apache.http.nio.reactor.IOSession;
+//import org.apache.http.params.HttpParams;
+//
+//public class SSLClientIOEventDispatch implements IOEventDispatch {
+//
+//    private static final String NHTTP_CONN = "SYNAPSE.NHTTP_CONN";
+//    private static final String SSL_SESSION = "SYNAPSE.SSL_SESSION";
+//
+//    private final NHttpClientHandler handler;
+//    private final HttpParams params;
+//    private final SSLContext sslcontext;
+//    private final SSLIOSessionHandler sslHandler;
+//
+//    public SSLClientIOEventDispatch(
+//            final NHttpClientHandler handler,
+//            final SSLContext sslcontext,
+//            final SSLIOSessionHandler sslHandler,
+//            final HttpParams params) {
+//        super();
+//        if (handler == null) {
+//            throw new IllegalArgumentException("HTTP client handler may not be null");
+//        }
+//        if (sslcontext == null) {
+//            throw new IllegalArgumentException("SSL context may not be null");
+//        }
+//        if (params == null) {
+//            throw new IllegalArgumentException("HTTP parameters may not be null");
+//        }
+//        this.handler = new LoggingNHttpClientHandler(handler);
+//        this.params = params;
+//        this.sslcontext = sslcontext;
+//        this.sslHandler = sslHandler;
+//    }
+//
+//    public SSLClientIOEventDispatch(
+//            final NHttpClientHandler handler,
+//            final SSLContext sslcontext,
+//            final HttpParams params) {
+//        this(handler, sslcontext, null, params);
+//    }
+//
+//    public void connected(final IOSession session) {
+//
+//        SSLIOSession sslSession = new SSLIOSession(
+//                session,
+//                this.sslcontext,
+//                this.sslHandler);
+//
+//        DefaultNHttpClientConnection conn = new DefaultNHttpClientConnection(
+//                new LoggingIOSession(sslSession),
+//                new DefaultHttpResponseFactory(),
+//                this.params);
+//
+//        session.setAttribute(NHTTP_CONN, conn);
+//        session.setAttribute(SSL_SESSION, sslSession);
+//
+//        Object attachment = session.getAttribute(IOSession.ATTACHMENT_KEY);
+//        this.handler.connected(conn, attachment);
+//
+//        try {
+//            sslSession.initialize(SSLMode.CLIENT, this.params);
+//        } catch (SSLException ex) {
+//            this.handler.exception(conn, ex);
+//            sslSession.shutdown();
+//        }
+//    }
+//
+//    public void disconnected(final IOSession session) {
+//        DefaultNHttpClientConnection conn = (DefaultNHttpClientConnection) session.getAttribute(
+//                NHTTP_CONN);
+//
+//        this.handler.closed(conn);
+//    }
+//
+//    public void inputReady(final IOSession session) {
+//        DefaultNHttpClientConnection conn = (DefaultNHttpClientConnection) session.getAttribute(
+//                NHTTP_CONN);
+//        SSLIOSession sslSession = (SSLIOSession) session.getAttribute(
+//                SSL_SESSION);
+//        try {
+//            synchronized (sslSession) {
+//                while (sslSession.isAppInputReady()) {
+//                    conn.consumeInput(this.handler);
+//                }
+//                sslSession.inboundTransport();
+//            }
+//        } catch (IOException ex) {
+//            this.handler.exception(conn, ex);
+//            sslSession.shutdown();
+//        }
+//    }
+//
+//    public void outputReady(final IOSession session) {
+//        DefaultNHttpClientConnection conn = (DefaultNHttpClientConnection) session.getAttribute(
+//                NHTTP_CONN);
+//        SSLIOSession sslSession = (SSLIOSession) session.getAttribute(
+//                SSL_SESSION);
+//        try {
+//            synchronized (sslSession) {
+//                if (sslSession.isAppOutputReady()) {
+//                    conn.produceOutput(this.handler);
+//                }
+//                sslSession.outboundTransport();
+//            }
+//        } catch (IOException ex) {
+//            this.handler.exception(conn, ex);
+//            sslSession.shutdown();
+//        }
+//    }
+//
+//    public void timeout(final IOSession session) {
+//        DefaultNHttpClientConnection conn = (DefaultNHttpClientConnection) session.getAttribute(
+//                NHTTP_CONN);
+//        SSLIOSession sslSession = (SSLIOSession) session.getAttribute(
+//                SSL_SESSION);
+//        this.handler.timeout(conn);
+//        synchronized (sslSession) {
+//            if (sslSession.isOutboundDone() && !sslSession.isInboundDone()) {
+//                // The session failed to terminate cleanly
+//                sslSession.shutdown();
+//            }
+//        }
+//    }
+//
+//}

Added: webservices/axis2/trunk/java/modules/kernel/src/org/apache/axis2/transport/nhttp/SSLServerIOEventDispatch.java
URL: http://svn.apache.org/viewvc/webservices/axis2/trunk/java/modules/kernel/src/org/apache/axis2/transport/nhttp/SSLServerIOEventDispatch.java?view=auto&rev=549457
==============================================================================
--- webservices/axis2/trunk/java/modules/kernel/src/org/apache/axis2/transport/nhttp/SSLServerIOEventDispatch.java (added)
+++ webservices/axis2/trunk/java/modules/kernel/src/org/apache/axis2/transport/nhttp/SSLServerIOEventDispatch.java Thu Jun 21 05:21:46 2007
@@ -0,0 +1,155 @@
+///*
+// *  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.axis2.transport.nhttp;
+//
+//import java.io.IOException;
+//
+//import javax.net.ssl.SSLContext;
+//import javax.net.ssl.SSLException;
+//
+//import org.apache.http.impl.DefaultHttpRequestFactory;
+//import org.apache.http.impl.nio.DefaultNHttpServerConnection;
+//import org.apache.http.impl.nio.reactor.SSLIOSession;
+//import org.apache.http.impl.nio.reactor.SSLIOSessionHandler;
+//import org.apache.http.impl.nio.reactor.SSLMode;
+//import org.apache.http.nio.NHttpServiceHandler;
+//import org.apache.http.nio.reactor.IOEventDispatch;
+//import org.apache.http.nio.reactor.IOSession;
+//import org.apache.http.params.HttpParams;
+//
+//public class SSLServerIOEventDispatch implements IOEventDispatch {
+//
+//    private static final String NHTTP_CONN = "SYNAPSE.NHTTP_CONN";
+//    private static final String SSL_SESSION = "SYNAPSE.SSL_SESSION";
+//
+//    private final NHttpServiceHandler handler;
+//    private final SSLContext sslcontext;
+//    private final SSLIOSessionHandler sslHandler;
+//    private final HttpParams params;
+//
+//    public SSLServerIOEventDispatch(
+//            final NHttpServiceHandler handler,
+//            final SSLContext sslcontext,
+//            final SSLIOSessionHandler sslHandler,
+//            final HttpParams params) {
+//        super();
+//        if (handler == null) {
+//            throw new IllegalArgumentException("HTTP service handler may not be null");
+//        }
+//        if (sslcontext == null) {
+//            throw new IllegalArgumentException("SSL context may not be null");
+//        }
+//        if (params == null) {
+//            throw new IllegalArgumentException("HTTP parameters may not be null");
+//        }
+//        this.handler = new LoggingNHttpServiceHandler(handler);
+//        this.params = params;
+//        this.sslcontext = sslcontext;
+//        this.sslHandler = sslHandler;
+//    }
+//
+//    public SSLServerIOEventDispatch(
+//            final NHttpServiceHandler handler,
+//            final SSLContext sslcontext,
+//            final HttpParams params) {
+//        this(handler, sslcontext, null, params);
+//    }
+//
+//    public void connected(final IOSession session) {
+//
+//        SSLIOSession sslSession = new SSLIOSession(
+//                session,
+//                this.sslcontext,
+//                this.sslHandler);
+//
+//        DefaultNHttpServerConnection conn = new DefaultNHttpServerConnection(
+//                new LoggingIOSession(sslSession),
+//                new DefaultHttpRequestFactory(),
+//                this.params);
+//
+//        session.setAttribute(NHTTP_CONN, conn);
+//        session.setAttribute(SSL_SESSION, sslSession);
+//
+//        this.handler.connected(conn);
+//
+//        try {
+//            sslSession.initialize(SSLMode.SERVER, this.params);
+//        } catch (SSLException ex) {
+//            this.handler.exception(conn, ex);
+//            sslSession.shutdown();
+//        }
+//    }
+//
+//    public void disconnected(final IOSession session) {
+//        DefaultNHttpServerConnection conn = (DefaultNHttpServerConnection) session.getAttribute(
+//                NHTTP_CONN);
+//        this.handler.closed(conn);
+//    }
+//
+//    public void inputReady(final IOSession session) {
+//        DefaultNHttpServerConnection conn = (DefaultNHttpServerConnection) session.getAttribute(
+//                NHTTP_CONN);
+//        SSLIOSession sslSession = (SSLIOSession) session.getAttribute(
+//                SSL_SESSION);
+//        try {
+//            synchronized (sslSession) {
+//                if (sslSession.isAppInputReady()) {
+//                    conn.consumeInput(this.handler);
+//                }
+//                sslSession.inboundTransport();
+//            }
+//        } catch (IOException ex) {
+//            this.handler.exception(conn, ex);
+//            sslSession.shutdown();
+//        }
+//    }
+//
+//    public void outputReady(final IOSession session) {
+//        DefaultNHttpServerConnection conn = (DefaultNHttpServerConnection) session.getAttribute(
+//                NHTTP_CONN);
+//        SSLIOSession sslSession = (SSLIOSession) session.getAttribute(
+//                SSL_SESSION);
+//        try {
+//            synchronized (sslSession) {
+//                if (sslSession.isAppOutputReady()) {
+//                    conn.produceOutput(this.handler);
+//                }
+//                sslSession.outboundTransport();
+//            }
+//        } catch (IOException ex) {
+//            this.handler.exception(conn, ex);
+//            sslSession.shutdown();
+//        }
+//    }
+//
+//    public void timeout(final IOSession session) {
+//        DefaultNHttpServerConnection conn = (DefaultNHttpServerConnection) session.getAttribute(
+//                NHTTP_CONN);
+//        SSLIOSession sslSession = (SSLIOSession) session.getAttribute(
+//                SSL_SESSION);
+//        this.handler.timeout(conn);
+//        synchronized (sslSession) {
+//            if (sslSession.isOutboundDone() && !sslSession.isInboundDone()) {
+//                // The session failed to terminate cleanly
+//                sslSession.shutdown();
+//            }
+//        }
+//    }
+//
+//}



---------------------------------------------------------------------
To unsubscribe, e-mail: axis-cvs-unsubscribe@ws.apache.org
For additional commands, e-mail: axis-cvs-help@ws.apache.org