Author: olamy
Date: Fri Dec  9 23:32:13 2011
New Revision: 1212685

URL: http://svn.apache.org/viewvc?rev=1212685&view=rev
Log:
use asf httpclient and add preemptive support to avoid uploading twice
Modified:
    tomcat/maven-plugin/trunk/common-tomcat-maven-plugin/pom.xml
    
tomcat/maven-plugin/trunk/common-tomcat-maven-plugin/src/main/java/org/apache/tomcat/maven/common/deployer/TomcatManager.java

Modified: tomcat/maven-plugin/trunk/common-tomcat-maven-plugin/pom.xml
URL: 
http://svn.apache.org/viewvc/tomcat/maven-plugin/trunk/common-tomcat-maven-plugin/pom.xml?rev=1212685&r1=1212684&r2=1212685&view=diff
==============================================================================
--- tomcat/maven-plugin/trunk/common-tomcat-maven-plugin/pom.xml (original)
+++ tomcat/maven-plugin/trunk/common-tomcat-maven-plugin/pom.xml Fri Dec  9 
23:32:13 2011
@@ -66,6 +66,11 @@
     </dependency>
 
     <dependency>
+      <groupId>org.apache.httpcomponents</groupId>
+      <artifactId>httpclient</artifactId>
+    </dependency>
+
+    <dependency>
       <groupId>org.apache.tomcat</groupId>
       <artifactId>tomcat-catalina</artifactId>
       <version>7.0.22</version>

Modified: 
tomcat/maven-plugin/trunk/common-tomcat-maven-plugin/src/main/java/org/apache/tomcat/maven/common/deployer/TomcatManager.java
URL: 
http://svn.apache.org/viewvc/tomcat/maven-plugin/trunk/common-tomcat-maven-plugin/src/main/java/org/apache/tomcat/maven/common/deployer/TomcatManager.java?rev=1212685&r1=1212684&r2=1212685&view=diff
==============================================================================
--- 
tomcat/maven-plugin/trunk/common-tomcat-maven-plugin/src/main/java/org/apache/tomcat/maven/common/deployer/TomcatManager.java
 (original)
+++ 
tomcat/maven-plugin/trunk/common-tomcat-maven-plugin/src/main/java/org/apache/tomcat/maven/common/deployer/TomcatManager.java
 Fri Dec  9 23:32:13 2011
@@ -20,22 +20,35 @@ package org.apache.tomcat.maven.common.d
  */
 
 import org.apache.commons.codec.binary.Base64;
+import org.apache.commons.io.IOUtils;
+import org.apache.commons.lang.StringUtils;
+import org.apache.http.HttpHost;
+import org.apache.http.HttpResponse;
+import org.apache.http.auth.AuthScope;
+import org.apache.http.auth.Credentials;
+import org.apache.http.auth.UsernamePasswordCredentials;
+import org.apache.http.client.AuthCache;
+import org.apache.http.client.methods.HttpGet;
+import org.apache.http.client.methods.HttpPut;
+import org.apache.http.client.methods.HttpRequestBase;
+import org.apache.http.client.protocol.ClientContext;
+import org.apache.http.entity.AbstractHttpEntity;
+import org.apache.http.impl.auth.BasicScheme;
+import org.apache.http.impl.client.BasicAuthCache;
+import org.apache.http.impl.client.DefaultHttpClient;
+import org.apache.http.impl.conn.BasicClientConnectionManager;
+import org.apache.http.protocol.BasicHttpContext;
 
-import java.io.BufferedOutputStream;
 import java.io.IOException;
 import java.io.InputStream;
-import java.io.InputStreamReader;
 import java.io.OutputStream;
-import java.net.HttpURLConnection;
 import java.net.URL;
 import java.net.URLEncoder;
 
 /**
  * FIXME http connection tru a proxy
- * FIXME preemptive support
- * FIXME move to ASF httpclient ?
  * A Tomcat manager webapp invocation wrapper.
- * 
+ *
  * @author Mark Hobson <markhob...@gmail.com>
  * @version $Id: TomcatManager.java 12852 2010-10-12 22:04:32Z thragor $
  */
