UploadPackageClient.java

From AgileApps Support Wiki
import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.lang.reflect.InvocationTargetException;

import org.apache.commons.httpclient.DefaultHttpMethodRetryHandler;
import org.apache.commons.httpclient.HttpClient;
import org.apache.commons.httpclient.HttpException;
import org.apache.commons.httpclient.HttpStatus;
import org.apache.commons.httpclient.methods.PostMethod;
import org.apache.commons.httpclient.methods.RequestEntity;
import org.apache.commons.httpclient.methods.multipart.FilePart;
import org.apache.commons.httpclient.methods.multipart.MultipartRequestEntity;
import org.apache.commons.httpclient.methods.multipart.Part;
import org.apache.commons.httpclient.methods.multipart.StringPart;
import org.apache.commons.httpclient.params.HttpMethodParams;

public class UploadPackageClient 
{
  
  public static final String REST_SERVICE = 
    "https://{domainName}/networking/RESTService";
  public static final String USER_NAME = "jim@acme.com";
  public static final String PASSWORD = "jimacme";
  
  public static String login() throws Exception
  {
    String sessionId = null;
    StringBuilder loginRequestXML = 
      new StringBuilder("<?xml version=\"1.0\" ?>") 
            .append("    <longjump ver=\"2.0\">")
            .append("      <login_request>")   
            .append("        <login>").append(USER_NAME).append("</login>")   
            .append("        <password>").append(PASSWORD).append("</password>")
            .append("      </login_request>")
            .append("    </longjump>");
    
      // Create an instance of HttpClient.
      HttpClient client = new HttpClient();
      
      //Create GET method
      PostMethod method = new PostMethod(REST_SERVICE);
      
      //add to Request
      method.addParameter("xml_data", loginRequestXML.toString());

       // Provide custom retry handler (necessary)
      method.getParams().setParameter(HttpMethodParams.RETRY_HANDLER, 
          new DefaultHttpMethodRetryHandler(3, false));
      try 
      {
          // Execute the method.
          int statusCode = client.executeMethod(method);
          if (statusCode != HttpStatus.SC_OK) 
          {
            System.err.println("Method failed: " + method.getStatusLine());
          }
      
          // Read the response body.
          byte[] responseBody = method.getResponseBody();
          String file = new String(responseBody);
          int indexOfXMLStart = 
              file.indexOf("<?xml version=\"1.0\" encoding=\"UTF-8\"?>");
          int indexOfXMLEnd = file.indexOf("</longjump>");        
          String xmlPartOfResponse = 
              file.substring(indexOfXMLStart, indexOfXMLEnd + 11);
          
          if(xmlPartOfResponse.contains("<session_id>"))
          {
            int sessionIdBeginTagIndx = xmlPartOfResponse.indexOf("<session_id>");
            int sessionIdEndTagIndx = xmlPartOfResponse.indexOf("</session_id>") 
                                    + "</session_id>".length();
            
            sessionId = 
              (xmlPartOfResponse.substring(sessionIdBeginTagIndx, sessionIdEndTagIndx))
                  .replace("<session_id>", "")
                  .replace("</session_id>", "")
                  .trim();
          }
          else if (xmlPartOfResponse.contains("<error>"))
          {
            int messageBeginTagIndx = xmlPartOfResponse.indexOf("<message>");
            int messageEndTagIndx = xmlPartOfResponse.indexOf("</message>") 
                                  + "</message>".length();
            String message = 
              (xmlPartOfResponse.substring(messageBeginTagIndx, messageEndTagIndx))
                  .replace("<message>", "")
                  .replace("</message>", "")
                  .trim();
            throw new Exception(message);
          }          
      }
      catch (HttpException e) 
      {
          e.printStackTrace();
          throw new InvocationTargetException(e, 
              "Fatal protocol violation: " + e.getMessage());
    } 
      catch (IOException e) 
      {
          e.printStackTrace();
          throw new InvocationTargetException(e, 
              "Fatal transport error: " + e.getMessage());
    } 
      catch (Exception e)
      {
        e.printStackTrace();
        throw new InvocationTargetException(e, e.getMessage());
      }
      finally 
      {
          // Release the connection.
          method.releaseConnection();
          return sessionId;
      }
  }
  
