You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@hc.apache.org by ol...@apache.org on 2013/04/02 22:09:36 UTC

svn commit: r1463726 [1/2] - in /httpcomponents/httpasyncclient/trunk/httpasyncclient/src: main/java/org/apache/http/impl/nio/conn/ main/java/org/apache/http/nio/conn/ main/java/org/apache/http/nio/conn/scheme/ main/java/org/apache/http/nio/conn/ssl/ t...

Author: olegk
Date: Tue Apr  2 20:09:35 2013
New Revision: 1463726

URL: http://svn.apache.org/r1463726
Log:
New async client connection manager API

Added:
    httpcomponents/httpasyncclient/trunk/httpasyncclient/src/main/java/org/apache/http/impl/nio/conn/CPool.java
      - copied, changed from r1463725, httpcomponents/httpasyncclient/trunk/httpasyncclient/src/main/java/org/apache/http/impl/nio/conn/HttpNIOConnPool.java
    httpcomponents/httpasyncclient/trunk/httpasyncclient/src/main/java/org/apache/http/impl/nio/conn/CPoolEntry.java
      - copied, changed from r1463725, httpcomponents/httpasyncclient/trunk/httpasyncclient/src/main/java/org/apache/http/impl/nio/conn/HttpPoolEntry.java
    httpcomponents/httpasyncclient/trunk/httpasyncclient/src/main/java/org/apache/http/impl/nio/conn/CPoolProxy.java   (with props)
    httpcomponents/httpasyncclient/trunk/httpasyncclient/src/main/java/org/apache/http/impl/nio/conn/ManagedNHttpClientConnectionFactory.java   (with props)
    httpcomponents/httpasyncclient/trunk/httpasyncclient/src/main/java/org/apache/http/impl/nio/conn/ManagedNHttpClientConnectionImpl.java
      - copied, changed from r1463725, httpcomponents/httpasyncclient/trunk/httpasyncclient/src/main/java/org/apache/http/impl/nio/conn/DefaultClientAsyncConnection.java
    httpcomponents/httpasyncclient/trunk/httpasyncclient/src/main/java/org/apache/http/impl/nio/conn/PoolingNHttpClientConnectionManager.java   (with props)
    httpcomponents/httpasyncclient/trunk/httpasyncclient/src/main/java/org/apache/http/nio/conn/ManagedNHttpClientConnection.java
      - copied, changed from r1463725, httpcomponents/httpasyncclient/trunk/httpasyncclient/src/main/java/org/apache/http/nio/conn/ClientAsyncConnection.java
    httpcomponents/httpasyncclient/trunk/httpasyncclient/src/main/java/org/apache/http/nio/conn/NHttpClientConnectionManager.java   (with props)
    httpcomponents/httpasyncclient/trunk/httpasyncclient/src/main/java/org/apache/http/nio/conn/NHttpConnectionFactory.java
      - copied, changed from r1463725, httpcomponents/httpasyncclient/trunk/httpasyncclient/src/main/java/org/apache/http/nio/conn/ClientAsyncConnectionFactory.java
    httpcomponents/httpasyncclient/trunk/httpasyncclient/src/test/java/org/apache/http/impl/nio/conn/
    httpcomponents/httpasyncclient/trunk/httpasyncclient/src/test/java/org/apache/http/impl/nio/conn/TestPoolingHttpClientAsyncConnectionManager.java   (with props)
Modified:
    httpcomponents/httpasyncclient/trunk/httpasyncclient/src/main/java/org/apache/http/impl/nio/conn/AsyncSchemeRegistryFactory.java
    httpcomponents/httpasyncclient/trunk/httpasyncclient/src/main/java/org/apache/http/impl/nio/conn/DefaultClientAsyncConnection.java
    httpcomponents/httpasyncclient/trunk/httpasyncclient/src/main/java/org/apache/http/impl/nio/conn/DefaultClientAsyncConnectionFactory.java
    httpcomponents/httpasyncclient/trunk/httpasyncclient/src/main/java/org/apache/http/impl/nio/conn/DefaultHttpAsyncRoutePlanner.java
    httpcomponents/httpasyncclient/trunk/httpasyncclient/src/main/java/org/apache/http/impl/nio/conn/HttpNIOConnPool.java
    httpcomponents/httpasyncclient/trunk/httpasyncclient/src/main/java/org/apache/http/impl/nio/conn/HttpNIOConnPoolFactory.java
    httpcomponents/httpasyncclient/trunk/httpasyncclient/src/main/java/org/apache/http/impl/nio/conn/HttpPoolEntry.java
    httpcomponents/httpasyncclient/trunk/httpasyncclient/src/main/java/org/apache/http/impl/nio/conn/ManagedClientAsyncConnectionImpl.java
    httpcomponents/httpasyncclient/trunk/httpasyncclient/src/main/java/org/apache/http/impl/nio/conn/PoolingClientAsyncConnectionManager.java
    httpcomponents/httpasyncclient/trunk/httpasyncclient/src/main/java/org/apache/http/nio/conn/ClientAsyncConnection.java
    httpcomponents/httpasyncclient/trunk/httpasyncclient/src/main/java/org/apache/http/nio/conn/ClientAsyncConnectionFactory.java
    httpcomponents/httpasyncclient/trunk/httpasyncclient/src/main/java/org/apache/http/nio/conn/ClientAsyncConnectionManager.java
    httpcomponents/httpasyncclient/trunk/httpasyncclient/src/main/java/org/apache/http/nio/conn/ManagedClientAsyncConnection.java
    httpcomponents/httpasyncclient/trunk/httpasyncclient/src/main/java/org/apache/http/nio/conn/scheme/AsyncScheme.java
    httpcomponents/httpasyncclient/trunk/httpasyncclient/src/main/java/org/apache/http/nio/conn/scheme/AsyncSchemeRegistry.java
    httpcomponents/httpasyncclient/trunk/httpasyncclient/src/main/java/org/apache/http/nio/conn/scheme/LayeringStrategy.java
    httpcomponents/httpasyncclient/trunk/httpasyncclient/src/main/java/org/apache/http/nio/conn/ssl/SSLLayeringStrategy.java

Modified: httpcomponents/httpasyncclient/trunk/httpasyncclient/src/main/java/org/apache/http/impl/nio/conn/AsyncSchemeRegistryFactory.java
URL: http://svn.apache.org/viewvc/httpcomponents/httpasyncclient/trunk/httpasyncclient/src/main/java/org/apache/http/impl/nio/conn/AsyncSchemeRegistryFactory.java?rev=1463726&r1=1463725&r2=1463726&view=diff
==============================================================================
--- httpcomponents/httpasyncclient/trunk/httpasyncclient/src/main/java/org/apache/http/impl/nio/conn/AsyncSchemeRegistryFactory.java (original)
+++ httpcomponents/httpasyncclient/trunk/httpasyncclient/src/main/java/org/apache/http/impl/nio/conn/AsyncSchemeRegistryFactory.java Tue Apr  2 20:09:35 2013
@@ -31,6 +31,7 @@ import org.apache.http.nio.conn.scheme.A
 import org.apache.http.nio.conn.scheme.AsyncSchemeRegistry;
 import org.apache.http.nio.conn.ssl.SSLLayeringStrategy;
 