@@ -79,6 +92,10 @@ public class TomcatManager
      */
     private String userAgent;
 
+    private DefaultHttpClient httpClient;
+
+    private BasicHttpContext localContext;
+
     // ----------------------------------------------------------------------
     // Constructors
     // ----------------------------------------------------------------------
@@ -86,7 +103,7 @@ public class TomcatManager
     /**
      * Creates a Tomcat manager wrapper for the specified URL that uses a 
username of <code>admin</code>, an empty
      * password and ISO-8859-1 URL encoding.
-     * 
+     *
      * @param url the full URL of the Tomcat manager instance to use
      */
     public TomcatManager( URL url )
@@ -97,8 +114,8 @@ public class TomcatManager
     /**
      * Creates a Tomcat manager wrapper for the specified URL and username 
that uses an empty password and ISO-8859-1
      * URL encoding.
-     * 
-     * @param url the full URL of the Tomcat manager instance to use
+     *
+     * @param url      the full URL of the Tomcat manager instance to use
      * @param username the username to use when authenticating with Tomcat 
manager
      */
     public TomcatManager( URL url, String username )
@@ -108,8 +125,8 @@ public class TomcatManager
 
     /**
      * Creates a Tomcat manager wrapper for the specified URL, username and 
password that uses ISO-8859-1 URL encoding.
-     * 
-     * @param url the full URL of the Tomcat manager instance to use
+     *
+     * @param url      the full URL of the Tomcat manager instance to use
      * @param username the username to use when authenticating with Tomcat 
manager
      * @param password the password to use when authenticating with Tomcat 
manager
      */
@@ -118,13 +135,14 @@ public class TomcatManager
         this( url, username, password, "ISO-8859-1" );
     }
 
+
     /**
      * Creates a Tomcat manager wrapper for the specified URL, username, 
password and URL encoding.
-     * 
-     * @param url the full URL of the Tomcat manager instance to use
+     *
+     * @param url      the full URL of the Tomcat manager instance to use
      * @param username the username to use when authenticating with Tomcat 
manager
      * @param password the password to use when authenticating with Tomcat 
manager
-     * @param charset the URL encoding charset to use when communicating with 
Tomcat manager
+     * @param charset  the URL encoding charset to use when communicating with 
Tomcat manager
      */
     public TomcatManager( URL url, String username, String password, String 
charset )
     {
@@ -132,6 +150,25 @@ public class TomcatManager
         this.username = username;
         this.password = password;
         this.charset = charset;
+
+        this.httpClient = new DefaultHttpClient( new 
BasicClientConnectionManager() );
+        if ( StringUtils.isNotEmpty( username ) && StringUtils.isNotEmpty( 
password ) )
+        {
+            Credentials creds = new UsernamePasswordCredentials( username, 
password );
+
+            String host = url.getHost();
+            int port = url.getPort() > -1 ? url.getPort() : AuthScope.ANY_PORT;
+
+            httpClient.getCredentialsProvider().setCredentials( new AuthScope( 
host, port ), creds );
+
+            AuthCache authCache = new BasicAuthCache();
+            BasicScheme basicAuth = new BasicScheme();
+            HttpHost targetHost = new HttpHost( url.getHost(), url.getPort(), 
url.getProtocol() );
+            authCache.put( targetHost, basicAuth );
+
+            localContext = new BasicHttpContext();
+            localContext.setAttribute( ClientContext.AUTH_CACHE, authCache );
+        }
     }
 
     // ----------------------------------------------------------------------
@@ -140,7 +177,7 @@ public class TomcatManager
 
     /**
      * Gets the full URL of the Tomcat manager instance.
-     * 
+     *
      * @return the full URL of the Tomcat manager instance
      */
     public URL getURL()