  public static void pushPackageToRemoteServer(
      String userName, String password, 
      String url, String packageFileToUpload)
  {
    String sessionId = null;
    try
    {
      sessionId =login();
    }
    catch(Exception e)
    {
      System.out.println(e.getMessage());
    }
    
    File targetFile = new File(packageFileToUpload);    
    StringBuilder uploadPackageXML = 
      new StringBuilder("<?xml version=\"1.0\" ?>") 
            .append("  <longjump ver=\"2.0\">")
            .append("    <resource_upload_request>")
            .append("      <session_id>").append(sessionId).append("</session_id>")
            .append("        <type>upload_package</type>")
            .append("    </resource_upload_request>")
            .append("  </longjump>");
    
    // Create an instance of HttpClient.
    HttpClient client = new HttpClient();
      
    //Create GET method
    PostMethod method = new PostMethod(url);
      
    FilePart fp = null;
      
    StringPart sp = null;
      
    try 
    {
      fp = new FilePart(targetFile.getName(), targetFile);
    } 
      catch (FileNotFoundException e1) 
    {
      // TODO Auto-generated catch block
      System.out.println(e1.getMessage());
    }  
    sp= new StringPart("xml_data", uploadPackageXML.toString());
                
    //add to Request
    Part[] parts = {fp,sp};
      
    method.setRequestEntity(
      (RequestEntity)new MultipartRequestEntity(parts,method.getParams()));
      
      // Provide custom retry handler is necessary
      method.getParams().setParameter(HttpMethodParams.RETRY_HANDLER, 
          new DefaultHttpMethodRetryHandler(3, false));
      try 
      {
          // Execute the method.
          int statusCode = client.executeMethod(method);
          if (statusCode != HttpStatus.SC_OK) 
          {
            throw new Exception("Method failed: " + method.getStatusLine());
          }
      
          // Read the response body.
          byte[] responseBody = method.getResponseBody();
          String file = new String(responseBody);
          int indexOfXMLStart = 
              file.indexOf("<?xml version=\"1.0\" encoding=\"UTF-8\"?>");
          int indexOfXMLEnd = file.indexOf("</longjump>");
          String xmlPartOfResponse = 
              file.substring(indexOfXMLStart, indexOfXMLEnd + 11);
          
          int messageBeginTagIndx = xmlPartOfResponse.indexOf("<message>");
          int messageEndTagIndx = xmlPartOfResponse.indexOf("</message>") 
                                + "</message>".length();
          String message = 
            (xmlPartOfResponse.substring(messageBeginTagIndx, messageEndTagIndx))
                .replace("<message>", "")
                .replace("</message>", "")
                .trim();
          if(xmlPartOfResponse.contains("<success>"))
          {
            System.out.println(message);
          }
          else
          {
            throw new Exception(message);
          }
      }
      catch (HttpException e) 
      {
        System.out.println(e.getMessage());
      } 
      catch (IOException e) 
      {
        System.out.println(e.getMessage());
      } 
      catch (Exception e)
      {
        System.out.println(e.getMessage());
      }
      finally 
      {
          // Release the connection.
          method.releaseConnection();
      }
  }
  
  public static void main(String args[])
  {
    UploadPackageClient upc = new UploadPackageClient();
    String packageLocation ="C:\\myPackage.zip";
    try
    {
      upc.pushPackageToRemoteServer(USER_NAME, PASSWORD,
                                    REST_SERVICE,packageLocation);
      
    }
    catch(Exception e)
    {
      System.out.println(e.getMessage());
    }
  }
}