+@Deprecated
 @ThreadSafe
 public final class AsyncSchemeRegistryFactory {
 

Copied: httpcomponents/httpasyncclient/trunk/httpasyncclient/src/main/java/org/apache/http/impl/nio/conn/CPool.java (from r1463725, httpcomponents/httpasyncclient/trunk/httpasyncclient/src/main/java/org/apache/http/impl/nio/conn/HttpNIOConnPool.java)
URL: http://svn.apache.org/viewvc/httpcomponents/httpasyncclient/trunk/httpasyncclient/src/main/java/org/apache/http/impl/nio/conn/CPool.java?p2=httpcomponents/httpasyncclient/trunk/httpasyncclient/src/main/java/org/apache/http/impl/nio/conn/CPool.java&p1=httpcomponents/httpasyncclient/trunk/httpasyncclient/src/main/java/org/apache/http/impl/nio/conn/HttpNIOConnPool.java&r1=1463725&r2=1463726&rev=1463726&view=diff
==============================================================================
--- httpcomponents/httpasyncclient/trunk/httpasyncclient/src/main/java/org/apache/http/impl/nio/conn/HttpNIOConnPool.java (original)
+++ httpcomponents/httpasyncclient/trunk/httpasyncclient/src/main/java/org/apache/http/impl/nio/conn/CPool.java Tue Apr  2 20:09:35 2013
@@ -29,39 +29,41 @@ package org.apache.http.impl.nio.conn;
 import java.net.InetSocketAddress;
 import java.net.SocketAddress;
 import java.util.concurrent.TimeUnit;
-import java.util.concurrent.atomic.AtomicLong;
 
 import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
 import org.apache.http.HttpHost;
+import org.apache.http.annotation.ThreadSafe;
 import org.apache.http.conn.routing.HttpRoute;
-import org.apache.http.nio.conn.scheme.AsyncScheme;
-import org.apache.http.nio.conn.scheme.AsyncSchemeRegistry;
+import org.apache.http.nio.conn.ManagedNHttpClientConnection;
 import org.apache.http.nio.pool.AbstractNIOConnPool;
+import org.apache.http.nio.pool.NIOConnFactory;
 import org.apache.http.nio.reactor.ConnectingIOReactor;
-import org.apache.http.nio.reactor.IOSession;
 
-class HttpNIOConnPool extends AbstractNIOConnPool<HttpRoute, IOSession, HttpPoolEntry> {
+@ThreadSafe
+class CPool extends AbstractNIOConnPool<HttpRoute, ManagedNHttpClientConnection, CPoolEntry> {
 
-    private static final AtomicLong COUNTER = new AtomicLong(1);
+    private final Log log = LogFactory.getLog(CPool.class);
 
-    private final Log log;
-    private final AsyncSchemeRegistry schemeRegistry;
-    private final long connTimeToLive;
+    private final long timeToLive;
     private final TimeUnit tunit;
 
-    HttpNIOConnPool(
-            final Log log,
+    public CPool(
             final ConnectingIOReactor ioreactor,
-            final AsyncSchemeRegistry schemeRegistry,
-            final long connTimeToLive, final TimeUnit tunit) {
-        super(ioreactor, new HttpNIOConnPoolFactory(), 2, 20);
-        this.log = log;
-        this.schemeRegistry = schemeRegistry;
-        this.connTimeToLive = connTimeToLive;
+            final NIOConnFactory<HttpRoute, ManagedNHttpClientConnection> connFactory,
+            final int defaultMaxPerRoute, final int maxTotal,
+            final long timeToLive, final TimeUnit tunit) {
+        super(ioreactor, connFactory, defaultMaxPerRoute, maxTotal);
+        this.timeToLive = timeToLive;
         this.tunit = tunit;
     }
 
     @Override
+    protected CPoolEntry createEntry(final HttpRoute route, final ManagedNHttpClientConnection conn) {
+        return new CPoolEntry(this.log, conn.getId(), route, conn, this.timeToLive, this.tunit);
+    }
+
+    @Override
     protected SocketAddress resolveLocalAddress(final HttpRoute route) {
         return new InetSocketAddress(route.getLocalAddress(), 0);
     }
@@ -73,18 +75,8 @@ class HttpNIOConnPool extends AbstractNI
             firsthop = route.getTargetHost();
         }
         final String hostname = firsthop.getHostName();
-        int port = firsthop.getPort();
-        if (port < 0) {
-            final AsyncScheme scheme = this.schemeRegistry.getScheme(firsthop);
-            port = scheme.resolvePort(port);
-        }
+        final int port = firsthop.getPort();
         return new InetSocketAddress(hostname, port);
     }
 
-    @Override
-    protected HttpPoolEntry createEntry(final HttpRoute route, final IOSession session) {
-        final String id = Long.toString(COUNTER.getAndIncrement());
-        return new HttpPoolEntry(this.log, id, route, session, this.connTimeToLive, this.tunit);
-    }
-
 }

Copied: httpcomponents/httpasyncclient/trunk/httpasyncclient/src/main/java/org/apache/http/impl/nio/conn/CPoolEntry.java (from r1463725, httpcomponents/httpasyncclient/trunk/httpasyncclient/src/main/java/org/apache/http/impl/nio/conn/HttpPoolEntry.java)
URL: http://svn.apache.org/viewvc/httpcomponents/httpasyncclient/trunk/httpasyncclient/src/main/java/org/apache/http/impl/nio/conn/CPoolEntry.java?p2=httpcomponents/httpasyncclient/trunk/httpasyncclient/src/main/java/org/apache/http/impl/nio/conn/CPoolEntry.java&p1=httpcomponents/httpasyncclient/trunk/httpasyncclient/src/main/java/org/apache/http/impl/nio/conn/HttpPoolEntry.java&r1=1463725&r2=1463726&rev=1463726&view=diff
==============================================================================
--- httpcomponents/httpasyncclient/trunk/httpasyncclient/src/main/java/org/apache/http/impl/nio/conn/HttpPoolEntry.java (original)
+++ httpcomponents/httpasyncclient/trunk/httpasyncclient/src/main/java/org/apache/http/impl/nio/conn/CPoolEntry.java Tue Apr  2 20:09:35 2013
@@ -31,23 +31,43 @@ import java.util.Date;
 import java.util.concurrent.TimeUnit;
 
 import org.apache.commons.logging.Log;
+import org.apache.http.annotation.ThreadSafe;
 import org.apache.http.conn.routing.HttpRoute;
-import org.apache.http.conn.routing.RouteTracker;
-import org.apache.http.nio.conn.ClientAsyncConnection;
-import org.apache.http.nio.reactor.IOEventDispatch;
-import org.apache.http.nio.reactor.IOSession;
+import org.apache.http.nio.conn.ManagedNHttpClientConnection;
 import org.apache.http.pool.PoolEntry;
 
-class HttpPoolEntry extends PoolEntry<HttpRoute, IOSession> {
+@ThreadSafe
+class CPoolEntry extends PoolEntry<HttpRoute, ManagedNHttpClientConnection> {
 
     private final Log log;
-    private final RouteTracker tracker;
+    private volatile boolean routeComplete;
 
-    HttpPoolEntry(final Log log, final String id, final HttpRoute route, final IOSession session,
+    public CPoolEntry(
+            final Log log,
+            final String id,
+            final HttpRoute route,
+            final ManagedNHttpClientConnection conn,
             final long timeToLive, final TimeUnit tunit) {
-        super(id, route, session, timeToLive, tunit);
+        super(id, route, conn, timeToLive, tunit);
         this.log = log;
-        this.tracker = new RouteTracker(route);
+    }
+
+    public boolean isRouteComplete() {
+        return this.routeComplete;
+    }
+
+    public void markRouteComplete() {
+        this.routeComplete = true;
+    }
+
+    public void closeConnection() throws IOException {
+        final ManagedNHttpClientConnection conn = getConnection();
+        conn.close();
+    }
+
+    public void shutdownConnection() throws IOException {
+        final ManagedNHttpClientConnection conn = getConnection();
+        conn.shutdown();
     }
 
     @Override
@@ -59,38 +79,19 @@ class HttpPoolEntry extends PoolEntry<Ht
         return expired;
     }
 
-    public ClientAsyncConnection getOperatedClientConnection() {
-        final IOSession session = getConnection();
-        return (ClientAsyncConnection) session.getAttribute(IOEventDispatch.CONNECTION_KEY);
+    @Override
+    public boolean isClosed() {
+        final ManagedNHttpClientConnection conn = getConnection();
+        return !conn.isOpen();
     }
 
     @Override
     public void close() {
         try {
-            getOperatedClientConnection().shutdown();
+            closeConnection();
         } catch (final IOException ex) {
-            if (this.log.isDebugEnabled()) {
-                this.log.debug("I/O error shutting down connection", ex);
-            }
+            this.log.debug("I/O error closing connection", ex);
         }
     }
 
-    @Override
-    public boolean isClosed() {
-        final IOSession session = getConnection();
-        return session.isClosed();
-    }
-
-    HttpRoute getPlannedRoute() {
-        return super.getRoute();
-    }
-
-    RouteTracker getTracker() {
-        return this.tracker;
-    }
-
-    HttpRoute getEffectiveRoute() {
-        return this.tracker.toRoute();
-    }
-
 }

Added: httpcomponents/httpasyncclient/trunk/httpasyncclient/src/main/java/org/apache/http/impl/nio/conn/CPoolProxy.java
URL: http://svn.apache.org/viewvc/httpcomponents/httpasyncclient/trunk/httpasyncclient/src/main/java/org/apache/http/impl/nio/conn/CPoolProxy.java?rev=1463726&view=auto
==============================================================================
--- httpcomponents/httpasyncclient/trunk/httpasyncclient/src/main/java/org/apache/http/impl/nio/conn/CPoolProxy.java (added)
+++ httpcomponents/httpasyncclient/trunk/httpasyncclient/src/main/java/org/apache/http/impl/nio/conn/CPoolProxy.java Tue Apr  2 20:09:35 2013
@@ -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.
+ * ====================================================================
+ *
+ * This software consists of voluntary contributions made by many
+ * individuals on behalf of the Apache Software Foundation.  For more
+ * information on the Apache Software Foundation, please see
+ * <http://www.apache.org/>.
+ *
+ */
+package org.apache.http.impl.nio.conn;
+
+import java.io.IOException;
+import java.lang.reflect.InvocationHandler;
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
+import java.lang.reflect.Proxy;
+
+import org.apache.http.HttpConnection;
+import org.apache.http.annotation.NotThreadSafe;
+import org.apache.http.impl.conn.ConnectionShutdownException;
+import org.apache.http.nio.NHttpClientConnection;
+import org.apache.http.nio.conn.ManagedNHttpClientConnection;
+
+@NotThreadSafe
+class CPoolProxy implements InvocationHandler {
+
+    private static final Method CLOSE_METHOD;
+    private static final Method SHUTDOWN_METHOD;
+    private static final Method IS_OPEN_METHOD;
+    private static final Method IS_STALE_METHOD;
+
+    static {
+        try {
+            CLOSE_METHOD = HttpConnection.class.getMethod("close");
+            SHUTDOWN_METHOD = HttpConnection.class.getMethod("shutdown");
+            IS_OPEN_METHOD = HttpConnection.class.getMethod("isOpen");
+            IS_STALE_METHOD = HttpConnection.class.getMethod("isStale");
+        } catch (final NoSuchMethodException ex) {
+            throw new Error(ex);
+        }
+    }
+
+    private volatile CPoolEntry poolEntry;
+
+    CPoolProxy(final CPoolEntry entry) {
+        super();
+        this.poolEntry = entry;
+    }
+
+    CPoolEntry getPoolEntry() {
+        return this.poolEntry;
+    }
+
+    CPoolEntry detach() {
+        final CPoolEntry local = this.poolEntry;
+        this.poolEntry = null;
+        return local;
+    }
+
+    NHttpClientConnection getConnection() {
+        final CPoolEntry local = this.poolEntry;
+        if (local == null) {
+            return null;
+        }
+        return local.getConnection();
+    }
+
+    public void close() throws IOException {
+        final CPoolEntry local = this.poolEntry;
+        if (local != null) {
+            local.closeConnection();
+        }
+    }
+
+    public void shutdown() throws IOException {
+        final CPoolEntry local = this.poolEntry;
+        if (local != null) {
+            local.shutdownConnection();
+        }
+    }
+
+    public boolean isOpen() {
+        final CPoolEntry local = this.poolEntry;
+        if (local != null) {
+            return !local.isClosed();
+        } else {
+            return false;
+        }
+    }
+
+    public boolean isStale() {
+        final NHttpClientConnection conn = getConnection();
+        if (conn != null) {
+            return conn.isStale() || !conn.isOpen();
+        } else {
+            return true;
+        }
+    }
+
+    public Object invoke(
+            final Object proxy, final Method method, final Object[] args) throws Throwable {
+        if (method.equals(CLOSE_METHOD)) {
+            close();
+            return null;
+        } else if (method.equals(SHUTDOWN_METHOD)) {
+            shutdown();
+            return null;
+        } else if (method.equals(IS_OPEN_METHOD)) {
+            return Boolean.valueOf(isOpen());
+        } else if (method.equals(IS_STALE_METHOD)) {
+            return Boolean.valueOf(isStale());
+        } else {
+            final NHttpClientConnection conn = getConnection();
+            if (conn == null) {
+                throw new ConnectionShutdownException();
+            }
+            try {
+                return method.invoke(conn, args);
+            } catch (final InvocationTargetException ex) {
+                final Throwable cause = ex.getCause();
+                if (cause != null) {
+                    throw cause;
+                } else {
+                    throw ex;
+                }
+            }
+        }
+    }
+
+    public static NHttpClientConnection newProxy(
+            final CPoolEntry poolEntry) {
+        return (NHttpClientConnection) Proxy.newProxyInstance(
+                CPoolProxy.class.getClassLoader(),
+                new Class<?>[] { ManagedNHttpClientConnection.class },
+                new CPoolProxy(poolEntry));
+    }
+
+    private static CPoolProxy getHandler(
+            final NHttpClientConnection proxy) {
+        final InvocationHandler handler = Proxy.getInvocationHandler(proxy);
+        if (!CPoolProxy.class.isInstance(handler)) {
+            throw new IllegalStateException("Unexpected proxy handler class: " + handler);
+        }
+        return CPoolProxy.class.cast(handler);
+    }
+
+    public static CPoolEntry getPoolEntry(final NHttpClientConnection proxy) {
+        final CPoolEntry entry = getHandler(proxy).getPoolEntry();
+        if (entry == null) {
+            throw new ConnectionShutdownException();
+        }
+        return entry;
+    }
+
+    public static CPoolEntry detach(final NHttpClientConnection proxy) {
+        return getHandler(proxy).detach();
+    }
+
+}

Propchange: httpcomponents/httpasyncclient/trunk/httpasyncclient/src/main/java/org/apache/http/impl/nio/conn/CPoolProxy.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: httpcomponents/httpasyncclient/trunk/httpasyncclient/src/main/java/org/apache/http/impl/nio/conn/CPoolProxy.java
------------------------------------------------------------------------------
    svn:keywords = Date Revision

Propchange: httpcomponents/httpasyncclient/trunk/httpasyncclient/src/main/java/org/apache/http/impl/nio/conn/CPoolProxy.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Modified: httpcomponents/httpasyncclient/trunk/httpasyncclient/src/main/java/org/apache/http/impl/nio/conn/DefaultClientAsyncConnection.java
URL: http://svn.apache.org/viewvc/httpcomponents/httpasyncclient/trunk/httpasyncclient/src/main/java/org/apache/http/impl/nio/conn/DefaultClientAsyncConnection.java?rev=1463726&r1=1463725&r2=1463726&view=diff
==============================================================================
--- httpcomponents/httpasyncclient/trunk/httpasyncclient/src/main/java/org/apache/http/impl/nio/conn/DefaultClientAsyncConnection.java (original)
+++ httpcomponents/httpasyncclient/trunk/httpasyncclient/src/main/java/org/apache/http/impl/nio/conn/DefaultClientAsyncConnection.java Tue Apr  2 20:09:35 2013
@@ -38,6 +38,7 @@ import org.apache.http.nio.reactor.IOSes
 import org.apache.http.nio.util.ByteBufferAllocator;
 import org.apache.http.params.HttpParams;
 
+@Deprecated
 public class DefaultClientAsyncConnection
                     extends DefaultNHttpClientConnection implements ClientAsyncConnection {
 

Modified: httpcomponents/httpasyncclient/trunk/httpasyncclient/src/main/java/org/apache/http/impl/nio/conn/DefaultClientAsyncConnectionFactory.java
URL: http://svn.apache.org/viewvc/httpcomponents/httpasyncclient/trunk/httpasyncclient/src/main/java/org/apache/http/impl/nio/conn/DefaultClientAsyncConnectionFactory.java?rev=1463726&r1=1463725&r2=1463726&view=diff
==============================================================================
--- httpcomponents/httpasyncclient/trunk/httpasyncclient/src/main/java/org/apache/http/impl/nio/conn/DefaultClientAsyncConnectionFactory.java (original)
+++ httpcomponents/httpasyncclient/trunk/httpasyncclient/src/main/java/org/apache/http/impl/nio/conn/DefaultClientAsyncConnectionFactory.java Tue Apr  2 20:09:35 2013
@@ -26,26 +26,66 @@
  */
 package org.apache.http.impl.nio.conn;
 
+import java.nio.charset.Charset;
+import java.nio.charset.CharsetDecoder;
+import java.nio.charset.CharsetEncoder;
+import java.nio.charset.CodingErrorAction;
+import java.util.concurrent.atomic.AtomicLong;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.apache.http.HttpResponse;
 import org.apache.http.HttpResponseFactory;
+import org.apache.http.config.ConnectionConfig;
 import org.apache.http.impl.DefaultHttpResponseFactory;
+import org.apache.http.impl.nio.codecs.DefaultHttpResponseParserFactory;
+import org.apache.http.message.BasicLineParser;
+import org.apache.http.nio.NHttpMessageParserFactory;
 import org.apache.http.nio.conn.ClientAsyncConnection;
 import org.apache.http.nio.conn.ClientAsyncConnectionFactory;
+import org.apache.http.nio.conn.ManagedNHttpClientConnection;
+import org.apache.http.nio.conn.NHttpConnectionFactory;
+import org.apache.http.nio.reactor.IOEventDispatch;
 import org.apache.http.nio.reactor.IOSession;
 import org.apache.http.nio.util.ByteBufferAllocator;
 import org.apache.http.nio.util.HeapByteBufferAllocator;
 import org.apache.http.params.HttpParams;
 
-public class DefaultClientAsyncConnectionFactory implements ClientAsyncConnectionFactory {
+@Deprecated
+public class DefaultClientAsyncConnectionFactory
+    implements ClientAsyncConnectionFactory, NHttpConnectionFactory<ManagedNHttpClientConnection> {
+
+    private final Log headerlog = LogFactory.getLog("org.apache.http.headers");
+    private final Log wirelog = LogFactory.getLog("org.apache.http.wire");
+    private final Log log = LogFactory.getLog(ManagedNHttpClientConnectionImpl.class);
+
+    public static final DefaultClientAsyncConnectionFactory INSTANCE = new DefaultClientAsyncConnectionFactory(null, null);
+
+    private static AtomicLong COUNTER = new AtomicLong();
 
     private final HttpResponseFactory responseFactory;
+    private final NHttpMessageParserFactory<HttpResponse> responseParserFactory;
     private final ByteBufferAllocator allocator;
 
+    public DefaultClientAsyncConnectionFactory(
+            final NHttpMessageParserFactory<HttpResponse> responseParserFactory,
+            final ByteBufferAllocator allocator) {
+        super();
+        this.responseFactory = createHttpResponseFactory();
+        this.responseParserFactory = responseParserFactory != null ? responseParserFactory :
+            DefaultHttpResponseParserFactory.INSTANCE;
+        this.allocator = allocator != null ? allocator : HeapByteBufferAllocator.INSTANCE;
+    }
+
     public DefaultClientAsyncConnectionFactory() {
         super();
         this.responseFactory = createHttpResponseFactory();
+        this.responseParserFactory = new DefaultHttpResponseParserFactory(
+            BasicLineParser.INSTANCE, this.responseFactory);
         this.allocator = createByteBufferAllocator();
     }
 
+    @Deprecated
     public ClientAsyncConnection create(
             final String id,
             final IOSession iosession,
@@ -54,12 +94,47 @@ public class DefaultClientAsyncConnectio
                 id, iosession, this.responseFactory, this.allocator, params);
     }
 
+    @Deprecated
     protected ByteBufferAllocator createByteBufferAllocator() {
-        return new HeapByteBufferAllocator();
+        return HeapByteBufferAllocator.INSTANCE;
     }
 
+    @Deprecated
     protected HttpResponseFactory createHttpResponseFactory() {
-        return new DefaultHttpResponseFactory();
+        return DefaultHttpResponseFactory.INSTANCE;
+    }
+
+    public ManagedNHttpClientConnection create(
+            final IOSession iosession, final ConnectionConfig config) {
+        final String id = "http-outgoing-" + Long.toString(COUNTER.getAndIncrement());
+        CharsetDecoder chardecoder = null;
+        CharsetEncoder charencoder = null;
+        final Charset charset = config.getCharset();
+        final CodingErrorAction malformedInputAction = config.getMalformedInputAction() != null ?
+                config.getMalformedInputAction() : CodingErrorAction.REPORT;
+        final CodingErrorAction unmappableInputAction = config.getUnmappableInputAction() != null ?
+                config.getUnmappableInputAction() : CodingErrorAction.REPORT;
+        if (charset != null) {
+            chardecoder = charset.newDecoder();
+            chardecoder.onMalformedInput(malformedInputAction);
+            chardecoder.onUnmappableCharacter(unmappableInputAction);
+            charencoder = charset.newEncoder();
+            charencoder.onMalformedInput(malformedInputAction);
+            charencoder.onUnmappableCharacter(unmappableInputAction);
+        }
+        final ManagedNHttpClientConnection conn = new ManagedNHttpClientConnectionImpl(
+                id,
+                this.log,
+                this.headerlog,
+                this.wirelog,
+                iosession,
+                8 * 1024,
+                this.allocator,
+                chardecoder, charencoder, config.getMessageConstraints(),
+                null, null, null,
+                this.responseParserFactory);
+        iosession.setAttribute(IOEventDispatch.CONNECTION_KEY, conn);
+        return conn;
     }
 
 }

Modified: httpcomponents/httpasyncclient/trunk/httpasyncclient/src/main/java/org/apache/http/impl/nio/conn/DefaultHttpAsyncRoutePlanner.java
URL: http://svn.apache.org/viewvc/httpcomponents/httpasyncclient/trunk/httpasyncclient/src/main/java/org/apache/http/impl/nio/conn/DefaultHttpAsyncRoutePlanner.java?rev=1463726&r1=1463725&r2=1463726&view=diff
==============================================================================
--- httpcomponents/httpasyncclient/trunk/httpasyncclient/src/main/java/org/apache/http/impl/nio/conn/DefaultHttpAsyncRoutePlanner.java (original)
+++ httpcomponents/httpasyncclient/trunk/httpasyncclient/src/main/java/org/apache/http/impl/nio/conn/DefaultHttpAsyncRoutePlanner.java Tue Apr  2 20:09:35 2013
@@ -41,6 +41,7 @@ import org.apache.http.nio.conn.scheme.A
 import org.apache.http.nio.conn.scheme.LayeringStrategy;
 import org.apache.http.protocol.HttpContext;
 
+@Deprecated
 public class DefaultHttpAsyncRoutePlanner implements HttpRoutePlanner {
 
     private final AsyncSchemeRegistry schemeRegistry;

Modified: httpcomponents/httpasyncclient/trunk/httpasyncclient/src/main/java/org/apache/http/impl/nio/conn/HttpNIOConnPool.java
URL: http://svn.apache.org/viewvc/httpcomponents/httpasyncclient/trunk/httpasyncclient/src/main/java/org/apache/http/impl/nio/conn/HttpNIOConnPool.java?rev=1463726&r1=1463725&r2=1463726&view=diff
==============================================================================
--- httpcomponents/httpasyncclient/trunk/httpasyncclient/src/main/java/org/apache/http/impl/nio/conn/HttpNIOConnPool.java (original)
+++ httpcomponents/httpasyncclient/trunk/httpasyncclient/src/main/java/org/apache/http/impl/nio/conn/HttpNIOConnPool.java Tue Apr  2 20:09:35 2013
@@ -40,6 +40,7 @@ import org.apache.http.nio.pool.Abstract
 import org.apache.http.nio.reactor.ConnectingIOReactor;
 import org.apache.http.nio.reactor.IOSession;
 
+@Deprecated
 class HttpNIOConnPool extends AbstractNIOConnPool<HttpRoute, IOSession, HttpPoolEntry> {
 
     private static final AtomicLong COUNTER = new AtomicLong(1);

Modified: httpcomponents/httpasyncclient/trunk/httpasyncclient/src/main/java/org/apache/http/impl/nio/conn/HttpNIOConnPoolFactory.java
URL: http://svn.apache.org/viewvc/httpcomponents/httpasyncclient/trunk/httpasyncclient/src/main/java/org/apache/http/impl/nio/conn/HttpNIOConnPoolFactory.java?rev=1463726&r1=1463725&r2=1463726&view=diff
==============================================================================
--- httpcomponents/httpasyncclient/trunk/httpasyncclient/src/main/java/org/apache/http/impl/nio/conn/HttpNIOConnPoolFactory.java (original)
+++ httpcomponents/httpasyncclient/trunk/httpasyncclient/src/main/java/org/apache/http/impl/nio/conn/HttpNIOConnPoolFactory.java Tue Apr  2 20:09:35 2013
@@ -32,6 +32,7 @@ import org.apache.http.conn.routing.Http
 import org.apache.http.nio.pool.NIOConnFactory;
 import org.apache.http.nio.reactor.IOSession;
 
+@Deprecated
 class HttpNIOConnPoolFactory implements NIOConnFactory<HttpRoute, IOSession> {
 
     public IOSession create(final HttpRoute route, final IOSession session) throws IOException {

Modified: httpcomponents/httpasyncclient/trunk/httpasyncclient/src/main/java/org/apache/http/impl/nio/conn/HttpPoolEntry.java
URL: http://svn.apache.org/viewvc/httpcomponents/httpasyncclient/trunk/httpasyncclient/src/main/java/org/apache/http/impl/nio/conn/HttpPoolEntry.java?rev=1463726&r1=1463725&r2=1463726&view=diff
==============================================================================
--- httpcomponents/httpasyncclient/trunk/httpasyncclient/src/main/java/org/apache/http/impl/nio/conn/HttpPoolEntry.java (original)
+++ httpcomponents/httpasyncclient/trunk/httpasyncclient/src/main/java/org/apache/http/impl/nio/conn/HttpPoolEntry.java Tue Apr  2 20:09:35 2013
@@ -38,6 +38,7 @@ import org.apache.http.nio.reactor.IOEve
 import org.apache.http.nio.reactor.IOSession;
 import org.apache.http.pool.PoolEntry;
 
+@Deprecated
 class HttpPoolEntry extends PoolEntry<HttpRoute, IOSession> {
 
     private final Log log;

Modified: httpcomponents/httpasyncclient/trunk/httpasyncclient/src/main/java/org/apache/http/impl/nio/conn/ManagedClientAsyncConnectionImpl.java
URL: http://svn.apache.org/viewvc/httpcomponents/httpasyncclient/trunk/httpasyncclient/src/main/java/org/apache/http/impl/nio/conn/ManagedClientAsyncConnectionImpl.java?rev=1463726&r1=1463725&r2=1463726&view=diff
==============================================================================
--- httpcomponents/httpasyncclient/trunk/httpasyncclient/src/main/java/org/apache/http/impl/nio/conn/ManagedClientAsyncConnectionImpl.java (original)
+++ httpcomponents/httpasyncclient/trunk/httpasyncclient/src/main/java/org/apache/http/impl/nio/conn/ManagedClientAsyncConnectionImpl.java Tue Apr  2 20:09:35 2013
@@ -54,6 +54,7 @@ import org.apache.http.nio.reactor.ssl.S
 import org.apache.http.params.HttpParams;
 import org.apache.http.protocol.HttpContext;
 
+@Deprecated
 class ManagedClientAsyncConnectionImpl implements ManagedClientAsyncConnection {
 
     private final ClientAsyncConnectionManager manager;

Added: httpcomponents/httpasyncclient/trunk/httpasyncclient/src/main/java/org/apache/http/impl/nio/conn/ManagedNHttpClientConnectionFactory.java
URL: http://svn.apache.org/viewvc/httpcomponents/httpasyncclient/trunk/httpasyncclient/src/main/java/org/apache/http/impl/nio/conn/ManagedNHttpClientConnectionFactory.java?rev=1463726&view=auto
==============================================================================
--- httpcomponents/httpasyncclient/trunk/httpasyncclient/src/main/java/org/apache/http/impl/nio/conn/ManagedNHttpClientConnectionFactory.java (added)
+++ httpcomponents/httpasyncclient/trunk/httpasyncclient/src/main/java/org/apache/http/impl/nio/conn/ManagedNHttpClientConnectionFactory.java Tue Apr  2 20:09:35 2013
@@ -0,0 +1,118 @@
+/*
+ * ====================================================================
+ * 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.
+ * ====================================================================
+ *
+ * This software consists of voluntary contributions made by many
+ * individuals on behalf of the Apache Software Foundation.  For more
+ * information on the Apache Software Foundation, please see
+ * <http://www.apache.org/>.
+ *
+ */
+package org.apache.http.impl.nio.conn;
+
+import java.nio.charset.Charset;
+import java.nio.charset.CharsetDecoder;
+import java.nio.charset.CharsetEncoder;
+import java.nio.charset.CodingErrorAction;
+import java.util.concurrent.atomic.AtomicLong;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.apache.http.HttpRequest;
+import org.apache.http.HttpResponse;
+import org.apache.http.config.ConnectionConfig;
+import org.apache.http.impl.nio.codecs.DefaultHttpRequestWriterFactory;
+import org.apache.http.impl.nio.codecs.DefaultHttpResponseParserFactory;
+import org.apache.http.nio.NHttpMessageParserFactory;
+import org.apache.http.nio.NHttpMessageWriterFactory;
+import org.apache.http.nio.conn.ManagedNHttpClientConnection;
+import org.apache.http.nio.conn.NHttpConnectionFactory;
+import org.apache.http.nio.reactor.IOEventDispatch;
+import org.apache.http.nio.reactor.IOSession;
+import org.apache.http.nio.util.ByteBufferAllocator;
+import org.apache.http.nio.util.HeapByteBufferAllocator;
+
+public class ManagedNHttpClientConnectionFactory implements NHttpConnectionFactory<ManagedNHttpClientConnection> {
+
+    private final Log headerlog = LogFactory.getLog("org.apache.http.headers");
+    private final Log wirelog = LogFactory.getLog("org.apache.http.wire");
+    private final Log log = LogFactory.getLog(ManagedNHttpClientConnectionImpl.class);
+
+    private static AtomicLong COUNTER = new AtomicLong();
+
+    public static final ManagedNHttpClientConnectionFactory INSTANCE = new ManagedNHttpClientConnectionFactory();
+
+    private final ByteBufferAllocator allocator;
+    private final NHttpMessageWriterFactory<HttpRequest> requestWriterFactory;
+    private final NHttpMessageParserFactory<HttpResponse> responseParserFactory;
+
+    public ManagedNHttpClientConnectionFactory(
+            final NHttpMessageWriterFactory<HttpRequest> requestWriterFactory,
+            final NHttpMessageParserFactory<HttpResponse> responseParserFactory,
+            final ByteBufferAllocator allocator) {
+        super();
+        this.requestWriterFactory = requestWriterFactory != null ? requestWriterFactory :
+            DefaultHttpRequestWriterFactory.INSTANCE;
+        this.responseParserFactory = responseParserFactory != null ? responseParserFactory :
+            DefaultHttpResponseParserFactory.INSTANCE;
+        this.allocator = allocator != null ? allocator : HeapByteBufferAllocator.INSTANCE;
+    }
+
+    public ManagedNHttpClientConnectionFactory() {
+        this(null, null, null);
+    }
+
+    public ManagedNHttpClientConnection create(
+            final IOSession iosession, final ConnectionConfig config) {
+        final String id = "http-outgoing-" + Long.toString(COUNTER.getAndIncrement());
+        CharsetDecoder chardecoder = null;
+        CharsetEncoder charencoder = null;
+        final Charset charset = config.getCharset();
+        final CodingErrorAction malformedInputAction = config.getMalformedInputAction() != null ?
+                config.getMalformedInputAction() : CodingErrorAction.REPORT;
+        final CodingErrorAction unmappableInputAction = config.getUnmappableInputAction() != null ?
+                config.getUnmappableInputAction() : CodingErrorAction.REPORT;
+        if (charset != null) {
+            chardecoder = charset.newDecoder();
+            chardecoder.onMalformedInput(malformedInputAction);
+            chardecoder.onUnmappableCharacter(unmappableInputAction);
+            charencoder = charset.newEncoder();
+            charencoder.onMalformedInput(malformedInputAction);
+            charencoder.onUnmappableCharacter(unmappableInputAction);
+        }
+        final ManagedNHttpClientConnection conn = new ManagedNHttpClientConnectionImpl(
+                id,
+                this.log,
+                this.headerlog,
+                this.wirelog,
+                iosession,
+                8 * 1024,
+                this.allocator,
+                chardecoder,
+                charencoder,
+                config.getMessageConstraints(),
+                null,
+                null,
+                this.requestWriterFactory,
+                this.responseParserFactory);
+        iosession.setAttribute(IOEventDispatch.CONNECTION_KEY, conn);
+        return conn;
+    }
+
+}

Propchange: httpcomponents/httpasyncclient/trunk/httpasyncclient/src/main/java/org/apache/http/impl/nio/conn/ManagedNHttpClientConnectionFactory.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: httpcomponents/httpasyncclient/trunk/httpasyncclient/src/main/java/org/apache/http/impl/nio/conn/ManagedNHttpClientConnectionFactory.java
------------------------------------------------------------------------------
    svn:keywords = Date Revision

Propchange: httpcomponents/httpasyncclient/trunk/httpasyncclient/src/main/java/org/apache/http/impl/nio/conn/ManagedNHttpClientConnectionFactory.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Copied: httpcomponents/httpasyncclient/trunk/httpasyncclient/src/main/java/org/apache/http/impl/nio/conn/ManagedNHttpClientConnectionImpl.java (from r1463725, httpcomponents/httpasyncclient/trunk/httpasyncclient/src/main/java/org/apache/http/impl/nio/conn/DefaultClientAsyncConnection.java)
URL: http://svn.apache.org/viewvc/httpcomponents/httpasyncclient/trunk/httpasyncclient/src/main/java/org/apache/http/impl/nio/conn/ManagedNHttpClientConnectionImpl.java?p2=httpcomponents/httpasyncclient/trunk/httpasyncclient/src/main/java/org/apache/http/impl/nio/conn/ManagedNHttpClientConnectionImpl.java&p1=httpcomponents/httpasyncclient/trunk/httpasyncclient/src/main/java/org/apache/http/impl/nio/conn/DefaultClientAsyncConnection.java&r1=1463725&r2=1463726&rev=1463726&view=diff
==============================================================================
--- httpcomponents/httpasyncclient/trunk/httpasyncclient/src/main/java/org/apache/http/impl/nio/conn/DefaultClientAsyncConnection.java (original)
+++ httpcomponents/httpasyncclient/trunk/httpasyncclient/src/main/java/org/apache/http/impl/nio/conn/ManagedNHttpClientConnectionImpl.java Tue Apr  2 20:09:35 2013
@@ -26,50 +26,76 @@
  */
 package org.apache.http.impl.nio.conn;
 
+import java.nio.charset.CharsetDecoder;
+import java.nio.charset.CharsetEncoder;
+
+import javax.net.ssl.SSLSession;
+
 import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
 import org.apache.http.Header;
 import org.apache.http.HttpRequest;
 import org.apache.http.HttpResponse;
-import org.apache.http.HttpResponseFactory;
+import org.apache.http.config.MessageConstraints;
+import org.apache.http.entity.ContentLengthStrategy;
 import org.apache.http.impl.nio.DefaultNHttpClientConnection;
-import org.apache.http.nio.conn.ClientAsyncConnection;
+import org.apache.http.nio.NHttpMessageParserFactory;
+import org.apache.http.nio.NHttpMessageWriterFactory;
+import org.apache.http.nio.conn.ManagedNHttpClientConnection;
 import org.apache.http.nio.reactor.IOSession;
+import org.apache.http.nio.reactor.ssl.SSLIOSession;
 import org.apache.http.nio.util.ByteBufferAllocator;
-import org.apache.http.params.HttpParams;
+import org.apache.http.util.Args;
+import org.apache.http.util.Asserts;
 
-public class DefaultClientAsyncConnection
-                    extends DefaultNHttpClientConnection implements ClientAsyncConnection {
+class ManagedNHttpClientConnectionImpl
+                    extends DefaultNHttpClientConnection implements ManagedNHttpClientConnection {
 
-    private final Log headerlog = LogFactory.getLog("org.apache.http.headers");
-    private final Log wirelog   = LogFactory.getLog("org.apache.http.wire");
+    private final Log headerlog;
+    private final Log wirelog;
     private final Log log;
 
     private final String id;
     private IOSession original;
 
-    public DefaultClientAsyncConnection(
+    public ManagedNHttpClientConnectionImpl(
             final String id,
+            final Log log,
+            final Log headerlog,
+            final Log wirelog,
             final IOSession iosession,
-            final HttpResponseFactory responseFactory,
+            final int buffersize,
             final ByteBufferAllocator allocator,
-            final HttpParams params) {
-        super(iosession, responseFactory, allocator, params);
+            final CharsetDecoder chardecoder,
+            final CharsetEncoder charencoder,
+            final MessageConstraints constraints,
+            final ContentLengthStrategy incomingContentStrategy,
+            final ContentLengthStrategy outgoingContentStrategy,
+            final NHttpMessageWriterFactory<HttpRequest> requestWriterFactory,
+            final NHttpMessageParserFactory<HttpResponse> responseParserFactory) {
+        super(iosession, buffersize, allocator, chardecoder, charencoder, constraints,
+                incomingContentStrategy, outgoingContentStrategy,
+                requestWriterFactory, responseParserFactory);
         this.id = id;
+        this.log = log;
+        this.headerlog = headerlog;
+        this.wirelog = wirelog;
         this.original = iosession;
-        this.log = LogFactory.getLog(iosession.getClass());
         if (this.log.isDebugEnabled() || this.wirelog.isDebugEnabled()) {
-            bind(new LoggingIOSession(iosession, this.id, this.log, this.wirelog));
+            super.bind(new LoggingIOSession(iosession, this.id, this.log, this.wirelog));
         }
     }
 
-    public void upgrade(final IOSession iosession) {
+    @Override
+    public void bind(final IOSession iosession) {
+        Args.notNull(iosession, "I/O session");
+        Asserts.check(!iosession.isClosed(), "I/O session is closed");
+        this.status = ACTIVE;
         this.original = iosession;
         if (this.log.isDebugEnabled() || this.wirelog.isDebugEnabled()) {
             this.log.debug(this.id + " Upgrade session " + iosession);
-            bind(new LoggingIOSession(iosession, this.id, this.headerlog, this.wirelog));
+            super.bind(new LoggingIOSession(iosession, this.id, this.log, this.wirelog));
         } else {
-            bind(iosession);
+            super.bind(iosession);
         }
     }
 
@@ -77,6 +103,14 @@ public class DefaultClientAsyncConnectio
         return this.original;
     }
 
+    public SSLSession getSSLSession() {
+        if (this.original instanceof SSLIOSession) {
+            return ((SSLIOSession) this.original).getSSLSession();
+        } else {
+            return null;
+        }
+    }
+
     public String getId() {
         return this.id;
     }

Modified: httpcomponents/httpasyncclient/trunk/httpasyncclient/src/main/java/org/apache/http/impl/nio/conn/PoolingClientAsyncConnectionManager.java
URL: http://svn.apache.org/viewvc/httpcomponents/httpasyncclient/trunk/httpasyncclient/src/main/java/org/apache/http/impl/nio/conn/PoolingClientAsyncConnectionManager.java?rev=1463726&r1=1463725&r2=1463726&view=diff
==============================================================================
--- httpcomponents/httpasyncclient/trunk/httpasyncclient/src/main/java/org/apache/http/impl/nio/conn/PoolingClientAsyncConnectionManager.java (original)
+++ httpcomponents/httpasyncclient/trunk/httpasyncclient/src/main/java/org/apache/http/impl/nio/conn/PoolingClientAsyncConnectionManager.java Tue Apr  2 20:09:35 2013
@@ -46,6 +46,7 @@ import org.apache.http.nio.reactor.IORea
 import org.apache.http.pool.ConnPoolControl;
 import org.apache.http.pool.PoolStats;
 
+@Deprecated
 public class PoolingClientAsyncConnectionManager
                               implements ClientAsyncConnectionManager, ConnPoolControl<HttpRoute> {
 

Added: httpcomponents/httpasyncclient/trunk/httpasyncclient/src/main/java/org/apache/http/impl/nio/conn/PoolingNHttpClientConnectionManager.java
URL: http://svn.apache.org/viewvc/httpcomponents/httpasyncclient/trunk/httpasyncclient/src/main/java/org/apache/http/impl/nio/conn/PoolingNHttpClientConnectionManager.java?rev=1463726&view=auto
==============================================================================
--- httpcomponents/httpasyncclient/trunk/httpasyncclient/src/main/java/org/apache/http/impl/nio/conn/PoolingNHttpClientConnectionManager.java (added)
+++ httpcomponents/httpasyncclient/trunk/httpasyncclient/src/main/java/org/apache/http/impl/nio/conn/PoolingNHttpClientConnectionManager.java Tue Apr  2 20:09:35 2013
@@ -0,0 +1,591 @@
+/*
+ * ====================================================================
+ * 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.
+ * ====================================================================
+ *
+ * This software consists of voluntary contributions made by many
+ * individuals on behalf of the Apache Software Foundation.  For more
+ * information on the Apache Software Foundation, please see
+ * <http://www.apache.org/>.
+ *
+ */
+package org.apache.http.impl.nio.conn;
+
+import java.io.IOException;
+import java.net.InetAddress;
+import java.net.InetSocketAddress;
+import java.net.UnknownHostException;
+import java.util.Map;
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.Future;
+import java.util.concurrent.TimeUnit;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.apache.http.HttpHost;
+import org.apache.http.concurrent.BasicFuture;
+import org.apache.http.concurrent.FutureCallback;
+import org.apache.http.config.ConnectionConfig;
+import org.apache.http.config.Registry;
+import org.apache.http.config.RegistryBuilder;
+import org.apache.http.config.SocketConfig;
+import org.apache.http.conn.ConnectTimeoutException;
+import org.apache.http.conn.DnsResolver;
+import org.apache.http.conn.SchemePortResolver;
+import org.apache.http.conn.routing.HttpRoute;
+import org.apache.http.impl.conn.DefaultSchemePortResolver;
+import org.apache.http.impl.conn.SystemDefaultDnsResolver;
+import org.apache.http.nio.NHttpClientConnection;
+import org.apache.http.nio.conn.NHttpClientConnectionManager;
+import org.apache.http.nio.conn.ManagedNHttpClientConnection;
+import org.apache.http.nio.conn.NHttpConnectionFactory;
+import org.apache.http.nio.conn.scheme.LayeringStrategy;
+import org.apache.http.nio.conn.ssl.SSLLayeringStrategy;
+import org.apache.http.nio.pool.NIOConnFactory;
+import org.apache.http.nio.reactor.ConnectingIOReactor;
+import org.apache.http.nio.reactor.IOEventDispatch;
+import org.apache.http.nio.reactor.IOSession;
+import org.apache.http.nio.reactor.SessionRequest;
+import org.apache.http.nio.reactor.SessionRequestCallback;
+import org.apache.http.pool.ConnPoolControl;
+import org.apache.http.pool.PoolStats;
+import org.apache.http.protocol.HttpContext;
+import org.apache.http.util.Args;
+import org.apache.http.util.Asserts;
+
+public class PoolingNHttpClientConnectionManager
+       implements NHttpClientConnectionManager, ConnPoolControl<HttpRoute> {
+
+    private final Log log = LogFactory.getLog(getClass());
+
+    private final ConnectingIOReactor ioreactor;
+    private final ConfigData configData;
+    private final CPool pool;
+    private final Registry<LayeringStrategy> layeringStrategyRegistry;
+    private final SchemePortResolver schemePortResolver;
+    private final DnsResolver dnsResolver;
+
+    private static Registry<LayeringStrategy> getDefaultRegistry() {
+        return RegistryBuilder.<LayeringStrategy>create()
+                .register("https", SSLLayeringStrategy.getDefaultStrategy())
+                .build();
+    }
+
+    public PoolingNHttpClientConnectionManager(final ConnectingIOReactor ioreactor) {
+        this(ioreactor, getDefaultRegistry());
+    }
+
+    public PoolingNHttpClientConnectionManager(
+            final ConnectingIOReactor ioreactor,
+            final Registry<LayeringStrategy> layeringStrategyRegistry) {
+        this(ioreactor, null, layeringStrategyRegistry, null);
+    }
+
+    public PoolingNHttpClientConnectionManager(
+            final ConnectingIOReactor ioreactor,
+            final NHttpConnectionFactory<ManagedNHttpClientConnection> connFactory,
+            final DnsResolver dnsResolver) {
+        this(ioreactor, connFactory, getDefaultRegistry(), dnsResolver);
+    }
+
+    public PoolingNHttpClientConnectionManager(
+            final ConnectingIOReactor ioreactor,
+            final NHttpConnectionFactory<ManagedNHttpClientConnection> connFactory) {
+        this(ioreactor, connFactory, getDefaultRegistry(), null);
+    }
+
+    public PoolingNHttpClientConnectionManager(
+            final ConnectingIOReactor ioreactor,
+            final NHttpConnectionFactory<ManagedNHttpClientConnection> connFactory,
+            final Registry<LayeringStrategy> layeringStrategyRegistry) {
+        this(ioreactor, connFactory, layeringStrategyRegistry, null);
+    }
+
+    public PoolingNHttpClientConnectionManager(
+            final ConnectingIOReactor ioreactor,
+            final NHttpConnectionFactory<ManagedNHttpClientConnection> connFactory,
+            final Registry<LayeringStrategy> layeringStrategyRegistry,
+            final DnsResolver dnsResolver) {
+        this(ioreactor, connFactory, layeringStrategyRegistry, null, dnsResolver,
+            -1, TimeUnit.MILLISECONDS);
+    }
+
+    public PoolingNHttpClientConnectionManager(
+            final ConnectingIOReactor ioreactor,
+            final NHttpConnectionFactory<ManagedNHttpClientConnection> connFactory,
+            final Registry<LayeringStrategy> layeringStrategyRegistry,
+            final SchemePortResolver schemePortResolver,
+            final DnsResolver dnsResolver,
+            final long timeToLive, final TimeUnit tunit) {
+        super();
+        Args.notNull(ioreactor, "I/O reactor");
+        Args.notNull(layeringStrategyRegistry, "Layering strategy registry");
+        this.ioreactor = ioreactor;
+        this.configData = new ConfigData();
+        this.pool = new CPool(ioreactor,
+            new InternalConnectionFactory(this.configData, connFactory),
+            2, 20, timeToLive, tunit != null ? tunit : TimeUnit.MILLISECONDS);
+        this.layeringStrategyRegistry = layeringStrategyRegistry;
+        this.schemePortResolver = schemePortResolver != null ? schemePortResolver :
+            DefaultSchemePortResolver.INSTANCE;
+        this.dnsResolver = dnsResolver != null ? dnsResolver :
+            SystemDefaultDnsResolver.INSTANCE;
+    }
+
+    PoolingNHttpClientConnectionManager(
+            final ConnectingIOReactor ioreactor,
+            final CPool pool,
+            final Registry<LayeringStrategy> layeringStrategyRegistry,
+            final SchemePortResolver schemePortResolver,
+            final DnsResolver dnsResolver,
+            final long timeToLive, final TimeUnit tunit) {
+        super();
+        this.ioreactor = ioreactor;
+        this.configData = new ConfigData();
+        this.pool = pool;
+        this.layeringStrategyRegistry = layeringStrategyRegistry;
+        this.schemePortResolver = schemePortResolver != null ? schemePortResolver :
+            DefaultSchemePortResolver.INSTANCE;
+        this.dnsResolver = dnsResolver != null ? dnsResolver :
+            SystemDefaultDnsResolver.INSTANCE;
+    }
+
+    @Override
+    protected void finalize() throws Throwable {
+        try {
+            shutdown();
+        } finally {
+            super.finalize();
+        }
+    }
+
+    public void execute(final IOEventDispatch eventDispatch) throws IOException {
+        this.ioreactor.execute(eventDispatch);
+    }
+
+    public void shutdown(final long waitMs) throws IOException {
+        this.log.debug("Connection manager is shutting down");
+        this.pool.shutdown(waitMs);
+        this.log.debug("Connection manager shut down");
+    }
+
+    public void shutdown() throws IOException {
+        this.log.debug("Connection manager is shutting down");
+        this.pool.shutdown(2000);
+        this.log.debug("Connection manager shut down");
+    }
+
+    private String format(final HttpRoute route, final Object state) {
+        final StringBuilder buf = new StringBuilder();
+        buf.append("[route: ").append(route).append("]");
+        if (state != null) {
+            buf.append("[state: ").append(state).append("]");
+        }
+        return buf.toString();
+    }
+
+    private String formatStats(final HttpRoute route) {
+        final StringBuilder buf = new StringBuilder();
+        final PoolStats totals = this.pool.getTotalStats();
+        final PoolStats stats = this.pool.getStats(route);
+        buf.append("[total kept alive: ").append(totals.getAvailable()).append("; ");
+        buf.append("route allocated: ").append(stats.getLeased() + stats.getAvailable());
+        buf.append(" of ").append(stats.getMax()).append("; ");
+        buf.append("total allocated: ").append(totals.getLeased() + totals.getAvailable());
+        buf.append(" of ").append(totals.getMax()).append("]");
+        return buf.toString();
+    }
+
+    private String format(final CPoolEntry entry) {
+        final StringBuilder buf = new StringBuilder();
+        buf.append("[id: ").append(entry.getId()).append("]");
+        buf.append("[route: ").append(entry.getRoute()).append("]");
+        final Object state = entry.getState();
+        if (state != null) {
+            buf.append("[state: ").append(state).append("]");
+        }
+        return buf.toString();
+    }
+
+    public Future<NHttpClientConnection> requestConnection(
+            final HttpRoute route,
+            final Object state,
+            final long connectTimeout,
+            final TimeUnit tunit,
+            final FutureCallback<NHttpClientConnection> callback) {
+        Args.notNull(route, "HTTP route");
+        if (this.log.isDebugEnabled()) {
+            this.log.debug("Connection request: " + format(route, state) + formatStats(route));
+        }
+        final BasicFuture<NHttpClientConnection> future = new BasicFuture<NHttpClientConnection>(callback);
+        this.pool.lease(route, state, connectTimeout,
+                tunit != null ? tunit : TimeUnit.MILLISECONDS,
+                new InternalPoolEntryCallback(future));
+        return future;
+    }
+
+    public void releaseConnection(
+            final NHttpClientConnection managedConn,
+            final Object state,
+            final long keepalive,
+            final TimeUnit tunit) {
+        Args.notNull(managedConn, "Managed connection");
+        synchronized (managedConn) {
+            final CPoolEntry entry = CPoolProxy.detach(managedConn);
+            if (entry == null) {
+                return;
+            }
+            final NHttpClientConnection conn = entry.getConnection();
+            try {
+                if (conn.isOpen()) {
+                    entry.setState(state);
+                    entry.updateExpiry(keepalive, tunit != null ? tunit : TimeUnit.MILLISECONDS);
+                    if (this.log.isDebugEnabled()) {
+                        String s;
+                        if (keepalive > 0) {
+                            s = "for " + (double) keepalive / 1000 + " seconds";
+                        } else {
+                            s = "indefinitely";
+                        }
+                        this.log.debug("Connection " + format(entry) + " can be kept alive " + s);
+                    }
+                }
+            } finally {
+                this.pool.release(entry, conn.isOpen() && entry.isRouteComplete());
+                if (this.log.isDebugEnabled()) {
+                    this.log.debug("Connection released: " + format(entry) + formatStats(entry.getRoute()));
+                }
+            }
+        }
+    }
+
+    public Future<NHttpClientConnection> connect(
+            final NHttpClientConnection managedConn,
+            final HttpRoute route,
+            final int connectTimeout,
+            final FutureCallback<NHttpClientConnection> callback) {
+        Args.notNull(managedConn, "Managed connection");
+        final BasicFuture<NHttpClientConnection> future = new BasicFuture<NHttpClientConnection>(callback);
+        if (managedConn.isOpen()) {
+            future.completed(managedConn);
+            return future;
+        }
+        final HttpHost host;
+        if (route.getProxyHost() != null) {
+            host = route.getProxyHost();
+        } else {
+            host = route.getTargetHost();
+        }
+        final InetSocketAddress localAddress = route.getLocalAddress() != null ?
+            new InetSocketAddress(route.getLocalAddress(), 0) : null;
+        final InetAddress[] addresses;
+        try {
+            addresses = this.dnsResolver.resolve(host.getHostName());
+        } catch (final UnknownHostException ex) {
+            future.failed(ex);
+            return future;
+        }
+        final int port = this.schemePortResolver.resolve(host);
+        final InetSocketAddress remoteAddress = new InetSocketAddress(addresses[0], port);
+        this.ioreactor.connect(remoteAddress, localAddress, null, new SessionRequestCallback() {
+
+            public void completed(final SessionRequest request) {
+                synchronized (managedConn) {
+                    final CPoolEntry entry = CPoolProxy.getPoolEntry(managedConn);
+                    final ManagedNHttpClientConnection conn = entry.getConnection();
+                    final IOSession iosession = request.getSession();
+                    iosession.setAttribute(IOEventDispatch.CONNECTION_KEY, conn);
+                    conn.bind(iosession);
+                }
+                future.completed(managedConn);
+            }
+
+            public void timeout(final SessionRequest request) {
+                future.failed(new ConnectTimeoutException(host, remoteAddress));
+            }
+
+            public void failed(final SessionRequest request) {
+                future.failed(request.getException());
+            }
+
+            public void cancelled(final SessionRequest request) {
+                future.cancel();
+            }
+
+        });
+        return future;
+    }
+
+    public void initialize(
+            final NHttpClientConnection managedConn,
+            final HttpRoute route,
+            final HttpContext context) throws IOException {
+        Args.notNull(managedConn, "Managed connection");
+        Args.notNull(route, "HTTP route");
+        final HttpHost host;
+        if (route.getProxyHost() != null) {
+            host = route.getProxyHost();
+        } else {
+            host = route.getTargetHost();
+        }
+        final LayeringStrategy layeringStrategy = layeringStrategyRegistry.lookup(
+                host.getSchemeName());
+        if (layeringStrategy != null) {
+            synchronized (managedConn) {
+                final CPoolEntry entry = CPoolProxy.getPoolEntry(managedConn);
+                final ManagedNHttpClientConnection conn = entry.getConnection();
+                final IOSession currentSession = layeringStrategy.layer(conn.getIOSession());
+                conn.bind(currentSession);
+            }
+        }
+    }
+
+    public void upgrade(
+            final NHttpClientConnection managedConn,
+            final HttpRoute route,
+            final HttpContext context) throws IOException {
+        Args.notNull(managedConn, "Managed connection");
+        Args.notNull(route, "HTTP route");
+        final HttpHost host  = route.getTargetHost();
+        final LayeringStrategy layeringStrategy = layeringStrategyRegistry.lookup(
+            host.getSchemeName());
+        synchronized (managedConn) {
+            final CPoolEntry entry = CPoolProxy.getPoolEntry(managedConn);
+            final ManagedNHttpClientConnection conn = entry.getConnection();
+            Asserts.check(layeringStrategy != null, "Layering is not supported for this scheme");
+            final IOSession currentSession = layeringStrategy.layer(conn.getIOSession());
+            conn.bind(currentSession);
+        }
+    }
+
+    public void routeComplete(
+            final NHttpClientConnection managedConn,
+            final HttpRoute route,
+            final HttpContext context) throws IOException {
+        Args.notNull(managedConn, "Managed connection");
+        Args.notNull(route, "HTTP route");
+        synchronized (managedConn) {
+            final CPoolEntry entry = CPoolProxy.getPoolEntry(managedConn);
+            entry.markRouteComplete();
+        }
+    }
+
+    public boolean isRouteComplete(
+            final NHttpClientConnection managedConn) {
+        Args.notNull(managedConn, "Managed connection");
+        synchronized (managedConn) {
+            final CPoolEntry entry = CPoolProxy.getPoolEntry(managedConn);
+            return entry.isRouteComplete();
+        }
+    }
+
+    public void closeIdleConnections(final long idleTimeout, final TimeUnit tunit) {
+        if (log.isDebugEnabled()) {
+            log.debug("Closing connections idle longer than " + idleTimeout + " " + tunit);
+        }
+        this.pool.closeIdle(idleTimeout, tunit);
+    }
+
+    public void closeExpiredConnections() {
+        log.debug("Closing expired connections");
+        this.pool.closeExpired();
+    }
+
+    public int getMaxTotal() {
+        return this.pool.getMaxTotal();
+    }
+
+    public void setMaxTotal(final int max) {
+        this.pool.setMaxTotal(max);
+    }
+
+    public int getDefaultMaxPerRoute() {
+        return this.pool.getDefaultMaxPerRoute();
+    }
+
+    public void setDefaultMaxPerRoute(final int max) {
+        this.pool.setDefaultMaxPerRoute(max);
+    }
+
+    public int getMaxPerRoute(final HttpRoute route) {
+        return this.pool.getMaxPerRoute(route);
+    }
+
+    public void setMaxPerRoute(final HttpRoute route, final int max) {
+        this.pool.setMaxPerRoute(route, max);
+    }
+
+    public PoolStats getTotalStats() {
+        return this.pool.getTotalStats();
+    }
+
+    public PoolStats getStats(final HttpRoute route) {
+        return this.pool.getStats(route);
+    }
+
+    public SocketConfig getDefaultSocketConfig() {
+        return this.configData.getDefaultSocketConfig();
+    }
+
+    public void setDefaultSocketConfig(final SocketConfig defaultSocketConfig) {
+        this.configData.setDefaultSocketConfig(defaultSocketConfig);
+    }
+
+    public ConnectionConfig getDefaultConnectionConfig() {
+        return this.configData.getDefaultConnectionConfig();
+    }
+
+    public void setDefaultConnectionConfig(final ConnectionConfig defaultConnectionConfig) {
+        this.configData.setDefaultConnectionConfig(defaultConnectionConfig);
+    }
+
+    public SocketConfig getSocketConfig(final HttpHost host) {
+        return this.configData.getSocketConfig(host);
+    }
+
+    public void setSocketConfig(final HttpHost host, final SocketConfig socketConfig) {
+        this.configData.setSocketConfig(host, socketConfig);
+    }
+
+    public ConnectionConfig getConnectionConfig(final HttpHost host) {
+        return this.configData.getConnectionConfig(host);
+    }
+
+    public void setConnectionConfig(final HttpHost host, final ConnectionConfig connectionConfig) {
+        this.configData.setConnectionConfig(host, connectionConfig);
+    }
+
+    class InternalPoolEntryCallback implements FutureCallback<CPoolEntry> {
+
+        private final BasicFuture<NHttpClientConnection> future;
+
+        public InternalPoolEntryCallback(
+                final BasicFuture<NHttpClientConnection> future) {
+            super();
+            this.future = future;
+        }
+
+        public void completed(final CPoolEntry entry) {
+            Asserts.check(entry.getConnection() != null, "Pool entry with no connection");
+            if (log.isDebugEnabled()) {
+                log.debug("Connection leased: " + format(entry) + formatStats(entry.getRoute()));
+            }
+            final NHttpClientConnection managedConn = CPoolProxy.newProxy(entry);
+            if (!this.future.completed(managedConn)) {
+                pool.release(entry, true);
+            }
+        }
+
+        public void failed(final Exception ex) {
+            if (log.isDebugEnabled()) {
+                log.debug("Connection request failed", ex);
+            }
+            this.future.failed(ex);
+        }
+
+        public void cancelled() {
+            log.debug("Connection request cancelled");
+            this.future.cancel(true);
+        }
+
+    }
+
+    static class ConfigData {
+
+        private final Map<HttpHost, SocketConfig> socketConfigMap;
+        private final Map<HttpHost, ConnectionConfig> connectionConfigMap;
+        private volatile SocketConfig defaultSocketConfig;
+        private volatile ConnectionConfig defaultConnectionConfig;
+
+        ConfigData() {
+            super();
+            this.socketConfigMap = new ConcurrentHashMap<HttpHost, SocketConfig>();
+            this.connectionConfigMap = new ConcurrentHashMap<HttpHost, ConnectionConfig>();
+        }
+
+        public SocketConfig getDefaultSocketConfig() {
+            return this.defaultSocketConfig;
+        }
+
+        public void setDefaultSocketConfig(final SocketConfig defaultSocketConfig) {
+            this.defaultSocketConfig = defaultSocketConfig;
+        }
+
+        public ConnectionConfig getDefaultConnectionConfig() {
+            return this.defaultConnectionConfig;
+        }
+
+        public void setDefaultConnectionConfig(final ConnectionConfig defaultConnectionConfig) {
+            this.defaultConnectionConfig = defaultConnectionConfig;
+        }
+
+        public SocketConfig getSocketConfig(final HttpHost host) {
+            return this.socketConfigMap.get(host);
+        }
+
+        public void setSocketConfig(final HttpHost host, final SocketConfig socketConfig) {
+            this.socketConfigMap.put(host, socketConfig);
+        }
+
+        public ConnectionConfig getConnectionConfig(final HttpHost host) {
+            return this.connectionConfigMap.get(host);
+        }
+
+        public void setConnectionConfig(final HttpHost host, final ConnectionConfig connectionConfig) {
+            this.connectionConfigMap.put(host, connectionConfig);
+        }
+
+    }
+
+    static class InternalConnectionFactory implements NIOConnFactory<HttpRoute, ManagedNHttpClientConnection> {
+
+        private final ConfigData configData;
+        private final NHttpConnectionFactory<ManagedNHttpClientConnection> connFactory;
+
+        InternalConnectionFactory(
+                final ConfigData configData,
+                final NHttpConnectionFactory<ManagedNHttpClientConnection> connFactory) {
+            super();
+            this.configData = configData != null ? configData : new ConfigData();
+            this.connFactory = connFactory != null ? connFactory :
+                ManagedNHttpClientConnectionFactory.INSTANCE;
+        }
+
+        public ManagedNHttpClientConnection create(
+                final HttpRoute route, final IOSession iosession) throws IOException {
+            ConnectionConfig config = null;
+            if (route.getProxyHost() != null) {
+                config = this.configData.getConnectionConfig(route.getProxyHost());
+            }
+            if (config == null) {
+                config = this.configData.getConnectionConfig(route.getTargetHost());
+            }
+            if (config == null) {
+                config = this.configData.getDefaultConnectionConfig();
+            }
+            if (config == null) {
+                config = ConnectionConfig.DEFAULT;
+            }
+            final ManagedNHttpClientConnection conn = this.connFactory.create(iosession, config);
+            iosession.setAttribute(IOEventDispatch.CONNECTION_KEY, conn);
+            return conn;
+        }
+
+    }
+
+}

Propchange: httpcomponents/httpasyncclient/trunk/httpasyncclient/src/main/java/org/apache/http/impl/nio/conn/PoolingNHttpClientConnectionManager.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: httpcomponents/httpasyncclient/trunk/httpasyncclient/src/main/java/org/apache/http/impl/nio/conn/PoolingNHttpClientConnectionManager.java
------------------------------------------------------------------------------
    svn:keywords = Date Revision

Propchange: httpcomponents/httpasyncclient/trunk/httpasyncclient/src/main/java/org/apache/http/impl/nio/conn/PoolingNHttpClientConnectionManager.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Modified: httpcomponents/httpasyncclient/trunk/httpasyncclient/src/main/java/org/apache/http/nio/conn/ClientAsyncConnection.java
URL: http://svn.apache.org/viewvc/httpcomponents/httpasyncclient/trunk/httpasyncclient/src/main/java/org/apache/http/nio/conn/ClientAsyncConnection.java?rev=1463726&r1=1463725&r2=1463726&view=diff
==============================================================================
--- httpcomponents/httpasyncclient/trunk/httpasyncclient/src/main/java/org/apache/http/nio/conn/ClientAsyncConnection.java (original)
+++ httpcomponents/httpasyncclient/trunk/httpasyncclient/src/main/java/org/apache/http/nio/conn/ClientAsyncConnection.java Tue Apr  2 20:09:35 2013
@@ -30,6 +30,7 @@ import org.apache.http.HttpInetConnectio
 import org.apache.http.nio.NHttpClientConnection;
 import org.apache.http.nio.reactor.IOSession;
 
+@Deprecated
 public interface ClientAsyncConnection extends NHttpClientConnection, HttpInetConnection {
 
     void upgrade(IOSession iosession);

Modified: httpcomponents/httpasyncclient/trunk/httpasyncclient/src/main/java/org/apache/http/nio/conn/ClientAsyncConnectionFactory.java
URL: http://svn.apache.org/viewvc/httpcomponents/httpasyncclient/trunk/httpasyncclient/src/main/java/org/apache/http/nio/conn/ClientAsyncConnectionFactory.java?rev=1463726&r1=1463725&r2=1463726&view=diff
==============================================================================
--- httpcomponents/httpasyncclient/trunk/httpasyncclient/src/main/java/org/apache/http/nio/conn/ClientAsyncConnectionFactory.java (original)
+++ httpcomponents/httpasyncclient/trunk/httpasyncclient/src/main/java/org/apache/http/nio/conn/ClientAsyncConnectionFactory.java Tue Apr  2 20:09:35 2013
@@ -29,6 +29,7 @@ package org.apache.http.nio.conn;
 import org.apache.http.nio.reactor.IOSession;
 import org.apache.http.params.HttpParams;
 
+@Deprecated
 public interface ClientAsyncConnectionFactory {
 
     ClientAsyncConnection create(String id, IOSession iosession, HttpParams params);

Modified: httpcomponents/httpasyncclient/trunk/httpasyncclient/src/main/java/org/apache/http/nio/conn/ClientAsyncConnectionManager.java
URL: http://svn.apache.org/viewvc/httpcomponents/httpasyncclient/trunk/httpasyncclient/src/main/java/org/apache/http/nio/conn/ClientAsyncConnectionManager.java?rev=1463726&r1=1463725&r2=1463726&view=diff
==============================================================================
--- httpcomponents/httpasyncclient/trunk/httpasyncclient/src/main/java/org/apache/http/nio/conn/ClientAsyncConnectionManager.java (original)
+++ httpcomponents/httpasyncclient/trunk/httpasyncclient/src/main/java/org/apache/http/nio/conn/ClientAsyncConnectionManager.java Tue Apr  2 20:09:35 2013
@@ -34,6 +34,7 @@ import org.apache.http.conn.routing.Http
 import org.apache.http.nio.conn.scheme.AsyncSchemeRegistry;
 import org.apache.http.nio.reactor.IOReactor;
 
+@Deprecated
 public interface ClientAsyncConnectionManager extends IOReactor {
 
     AsyncSchemeRegistry getSchemeRegistry();

Modified: httpcomponents/httpasyncclient/trunk/httpasyncclient/src/main/java/org/apache/http/nio/conn/ManagedClientAsyncConnection.java
URL: http://svn.apache.org/viewvc/httpcomponents/httpasyncclient/trunk/httpasyncclient/src/main/java/org/apache/http/nio/conn/ManagedClientAsyncConnection.java?rev=1463726&r1=1463725&r2=1463726&view=diff
==============================================================================
--- httpcomponents/httpasyncclient/trunk/httpasyncclient/src/main/java/org/apache/http/nio/conn/ManagedClientAsyncConnection.java (original)
+++ httpcomponents/httpasyncclient/trunk/httpasyncclient/src/main/java/org/apache/http/nio/conn/ManagedClientAsyncConnection.java Tue Apr  2 20:09:35 2013
@@ -37,6 +37,7 @@ import org.apache.http.nio.NHttpClientCo
 import org.apache.http.params.HttpParams;
 import org.apache.http.protocol.HttpContext;
 
+@Deprecated
 public interface ManagedClientAsyncConnection
     extends HttpRoutedConnection, NHttpClientConnection, ConnectionReleaseTrigger {
 

Copied: httpcomponents/httpasyncclient/trunk/httpasyncclient/src/main/java/org/apache/http/nio/conn/ManagedNHttpClientConnection.java (from r1463725, httpcomponents/httpasyncclient/trunk/httpasyncclient/src/main/java/org/apache/http/nio/conn/ClientAsyncConnection.java)
URL: http://svn.apache.org/viewvc/httpcomponents/httpasyncclient/trunk/httpasyncclient/src/main/java/org/apache/http/nio/conn/ManagedNHttpClientConnection.java?p2=httpcomponents/httpasyncclient/trunk/httpasyncclient/src/main/java/org/apache/http/nio/conn/ManagedNHttpClientConnection.java&p1=httpcomponents/httpasyncclient/trunk/httpasyncclient/src/main/java/org/apache/http/nio/conn/ClientAsyncConnection.java&r1=1463725&r2=1463726&rev=1463726&view=diff
==============================================================================
--- httpcomponents/httpasyncclient/trunk/httpasyncclient/src/main/java/org/apache/http/nio/conn/ClientAsyncConnection.java (original)
+++ httpcomponents/httpasyncclient/trunk/httpasyncclient/src/main/java/org/apache/http/nio/conn/ManagedNHttpClientConnection.java Tue Apr  2 20:09:35 2013
@@ -26,14 +26,20 @@
  */
 package org.apache.http.nio.conn;
 
+import javax.net.ssl.SSLSession;
+
 import org.apache.http.HttpInetConnection;
 import org.apache.http.nio.NHttpClientConnection;
 import org.apache.http.nio.reactor.IOSession;
 
-public interface ClientAsyncConnection extends NHttpClientConnection, HttpInetConnection {
+public interface ManagedNHttpClientConnection extends NHttpClientConnection, HttpInetConnection {
+
+    String getId();
 
-    void upgrade(IOSession iosession);
+    void bind(IOSession iosession);
 
     IOSession getIOSession();
 
+    SSLSession getSSLSession();
+
 }

Added: httpcomponents/httpasyncclient/trunk/httpasyncclient/src/main/java/org/apache/http/nio/conn/NHttpClientConnectionManager.java
URL: http://svn.apache.org/viewvc/httpcomponents/httpasyncclient/trunk/httpasyncclient/src/main/java/org/apache/http/nio/conn/NHttpClientConnectionManager.java?rev=1463726&view=auto
==============================================================================
--- httpcomponents/httpasyncclient/trunk/httpasyncclient/src/main/java/org/apache/http/nio/conn/NHttpClientConnectionManager.java (added)
+++ httpcomponents/httpasyncclient/trunk/httpasyncclient/src/main/java/org/apache/http/nio/conn/NHttpClientConnectionManager.java Tue Apr  2 20:09:35 2013
@@ -0,0 +1,137 @@
+/*
+ * ====================================================================
+ * 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.
+ * ====================================================================
+ *
+ * This software consists of voluntary contributions made by many
+ * individuals on behalf of the Apache Software Foundation.  For more
+ * information on the Apache Software Foundation, please see
+ * <http://www.apache.org/>.
+ *
+ */
+package org.apache.http.nio.conn;
+
+import java.io.IOException;
+import java.util.concurrent.Future;
+import java.util.concurrent.TimeUnit;
+
+import org.apache.http.concurrent.FutureCallback;
+import org.apache.http.conn.routing.HttpRoute;
+import org.apache.http.nio.NHttpClientConnection;
+import org.apache.http.nio.reactor.IOEventDispatch;
+import org.apache.http.protocol.HttpContext;
+
+/**
+ * Represents a manager of persistent client connections.
+ * <p/>
+ * The purpose of an HTTP connection manager is to serve as a factory for new
+ * HTTP connections, manage persistent connections and synchronize access to
+ * persistent connections making sure that only one thread of execution can
+ * have access to a connection at a time.
+ * <p/>
+ * Implementations of this interface must be thread-safe. Access to shared
+ * data must be synchronized as methods of this interface may be executed
+ * from multiple threads.
+ */
+public interface NHttpClientConnectionManager {
+
+    /**
+     * Returns a {@link Future} for a {@link NHttpClientConnection}.
+     */
+    Future<NHttpClientConnection> requestConnection(
+            HttpRoute route, Object state,
+            long connectTimeout, TimeUnit timeUnit,
+            FutureCallback<NHttpClientConnection> callback);
+
+    /**
+     * Releases a connection for use by others.
+     * You may optionally specify how long the connection is valid
+     * to be reused.  Values <= 0 are considered to be valid forever.
+     * If the connection is not marked as reusable, the connection will
+     * not be reused regardless of the valid duration.
+     *
+     * If the connection has been released before,
+     * the call will be ignored.
+     *
+     * @param conn      the connection to release
+     * @param validDuration the duration of time this connection is valid for reuse
+     * @param timeUnit the unit of time validDuration is measured in
+     *
+     * @see #closeExpiredConnections()
+     */
+    void releaseConnection(
+            NHttpClientConnection conn, Object newState, long validDuration, TimeUnit timeUnit);
+
+    Future<NHttpClientConnection> connect(
+            NHttpClientConnection conn,
+            HttpRoute route,
+            int connectTimeout,
+            FutureCallback<NHttpClientConnection> callback);
+
+    void initialize(
+            NHttpClientConnection conn,
+            HttpRoute route,
+            HttpContext context) throws IOException;
+
+    void upgrade(
+            NHttpClientConnection conn,
+            HttpRoute route,
+            HttpContext context) throws IOException;
+
+    void routeComplete(
+            NHttpClientConnection conn,
+            HttpRoute route,
+            HttpContext context) throws IOException;
+
+    boolean isRouteComplete(NHttpClientConnection conn);
+
+    /**
+     * Closes idle connections in the pool.
+     * Open connections in the pool that have not been used for the
+     * timespan given by the argument will be closed.
+     * Currently allocated connections are not subject to this method.
+     * Times will be checked with milliseconds precision
+     *
+     * All expired connections will also be closed.
+     *
+     * @param idletime  the idle time of connections to be closed
+     * @param tunit     the unit for the <code>idletime</code>
+     *
+     * @see #closeExpiredConnections()
+     */
+    void closeIdleConnections(long idletime, TimeUnit tunit);
+
+    /**
+     * Closes all expired connections in the pool.
+     * Open connections in the pool that have not been used for
+     * the timespan defined when the connection was released will be closed.
+     * Currently allocated connections are not subject to this method.
+     * Times will be checked with milliseconds precision.
+     */
+    void closeExpiredConnections();
+
+    void execute(IOEventDispatch eventDispatch) throws IOException;
+
+    /**
+     * Shuts down this connection manager and releases allocated resources.
+     * This includes closing all connections, whether they are currently
+     * used or not.
+     */
+    void shutdown() throws IOException;
+
+}

Propchange: httpcomponents/httpasyncclient/trunk/httpasyncclient/src/main/java/org/apache/http/nio/conn/NHttpClientConnectionManager.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: httpcomponents/httpasyncclient/trunk/httpasyncclient/src/main/java/org/apache/http/nio/conn/NHttpClientConnectionManager.java
------------------------------------------------------------------------------
    svn:keywords = Date Revision

Propchange: httpcomponents/httpasyncclient/trunk/httpasyncclient/src/main/java/org/apache/http/nio/conn/NHttpClientConnectionManager.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Copied: httpcomponents/httpasyncclient/trunk/httpasyncclient/src/main/java/org/apache/http/nio/conn/NHttpConnectionFactory.java (from r1463725, httpcomponents/httpasyncclient/trunk/httpasyncclient/src/main/java/org/apache/http/nio/conn/ClientAsyncConnectionFactory.java)
URL: http://svn.apache.org/viewvc/httpcomponents/httpasyncclient/trunk/httpasyncclient/src/main/java/org/apache/http/nio/conn/NHttpConnectionFactory.java?p2=httpcomponents/httpasyncclient/trunk/httpasyncclient/src/main/java/org/apache/http/nio/conn/NHttpConnectionFactory.java&p1=httpcomponents/httpasyncclient/trunk/httpasyncclient/src/main/java/org/apache/http/nio/conn/ClientAsyncConnectionFactory.java&r1=1463725&r2=1463726&rev=1463726&view=diff
==============================================================================
--- httpcomponents/httpasyncclient/trunk/httpasyncclient/src/main/java/org/apache/http/nio/conn/ClientAsyncConnectionFactory.java (original)
+++ httpcomponents/httpasyncclient/trunk/httpasyncclient/src/main/java/org/apache/http/nio/conn/NHttpConnectionFactory.java Tue Apr  2 20:09:35 2013
@@ -26,11 +26,12 @@
  */
 package org.apache.http.nio.conn;
 
+import org.apache.http.config.ConnectionConfig;
+import org.apache.http.nio.NHttpConnection;
 import org.apache.http.nio.reactor.IOSession;
-import org.apache.http.params.HttpParams;
 
-public interface ClientAsyncConnectionFactory {
+public interface NHttpConnectionFactory<T extends NHttpConnection> {
 
-    ClientAsyncConnection create(String id, IOSession iosession, HttpParams params);
+    T create(IOSession iosession, ConnectionConfig config);
 
 }

Modified: httpcomponents/httpasyncclient/trunk/httpasyncclient/src/main/java/org/apache/http/nio/conn/scheme/AsyncScheme.java
URL: http://svn.apache.org/viewvc/httpcomponents/httpasyncclient/trunk/httpasyncclient/src/main/java/org/apache/http/nio/conn/scheme/AsyncScheme.java?rev=1463726&r1=1463725&r2=1463726&view=diff
==============================================================================
--- httpcomponents/httpasyncclient/trunk/httpasyncclient/src/main/java/org/apache/http/nio/conn/scheme/AsyncScheme.java (original)
+++ httpcomponents/httpasyncclient/trunk/httpasyncclient/src/main/java/org/apache/http/nio/conn/scheme/AsyncScheme.java Tue Apr  2 20:09:35 2013
@@ -30,6 +30,7 @@ import java.util.Locale;
 
 import org.apache.http.util.LangUtils;
 
+@Deprecated
 public final class AsyncScheme {
 
     /** The name of this scheme, in lowercase. (e.g. http, https) */

Modified: httpcomponents/httpasyncclient/trunk/httpasyncclient/src/main/java/org/apache/http/nio/conn/scheme/AsyncSchemeRegistry.java
URL: http://svn.apache.org/viewvc/httpcomponents/httpasyncclient/trunk/httpasyncclient/src/main/java/org/apache/http/nio/conn/scheme/AsyncSchemeRegistry.java?rev=1463726&r1=1463725&r2=1463726&view=diff
==============================================================================
--- httpcomponents/httpasyncclient/trunk/httpasyncclient/src/main/java/org/apache/http/nio/conn/scheme/AsyncSchemeRegistry.java (original)
+++ httpcomponents/httpasyncclient/trunk/httpasyncclient/src/main/java/org/apache/http/nio/conn/scheme/AsyncSchemeRegistry.java Tue Apr  2 20:09:35 2013
@@ -38,6 +38,7 @@ import org.apache.http.HttpHost;
  * Schemes are identified by lowercase names.
  *
  */
+@Deprecated
 public final class AsyncSchemeRegistry {
 
     /** The available schemes in this registry. */