@@ -150,7 +187,7 @@ public class TomcatManager
 
     /**
      * Gets the username to use when authenticating with Tomcat manager.
-     * 
+     *
      * @return the username to use when authenticating with Tomcat manager
      */
     public String getUserName()
@@ -160,7 +197,7 @@ public class TomcatManager
 
     /**
      * Gets the password to use when authenticating with Tomcat manager.
-     * 
+     *
      * @return the password to use when authenticating with Tomcat manager
      */
     public String getPassword()
@@ -170,7 +207,7 @@ public class TomcatManager
 
     /**
      * Gets the URL encoding charset to use when communicating with Tomcat 
manager.
-     * 
+     *
      * @return the URL encoding charset to use when communicating with Tomcat 
manager
      */
     public String getCharset()
@@ -180,7 +217,7 @@ public class TomcatManager
 
     /**
      * Gets the user agent name to use when communicating with Tomcat manager.
-     * 
+     *
      * @return the user agent name to use when communicating with Tomcat 
manager
      */
     public String getUserAgent()
@@ -190,7 +227,7 @@ public class TomcatManager
 
     /**
      * Sets the user agent name to use when communicating with Tomcat manager.
-     * 
+     *
      * @param userAgent the user agent name to use when communicating with 
Tomcat manager
      */
     public void setUserAgent( String userAgent )
@@ -200,12 +237,12 @@ public class TomcatManager
 
     /**
      * Deploys the specified WAR as a URL to the specified context path.
-     * 
+     *
      * @param path the webapp context path to deploy to
-     * @param war the URL of the WAR to deploy
+     * @param war  the URL of the WAR to deploy
      * @return the Tomcat manager response
      * @throws TomcatManagerException if the Tomcat manager request fails
-     * @throws IOException if an i/o error occurs
+     * @throws IOException            if an i/o error occurs
      */
     public String deploy( String path, URL war )
         throws TomcatManagerException, IOException
@@ -216,13 +253,13 @@ public class TomcatManager
     /**
      * Deploys the specified WAR as a URL to the specified context path, 
optionally undeploying the webapp if it already
      * exists.
-     * 
-     * @param path the webapp context path to deploy to
-     * @param war the URL of the WAR to deploy
+     *
+     * @param path   the webapp context path to deploy to
+     * @param war    the URL of the WAR to deploy
      * @param update whether to first undeploy the webapp if it already exists
      * @return the Tomcat manager response
      * @throws TomcatManagerException if the Tomcat manager request fails
-     * @throws IOException if an i/o error occurs
+     * @throws IOException            if an i/o error occurs
      */
     public String deploy( String path, URL war, boolean update )
         throws TomcatManagerException, IOException
@@ -233,14 +270,14 @@ public class TomcatManager
     /**
      * Deploys the specified WAR as a URL to the specified context path, 
optionally undeploying the webapp if it already
      * exists and using the specified tag name.
-     * 
-     * @param path the webapp context path to deploy to
-     * @param war the URL of the WAR to deploy
+     *
+     * @param path   the webapp context path to deploy to
+     * @param war    the URL of the WAR to deploy
      * @param update whether to first undeploy the webapp if it already exists
-     * @param tag the tag name to use
+     * @param tag    the tag name to use
      * @return the Tomcat manager response
      * @throws TomcatManagerException if the Tomcat manager request fails
-     * @throws IOException if an i/o error occurs
+     * @throws IOException            if an i/o error occurs
      */
     public String deploy( String path, URL war, boolean update, String tag )
         throws TomcatManagerException, IOException
@@ -250,12 +287,12 @@ public class TomcatManager
 
     /**
      * Deploys the specified WAR as a HTTP PUT to the specified context path.
-     * 
+     *
      * @param path the webapp context path to deploy to
-     * @param war an input stream to the WAR to deploy
+     * @param war  an input stream to the WAR to deploy
      * @return the Tomcat manager response
      * @throws TomcatManagerException if the Tomcat manager request fails
-     * @throws IOException if an i/o error occurs
+     * @throws IOException            if an i/o error occurs
      */
     public String deploy( String path, InputStream war )
         throws TomcatManagerException, IOException
@@ -266,13 +303,13 @@ public class TomcatManager
     /**
      * Deploys the specified WAR as a HTTP PUT to the specified context path, 
optionally undeploying the webapp if it
      * already exists.
-     * 
-     * @param path the webapp context path to deploy to
-     * @param war an input stream to the WAR to deploy
+     *
+     * @param path   the webapp context path to deploy to
+     * @param war    an input stream to the WAR to deploy
      * @param update whether to first undeploy the webapp if it already exists
      * @return the Tomcat manager response
      * @throws TomcatManagerException if the Tomcat manager request fails
-     * @throws IOException if an i/o error occurs
+     * @throws IOException            if an i/o error occurs
      */
     public String deploy( String path, InputStream war, boolean update )
         throws TomcatManagerException, IOException
@@ -283,14 +320,14 @@ public class TomcatManager
     /**
      * Deploys the specified WAR as a HTTP PUT to the specified context path, 
optionally undeploying the webapp if it
      * already exists and using the specified tag name.
-     * 
-     * @param path the webapp context path to deploy to
-     * @param war an input stream to the WAR to deploy
+     *
+     * @param path   the webapp context path to deploy to
+     * @param war    an input stream to the WAR to deploy
      * @param update whether to first undeploy the webapp if it already exists
-     * @param tag the tag name to use
+     * @param tag    the tag name to use
      * @return the Tomcat manager response
      * @throws TomcatManagerException if the Tomcat manager request fails
-     * @throws IOException if an i/o error occurs
+     * @throws IOException            if an i/o error occurs
      */
     public String deploy( String path, InputStream war, boolean update, String 
tag )
         throws TomcatManagerException, IOException
@@ -300,12 +337,12 @@ public class TomcatManager
 
     /**
      * Deploys the specified context XML configuration to the specified 
context path.
-     * 
-     * @param path the webapp context path to deploy to
+     *
+     * @param path   the webapp context path to deploy to
      * @param config the URL of the context XML configuration to deploy
      * @return the Tomcat manager response
      * @throws TomcatManagerException if the Tomcat manager request fails
-     * @throws IOException if an i/o error occurs
+     * @throws IOException            if an i/o error occurs
      */
     public String deployContext( String path, URL config )
         throws TomcatManagerException, IOException
@@ -316,13 +353,13 @@ public class TomcatManager
     /**
      * Deploys the specified context XML configuration to the specified 
context path, optionally undeploying the webapp
      * if it already exists.
-     * 
-     * @param path the webapp context path to deploy to
+     *
+     * @param path   the webapp context path to deploy to
      * @param config the URL of the context XML configuration to deploy
      * @param update whether to first undeploy the webapp if it already exists
      * @return the Tomcat manager response
      * @throws TomcatManagerException if the Tomcat manager request fails
-     * @throws IOException if an i/o error occurs
+     * @throws IOException            if an i/o error occurs
      */
     public String deployContext( String path, URL config, boolean update )
         throws TomcatManagerException, IOException
@@ -333,14 +370,14 @@ public class TomcatManager
     /**
      * Deploys the specified context XML configuration to the specified 
context path, optionally undeploying the webapp
      * if it already exists and using the specified tag name.
-     * 
-     * @param path the webapp context path to deploy to
+     *
+     * @param path   the webapp context path to deploy to
      * @param config the URL of the context XML configuration to deploy
      * @param update whether to first undeploy the webapp if it already exists
-     * @param tag the tag name to use
+     * @param tag    the tag name to use
      * @return the Tomcat manager response
      * @throws TomcatManagerException if the Tomcat manager request fails
-     * @throws IOException if an i/o error occurs
+     * @throws IOException            if an i/o error occurs
      */
     public String deployContext( String path, URL config, boolean update, 
String tag )
         throws TomcatManagerException, IOException
@@ -350,13 +387,13 @@ public class TomcatManager
 
     /**
      * Deploys the specified context XML configuration and WAR as a URL to the 
specified context path.
-     * 
-     * @param path the webapp context path to deploy to
+     *
+     * @param path   the webapp context path to deploy to
      * @param config the URL of the context XML configuration to deploy
-     * @param war the URL of the WAR to deploy
+     * @param war    the URL of the WAR to deploy
      * @return the Tomcat manager response
      * @throws TomcatManagerException if the Tomcat manager request fails
-     * @throws IOException if an i/o error occurs
+     * @throws IOException            if an i/o error occurs
      */
     public String deployContext( String path, URL config, URL war )
         throws TomcatManagerException, IOException
@@ -367,14 +404,14 @@ public class TomcatManager
     /**
      * Deploys the specified context XML configuration and WAR as a URL to the 
specified context path, optionally
      * undeploying the webapp if it already exists.
-     * 
-     * @param path the webapp context path to deploy to
+     *
+     * @param path   the webapp context path to deploy to
      * @param config the URL of the context XML configuration to deploy
-     * @param war the URL of the WAR to deploy
+     * @param war    the URL of the WAR to deploy
      * @param update whether to first undeploy the webapp if it already exists
      * @return the Tomcat manager response
      * @throws TomcatManagerException if the Tomcat manager request fails
-     * @throws IOException if an i/o error occurs
+     * @throws IOException            if an i/o error occurs
      */
     public String deployContext( String path, URL config, URL war, boolean 
update )
         throws TomcatManagerException, IOException
@@ -385,15 +422,15 @@ public class TomcatManager
     /**
      * Deploys the specified context XML configuration and WAR as a URL to the 
specified context path, optionally
      * undeploying the webapp if it already exists and using the specified tag 
name.
-     * 
-     * @param path the webapp context path to deploy to
+     *
+     * @param path   the webapp context path to deploy to
      * @param config the URL of the context XML configuration to deploy
-     * @param war the URL of the WAR to deploy
+     * @param war    the URL of the WAR to deploy
      * @param update whether to first undeploy the webapp if it already exists
-     * @param tag the tag name to use
+     * @param tag    the tag name to use
      * @return the Tomcat manager response
      * @throws TomcatManagerException if the Tomcat manager request fails
-     * @throws IOException if an i/o error occurs
+     * @throws IOException            if an i/o error occurs
      */
     public String deployContext( String path, URL config, URL war, boolean 
update, String tag )
         throws TomcatManagerException, IOException
@@ -403,11 +440,11 @@ public class TomcatManager
 
     /**
      * Undeploys the webapp at the specified context path.
-     * 
+     *
      * @param path the webapp context path to undeploy
      * @return the Tomcat manager response
      * @throws TomcatManagerException if the Tomcat manager request fails
-     * @throws IOException if an i/o error occurs
+     * @throws IOException            if an i/o error occurs
      */
     public String undeploy( String path )
         throws TomcatManagerException, IOException
@@ -417,11 +454,11 @@ public class TomcatManager
 
     /**
      * Reloads the webapp at the specified context path.
-     * 
+     *
      * @param path the webapp context path to reload
      * @return the Tomcat manager response
      * @throws TomcatManagerException if the Tomcat manager request fails
-     * @throws IOException if an i/o error occurs
+     * @throws IOException            if an i/o error occurs
      */
     public String reload( String path )
         throws TomcatManagerException, IOException
@@ -431,11 +468,11 @@ public class TomcatManager
 
     /**
      * Starts the webapp at the specified context path.
-     * 
+     *
      * @param path the webapp context path to start
      * @return the Tomcat manager response
      * @throws TomcatManagerException if the Tomcat manager request fails
-     * @throws IOException if an i/o error occurs
+     * @throws IOException            if an i/o error occurs
      */
     public String start( String path )
         throws TomcatManagerException, IOException
@@ -445,11 +482,11 @@ public class TomcatManager
 
     /**
      * Stops the webapp at the specified context path.
-     * 
+     *
      * @param path the webapp context path to stop
      * @return the Tomcat manager response
      * @throws TomcatManagerException if the Tomcat manager request fails
-     * @throws IOException if an i/o error occurs
+     * @throws IOException            if an i/o error occurs
      */
     public String stop( String path )
         throws TomcatManagerException, IOException
@@ -459,10 +496,10 @@ public class TomcatManager
 
     /**
      * Lists all the currently deployed web applications.
-     * 
+     *
      * @return the list of currently deployed applications
      * @throws TomcatManagerException if the Tomcat manager request fails
-     * @throws IOException if an i/o error occurs
+     * @throws IOException            if an i/o error occurs
      */
     public String list()
         throws TomcatManagerException, IOException
@@ -472,10 +509,10 @@ public class TomcatManager
 
     /**
      * Lists information about the Tomcat version, OS, and JVM properties.
-     * 
+     *
      * @return the server information
      * @throws TomcatManagerException if the Tomcat manager request fails
-     * @throws IOException if an i/o error occurs
+     * @throws IOException            if an i/o error occurs
      */
     public String getServerInfo()
         throws TomcatManagerException, IOException
@@ -485,10 +522,10 @@ public class TomcatManager
 
     /**
      * Lists all of the global JNDI resources.
-     * 
+     *
      * @return the list of all global JNDI resources
      * @throws TomcatManagerException if the Tomcat manager request fails
-     * @throws IOException if an i/o error occurs
+     * @throws IOException            if an i/o error occurs
      */
     public String getResources()
         throws TomcatManagerException, IOException
@@ -498,11 +535,11 @@ public class TomcatManager
 
     /**
      * Lists the global JNDI resources of the given type.
-     * 
+     *
      * @param type the class name of the resources to list, or 
<code>null</code> for all
      * @return the list of global JNDI resources of the given type
      * @throws TomcatManagerException if the Tomcat manager request fails
-     * @throws IOException if an i/o error occurs
+     * @throws IOException            if an i/o error occurs
      */
     public String getResources( String type )
         throws TomcatManagerException, IOException
@@ -519,10 +556,10 @@ public class TomcatManager
 
     /**
      * Lists the security role names and corresponding descriptions that are 
available.
-     * 
+     *
      * @return the list of security role names and corresponding descriptions
      * @throws TomcatManagerException if the Tomcat manager request fails
-     * @throws IOException if an i/o error occurs
+     * @throws IOException            if an i/o error occurs
      */
     public String getRoles()
         throws TomcatManagerException, IOException
@@ -532,11 +569,11 @@ public class TomcatManager
 
     /**
      * Lists the default session timeout and the number of currently active 
sessions for the given context path.
-     * 
+     *
      * @param path the context path to list session information for
      * @return the default session timeout and the number of currently active 
sessions
      * @throws TomcatManagerException if the Tomcat manager request fails
-     * @throws IOException if an i/o error occurs
+     * @throws IOException            if an i/o error occurs
      */
     public String getSessions( String path )
         throws TomcatManagerException, IOException
@@ -550,11 +587,11 @@ public class TomcatManager
 
     /**
      * Invokes Tomcat manager with the specified command.
-     * 
+     *
      * @param path the Tomcat manager command to invoke
      * @return the Tomcat manager response
      * @throws TomcatManagerException if the Tomcat manager request fails
-     * @throws IOException if an i/o error occurs
+     * @throws IOException            if an i/o error occurs
      */
     protected String invoke( String path )
         throws TomcatManagerException, IOException
@@ -562,57 +599,6 @@ public class TomcatManager
         return invoke( path, null );
     }
 
