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 2009/09/12 22:30:21 UTC

svn commit: r814229 [1/2] - in /httpcomponents/asynchttpclient/trunk: ./ src/ src/examples/ src/examples/org/ src/examples/org/apache/ src/examples/org/apache/http/ src/examples/org/apache/http/examples/ src/examples/org/apache/http/examples/nio/ src/e...

Author: olegk
Date: Sat Sep 12 20:30:20 2009
New Revision: 814229

URL: http://svn.apache.org/viewvc?rev=814229&view=rev
Log:
Initial drop of AsyncHttpClient

Added:
    httpcomponents/asynchttpclient/trunk/pom.xml   (with props)
    httpcomponents/asynchttpclient/trunk/src/
    httpcomponents/asynchttpclient/trunk/src/examples/
    httpcomponents/asynchttpclient/trunk/src/examples/org/
    httpcomponents/asynchttpclient/trunk/src/examples/org/apache/
    httpcomponents/asynchttpclient/trunk/src/examples/org/apache/http/
    httpcomponents/asynchttpclient/trunk/src/examples/org/apache/http/examples/
    httpcomponents/asynchttpclient/trunk/src/examples/org/apache/http/examples/nio/
    httpcomponents/asynchttpclient/trunk/src/examples/org/apache/http/examples/nio/client/
    httpcomponents/asynchttpclient/trunk/src/examples/org/apache/http/examples/nio/client/AsyncClientRequest.java   (with props)
    httpcomponents/asynchttpclient/trunk/src/main/
    httpcomponents/asynchttpclient/trunk/src/main/java/
    httpcomponents/asynchttpclient/trunk/src/main/java/org/
    httpcomponents/asynchttpclient/trunk/src/main/java/org/apache/
    httpcomponents/asynchttpclient/trunk/src/main/java/org/apache/http/
    httpcomponents/asynchttpclient/trunk/src/main/java/org/apache/http/impl/
    httpcomponents/asynchttpclient/trunk/src/main/java/org/apache/http/impl/nio/
    httpcomponents/asynchttpclient/trunk/src/main/java/org/apache/http/impl/nio/client/
    httpcomponents/asynchttpclient/trunk/src/main/java/org/apache/http/impl/nio/client/BasicAsyncHttpClient.java   (with props)
    httpcomponents/asynchttpclient/trunk/src/main/java/org/apache/http/impl/nio/client/HttpExchangeImpl.java   (with props)
    httpcomponents/asynchttpclient/trunk/src/main/java/org/apache/http/impl/nio/client/InternalClientEventDispatch.java   (with props)
    httpcomponents/asynchttpclient/trunk/src/main/java/org/apache/http/impl/nio/client/InternalEventLogger.java   (with props)
    httpcomponents/asynchttpclient/trunk/src/main/java/org/apache/http/impl/nio/client/InternalRequestExecutionHandler.java   (with props)
    httpcomponents/asynchttpclient/trunk/src/main/java/org/apache/http/impl/nio/conn/
    httpcomponents/asynchttpclient/trunk/src/main/java/org/apache/http/impl/nio/conn/BasicIOSessionManager.java   (with props)
    httpcomponents/asynchttpclient/trunk/src/main/java/org/apache/http/impl/nio/conn/BasicManagedIOSession.java   (with props)
    httpcomponents/asynchttpclient/trunk/src/main/java/org/apache/http/impl/nio/conn/HttpSessionPool.java   (with props)
    httpcomponents/asynchttpclient/trunk/src/main/java/org/apache/http/impl/nio/conn/LoggingIOSession.java   (with props)
    httpcomponents/asynchttpclient/trunk/src/main/java/org/apache/http/impl/nio/conn/LoggingNHttpClientConnection.java   (with props)
    httpcomponents/asynchttpclient/trunk/src/main/java/org/apache/http/impl/nio/conn/Wire.java   (with props)
    httpcomponents/asynchttpclient/trunk/src/main/java/org/apache/http/impl/nio/pool/
    httpcomponents/asynchttpclient/trunk/src/main/java/org/apache/http/impl/nio/pool/LeaseRequest.java   (with props)
    httpcomponents/asynchttpclient/trunk/src/main/java/org/apache/http/impl/nio/pool/PoolEntry.java   (with props)
    httpcomponents/asynchttpclient/trunk/src/main/java/org/apache/http/impl/nio/pool/PoolEntryCallback.java   (with props)
    httpcomponents/asynchttpclient/trunk/src/main/java/org/apache/http/impl/nio/pool/RouteResolver.java   (with props)
    httpcomponents/asynchttpclient/trunk/src/main/java/org/apache/http/impl/nio/pool/SessionPool.java   (with props)
    httpcomponents/asynchttpclient/trunk/src/main/java/org/apache/http/impl/nio/pool/SessionPoolForRoute.java   (with props)
    httpcomponents/asynchttpclient/trunk/src/main/java/org/apache/http/nio/
    httpcomponents/asynchttpclient/trunk/src/main/java/org/apache/http/nio/client/
    httpcomponents/asynchttpclient/trunk/src/main/java/org/apache/http/nio/client/AsyncHttpClient.java   (with props)
    httpcomponents/asynchttpclient/trunk/src/main/java/org/apache/http/nio/client/HttpExchange.java   (with props)
    httpcomponents/asynchttpclient/trunk/src/main/java/org/apache/http/nio/concurrent/
    httpcomponents/asynchttpclient/trunk/src/main/java/org/apache/http/nio/concurrent/BasicFuture.java   (with props)
    httpcomponents/asynchttpclient/trunk/src/main/java/org/apache/http/nio/concurrent/FutureCallback.java   (with props)
    httpcomponents/asynchttpclient/trunk/src/main/java/org/apache/http/nio/conn/
    httpcomponents/asynchttpclient/trunk/src/main/java/org/apache/http/nio/conn/IOSessionManager.java   (with props)
    httpcomponents/asynchttpclient/trunk/src/main/java/org/apache/http/nio/conn/ManagedIOSession.java   (with props)
    httpcomponents/asynchttpclient/trunk/src/main/java/org/apache/http/nio/conn/PoolStats.java   (with props)
    httpcomponents/asynchttpclient/trunk/src/test/
    httpcomponents/asynchttpclient/trunk/src/test/java/

Added: httpcomponents/asynchttpclient/trunk/pom.xml
URL: http://svn.apache.org/viewvc/httpcomponents/asynchttpclient/trunk/pom.xml?rev=814229&view=auto
==============================================================================
--- httpcomponents/asynchttpclient/trunk/pom.xml (added)
+++ httpcomponents/asynchttpclient/trunk/pom.xml Sat Sep 12 20:30:20 2009
@@ -0,0 +1,139 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+   ====================================================================
+   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 />.
+ -->
+
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+  <modelVersion>4.0.0</modelVersion>
+  <parent>
+    <artifactId>project</artifactId>
+    <groupId>org.apache.httpcomponents</groupId>
+    <version>4.0</version>
+    <relativePath>../project/pom.xml</relativePath>
+  </parent>
+  <artifactId>asynchttpclient</artifactId>
+  <name>AsyncHttpClient</name>
+  <description>
+   HttpComponents Async Client
+  </description>
+  <url>http://hc.apache.org/httpcomponents-client</url>
+  <packaging>jar</packaging>  
+
+  <licenses>
+    <license>
+      <name>Apache License</name>
+      <url>LICENSE.txt</url>
+      <distribution>repo</distribution>
+    </license>
+  </licenses>
+
+  <dependencies>
+    <dependency>
+      <groupId>org.apache.httpcomponents</groupId>
+      <artifactId>httpcore</artifactId>
+      <version>${httpcore.version}</version>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.httpcomponents</groupId>
+      <artifactId>httpcore-nio</artifactId>
+      <version>${httpcore.version}</version>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.httpcomponents</groupId>
+      <artifactId>httpclient</artifactId>
+      <version>${httpclient.version}</version>
+    </dependency>
+    <dependency>
+      <groupId>commons-logging</groupId>
+      <artifactId>commons-logging</artifactId>
+      <version>${commons-logging.version}</version>
+    </dependency>
+    <dependency>
+      <groupId>junit</groupId>
+      <artifactId>junit</artifactId>
+      <version>${junit.version}</version>
+      <scope>test</scope>
+    </dependency>
+  </dependencies>
+
+  <properties>
+    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+    <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
+    <maven.compile.source>1.5</maven.compile.source>
+    <maven.compile.target>1.5</maven.compile.target>
+    <maven.compile.optimize>true</maven.compile.optimize>
+    <maven.compile.deprecation>true</maven.compile.deprecation>
+    <httpcore.version>4.1-alpha1</httpcore.version>
+    <httpclient.version>4.0</httpclient.version>
+    <commons-logging.version>1.1.1</commons-logging.version>
+    <junit.version>3.8.2</junit.version>
+  </properties>
+
+  <build>
+    <resources>
+      <resource>
+        <directory>src/main/resources</directory>
+        <filtering>false</filtering>
+        <includes>
+            <include>META-INF/*</include>
+        </includes>
+      </resource>
+      <resource>
+        <directory>src/main/resources</directory>
+        <filtering>true</filtering>
+        <includes>
+            <include>**/*.properties</include>
+        </includes>
+      </resource>
+    </resources>
+    <plugins>
+      <plugin>
+        <groupId>org.apache.maven.plugins</groupId>
+        <artifactId>maven-compiler-plugin</artifactId>
+        <configuration>
+          <source>${maven.compile.source}</source>
+          <target>${maven.compile.target}</target>
+          <optimize>${maven.compile.optimize}</optimize>
+          <showDeprecations>${maven.compile.deprecation}</showDeprecations>
+        </configuration>
+      </plugin>
+      <plugin>
+        <groupId>org.apache.maven.plugins</groupId>
+        <artifactId>maven-jar-plugin</artifactId>
+        <executions>
+          <execution>
+            <goals>
+              <goal>test-jar</goal>
+            </goals>
+          </execution>
+        </executions>
+      </plugin>
+      <plugin>
+        <artifactId>maven-surefire-plugin</artifactId>
+      </plugin>
+    </plugins>
+  </build>
+
+</project>