-    /**
-     * Invokes Tomcat manager with the specified command and content data.
-     * 
-     * @param path the Tomcat manager command to invoke
-     * @param data an input stream to the content data
-     * @return the Tomcat manager response
-     * @throws TomcatManagerException if the Tomcat manager request fails
-     * @throws IOException if an i/o error occurs
-     */
-    protected String invoke( String path, InputStream data )
-        throws TomcatManagerException, IOException
-    {
-        HttpURLConnection connection = (HttpURLConnection) new URL( url + path 
).openConnection();
-        connection.setAllowUserInteraction( false );
-        connection.setDoInput( true );
-        connection.setUseCaches( false );
-
-        if ( data == null )
-        {
-            connection.setDoOutput( false );
-            connection.setRequestMethod( "GET" );
-        }
-        else
-        {
-            connection.setDoOutput( true );
-            connection.setRequestMethod( "PUT" );
-            connection.setRequestProperty( "Content-Type", 
"application/octet-stream" );
-        }
-
-        if ( userAgent != null )
-        {
-            connection.setRequestProperty( "User-Agent", userAgent );
-        }
-        connection.setRequestProperty( "Authorization", toAuthorization( 
username, password ) );
-
-        connection.connect();
-
-        if ( data != null )
-        {
-            pipe( data, connection.getOutputStream() );
-        }
-
-        String response = toString( connection.getInputStream(), 
MANAGER_CHARSET );
-
-        if ( !response.startsWith( "OK -" ) )
-        {
-            throw new TomcatManagerException( response );
-        }
-
-        return response;
-    }
 
     // ----------------------------------------------------------------------
     // Private Methods
@@ -620,16 +606,16 @@ public class TomcatManager
 
     /**
      * Deploys the specified WAR.
-     * 
-     * @param path the webapp context path to deploy to
+     *
+     * @param path   the webapp context path to deploy to
      * @param config the URL of the context XML configuration to deploy, or 
null for none
-     * @param war the URL of the WAR to deploy, or null to use 
<code>data</code>
-     * @param data an input stream to the WAR to deploy, or null to use 
<code>war</code>
+     * @param war    the URL of the WAR to deploy, or null to use 
<code>data</code>
+     * @param data   an input stream to the WAR to deploy, or null to use 
<code>war</code>
      * @param update whether to first undeploy the webapp if it already exists
-     * @param tag the tag name to use
+     * @param tag    the tag name to use
      * @return the Tomcat manager response
      * @throws TomcatManagerException if the Tomcat manager request fails
-     * @throws IOException if an i/o error occurs
+     * @throws IOException            if an i/o error occurs
      */
     private String deployImpl( String path, URL config, URL war, InputStream 
data, boolean update, String tag )
         throws TomcatManagerException, IOException
@@ -660,9 +646,50 @@ public class TomcatManager
         return invoke( buffer.toString(), data );
     }
 
+
+/**
+     * Invokes Tomcat manager with the specified command and content data.
+     *
+     * @param path the Tomcat manager command to invoke
+     * @param data an input stream to the content data
+     * @return the Tomcat manager response
+     * @throws TomcatManagerException if the Tomcat manager request fails
+     * @throws IOException            if an i/o error occurs
+     */
+    protected String invoke( String path, InputStream data )
+        throws TomcatManagerException, IOException
+    {
+
+        HttpRequestBase httpRequestBase = null;
+        if ( data == null )
+        {
+            httpRequestBase = new HttpGet( url + path );
+        }
+        else
+        {
+            HttpPut httpPut = new HttpPut( url + path );
+
+            httpPut.setEntity( new RequestEntityImplementation( data, -1 ) );
+
+            httpRequestBase = httpPut;
+
+        }
+
+        if ( userAgent != null )
+        {
+            httpRequestBase.setHeader( "User-Agent", userAgent );
+        }
+
+        HttpResponse response = httpClient.execute( httpRequestBase, 
localContext );
+        // FIXME take care of statuscode and reasonphase
+        return IOUtils.toString( response.getEntity().getContent() );
+    }
+
+
+
     /**
      * Gets the HTTP Basic Authorization header value for the supplied 
username and password.
-     * 
+     *
      * @param username the username to use for authentication
      * @param password the password to use for authentication
      * @return the HTTP Basic Authorization header value
@@ -678,50 +705,89 @@ public class TomcatManager
         return "Basic " + new String( Base64.encodeBase64( 
buffer.toString().getBytes() ) );
     }
 
-    /**
-     * Reads all the data from the specified input stream and writes it to the 
specified output stream. Both streams are
-     * also closed.
-     * 
-     * @param in the input stream to read from
-     * @param out the output stream to write to
-     * @throws IOException if an i/o error occurs
-     */
-    private void pipe( InputStream in, OutputStream out )
-        throws IOException
+    private final class RequestEntityImplementation
+        extends AbstractHttpEntity
     {
-        out = new BufferedOutputStream( out );
-        int n;
-        byte[] bytes = new byte[1024 * 4];
-        while ( ( n = in.read( bytes ) ) != -1 )
+
+        private final static int BUFFER_SIZE = 2048;
+
+        private InputStream stream;
+
+        private long length = -1;
+
+        private RequestEntityImplementation( final InputStream stream, long 
length )
         {
-            out.write( bytes, 0, n );
+            this.stream = stream;
+            this.length = length;
         }
-        out.flush();
-        out.close();
-        in.close();
-    }
 
-    /**
-     * Gets the data from the specified input stream as a string using the 
specified charset.
-     * 
-     * @param in the input stream to read from
-     * @param charset the charset to use when constructing the string
-     * @return a string representation of the data read from the input stream
-     * @throws IOException if an i/o error occurs
-     */
-    private String toString( InputStream in, String charset )
-        throws IOException
-    {
-        InputStreamReader reader = new InputStreamReader( in, charset );
+        public long getContentLength()
+        {
+            return length >= 0 ? length : -1;
+        }
 
-        StringBuffer buffer = new StringBuffer();
-        char[] chars = new char[1024];
-        int n;
-        while ( ( n = reader.read( chars, 0, chars.length ) ) != -1 )
+
+        public InputStream getContent()
+            throws IOException, IllegalStateException
+        {
+            return this.stream;
+        }
+
+        public boolean isRepeatable()
         {
-            buffer.append( chars, 0, n );
+            return false;
         }
 
-        return buffer.toString();
+
+        public void writeTo( final OutputStream outstream )
+            throws IOException
+        {
+            if ( outstream == null )
+            {
+                throw new IllegalArgumentException( "Output stream may not be 
null" );
+            }
+
+            try
+            {
+                byte[] buffer = new byte[BUFFER_SIZE];
+                int l;
+                if ( this.length < 0 )
+                {
+                    // until EOF
+                    while ( ( l = stream.read( buffer ) ) != -1 )
+                    {
+                        //fireTransferProgress( transferEvent, buffer, -1 );
+                        outstream.write( buffer, 0, l );
+                    }
+                }
+                else
+                {
+                    // no need to consume more than length
+                    long remaining = this.length;
+                    while ( remaining > 0 )
+                    {
+                        l = stream.read( buffer, 0, (int) Math.min( 
BUFFER_SIZE, remaining ) );
+                        if ( l == -1 )
+                        {
+                            break;
+                        }
+                        //fireTransferProgress( transferEvent, buffer, (int) 
Math.min( BUFFER_SIZE, remaining ) );
+                        outstream.write( buffer, 0, l );
+                        remaining -= l;
+                    }
+                }
+            }
+            finally
+            {
+                stream.close();
+            }
+        }
+
+        public boolean isStreaming()
+        {
+            return true;
+        }
+
+
     }
 }



---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscr...@tomcat.apache.org
For additional commands, e-mail: dev-h...@tomcat.apache.org

Reply via email to