Propchange: httpcomponents/asynchttpclient/trunk/pom.xml
------------------------------------------------------------------------------
    svn:eol-style = native

Added: httpcomponents/asynchttpclient/trunk/src/examples/org/apache/http/examples/nio/client/AsyncClientRequest.java
URL: http://svn.apache.org/viewvc/httpcomponents/asynchttpclient/trunk/src/examples/org/apache/http/examples/nio/client/AsyncClientRequest.java?rev=814229&view=auto
==============================================================================
--- httpcomponents/asynchttpclient/trunk/src/examples/org/apache/http/examples/nio/client/AsyncClientRequest.java (added)
+++ httpcomponents/asynchttpclient/trunk/src/examples/org/apache/http/examples/nio/client/AsyncClientRequest.java Sat Sep 12 20:30:20 2009
@@ -0,0 +1,86 @@
+/*
+ * ====================================================================
+ * 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.examples.nio.client;
+
+import org.apache.http.HttpHost;
+import org.apache.http.HttpResponse;
+import org.apache.http.impl.nio.client.BasicAsyncHttpClient;
+import org.apache.http.impl.nio.conn.BasicIOSessionManager;
+import org.apache.http.impl.nio.reactor.DefaultConnectingIOReactor;
+import org.apache.http.message.BasicHttpRequest;
+import org.apache.http.nio.client.AsyncHttpClient;
+import org.apache.http.nio.client.HttpExchange;
+import org.apache.http.params.CoreConnectionPNames;
+import org.apache.http.params.CoreProtocolPNames;
+import org.apache.http.params.HttpParams;
+import org.apache.http.params.SyncBasicHttpParams;
+
+public class AsyncClientRequest {
+
+    public static void main(String[] args) throws Exception {
+        HttpParams params = new SyncBasicHttpParams();
+        params
+            .setIntParameter(CoreConnectionPNames.SO_TIMEOUT, 5000)
+            .setIntParameter(CoreConnectionPNames.CONNECTION_TIMEOUT, 10000)
+            .setIntParameter(CoreConnectionPNames.SOCKET_BUFFER_SIZE, 8 * 1024)
+            .setBooleanParameter(CoreConnectionPNames.TCP_NODELAY, true)
+            .setParameter(CoreProtocolPNames.USER_AGENT, "HttpComponents/1.1");
+        DefaultConnectingIOReactor ioReactor = new DefaultConnectingIOReactor(1, params);
+        BasicIOSessionManager sessmrg = new BasicIOSessionManager(ioReactor);
+        sessmrg.setTotalMax(5);
+        sessmrg.setDefaultMaxPerHost(3);
+
+        AsyncHttpClient asynchttpclient = new BasicAsyncHttpClient(
+                ioReactor, 
+                sessmrg, 
+                params);
+        
+        asynchttpclient.start();
+        
+        HttpHost target = new HttpHost("www.google.ch", 80);
+        BasicHttpRequest request = new BasicHttpRequest("GET", "/"); 
+
+        HttpExchange[] httpx = new HttpExchange[10]; 
+        for (int i = 0; i < httpx.length; i++) {
+            httpx[i] = asynchttpclient.execute(target, request);
+        }
+        
+        for (int i = 0; i < httpx.length; i++) {
+            HttpResponse response = httpx[i].awaitResponse();
+            if (response != null) {
+                System.out.println("Response: " + response.getStatusLine());
+            }
+        }
+
+        System.out.println("Shutting down");
+        
+        asynchttpclient.shutdown();
+        
+        System.out.println("Done");
+    }
+
+}

Propchange: httpcomponents/asynchttpclient/trunk/src/examples/org/apache/http/examples/nio/client/AsyncClientRequest.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: httpcomponents/asynchttpclient/trunk/src/examples/org/apache/http/examples/nio/client/AsyncClientRequest.java
------------------------------------------------------------------------------
    svn:keywords = Date Author Id Revision HeadURL

Propchange: httpcomponents/asynchttpclient/trunk/src/examples/org/apache/http/examples/nio/client/AsyncClientRequest.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Added: httpcomponents/asynchttpclient/trunk/src/main/java/org/apache/http/impl/nio/client/BasicAsyncHttpClient.java
URL: http://svn.apache.org/viewvc/httpcomponents/asynchttpclient/trunk/src/main/java/org/apache/http/impl/nio/client/BasicAsyncHttpClient.java?rev=814229&view=auto
==============================================================================
--- httpcomponents/asynchttpclient/trunk/src/main/java/org/apache/http/impl/nio/client/BasicAsyncHttpClient.java (added)
+++ httpcomponents/asynchttpclient/trunk/src/main/java/org/apache/http/impl/nio/client/BasicAsyncHttpClient.java Sat Sep 12 20:30:20 2009
@@ -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.client;
+
+import java.io.IOException;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.apache.http.ConnectionReuseStrategy;
+import org.apache.http.HttpHost;
+import org.apache.http.HttpRequest;
+import org.apache.http.HttpRequestInterceptor;
+import org.apache.http.conn.routing.HttpRoute;
+import org.apache.http.impl.DefaultConnectionReuseStrategy;
+import org.apache.http.impl.nio.conn.BasicIOSessionManager;
+import org.apache.http.impl.nio.reactor.DefaultConnectingIOReactor;
+import org.apache.http.nio.client.AsyncHttpClient;
+import org.apache.http.nio.client.HttpExchange;
+import org.apache.http.nio.conn.IOSessionManager;
+import org.apache.http.nio.protocol.AsyncNHttpClientHandler;
+import org.apache.http.nio.reactor.ConnectingIOReactor;
+import org.apache.http.nio.reactor.IOEventDispatch;
+import org.apache.http.nio.reactor.IOReactorException;
+import org.apache.http.nio.reactor.IOReactorStatus;
+import org.apache.http.params.CoreConnectionPNames;
+import org.apache.http.params.CoreProtocolPNames;
+import org.apache.http.params.HttpParams;
+import org.apache.http.params.SyncBasicHttpParams;
+import org.apache.http.protocol.HttpProcessor;
+import org.apache.http.protocol.ImmutableHttpProcessor;
+import org.apache.http.protocol.RequestConnControl;
+import org.apache.http.protocol.RequestContent;
+import org.apache.http.protocol.RequestExpectContinue;
+import org.apache.http.protocol.RequestTargetHost;
+import org.apache.http.protocol.RequestUserAgent;
+
+public class BasicAsyncHttpClient implements AsyncHttpClient {
+
+    private final Log log;
+    private final HttpParams params;
+    private final ConnectingIOReactor ioReactor;
+    private final IOSessionManager<HttpRoute> sessmrg;    
+    
+    private Thread reactorThread;
+    
+    public BasicAsyncHttpClient(
+            final ConnectingIOReactor ioReactor,
+            final IOSessionManager<HttpRoute> sessmrg,
+            final HttpParams params) throws IOReactorException {
+        super();
+        this.log = LogFactory.getLog(getClass());
+        if (params != null) {
+            this.params = params;
+        } else {
+            this.params = createDefaultHttpParams();
+        }
+        this.ioReactor = ioReactor;
+        this.sessmrg = sessmrg;
+    }
+    
+    public BasicAsyncHttpClient(final HttpParams params) throws IOReactorException {
+        super();
+        this.log = LogFactory.getLog(getClass());
+        if (params != null) {
+            this.params = params;
+        } else {
+            this.params = createDefaultHttpParams();
+        }
+        this.ioReactor = new DefaultConnectingIOReactor(2, this.params);
+        this.sessmrg = new BasicIOSessionManager(this.ioReactor);
+    }
+    
+    protected HttpParams createDefaultHttpParams() {
+        HttpParams params = new SyncBasicHttpParams();
+        params
+            .setIntParameter(CoreConnectionPNames.SO_TIMEOUT, 5000)
+            .setIntParameter(CoreConnectionPNames.CONNECTION_TIMEOUT, 10000)
+            .setIntParameter(CoreConnectionPNames.SOCKET_BUFFER_SIZE, 8 * 1024)
+            .setBooleanParameter(CoreConnectionPNames.TCP_NODELAY, true)
+            .setParameter(CoreProtocolPNames.USER_AGENT, "HttpComponents/1.1");
+        return params;
+    }
+    
+    protected HttpProcessor createHttpProcessor() {
+        HttpRequestInterceptor[] interceptors = new HttpRequestInterceptor[] {
+                new RequestContent(),
+                new RequestTargetHost(),
+                new RequestConnControl(),
+                new RequestUserAgent(),
+                new RequestExpectContinue()
+        };
+        ImmutableHttpProcessor httpProcessor = new ImmutableHttpProcessor(interceptors); 
+        return httpProcessor;
+    }
+    
+    protected ConnectionReuseStrategy createConnectionReuseStrategy() {
+        return new DefaultConnectionReuseStrategy();
+    }
+    
+    public HttpParams getParams() {
+        return this.params;
+    }
+
+    private void doExecute() {
+        AsyncNHttpClientHandler handler = new AsyncNHttpClientHandler(
+                createHttpProcessor(),
+                new InternalRequestExecutionHandler(),
+                createConnectionReuseStrategy(),
+                this.params);
+        handler.setEventListener(new InternalEventLogger(this.log));
+        IOEventDispatch ioEventDispatch = new InternalClientEventDispatch(handler, this.params);
+        try {
+            this.ioReactor.execute(ioEventDispatch);
+        } catch (IOException ex) {
+            this.log.error("I/O reactor terminated abnormally", ex);
+        }
+    }
+    
+    public IOReactorStatus getStatus() {
+        return this.ioReactor.getStatus();
+    }
+    
+    public synchronized void start() {
+        this.reactorThread = new Thread() {
+
+            @Override
+            public void run() {
+                doExecute();
+            }
+            
+        };
+        this.reactorThread.start();
+    }
+
+    public synchronized void shutdown() throws InterruptedException {
+        this.sessmrg.shutdown();
+        try {
+            this.ioReactor.shutdown(5000);
+        } catch (IOException ex) {
+            this.log.error("I/O error shutting down", ex);
+        }
+        if (this.reactorThread != null) {
+            this.reactorThread.join();
+        }
+    }
+    
+    public HttpExchange execute(final HttpHost target, final HttpRequest request) {
+        HttpRoute route = new HttpRoute(target);
+        return new HttpExchangeImpl(request, route, null, this.sessmrg);
+    }
+    
+}

Propchange: httpcomponents/asynchttpclient/trunk/src/main/java/org/apache/http/impl/nio/client/BasicAsyncHttpClient.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: httpcomponents/asynchttpclient/trunk/src/main/java/org/apache/http/impl/nio/client/BasicAsyncHttpClient.java
------------------------------------------------------------------------------
    svn:keywords = Date Author Id Revision HeadURL

Propchange: httpcomponents/asynchttpclient/trunk/src/main/java/org/apache/http/impl/nio/client/BasicAsyncHttpClient.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Added: httpcomponents/asynchttpclient/trunk/src/main/java/org/apache/http/impl/nio/client/HttpExchangeImpl.java
URL: http://svn.apache.org/viewvc/httpcomponents/asynchttpclient/trunk/src/main/java/org/apache/http/impl/nio/client/HttpExchangeImpl.java?rev=814229&view=auto
==============================================================================
--- httpcomponents/asynchttpclient/trunk/src/main/java/org/apache/http/impl/nio/client/HttpExchangeImpl.java (added)
+++ httpcomponents/asynchttpclient/trunk/src/main/java/org/apache/http/impl/nio/client/HttpExchangeImpl.java Sat Sep 12 20:30:20 2009
@@ -0,0 +1,127 @@
+/*
+ * ====================================================================
+ * 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.client;
+
+import java.nio.channels.SelectionKey;
+import java.util.concurrent.ExecutionException;
+import java.util.concurrent.Future;
+
+import org.apache.http.HttpRequest;
+import org.apache.http.HttpResponse;
+import org.apache.http.conn.routing.HttpRoute;
+import org.apache.http.nio.client.HttpExchange;
+import org.apache.http.nio.concurrent.BasicFuture;
+import org.apache.http.nio.concurrent.FutureCallback;
+import org.apache.http.nio.conn.IOSessionManager;
+import org.apache.http.nio.conn.ManagedIOSession;
+import org.apache.http.nio.reactor.IOSession;
+
+class HttpExchangeImpl implements HttpExchange {
+
+    private final HttpRequest request;
+    private final Future<ManagedIOSession> sessionFuture;
+    private final BasicFuture<HttpResponse> responseFuture;
+
+    private ManagedIOSession managedSession;
+    
+    public HttpExchangeImpl(
+            final HttpRequest request,
+            final HttpRoute route,
+            final Object state,
+            final IOSessionManager<HttpRoute> sessmrg) {
+        super();
+        this.request = request;
+        this.sessionFuture = sessmrg.leaseSession(route, state, new InternalFutureCallback());
+        this.responseFuture = new BasicFuture<HttpResponse>(null);
+    }
+
+    public boolean isCompleted() {
+        return this.responseFuture.isDone();
+    }
+    
+    public HttpRequest getRequest() {
+        return this.request;
+    }
+    
+    public HttpResponse awaitResponse() throws ExecutionException, InterruptedException {
+        return this.responseFuture.get();
+    }
+
+    public synchronized void completed(final HttpResponse response) {
+        if (this.managedSession != null) {
+            this.managedSession.releaseSession();
+        }
+        this.responseFuture.completed(response);
+    }
+    
+    public synchronized void cancel() {
+        this.sessionFuture.cancel(true);
+        if (this.managedSession != null) {
+            this.managedSession.abortSession();
+        }
+        this.responseFuture.cancel(true);
+    }
+
+    private synchronized void sessionRequestCompleted() {
+        try {
+            this.managedSession = this.sessionFuture.get();
+            if (this.managedSession == null || this.sessionFuture.isCancelled()) {
+                this.responseFuture.cancel(true);
+            } else {
+                IOSession iosession = this.managedSession.getSession();
+                iosession.setAttribute(InternalRequestExecutionHandler.HTTP_EXCHANGE, this);
+                iosession.setEvent(SelectionKey.OP_WRITE);
+            }
+        } catch (InterruptedException ex) {
+            this.responseFuture.cancel(true);
+        } catch (ExecutionException ex) {
+            Throwable cause = ex.getCause(); 
+            if (cause != null && cause instanceof Exception) {
+                this.responseFuture.failed((Exception) cause);
+            } else {
+                this.responseFuture.failed(ex);
+            }
+        }
+    }
+    
+    class InternalFutureCallback implements FutureCallback<ManagedIOSession> {
+
+        public void completed(final Future<ManagedIOSession> future) {
+            sessionRequestCompleted();
+        }
+
+        public void failed(final Future<ManagedIOSession> future) {
+            sessionRequestCompleted();
+        }
+        
+        public void cancelled(final Future<ManagedIOSession> future) {
+            sessionRequestCompleted();            
+        }
+
+    }
+    
+}

Propchange: httpcomponents/asynchttpclient/trunk/src/main/java/org/apache/http/impl/nio/client/HttpExchangeImpl.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: httpcomponents/asynchttpclient/trunk/src/main/java/org/apache/http/impl/nio/client/HttpExchangeImpl.java
------------------------------------------------------------------------------
    svn:keywords = Date Author Id Revision HeadURL

Propchange: httpcomponents/asynchttpclient/trunk/src/main/java/org/apache/http/impl/nio/client/HttpExchangeImpl.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Added: httpcomponents/asynchttpclient/trunk/src/main/java/org/apache/http/impl/nio/client/InternalClientEventDispatch.java
URL: http://svn.apache.org/viewvc/httpcomponents/asynchttpclient/trunk/src/main/java/org/apache/http/impl/nio/client/InternalClientEventDispatch.java?rev=814229&view=auto
==============================================================================
--- httpcomponents/asynchttpclient/trunk/src/main/java/org/apache/http/impl/nio/client/InternalClientEventDispatch.java (added)
+++ httpcomponents/asynchttpclient/trunk/src/main/java/org/apache/http/impl/nio/client/InternalClientEventDispatch.java Sat Sep 12 20:30:20 2009
@@ -0,0 +1,113 @@
+/*
+ * ====================================================================
+ * 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.client;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.apache.http.impl.nio.DefaultClientIOEventDispatch;
+import org.apache.http.impl.nio.conn.LoggingIOSession;
+import org.apache.http.impl.nio.conn.LoggingNHttpClientConnection;
+import org.apache.http.nio.NHttpClientHandler;
+import org.apache.http.nio.NHttpClientIOTarget;
+import org.apache.http.nio.reactor.IOSession;
+import org.apache.http.params.HttpParams;
+
+class InternalClientEventDispatch extends DefaultClientIOEventDispatch {
+
+    private static final String HEADERS = "org.apache.http.headers";
+    private static final String WIRE = "org.apache.http.wire";
+    
+    private Log log;
+    
+    InternalClientEventDispatch(
+            final NHttpClientHandler handler, 
+            final HttpParams params) {
+        super(handler, params);
+        this.log = LogFactory.getLog(getClass());
+    }
+
+    @Override
+    protected NHttpClientIOTarget createConnection(IOSession session) {
+        Log log = LogFactory.getLog(session.getClass());
+        Log wirelog = LogFactory.getLog(WIRE);
+        Log headerlog = LogFactory.getLog(HEADERS);
+        if (log.isDebugEnabled() || wirelog.isDebugEnabled()) {
+            session = new LoggingIOSession(session, log, wirelog);
+        }
+        if (headerlog.isDebugEnabled()) {
+            return new LoggingNHttpClientConnection(
+                    headerlog, 
+                    session,
+                    createHttpResponseFactory(),
+                    this.allocator,
+                    this.params); 
+        } else {
+            return super.createConnection(session);
+        }
+    }
+
+    @Override
+    public void connected(final IOSession session) {
+        if (this.log.isDebugEnabled()) {
+            this.log.debug("Session connected: " + session);
+        }
+        super.connected(session);
+    }
+
+    @Override
+    public void disconnected(final IOSession session) {
+        if (this.log.isDebugEnabled()) {
+            this.log.debug("Session disconnected: " + session);
+        }
+        super.disconnected(session);
+    }
+
+    @Override
+    public void inputReady(final IOSession session) {
+        if (this.log.isDebugEnabled()) {
+            this.log.debug("Session input ready: " + session);
+        }
+        super.inputReady(session);
+    }
+
+    @Override
+    public void outputReady(final IOSession session) {
+        if (this.log.isDebugEnabled()) {
+            this.log.debug("Session output ready: " + session);
+        }
+        super.outputReady(session);
+    }
+
+    @Override
+    public void timeout(IOSession session) {
+        if (this.log.isDebugEnabled()) {
+            this.log.debug("Session timed out: " + session);
+        }
+        super.timeout(session);
+    }
+    
+}
\ No newline at end of file

Propchange: httpcomponents/asynchttpclient/trunk/src/main/java/org/apache/http/impl/nio/client/InternalClientEventDispatch.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: httpcomponents/asynchttpclient/trunk/src/main/java/org/apache/http/impl/nio/client/InternalClientEventDispatch.java
------------------------------------------------------------------------------
    svn:keywords = Date Author Id Revision HeadURL

Propchange: httpcomponents/asynchttpclient/trunk/src/main/java/org/apache/http/impl/nio/client/InternalClientEventDispatch.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Added: httpcomponents/asynchttpclient/trunk/src/main/java/org/apache/http/impl/nio/client/InternalEventLogger.java
URL: http://svn.apache.org/viewvc/httpcomponents/asynchttpclient/trunk/src/main/java/org/apache/http/impl/nio/client/InternalEventLogger.java?rev=814229&view=auto
==============================================================================
--- httpcomponents/asynchttpclient/trunk/src/main/java/org/apache/http/impl/nio/client/InternalEventLogger.java (added)
+++ httpcomponents/asynchttpclient/trunk/src/main/java/org/apache/http/impl/nio/client/InternalEventLogger.java Sat Sep 12 20:30:20 2009
@@ -0,0 +1,75 @@
+/*
+ * ====================================================================
+ * 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.client;
+
+import java.io.IOException;
+
+import org.apache.commons.logging.Log;
+import org.apache.http.HttpException;
+import org.apache.http.nio.NHttpConnection;
+import org.apache.http.nio.protocol.EventListener;
+
+class InternalEventLogger implements EventListener {
+
+    private final Log log;
+    
+    InternalEventLogger(final Log log) {
+        super();
+        this.log = log;
+    }
+    
+    public void connectionOpen(final NHttpConnection conn) {
+        if (this.log.isDebugEnabled()) {
+            this.log.debug("Connection open: " + conn);
+        }
+    }
+
+    public void connectionTimeout(final NHttpConnection conn) {
+        if (this.log.isDebugEnabled()) {
+            this.log.debug("Connection timed out: " + conn);
+        }
+    }
+
+    public void connectionClosed(final NHttpConnection conn) {
+        if (this.log.isDebugEnabled()) {
+            this.log.debug("Connection closed: " + conn);
+        }
+    }
+
+    public void fatalIOException(final IOException ex, final NHttpConnection conn) {
+        if (this.log.isErrorEnabled()) {
+            this.log.error("I/O error: " + conn, ex);
+        }
+    }
+
+    public void fatalProtocolException(final HttpException ex, final NHttpConnection conn) {
+        if (this.log.isErrorEnabled()) {
+            this.log.error("Protocol error: " + conn, ex);
+        }
+    }
+    
+}
\ No newline at end of file

Propchange: httpcomponents/asynchttpclient/trunk/src/main/java/org/apache/http/impl/nio/client/InternalEventLogger.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: httpcomponents/asynchttpclient/trunk/src/main/java/org/apache/http/impl/nio/client/InternalEventLogger.java
------------------------------------------------------------------------------
    svn:keywords = Date Author Id Revision HeadURL

Propchange: httpcomponents/asynchttpclient/trunk/src/main/java/org/apache/http/impl/nio/client/InternalEventLogger.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Added: httpcomponents/asynchttpclient/trunk/src/main/java/org/apache/http/impl/nio/client/InternalRequestExecutionHandler.java
URL: http://svn.apache.org/viewvc/httpcomponents/asynchttpclient/trunk/src/main/java/org/apache/http/impl/nio/client/InternalRequestExecutionHandler.java?rev=814229&view=auto
==============================================================================
--- httpcomponents/asynchttpclient/trunk/src/main/java/org/apache/http/impl/nio/client/InternalRequestExecutionHandler.java (added)
+++ httpcomponents/asynchttpclient/trunk/src/main/java/org/apache/http/impl/nio/client/InternalRequestExecutionHandler.java Sat Sep 12 20:30:20 2009
@@ -0,0 +1,81 @@
+/*
+ * ====================================================================
+ * 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.client;
+
+import java.io.IOException;
+
+import org.apache.http.HttpRequest;
+import org.apache.http.HttpResponse;
+import org.apache.http.nio.entity.BufferingNHttpEntity;
+import org.apache.http.nio.entity.ConsumingNHttpEntity;
+import org.apache.http.nio.protocol.NHttpRequestExecutionHandler;
+import org.apache.http.nio.util.HeapByteBufferAllocator;
+import org.apache.http.protocol.HttpContext;
+
+class InternalRequestExecutionHandler implements NHttpRequestExecutionHandler {
+
+    protected static final String HTTP_EXCHANGE = "http.async.http-exchange";
+    
+    InternalRequestExecutionHandler() {
+        super();
+    }
+
+    public void initalizeContext(final HttpContext context, final Object attachment) {
+    }
+
+    public void finalizeContext(final HttpContext context) {
+        HttpExchangeImpl httpx = (HttpExchangeImpl) context.removeAttribute(HTTP_EXCHANGE);
+        if (httpx != null) {
+            httpx.cancel();
+        }
+    }
+
+    public HttpRequest submitRequest(final HttpContext context) {
+        HttpExchangeImpl httpx = (HttpExchangeImpl) context.getAttribute(HTTP_EXCHANGE);
+        if (httpx != null) {
+            return httpx.getRequest();
+        } else {
+            return null;
+        }
+    }
+    
+    public ConsumingNHttpEntity responseEntity(
+    		final HttpResponse response, final HttpContext context) throws IOException {
+        return new BufferingNHttpEntity(
+                response.getEntity(),
+                new HeapByteBufferAllocator());
+    }
+
+    public void handleResponse(
+    		final HttpResponse response, final HttpContext context) throws IOException {
+        HttpExchangeImpl httpx = (HttpExchangeImpl) context.removeAttribute(HTTP_EXCHANGE);
+        if (httpx != null) {
+            httpx.completed(response);
+        }
+    }
+
+}
\ No newline at end of file

Propchange: httpcomponents/asynchttpclient/trunk/src/main/java/org/apache/http/impl/nio/client/InternalRequestExecutionHandler.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: httpcomponents/asynchttpclient/trunk/src/main/java/org/apache/http/impl/nio/client/InternalRequestExecutionHandler.java
------------------------------------------------------------------------------
    svn:keywords = Date Author Id Revision HeadURL

Propchange: httpcomponents/asynchttpclient/trunk/src/main/java/org/apache/http/impl/nio/client/InternalRequestExecutionHandler.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Added: httpcomponents/asynchttpclient/trunk/src/main/java/org/apache/http/impl/nio/conn/BasicIOSessionManager.java
URL: http://svn.apache.org/viewvc/httpcomponents/asynchttpclient/trunk/src/main/java/org/apache/http/impl/nio/conn/BasicIOSessionManager.java?rev=814229&view=auto
==============================================================================
--- httpcomponents/asynchttpclient/trunk/src/main/java/org/apache/http/impl/nio/conn/BasicIOSessionManager.java (added)
+++ httpcomponents/asynchttpclient/trunk/src/main/java/org/apache/http/impl/nio/conn/BasicIOSessionManager.java Sat Sep 12 20:30:20 2009
@@ -0,0 +1,167 @@
+/*
+ * ====================================================================
+ * 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.util.concurrent.Future;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.apache.http.conn.routing.HttpRoute;
+import org.apache.http.impl.nio.pool.PoolEntry;
+import org.apache.http.impl.nio.pool.PoolEntryCallback;
+import org.apache.http.nio.concurrent.BasicFuture;
+import org.apache.http.nio.concurrent.FutureCallback;
+import org.apache.http.nio.conn.ManagedIOSession;
+import org.apache.http.nio.conn.IOSessionManager;
+import org.apache.http.nio.conn.PoolStats;
+import org.apache.http.nio.reactor.ConnectingIOReactor;
+import org.apache.http.nio.reactor.IOSession;
+
+public class BasicIOSessionManager implements IOSessionManager<HttpRoute> {
+
+    private final Log log;
+    private final HttpSessionPool pool;
+
+    public BasicIOSessionManager(final ConnectingIOReactor ioreactor) {
+        super();
+        if (ioreactor == null) {
+            throw new IllegalArgumentException("I/O reactor may not be null");
+        }
+        this.log = LogFactory.getLog(getClass());
+        this.pool = new HttpSessionPool(ioreactor);
+    }
+
+    public synchronized Future<ManagedIOSession> leaseSession(
+            final HttpRoute route,
+            final Object state,
+            final FutureCallback<ManagedIOSession> callback) {
+        if (this.log.isDebugEnabled()) {
+            this.log.debug("I/O session request: route[" + route + "][state: " + state + "]");
+            PoolStats totals = this.pool.getTotalStats();
+            PoolStats stats = this.pool.getStats(route);
+            this.log.debug("Total: " + totals);
+            this.log.debug("Route [" + route + "]: " + stats);
+        }
+        BasicFuture<ManagedIOSession> future = new BasicFuture<ManagedIOSession>(
+                callback);
+        this.pool.lease(route, state, new InternalPoolEntryCallback(future));
+        if (this.log.isDebugEnabled()) {
+            if (!future.isDone()) {
+                this.log.debug("I/O session could not be allocated immediately: " +
+                		"route[" + route + "][state: " + state + "]");
+            }
+        }
+        return future;
+    }
+
+    public synchronized void releaseSession(final ManagedIOSession conn) {
+        if (!(conn instanceof BasicManagedIOSession)) {
+            throw new IllegalArgumentException
+                ("I/O session class mismatch, " +
+                 "I/O session not obtained from this manager");
+        }
+        BasicManagedIOSession adaptor = (BasicManagedIOSession) conn;
+        IOSessionManager<HttpRoute> manager = adaptor.getManager();
+        if (manager != null && manager != this) {
+            throw new IllegalArgumentException
+                ("I/O session not obtained from this manager");
+        }
+        PoolEntry<HttpRoute> entry = adaptor.getEntry();
+        IOSession iosession = entry.getIOSession();
+        if (this.log.isDebugEnabled()) {
+            HttpRoute route = entry.getRoute();
+            PoolStats totals = this.pool.getTotalStats();
+            PoolStats stats = this.pool.getStats(route);
+            this.log.debug("Total: " + totals);
+            this.log.debug("Route [" + route + "]: " + stats);
+            this.log.debug("I/O session released: " + entry);
+        }
+        this.pool.release(entry, adaptor.isReusable() && !iosession.isClosed());
+    }
+
+    public PoolStats getTotalStats() {
+        return this.pool.getTotalStats();
+    }
+
+    public PoolStats getStats(final HttpRoute route) {
+        return this.pool.getStats(route);
+    }
+    
+    public void setTotalMax(int max) {
+    	this.pool.setTotalMax(max);
+    }
+
+    public void setDefaultMaxPerHost(int max) {
+    	this.pool.setDefaultMaxPerHost(max);
+    }
+
+    public void setMaxPerHost(final HttpRoute route, int max) {
+    	this.pool.setMaxPerHost(route, max);
+    }
+    
+    public synchronized void shutdown() {
+        this.log.debug("I/O session manager shut down"); 
+        this.pool.shutdown();
+    }
+
+    class InternalPoolEntryCallback implements PoolEntryCallback<HttpRoute> {
+
+        private final BasicFuture<ManagedIOSession> future;
+        
+        public InternalPoolEntryCallback(
+                final BasicFuture<ManagedIOSession> future) {
+            super();
+            this.future = future;
+        }
+        
+        public void completed(final PoolEntry<HttpRoute> entry) {
+            if (log.isDebugEnabled()) {
+                log.debug("I/O session allocated: " + entry);
+            }
+            BasicManagedIOSession result = new BasicManagedIOSession(
+                    BasicIOSessionManager.this, 
+                    entry);
+            if (!this.future.completed(result)) {
+                pool.release(entry, true);
+            }
+        }
+
+        public void failed(final Exception ex) {
+            if (log.isDebugEnabled()) {
+                log.debug("I/O session request failed", ex);
+            }
+            this.future.failed(ex);
+        }
+
+        public void cancelled() {
+            log.debug("I/O session request cancelled");
+            this.future.cancel(true);
+        }
+
+    }
+
+}

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

Propchange: httpcomponents/asynchttpclient/trunk/src/main/java/org/apache/http/impl/nio/conn/BasicIOSessionManager.java
------------------------------------------------------------------------------
    svn:keywords = Date Author Id Revision HeadURL

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

Added: httpcomponents/asynchttpclient/trunk/src/main/java/org/apache/http/impl/nio/conn/BasicManagedIOSession.java
URL: http://svn.apache.org/viewvc/httpcomponents/asynchttpclient/trunk/src/main/java/org/apache/http/impl/nio/conn/BasicManagedIOSession.java?rev=814229&view=auto
==============================================================================
--- httpcomponents/asynchttpclient/trunk/src/main/java/org/apache/http/impl/nio/conn/BasicManagedIOSession.java (added)
+++ httpcomponents/asynchttpclient/trunk/src/main/java/org/apache/http/impl/nio/conn/BasicManagedIOSession.java Sat Sep 12 20:30:20 2009
@@ -0,0 +1,140 @@
+/*
+ * ====================================================================
+ * 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 org.apache.http.conn.routing.HttpRoute;
+import org.apache.http.impl.nio.pool.PoolEntry;
+import org.apache.http.nio.conn.IOSessionManager;
+import org.apache.http.nio.conn.ManagedIOSession;
+import org.apache.http.nio.reactor.IOSession;
+
+public class BasicManagedIOSession implements ManagedIOSession {
+
+    private final IOSessionManager<HttpRoute> manager;
+    private volatile PoolEntry<HttpRoute> entry;
+    private volatile boolean released;
+    private volatile boolean reusable;
+
+    public BasicManagedIOSession(
+            final IOSessionManager<HttpRoute> manager,
+            final PoolEntry<HttpRoute> entry) {
+        super();
+        this.manager = manager;
+        this.entry = entry;
+        this.released = false;
+        this.reusable = true;
+    }
+
+    protected IOSessionManager<HttpRoute> getManager() {
+        return this.manager;
+    }
+
+    protected PoolEntry<HttpRoute> getEntry() {
+        return this.entry;
+    }
+    
+    public IOSession getSession() {
+        if (this.released) {
+            return null;
+        }
+        return this.entry.getIOSession();
+    }
+
+    public void releaseSession() {
+        if (this.released) {
+            return;
+        }
+        this.released = true;
+        this.manager.releaseSession(this);
+        this.entry = null;
+    }
+
+    public void abortSession() {
+        if (this.released) {
+            return;
+        }
+        this.released = true;
+        this.reusable = false;
+        IOSession iosession = this.entry.getIOSession();
+        iosession.shutdown();
+        this.manager.releaseSession(this);
+        this.entry = null;
+    }
+
+    public Object getState() {
+        if (this.released) {
+            return null;
+        }
+        return this.entry.getState();
+    }
+
+    public void setState(final Object state) {
+        if (this.released) {
+            return;
+        }
+        this.entry.setState(state);
+    }
+
+    public boolean isReusable() {
+        return this.reusable;
+    }
+
+    public void markNonReusable() {
+        if (this.released) {
+            return;
+        }
+        this.reusable = false;
+    }
+
+    public void markReusable() {
+        if (this.released) {
+            return;
+        }
+        this.reusable = true;
+    }
+
+    @Override
+    public String toString() {
+        HttpRoute route = this.entry.getRoute();
+    	StringBuilder buffer = new StringBuilder();
+        buffer.append("HTTP connection: ");
+        if (route.getLocalAddress() != null) {
+            buffer.append(route.getLocalAddress());
+            buffer.append("->");
+        }
+        for (int i = 0; i < route.getHopCount(); i++) {
+        	buffer.append(route.getHopTarget(i));
+        	buffer.append("->");
+        }
+        buffer.append(route.getTargetHost());
+        if (this.released) {
+            buffer.append(" (released)");
+        }
+        return buffer.toString();
+    }
+    
+}

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

Propchange: httpcomponents/asynchttpclient/trunk/src/main/java/org/apache/http/impl/nio/conn/BasicManagedIOSession.java
------------------------------------------------------------------------------
    svn:keywords = Date Author Id Revision HeadURL

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

Added: httpcomponents/asynchttpclient/trunk/src/main/java/org/apache/http/impl/nio/conn/HttpSessionPool.java
URL: http://svn.apache.org/viewvc/httpcomponents/asynchttpclient/trunk/src/main/java/org/apache/http/impl/nio/conn/HttpSessionPool.java?rev=814229&view=auto
==============================================================================
--- httpcomponents/asynchttpclient/trunk/src/main/java/org/apache/http/impl/nio/conn/HttpSessionPool.java (added)
+++ httpcomponents/asynchttpclient/trunk/src/main/java/org/apache/http/impl/nio/conn/HttpSessionPool.java Sat Sep 12 20:30:20 2009
@@ -0,0 +1,57 @@
+/*
+ * ====================================================================
+ * 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.net.InetSocketAddress;
+import java.net.SocketAddress;
+
+import org.apache.http.HttpHost;
+import org.apache.http.conn.routing.HttpRoute;
+import org.apache.http.impl.nio.pool.RouteResolver;
+import org.apache.http.impl.nio.pool.SessionPool;
+import org.apache.http.nio.reactor.ConnectingIOReactor;
+
+class HttpSessionPool extends SessionPool<HttpRoute> {
+
+    public HttpSessionPool(final ConnectingIOReactor ioreactor) {
+        super(ioreactor, new InternalRouteResolver(), 20, 50);
+    }
+    
+    static class InternalRouteResolver implements RouteResolver<HttpRoute> {
+
+        public SocketAddress resolveLocalAddress(final HttpRoute route) {
+            return new InetSocketAddress(route.getLocalAddress(), 0);
+        }
+
+        public SocketAddress resolveRemoteAddress(final HttpRoute route) {
+            HttpHost target = route.getTargetHost();
+            return new InetSocketAddress(target.getHostName(), target.getPort());
+        }
+
+    }
+    
+}

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

Propchange: httpcomponents/asynchttpclient/trunk/src/main/java/org/apache/http/impl/nio/conn/HttpSessionPool.java
------------------------------------------------------------------------------
    svn:keywords = Date Author Id Revision HeadURL

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

Added: httpcomponents/asynchttpclient/trunk/src/main/java/org/apache/http/impl/nio/conn/LoggingIOSession.java
URL: http://svn.apache.org/viewvc/httpcomponents/asynchttpclient/trunk/src/main/java/org/apache/http/impl/nio/conn/LoggingIOSession.java?rev=814229&view=auto
==============================================================================
--- httpcomponents/asynchttpclient/trunk/src/main/java/org/apache/http/impl/nio/conn/LoggingIOSession.java (added)
+++ httpcomponents/asynchttpclient/trunk/src/main/java/org/apache/http/impl/nio/conn/LoggingIOSession.java Sat Sep 12 20:30:20 2009
@@ -0,0 +1,233 @@
+/*
+ * ====================================================================
+ * 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.SocketAddress;
+import java.nio.ByteBuffer;
+import java.nio.channels.ByteChannel;
+import java.nio.channels.SelectionKey;
+import java.util.concurrent.atomic.AtomicLong;
+
+import org.apache.commons.logging.Log;
+import org.apache.http.nio.reactor.IOSession;
+import org.apache.http.nio.reactor.SessionBufferStatus;
+
+public class LoggingIOSession implements IOSession {
+
+    private static AtomicLong COUNT = new AtomicLong(0);
+    
+    private final Log log;
+    private final Wire wirelog;
+    private final IOSession session;
+    private final ByteChannel channel;
+    private final String id;
+    
+    public LoggingIOSession(final IOSession session, final Log log, final Log wirelog) {
+        super();
+        if (session == null) {
+            throw new IllegalArgumentException("I/O session may not be null");
+        }
+        this.log = log;
+        this.wirelog = new Wire(wirelog);
+        this.session = session;
+        this.channel = new LoggingByteChannel();
+        this.id = Long.toString(COUNT.incrementAndGet());
+    }
+
+    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();
+    }
+
+    private static String formatOps(int ops) {
+        StringBuffer buffer = new StringBuffer(6);
+        buffer.append('[');
+        if ((ops & SelectionKey.OP_READ) > 0) {
+            buffer.append('r');
+        }
+        if ((ops & SelectionKey.OP_WRITE) > 0) {
+            buffer.append('w');
+        }
+        if ((ops & SelectionKey.OP_ACCEPT) > 0) {
+            buffer.append('a');
+        }
+        if ((ops & SelectionKey.OP_CONNECT) > 0) {
+            buffer.append('c');
+        }
+        buffer.append(']');
+        return buffer.toString();
+    }
+    
+    public void setEventMask(int ops) {
+        if (this.log.isDebugEnabled()) {
+            this.log.debug("I/O session " + this.id + " " + this.session + ": Set event mask " 
+                    + formatOps(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 " 
+                    + formatOps(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 " 
+                    + formatOps(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 int getStatus() {
+        return this.session.getStatus();
+    }
+
+    public boolean isClosed() {
+        return this.session.isClosed();
+    }
+
+    public void shutdown() {
+        if (this.log.isDebugEnabled()) {
+            this.log.debug("I/O session " + this.id + " " + this.session + ": Shutdown");
+        }
+        this.session.shutdown();
+    }
+
+    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");
+            }
+            if (bytesRead > 0 && wirelog.isEnabled()) {
+            	ByteBuffer b = dst.duplicate();
+            	int p = b.position();
+            	b.limit(p);
+            	b.position(p - bytesRead);
+            	wirelog.input(b);
+            }
+            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");
+            }
+            if (byteWritten > 0 && wirelog.isEnabled()) {
+            	ByteBuffer b = src.duplicate();
+            	int p = b.position();
+            	b.limit(p);
+            	b.position(p - byteWritten);
+            	wirelog.output(b);
+            }
+            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

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

Propchange: httpcomponents/asynchttpclient/trunk/src/main/java/org/apache/http/impl/nio/conn/LoggingIOSession.java
------------------------------------------------------------------------------
    svn:keywords = Date Author Id Revision HeadURL

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

Added: httpcomponents/asynchttpclient/trunk/src/main/java/org/apache/http/impl/nio/conn/LoggingNHttpClientConnection.java
URL: http://svn.apache.org/viewvc/httpcomponents/asynchttpclient/trunk/src/main/java/org/apache/http/impl/nio/conn/LoggingNHttpClientConnection.java?rev=814229&view=auto
==============================================================================
--- httpcomponents/asynchttpclient/trunk/src/main/java/org/apache/http/impl/nio/conn/LoggingNHttpClientConnection.java (added)
+++ httpcomponents/asynchttpclient/trunk/src/main/java/org/apache/http/impl/nio/conn/LoggingNHttpClientConnection.java Sat Sep 12 20:30:20 2009
@@ -0,0 +1,140 @@
+/*
+ * ====================================================================
+ * 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.nio.channels.ReadableByteChannel;
+
+import org.apache.commons.logging.Log;
+import org.apache.http.Header;
+import org.apache.http.HttpException;
+import org.apache.http.HttpMessage;
+import org.apache.http.HttpRequest;
+import org.apache.http.HttpResponse;
+import org.apache.http.HttpResponseFactory;
+import org.apache.http.impl.nio.DefaultNHttpClientConnection;
+import org.apache.http.nio.NHttpMessageParser;
+import org.apache.http.nio.NHttpMessageWriter;
+import org.apache.http.nio.reactor.IOSession;
+import org.apache.http.nio.reactor.SessionInputBuffer;
+import org.apache.http.nio.reactor.SessionOutputBuffer;
+import org.apache.http.nio.util.ByteBufferAllocator;
+import org.apache.http.params.HttpParams;
+
+public class LoggingNHttpClientConnection extends DefaultNHttpClientConnection {
+
+    private final Log headerlog;
+
+    public LoggingNHttpClientConnection(
+    		final Log headerlog,
+            final IOSession iosession,
+            final HttpResponseFactory responseFactory,
+            final ByteBufferAllocator allocator,
+            final HttpParams params) {
+        super(iosession, responseFactory, allocator, params);
+        this.headerlog = headerlog;
+	}
+
+    @Override
+	protected NHttpMessageWriter createRequestWriter(
+			final SessionOutputBuffer buffer, 
+			final HttpParams params) {
+		return new LoggingNHttpMessageWriter(
+		        super.createRequestWriter(buffer, params));
+	}
+
+	@Override
+	protected NHttpMessageParser createResponseParser(
+			final SessionInputBuffer buffer, 
+			final HttpResponseFactory responseFactory,
+			final HttpParams params) {
+		return new LoggingNHttpMessageParser(
+		        super.createResponseParser(buffer, responseFactory, params));
+	}
+
+	class LoggingNHttpMessageWriter implements NHttpMessageWriter {
+
+		private final NHttpMessageWriter writer;
+		
+		public LoggingNHttpMessageWriter(final NHttpMessageWriter writer) {
+			super();
+			this.writer = writer;
+		}
+		
+		public void reset() {
+			this.writer.reset();
+		}
+
+		public void write(final HttpMessage message) throws IOException, HttpException {
+	        if (message != null && headerlog.isDebugEnabled()) {
+	        	HttpRequest request = (HttpRequest) message; 
+	            headerlog.debug(">> " + request.getRequestLine().toString());
+	            Header[] headers = request.getAllHeaders();
+	            for (int i = 0; i < headers.length; i++) {
+	                headerlog.debug(">> " + headers[i].toString());
+	            }
+	        }
+	        this.writer.write(message);
+		}
+		
+	}
+	
+	class LoggingNHttpMessageParser implements NHttpMessageParser {
+
+		private final NHttpMessageParser parser;
+		
+		public LoggingNHttpMessageParser(final NHttpMessageParser parser) {
+			super();
+			this.parser = parser;
+		}
+		
+		public void reset() {
+			this.parser.reset();
+		}
+
+		public int fillBuffer(final ReadableByteChannel channel) throws IOException {
+			return this.parser.fillBuffer(channel);
+		}
+
+		public HttpMessage parse() throws IOException, HttpException {
+			HttpMessage message = this.parser.parse();
+			if (headerlog.isDebugEnabled()) {
+				HttpResponse response = (HttpResponse) message; 
+		        if (response != null && headerlog.isDebugEnabled()) {
+		            headerlog.debug("<< " + response.getStatusLine().toString());
+		            Header[] headers = response.getAllHeaders();
+		            for (int i = 0; i < headers.length; i++) {
+		                headerlog.debug("<< " + headers[i].toString());
+		            }
+		        }
+			}
+			return message;
+		}
+		
+	}
+
+}

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

Propchange: httpcomponents/asynchttpclient/trunk/src/main/java/org/apache/http/impl/nio/conn/LoggingNHttpClientConnection.java
------------------------------------------------------------------------------
    svn:keywords = Date Author Id Revision HeadURL

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

Added: httpcomponents/asynchttpclient/trunk/src/main/java/org/apache/http/impl/nio/conn/Wire.java
URL: http://svn.apache.org/viewvc/httpcomponents/asynchttpclient/trunk/src/main/java/org/apache/http/impl/nio/conn/Wire.java?rev=814229&view=auto
==============================================================================
--- httpcomponents/asynchttpclient/trunk/src/main/java/org/apache/http/impl/nio/conn/Wire.java (added)
+++ httpcomponents/asynchttpclient/trunk/src/main/java/org/apache/http/impl/nio/conn/Wire.java Sat Sep 12 20:30:20 2009
@@ -0,0 +1,93 @@
+package org.apache.http.impl.nio.conn;
+
+import java.nio.ByteBuffer;
+
+import org.apache.commons.logging.Log;
+
+class Wire {
+
+    private final Log log;
+    
+    public Wire(final Log log) {
+        super();
+        this.log = log;
+    }
+    
+    private void wire(final String header, final byte[] b, int pos, int off) {
+        StringBuilder buffer = new StringBuilder();
+        for (int i = 0; i < off; i++) {
+            int ch = b[pos + i];
+            if (ch == 13) {
+                buffer.append("[\\r]");
+            } else if (ch == 10) {
+                    buffer.append("[\\n]\"");
+                    buffer.insert(0, "\"");
+                    buffer.insert(0, header);
+                    this.log.debug(buffer.toString());
+                    buffer.setLength(0);
+            } else if ((ch < 32) || (ch > 127)) {
+                buffer.append("[0x");
+                buffer.append(Integer.toHexString(ch));
+                buffer.append("]");
+            } else {
+                buffer.append((char) ch);
+            }
+        } 
+        if (buffer.length() > 0) {
+            buffer.append('\"');
+            buffer.insert(0, '\"');
+            buffer.insert(0, header);
+            this.log.debug(buffer.toString());
+        }
+    }
+
+
+    public boolean isEnabled() {
+        return this.log.isDebugEnabled();
+    }    
+    
+    public void output(final byte[] b, int pos, int off) {
+        wire(">> ", b, pos, off);
+    }
+
+    public void input(final byte[] b, int pos, int off) {
+        wire("<< ", b, pos, off);
+    }
+
+    public void output(byte[] b) {
+        output(b, 0, b.length);
+    }
+
+    public void input(byte[] b) {
+        input(b, 0, b.length);
+    }
+
+    public void output(int b) {
+        output(new byte[] {(byte) b});
+    }
+
+    public void input(int b) {
+        input(new byte[] {(byte) b});
+    }
+
+    public void output(final ByteBuffer b) {
+        if (b.hasArray()) {
+            output(b.array(), b.arrayOffset() + b.position(), b.remaining());
+        } else {
+            byte[] tmp = new byte[b.remaining()];
+            b.get(tmp);
+            output(tmp);
+        }
+    }
+
+    public void input(final ByteBuffer b) {
+        if (b.hasArray()) {
+            input(b.array(), b.arrayOffset() + b.position(), b.remaining());
+        } else {
+            byte[] tmp = new byte[b.remaining()];
+            b.get(tmp);
+            input(tmp);
+        }
+    }
+
+}

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

Propchange: httpcomponents/asynchttpclient/trunk/src/main/java/org/apache/http/impl/nio/conn/Wire.java
------------------------------------------------------------------------------
    svn:keywords = Date Author Id Revision HeadURL

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

Added: httpcomponents/asynchttpclient/trunk/src/main/java/org/apache/http/impl/nio/pool/LeaseRequest.java
URL: http://svn.apache.org/viewvc/httpcomponents/asynchttpclient/trunk/src/main/java/org/apache/http/impl/nio/pool/LeaseRequest.java?rev=814229&view=auto
==============================================================================
--- httpcomponents/asynchttpclient/trunk/src/main/java/org/apache/http/impl/nio/pool/LeaseRequest.java (added)
+++ httpcomponents/asynchttpclient/trunk/src/main/java/org/apache/http/impl/nio/pool/LeaseRequest.java Sat Sep 12 20:30:20 2009
@@ -0,0 +1,68 @@
+/*
+ * ====================================================================
+ * 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.pool;
+
+class LeaseRequest<T> {
+
+    private final T route;
+    private final Object state;
+    private final PoolEntryCallback<T> callback;
+
+    public LeaseRequest(
+            final T route,
+            final Object state,
+            final PoolEntryCallback<T> callback) {
+        super();
+        this.route = route;
+        this.state = state;
+        this.callback = callback;
+    }
+
+    public T getRoute() {
+        return this.route;
+    }
+
+    public Object getState() {
+        return this.state;
+    }
+
+    public PoolEntryCallback<T> getCallback() {
+        return this.callback;
+    }
+
+    @Override
+    public String toString() {
+        StringBuilder buffer = new StringBuilder();
+        buffer.append("[");
+        buffer.append(this.route);
+        buffer.append("][");
+        buffer.append(this.state);
+        buffer.append("]");
+        return super.toString();
+    }
+
+}

Propchange: httpcomponents/asynchttpclient/trunk/src/main/java/org/apache/http/impl/nio/pool/LeaseRequest.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: httpcomponents/asynchttpclient/trunk/src/main/java/org/apache/http/impl/nio/pool/LeaseRequest.java
------------------------------------------------------------------------------
    svn:keywords = Date Author Id Revision HeadURL

Propchange: httpcomponents/asynchttpclient/trunk/src/main/java/org/apache/http/impl/nio/pool/LeaseRequest.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Added: httpcomponents/asynchttpclient/trunk/src/main/java/org/apache/http/impl/nio/pool/PoolEntry.java
URL: http://svn.apache.org/viewvc/httpcomponents/asynchttpclient/trunk/src/main/java/org/apache/http/impl/nio/pool/PoolEntry.java?rev=814229&view=auto
==============================================================================
--- httpcomponents/asynchttpclient/trunk/src/main/java/org/apache/http/impl/nio/pool/PoolEntry.java (added)
+++ httpcomponents/asynchttpclient/trunk/src/main/java/org/apache/http/impl/nio/pool/PoolEntry.java Sat Sep 12 20:30:20 2009
@@ -0,0 +1,77 @@
+/*
+ * ====================================================================
+ * 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.pool;
+
+import java.util.concurrent.atomic.AtomicLong;
+
+import org.apache.http.nio.reactor.IOSession;
+
+public class PoolEntry<T> {
+
+    private static AtomicLong COUNTER = new AtomicLong(); 
+    
+    private final long id;
+    private final T route;
+    private final IOSession session;
+    private Object state;
+
+    public PoolEntry(final T route, final IOSession session) {
+        super();
+        this.route = route;
+        this.session = session;
+        this.id = COUNTER.incrementAndGet();
+    }
+
+    public T getRoute() {
+        return this.route;
+    }
+
+    public IOSession getIOSession() {
+        return this.session;
+    }
+    public Object getState() {
+        return this.state;
+    }
+
+    public void setState(final Object state) {
+        this.state = state;
+    }
+
+    @Override
+    public String toString() {
+        StringBuilder buffer = new StringBuilder();
+        buffer.append("[id:");
+        buffer.append(this.id);
+        buffer.append("][route:");
+        buffer.append(this.route);
+        buffer.append("][state:");
+        buffer.append(this.state);
+        buffer.append("]");
+        return buffer.toString();
+    }
+    
+}

Propchange: httpcomponents/asynchttpclient/trunk/src/main/java/org/apache/http/impl/nio/pool/PoolEntry.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: httpcomponents/asynchttpclient/trunk/src/main/java/org/apache/http/impl/nio/pool/PoolEntry.java
------------------------------------------------------------------------------
    svn:keywords = Date Author Id Revision HeadURL

Propchange: httpcomponents/asynchttpclient/trunk/src/main/java/org/apache/http/impl/nio/pool/PoolEntry.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Added: httpcomponents/asynchttpclient/trunk/src/main/java/org/apache/http/impl/nio/pool/PoolEntryCallback.java
URL: http://svn.apache.org/viewvc/httpcomponents/asynchttpclient/trunk/src/main/java/org/apache/http/impl/nio/pool/PoolEntryCallback.java?rev=814229&view=auto
==============================================================================
--- httpcomponents/asynchttpclient/trunk/src/main/java/org/apache/http/impl/nio/pool/PoolEntryCallback.java (added)
+++ httpcomponents/asynchttpclient/trunk/src/main/java/org/apache/http/impl/nio/pool/PoolEntryCallback.java Sat Sep 12 20:30:20 2009
@@ -0,0 +1,37 @@
+/*
+ * ====================================================================
+ * 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.pool;
+
+public interface PoolEntryCallback<T> {
+
+    void completed(PoolEntry<T> entry);
+    
+    void failed(Exception ex);
+    
+    void cancelled();
+    
+}

Propchange: httpcomponents/asynchttpclient/trunk/src/main/java/org/apache/http/impl/nio/pool/PoolEntryCallback.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: httpcomponents/asynchttpclient/trunk/src/main/java/org/apache/http/impl/nio/pool/PoolEntryCallback.java
------------------------------------------------------------------------------
    svn:keywords = Date Author Id Revision HeadURL

Propchange: httpcomponents/asynchttpclient/trunk/src/main/java/org/apache/http/impl/nio/pool/PoolEntryCallback.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain