incubator-libcloud mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Paul Querna <p...@querna.org>
Subject [libcloud] Re: svn commit: r997113 [1/2] - in /incubator/libcloud/sandbox/java/trunk/src: ./ base/ base/connection/ base/interfaces/ libcloud/ libcloud/data/ libcloud/exceptions/ libcloud/interfaces/ libcloud/providers/ libcloud/providers/amazon/ libcloud/provi
Date Tue, 14 Sep 2010 22:01:23 GMT
Please make smaller incremental commits, its hard to follow everything
going on like this, and its impossible for the wider community to
become involved with code dumps.

Thanks,

Paul


On Tue, Sep 14, 2010 at 2:57 PM,  <woodser@apache.org> wrote:
> Author: woodser
> Date: Tue Sep 14 21:57:01 2010
> New Revision: 997113
>
> URL: http://svn.apache.org/viewvc?rev=997113&view=rev
> Log:
> - Rackspace driver added.
> - Refactored structure for simplecloud.
> - Miscellaneous fixes & enhancements.
>
> Added:
>    incubator/libcloud/sandbox/java/trunk/src/Example.java
>    incubator/libcloud/sandbox/java/trunk/src/base/
>    incubator/libcloud/sandbox/java/trunk/src/base/Driver.java
>    incubator/libcloud/sandbox/java/trunk/src/base/connection/
>    incubator/libcloud/sandbox/java/trunk/src/base/connection/ConnectionKey.java   (with props)
>    incubator/libcloud/sandbox/java/trunk/src/base/connection/ConnectionUserAndKey.java   (with props)
>    incubator/libcloud/sandbox/java/trunk/src/base/connection/LoggingConnection.java   (with props)
>    incubator/libcloud/sandbox/java/trunk/src/base/connection/LoggingConnectionUserAndKey.java   (with props)
>    incubator/libcloud/sandbox/java/trunk/src/base/connection/Response.java   (with props)
>    incubator/libcloud/sandbox/java/trunk/src/base/connection/ResponseHandler.java   (with props)
>    incubator/libcloud/sandbox/java/trunk/src/base/interfaces/
>    incubator/libcloud/sandbox/java/trunk/src/base/interfaces/IConnection.java   (with props)
>    incubator/libcloud/sandbox/java/trunk/src/base/interfaces/IResponse.java   (with props)
>    incubator/libcloud/sandbox/java/trunk/src/libcloud/
>    incubator/libcloud/sandbox/java/trunk/src/libcloud/DriverFactory.java   (with props)
>    incubator/libcloud/sandbox/java/trunk/src/libcloud/NodeDriver.java   (with props)
>    incubator/libcloud/sandbox/java/trunk/src/libcloud/data/
>    incubator/libcloud/sandbox/java/trunk/src/libcloud/data/Node.java   (with props)
>    incubator/libcloud/sandbox/java/trunk/src/libcloud/data/NodeAuth.java   (with props)
>    incubator/libcloud/sandbox/java/trunk/src/libcloud/data/NodeImage.java   (with props)
>    incubator/libcloud/sandbox/java/trunk/src/libcloud/data/NodeLocation.java   (with props)
>    incubator/libcloud/sandbox/java/trunk/src/libcloud/data/NodeSize.java   (with props)
>    incubator/libcloud/sandbox/java/trunk/src/libcloud/data/NodeState.java   (with props)
>    incubator/libcloud/sandbox/java/trunk/src/libcloud/exceptions/
>    incubator/libcloud/sandbox/java/trunk/src/libcloud/exceptions/InvalidCredsException.java   (with props)
>    incubator/libcloud/sandbox/java/trunk/src/libcloud/interfaces/
>    incubator/libcloud/sandbox/java/trunk/src/libcloud/interfaces/INode.java   (with props)
>    incubator/libcloud/sandbox/java/trunk/src/libcloud/interfaces/INodeDriver.java   (with props)
>    incubator/libcloud/sandbox/java/trunk/src/libcloud/providers/
>    incubator/libcloud/sandbox/java/trunk/src/libcloud/providers/amazon/
>    incubator/libcloud/sandbox/java/trunk/src/libcloud/providers/amazon/EC2APSEDriver.java
>    incubator/libcloud/sandbox/java/trunk/src/libcloud/providers/amazon/EC2Connection.java
>    incubator/libcloud/sandbox/java/trunk/src/libcloud/providers/amazon/EC2Driver.java
>    incubator/libcloud/sandbox/java/trunk/src/libcloud/providers/amazon/EC2EUWestDriver.java
>    incubator/libcloud/sandbox/java/trunk/src/libcloud/providers/amazon/EC2Handler.java
>    incubator/libcloud/sandbox/java/trunk/src/libcloud/providers/amazon/EC2USEastDriver.java
>    incubator/libcloud/sandbox/java/trunk/src/libcloud/providers/amazon/EC2USWestDriver.java
>    incubator/libcloud/sandbox/java/trunk/src/libcloud/providers/ibm/
>    incubator/libcloud/sandbox/java/trunk/src/libcloud/providers/ibm/IBMConnection.java   (with props)
>    incubator/libcloud/sandbox/java/trunk/src/libcloud/providers/ibm/IBMDriver.java   (with props)
>    incubator/libcloud/sandbox/java/trunk/src/libcloud/providers/ibm/IBMHandler.java   (with props)
>    incubator/libcloud/sandbox/java/trunk/src/libcloud/providers/rackspace/
>    incubator/libcloud/sandbox/java/trunk/src/libcloud/providers/rackspace/RackspaceConnection.java   (with props)
>    incubator/libcloud/sandbox/java/trunk/src/libcloud/providers/rackspace/RackspaceDriver.java   (with props)
>    incubator/libcloud/sandbox/java/trunk/src/libcloud/providers/rackspace/RackspaceHandler.java   (with props)
>    incubator/libcloud/sandbox/java/trunk/src/simplecloud/
>    incubator/libcloud/sandbox/java/trunk/src/simplecloud/document/
>    incubator/libcloud/sandbox/java/trunk/src/simplecloud/queue/
>    incubator/libcloud/sandbox/java/trunk/src/simplecloud/storage/
>    incubator/libcloud/sandbox/java/trunk/src/simplecloud/storage/StorageAdapter.java
>    incubator/libcloud/sandbox/java/trunk/src/simplecloud/storage/StorageFactory.java
>    incubator/libcloud/sandbox/java/trunk/src/simplecloud/storage/data/
>    incubator/libcloud/sandbox/java/trunk/src/simplecloud/storage/data/File.java
>    incubator/libcloud/sandbox/java/trunk/src/simplecloud/storage/data/Folder.java
>    incubator/libcloud/sandbox/java/trunk/src/simplecloud/storage/data/Item.java
>    incubator/libcloud/sandbox/java/trunk/src/simplecloud/storage/exceptions/
>    incubator/libcloud/sandbox/java/trunk/src/simplecloud/storage/exceptions/StorageException.java
>    incubator/libcloud/sandbox/java/trunk/src/simplecloud/storage/interfaces/
>    incubator/libcloud/sandbox/java/trunk/src/simplecloud/storage/interfaces/IStorageAdapter.java
>    incubator/libcloud/sandbox/java/trunk/src/simplecloud/storage/providers/
>    incubator/libcloud/sandbox/java/trunk/src/simplecloud/storage/providers/amazon/
>    incubator/libcloud/sandbox/java/trunk/src/simplecloud/storage/providers/amazon/Main.java
>    incubator/libcloud/sandbox/java/trunk/src/simplecloud/storage/providers/amazon/S3Adapter.java
>    incubator/libcloud/sandbox/java/trunk/src/simplecloud/storage/providers/amazon/S3Connection.java
>    incubator/libcloud/sandbox/java/trunk/src/simplecloud/storage/providers/amazon/S3Handler.java
>    incubator/libcloud/sandbox/java/trunk/src/simplecloud/storage/providers/nirvanix/
>
> Added: incubator/libcloud/sandbox/java/trunk/src/Example.java
> URL: http://svn.apache.org/viewvc/incubator/libcloud/sandbox/java/trunk/src/Example.java?rev=997113&view=auto
> ==============================================================================
> --- incubator/libcloud/sandbox/java/trunk/src/Example.java (added)
> +++ incubator/libcloud/sandbox/java/trunk/src/Example.java Tue Sep 14 21:57:01 2010
> @@ -0,0 +1,55 @@
> +
> +
> +import java.util.ArrayList;
> +import java.util.List;
> +
> +import libcloud.DriverFactory;
> +import libcloud.NodeDriver;
> +import libcloud.DriverFactory.Provider;
> +import libcloud.data.NodeImage;
> +import libcloud.data.NodeLocation;
> +import libcloud.data.NodeSize;
> +import libcloud.interfaces.INode;
> +import libcloud.providers.amazon.EC2USEastDriver;
> +import libcloud.providers.ibm.IBMDriver;
> +import libcloud.providers.rackspace.RackspaceDriver;
> +
> +/*
> + * Illustrates how to interact with multiple cloud providers using a common
> + * interface using Apache libcloud.
> + */
> +public class Example {
> +
> +       /*
> +        * Entry point of execution.
> +        */
> +       public static void main(String[] args) {
> +               // Fetch driver(s).
> +               Class<NodeDriver> ibmClass = DriverFactory.getDriver(Provider.IBM);
> +               IBMDriver ibmDriver = (IBMDriver)DriverFactory.constructDriver(ibmClass, "username", "password");
> +               Class<NodeDriver> ec2USEastClass = DriverFactory.getDriver(Provider.EC2_US_EAST);
> +               EC2USEastDriver ec2USEastDriver = (EC2USEastDriver)DriverFactory.constructDriver(ec2USEastClass, "access key id", "access key");
> +               Class<NodeDriver> rackspaceClass = DriverFactory.getDriver(Provider.RACKSPACE);
> +               RackspaceDriver rackspaceDriver = (RackspaceDriver)DriverFactory.constructDriver(rackspaceClass, "your username", "your api key");
> +
> +               // Insert driver(s) into array for generic processing.
> +               List<NodeDriver> drivers = new ArrayList<NodeDriver>();
> +               drivers.add(ibmDriver);
> +               drivers.add(ec2USEastDriver);
> +               drivers.add(rackspaceDriver);
> +
> +               // Process drivers.
> +               for (NodeDriver driver : drivers) {
> +                       System.out.println(driver.getName() + ':');
> +                       List<INode> nodes = driver.listNodes();
> +                       List<NodeImage> images = driver.listImages();
> +                       List<NodeSize> sizes = driver.listSizes();
> +                       List<NodeLocation> locations = driver.listLocations();
> +
> +                       System.out.println("\t" + nodes.size() + " Nodes: " + nodes);
> +                       System.out.println("\t" + images.size() + " Images: " + images);
> +                       System.out.println("\t" + sizes.size() + " Sizes: " + sizes);
> +                       System.out.println("\t" + locations.size() + " Locations: " + locations);
> +               }
> +       }
> +}
>
> Added: incubator/libcloud/sandbox/java/trunk/src/base/Driver.java
> URL: http://svn.apache.org/viewvc/incubator/libcloud/sandbox/java/trunk/src/base/Driver.java?rev=997113&view=auto
> ==============================================================================
> --- incubator/libcloud/sandbox/java/trunk/src/base/Driver.java (added)
> +++ incubator/libcloud/sandbox/java/trunk/src/base/Driver.java Tue Sep 14 21:57:01 2010
> @@ -0,0 +1,8 @@
> +package base;
> +
> +import base.interfaces.IConnection;
> +
> +public class Driver {
> +
> +       protected IConnection connection;
> +}
>
> Added: incubator/libcloud/sandbox/java/trunk/src/base/connection/ConnectionKey.java
> URL: http://svn.apache.org/viewvc/incubator/libcloud/sandbox/java/trunk/src/base/connection/ConnectionKey.java?rev=997113&view=auto
> ==============================================================================
> --- incubator/libcloud/sandbox/java/trunk/src/base/connection/ConnectionKey.java (added)
> +++ incubator/libcloud/sandbox/java/trunk/src/base/connection/ConnectionKey.java Tue Sep 14 21:57:01 2010
> @@ -0,0 +1,212 @@
> +package base.connection;
> +
> +import java.io.IOException;
> +import java.io.UnsupportedEncodingException;
> +import java.net.URI;
> +import java.net.URISyntaxException;
> +import java.util.ArrayList;
> +import java.util.HashMap;
> +import java.util.List;
> +import java.util.Map;
> +import java.util.TreeSet;
> +
> +import org.apache.http.HttpEntityEnclosingRequest;
> +import org.apache.http.HttpHost;
> +import org.apache.http.auth.AuthScope;
> +import org.apache.http.auth.UsernamePasswordCredentials;
> +import org.apache.http.client.ClientProtocolException;
> +import org.apache.http.client.methods.HttpDelete;
> +import org.apache.http.client.methods.HttpGet;
> +import org.apache.http.client.methods.HttpPost;
> +import org.apache.http.client.methods.HttpPut;
> +import org.apache.http.client.methods.HttpUriRequest;
> +import org.apache.http.client.utils.URIUtils;
> +import org.apache.http.client.utils.URLEncodedUtils;
> +import org.apache.http.entity.StringEntity;
> +import org.apache.http.impl.client.DefaultHttpClient;
> +import org.apache.http.message.BasicNameValuePair;
> +
> +import base.Driver;
> +import base.interfaces.IConnection;
> +
> +/*
> + * Manages a connection with a secret access key.
> + */
> +public abstract class ConnectionKey implements IConnection {
> +
> +       protected String host;
> +
> +       protected int port;
> +
> +       protected String accessId;
> +
> +       protected String accessKey;
> +
> +       protected boolean secure;
> +
> +       protected Driver driver;
> +
> +       protected String method;
> +
> +       protected String path;
> +
> +       protected DefaultHttpClient httpClient;
> +
> +       protected HttpHost httpHost;
> +
> +       public ConnectionKey(String accessKey, boolean secure, String host, Driver driver) {
> +               this.accessKey = accessKey;
> +               this.secure = secure;
> +               this.host = host;
> +               this.driver = driver;
> +               this.accessId = null;   // subclass may initialize
> +               this.port = -1;                 // default port used by HTTPComponents
> +               this.path = null;
> +       }
> +
> +       public ConnectionKey(String accessKey, boolean secure, String host, int port,
> +                       Driver driver) {
> +               this.accessKey = accessKey;
> +               this.secure = secure;
> +               this.host = host;
> +               this.port = port;
> +               this.driver = driver;
> +               this.httpClient = null;
> +               this.httpHost = null;
> +               this.accessId = null;   // subclass may initialize
> +               this.path = null;
> +       }
> +
> +       public void connect() {
> +               connect(host, port);
> +       }
> +
> +       public void connect(String host, int port) {
> +               this.host = host;
> +               this.port = port;
> +
> +               httpClient = new DefaultHttpClient();
> +               if (accessId != null) {
> +                       httpClient.getCredentialsProvider().setCredentials(
> +                                       new AuthScope(host, port),
> +                                       new UsernamePasswordCredentials(accessId, accessKey));
> +               }
> +       }
> +
> +       public Response request(String method, String path,
> +                       Map<String, String> headers, Map<String, String> params, String data) {
> +               this.method = method;
> +               this.path = path;
> +
> +               // Connect if not already connected
> +               if (httpClient == null) {
> +                       connect();
> +               }
> +
> +               // Compose request headers with priority
> +               Map<String, String> reqHeaders = new HashMap<String, String>();
> +               reqHeaders.put("User-Agent", getUserAgent());           // 3: libcloud headers
> +               reqHeaders.put("Host", host);
> +               if (headers != null) reqHeaders.putAll(headers);        // 2: argument headers
> +               reqHeaders = addDefaultHeaders(reqHeaders);                     // 1: provider headers
> +
> +               // Compose request parameters with priority
> +               Map<String, String> reqParams = (params != null ? params        // 2: argument parameters
> +                               : new HashMap<String, String>());
> +               reqParams = addDefaultParams(reqParams);                                        // 1: provider parameters
> +
> +               // Create URI endpoint
> +               URI uri = null;
> +               try {
> +                       String protocol = secure ? "https" : "http";
> +                       uri = URIUtils.createURI(protocol, host, port, path, urlEncodeMap(reqParams), null);
> +               } catch (URISyntaxException e) {
> +                       e.printStackTrace();
> +                       return null;
> +               }
> +
> +               // Create request to send
> +               HttpUriRequest request = null;
> +               if (method.equalsIgnoreCase("GET")) {
> +                       request = new HttpGet(uri);
> +               } else if (method.equalsIgnoreCase("DELETE")) {
> +                       request = new HttpDelete(uri);
> +               } else if (method.equalsIgnoreCase("PUT")) {
> +                       request = new HttpPut(uri);
> +               } else if (method.equalsIgnoreCase("POST")) {
> +                       request = new HttpPost(uri);
> +               } else {
> +                       throw new IllegalArgumentException("Illegal HTTP method: " + method);
> +               }
> +
> +               // Encode and add the payload data
> +               String encoded = encodeData(data);
> +               if (encoded != null && !encoded.equals("")) {
> +                       try {
> +                               ((HttpEntityEnclosingRequest) request).setEntity(new StringEntity(encoded));
> +                       } catch (UnsupportedEncodingException e) {
> +                               e.printStackTrace();
> +                               return null;
> +                       }
> +               }
> +
> +               // Add headers to the request
> +               for (String header : reqHeaders.keySet()) {
> +                       request.addHeader(header, reqHeaders.get(header));
> +               }
> +
> +               // Execute the request!
> +               try {
> +                       return new Response(httpClient.execute(request));
> +               } catch (ClientProtocolException e) {
> +                       e.printStackTrace();
> +               } catch (IOException e) {
> +                       e.printStackTrace();
> +               }
> +
> +               return null; // Error
> +       }
> +
> +       /*
> +        * Utility that performs UTF-8 encoding of a map of Strings. Returns a
> +        * String that is suitable for use as an application/x-www-form-urlencoded
> +        * list of parameters in an HTTP PUT or HTTP POST.
> +        *
> +        * @param map is the map of String values to format as a UTF-8 String
> +        *
> +        * @return String is the UTF-8 encoding of the map of String values
> +        */
> +       public static String urlEncodeMap(Map<String, String> map) {
> +               if (map == null) return null;
> +
> +               // Convert map to List<NameValuePair> for URLEncodedUtils
> +               List<BasicNameValuePair> nvp = new ArrayList<BasicNameValuePair>();
> +               for (String key : new TreeSet<String>(map.keySet())) {  // preserve order
> +                       nvp.add(new BasicNameValuePair(key, map.get(key)));
> +               }
> +               return URLEncodedUtils.format(nvp, "UTF-8");
> +       }
> +
> +       // ============================ PROTECTED METHODS ===========================
> +       protected Map<String, String> addDefaultHeaders(Map<String, String> headers) {
> +               return headers;
> +       }
> +
> +       protected Map<String, String> addDefaultParams(Map<String, String> params) {
> +               return params;
> +       }
> +
> +       protected String encodeData(String data) {
> +               return data;
> +       }
> +
> +       // ============================ PRIVATE METHODS ===========================
> +       /*
> +        * Defines the user agent used when making requests.
> +        *
> +        * @return String is the user agent for making requests
> +        */
> +       private String getUserAgent() {
> +               return "libcloud-java"; // TODO: generate version like python?
> +       }
> +}
>
> Propchange: incubator/libcloud/sandbox/java/trunk/src/base/connection/ConnectionKey.java
> ------------------------------------------------------------------------------
>    svn:executable = *
>
> Added: incubator/libcloud/sandbox/java/trunk/src/base/connection/ConnectionUserAndKey.java
> URL: http://svn.apache.org/viewvc/incubator/libcloud/sandbox/java/trunk/src/base/connection/ConnectionUserAndKey.java?rev=997113&view=auto
> ==============================================================================
> --- incubator/libcloud/sandbox/java/trunk/src/base/connection/ConnectionUserAndKey.java (added)
> +++ incubator/libcloud/sandbox/java/trunk/src/base/connection/ConnectionUserAndKey.java Tue Sep 14 21:57:01 2010
> @@ -0,0 +1,18 @@
> +package base.connection;
> +
> +import base.Driver;
> +
> +public class ConnectionUserAndKey extends ConnectionKey {
> +
> +       public ConnectionUserAndKey(String accessId, String accessKey, boolean secure,
> +                       String host, int port, Driver driver) {
> +               super(accessKey, secure, host, port, driver);
> +               this.accessId = accessId;
> +       }
> +
> +       public ConnectionUserAndKey(String accessId, String accessKey, boolean secure,
> +                       String host, Driver driver) {
> +               super(accessKey, secure, host, driver);
> +               this.accessId = accessId;
> +       }
> +}
>
> Propchange: incubator/libcloud/sandbox/java/trunk/src/base/connection/ConnectionUserAndKey.java
> ------------------------------------------------------------------------------
>    svn:executable = *
>
> Added: incubator/libcloud/sandbox/java/trunk/src/base/connection/LoggingConnection.java
> URL: http://svn.apache.org/viewvc/incubator/libcloud/sandbox/java/trunk/src/base/connection/LoggingConnection.java?rev=997113&view=auto
> ==============================================================================
> --- incubator/libcloud/sandbox/java/trunk/src/base/connection/LoggingConnection.java (added)
> +++ incubator/libcloud/sandbox/java/trunk/src/base/connection/LoggingConnection.java Tue Sep 14 21:57:01 2010
> @@ -0,0 +1,60 @@
> +package base.connection;
> +
> +import java.util.Map;
> +
> +import base.Driver;
> +
> +public class LoggingConnection extends ConnectionKey {
> +
> +       protected StringBuffer log;
> +
> +       public LoggingConnection(String key, boolean secure, String host, int port,
> +                       Driver driver) {
> +               super(key, secure, host, port, driver);
> +               log = new StringBuffer();
> +       }
> +
> +       public Response request(String method, String action,
> +                       Map<String, String> headers, Map<String, String> params, String data) {
> +               log.append(logCurl(method, action, data, headers));
> +               Response response = super.request(method, action, headers, params, data);
> +               log.append(logResponse(response));
> +               return response;
> +       }
> +
> +       protected String logResponse(Response response) {
> +               String logEntry = "# -------- begin response ----------\n";
> +               logEntry += response.version.getProtocol() + "/"
> +                                + response.version.getMajor() + "." + response.version.getMinor();
> +               logEntry += " " + response.status + " " + response.phrase + "\r\n";
> +
> +               if (response.headers != null) {
> +                       for (Map.Entry<String, String> header : response.headers.entrySet()) {
> +                           logEntry += header.getKey() + ": " + header.getValue() + "\r\n";
> +                       }
> +               }
> +
> +               logEntry += "\r\n" + response.body + "\r\n";
> +               logEntry += "\n# -------- end response ------------\n";
> +
> +               return logEntry;
> +       }
> +
> +       protected String logCurl(String method, String url, String body, Map<String, String> headers) {
> +               String curl = "curl -X " + method + " ";
> +
> +               if (headers != null) {
> +                       for (Map.Entry<String, String> header : headers.entrySet()) {
> +                           curl += "-H \"" + header.getKey() + ": " + header.getValue() + "\" ";
> +                       }
> +               }
> +
> +               if (body != null && !"".equals(body)) {
> +                       curl += "-d \"" + body + "\" ";
> +               }
> +
> +               curl += url;
> +               return curl;
> +       }
> +
> +}
>
> Propchange: incubator/libcloud/sandbox/java/trunk/src/base/connection/LoggingConnection.java
> ------------------------------------------------------------------------------
>    svn:executable = *
>
> Added: incubator/libcloud/sandbox/java/trunk/src/base/connection/LoggingConnectionUserAndKey.java
> URL: http://svn.apache.org/viewvc/incubator/libcloud/sandbox/java/trunk/src/base/connection/LoggingConnectionUserAndKey.java?rev=997113&view=auto
> ==============================================================================
> --- incubator/libcloud/sandbox/java/trunk/src/base/connection/LoggingConnectionUserAndKey.java (added)
> +++ incubator/libcloud/sandbox/java/trunk/src/base/connection/LoggingConnectionUserAndKey.java Tue Sep 14 21:57:01 2010
> @@ -0,0 +1,12 @@
> +package base.connection;
> +
> +import base.Driver;
> +
> +public class LoggingConnectionUserAndKey extends LoggingConnection {
> +
> +       public LoggingConnectionUserAndKey(String accessId, String accessKey, boolean secure,
> +                       String host, int port, Driver driver) {
> +               super(accessKey, secure, host, port, driver);
> +               this.accessId = accessId;
> +       }
> +}
>
> Propchange: incubator/libcloud/sandbox/java/trunk/src/base/connection/LoggingConnectionUserAndKey.java
> ------------------------------------------------------------------------------
>    svn:executable = *
>
> Added: incubator/libcloud/sandbox/java/trunk/src/base/connection/Response.java
> URL: http://svn.apache.org/viewvc/incubator/libcloud/sandbox/java/trunk/src/base/connection/Response.java?rev=997113&view=auto
> ==============================================================================
> --- incubator/libcloud/sandbox/java/trunk/src/base/connection/Response.java (added)
> +++ incubator/libcloud/sandbox/java/trunk/src/base/connection/Response.java Tue Sep 14 21:57:01 2010
> @@ -0,0 +1,96 @@
> +package base.connection;
> +
> +import java.io.BufferedReader;
> +import java.io.IOException;
> +import java.io.InputStreamReader;
> +import java.util.HashMap;
> +import java.util.Map;
> +
> +import org.apache.http.Header;
> +import org.apache.http.HttpEntity;
> +import org.apache.http.HttpResponse;
> +import org.apache.http.ProtocolVersion;
> +
> +import base.interfaces.IResponse;
> +
> +
> +public class Response implements IResponse {
> +
> +       protected int status;
> +
> +       protected String phrase;
> +
> +       protected String body;
> +
> +       protected ProtocolVersion version;
> +
> +       protected Map<String, String> headers;
> +
> +       public Response(HttpResponse response) {
> +
> +               // Retrieve HTTP version from response
> +               version = response.getStatusLine().getProtocolVersion();
> +
> +               // Retrieve status code from response
> +               status = response.getStatusLine().getStatusCode();
> +
> +               // Retrieve reason from response
> +               phrase = response.getStatusLine().getReasonPhrase();
> +
> +               // Retrieve body from response
> +               body = null;
> +               HttpEntity entity = response.getEntity();
> +               if (entity != null) {
> +                       try {
> +                               String line = null;
> +                               StringBuffer bodySb = new StringBuffer();
> +                               BufferedReader reader = new BufferedReader(new InputStreamReader(entity.getContent()));
> +                               while ((line = reader.readLine()) != null) {
> +                                       bodySb.append(line);
> +                               }
> +                               body = bodySb.toString();
> +                               entity.consumeContent();
> +                       } catch (IOException ioe) {
> +                               ioe.printStackTrace();
> +                       }
> +               }
> +
> +               // Retrieve headers from response
> +               headers = new HashMap<String, String>();
> +               for (Header header : response.getAllHeaders()) {
> +                       this.headers.put(header.getName(), header.getValue());
> +               }
> +       }
> +
> +       public String getBody() {
> +               return body;
> +       }
> +
> +       public ProtocolVersion getVersion() {
> +               return version;
> +       }
> +
> +       public String getPhrase() {
> +               return phrase;
> +       }
> +
> +       public Map<String, String> getHeaders() {
> +               return headers;
> +       }
> +
> +       public int getStatus() {
> +               return status;
> +       }
> +
> +       public String toString() {
> +               StringBuilder sb = new StringBuilder();
> +               sb.append(status + " " + phrase + '\n');
> +               sb.append("Headers:\n");
> +               for (String key : headers.keySet()) {
> +                       sb.append('\t' + key + ": " + headers.get(key) + '\n');
> +               }
> +               sb.append("Body: ");
> +               sb.append(body);
> +               return sb.toString();
> +       }
> +}
>
> Propchange: incubator/libcloud/sandbox/java/trunk/src/base/connection/Response.java
> ------------------------------------------------------------------------------
>    svn:executable = *
>
> Added: incubator/libcloud/sandbox/java/trunk/src/base/connection/ResponseHandler.java
> URL: http://svn.apache.org/viewvc/incubator/libcloud/sandbox/java/trunk/src/base/connection/ResponseHandler.java?rev=997113&view=auto
> ==============================================================================
> --- incubator/libcloud/sandbox/java/trunk/src/base/connection/ResponseHandler.java (added)
> +++ incubator/libcloud/sandbox/java/trunk/src/base/connection/ResponseHandler.java Tue Sep 14 21:57:01 2010
> @@ -0,0 +1,75 @@
> +package base.connection;
> +
> +import base.interfaces.IResponse;
> +
> +/*
> + * Default handler for request responses.  Subclasses should extend for custom
> + * processing.
> + */
> +public class ResponseHandler {
> +
> +       protected IResponse response;
> +
> +       protected Object object;
> +
> +       /*
> +        * Constructs the handler with the given response.
> +        *
> +        * @param response is the request's response
> +        */
> +       public ResponseHandler(IResponse response) {
> +               this.response = response;
> +
> +               if (success()) {
> +                       parseBody();
> +               } else {
> +                       throw new RuntimeException(parseError());
> +               }
> +       }
> +
> +       /*
> +        * Returns the response's processed representation.
> +        *
> +        * @return Object is the response's parsed object for additional processing
> +        */
> +       public Object getParsedObject() {
> +               return object;
> +       }
> +
> +       /*
> +        * Returns the original response.
> +        *
> +        * @return IResponse is the request's original response
> +        */
> +       public IResponse getResponse() {
> +               return response;
> +       }
> +
> +       /*
> +        * Parses the response's body.  The parsed response is stored in 'object'.
> +        * Subclasses should override for custom processing.
> +        */
> +       protected void parseBody() {
> +               object = response.getBody();
> +       }
> +
> +       /*
> +        * Returns a String expressing the error that occurred.  Subclasses should
> +        * override for custom processing.
> +        *
> +        * @return String represents the error that occurred if !success()
> +        */
> +       protected String parseError() {
> +               return response.getStatus() + " " + response.getPhrase();
> +       }
> +
> +       /*
> +        * Indicates if the request was successful or not.  Subclasses should
> +        * override for custom processing.
> +        *
> +        * @return true if the request was successful, false otherwise
> +        */
> +       protected boolean success() {
> +               return response.getStatus() >= 200 && response.getStatus() <= 299;
> +       }
> +}
>
> Propchange: incubator/libcloud/sandbox/java/trunk/src/base/connection/ResponseHandler.java
> ------------------------------------------------------------------------------
>    svn:executable = *
>
> Added: incubator/libcloud/sandbox/java/trunk/src/base/interfaces/IConnection.java
> URL: http://svn.apache.org/viewvc/incubator/libcloud/sandbox/java/trunk/src/base/interfaces/IConnection.java?rev=997113&view=auto
> ==============================================================================
> --- incubator/libcloud/sandbox/java/trunk/src/base/interfaces/IConnection.java (added)
> +++ incubator/libcloud/sandbox/java/trunk/src/base/interfaces/IConnection.java Tue Sep 14 21:57:01 2010
> @@ -0,0 +1,15 @@
> +package base.interfaces;
> +
> +import java.util.Map;
> +
> +import base.connection.Response;
> +
> +public interface IConnection {
> +
> +       public void connect();
> +
> +       public void connect(String host, int port);
> +
> +       public Response request(String method, String action,
> +                       Map<String, String> headers, Map<String, String> params, String data);
> +}
>
> Propchange: incubator/libcloud/sandbox/java/trunk/src/base/interfaces/IConnection.java
> ------------------------------------------------------------------------------
>    svn:executable = *
>
> Added: incubator/libcloud/sandbox/java/trunk/src/base/interfaces/IResponse.java
> URL: http://svn.apache.org/viewvc/incubator/libcloud/sandbox/java/trunk/src/base/interfaces/IResponse.java?rev=997113&view=auto
> ==============================================================================
> --- incubator/libcloud/sandbox/java/trunk/src/base/interfaces/IResponse.java (added)
> +++ incubator/libcloud/sandbox/java/trunk/src/base/interfaces/IResponse.java Tue Sep 14 21:57:01 2010
> @@ -0,0 +1,14 @@
> +package base.interfaces;
> +
> +import java.util.Map;
> +
> +public interface IResponse {
> +
> +       public int getStatus();
> +
> +       public String getBody();
> +
> +       public String getPhrase();
> +
> +       public Map<String, String> getHeaders();
> +}
>
> Propchange: incubator/libcloud/sandbox/java/trunk/src/base/interfaces/IResponse.java
> ------------------------------------------------------------------------------
>    svn:executable = *
>
> Added: incubator/libcloud/sandbox/java/trunk/src/libcloud/DriverFactory.java
> URL: http://svn.apache.org/viewvc/incubator/libcloud/sandbox/java/trunk/src/libcloud/DriverFactory.java?rev=997113&view=auto
> ==============================================================================
> --- incubator/libcloud/sandbox/java/trunk/src/libcloud/DriverFactory.java (added)
> +++ incubator/libcloud/sandbox/java/trunk/src/libcloud/DriverFactory.java Tue Sep 14 21:57:01 2010
> @@ -0,0 +1,128 @@
> +package libcloud;
> +
> +import java.lang.reflect.Constructor;
> +import java.lang.reflect.InvocationTargetException;
> +import java.util.EnumMap;
> +
> +/*
> + * Manages provider information and provides a driver factory.
> + */
> +public class DriverFactory {
> +
> +       // Maps providers to the driver packages.
> +       private static EnumMap<Provider, String> providerMap;
> +
> +       /*
> +        * List of available drivers.
> +        */
> +       public static enum Provider {
> +               DUMMY,
> +           EC2_US_EAST,
> +           EC2_US_WEST,
> +           EC2_EU_WEST,
> +           EC2_AP_SOUTHEAST,
> +           ECP,
> +           GOGRID,
> +           RACKSPACE,
> +           SLICEHOST,
> +           VPSNET,
> +           LINODE,
> +           RIMUHOSTING,
> +           VOXEL,
> +           SOFTLAYER,
> +           EUCALYPTUS,
> +           IBM,
> +           OPENNEBULA,
> +           DREAMHOST;
> +       }
> +
> +       /*
> +        * Initializes the map bewteen providers (enum) and their driver packages.
> +        */
> +       private static void initProviderMap()
> +       {
> +               providerMap = new EnumMap<Provider, String>(Provider.class);
> +
> +               //First parameter to the map is the Provider name from the enum, the
> +               //second parameter is the package name of the driver.  When adding a new
> +               //provider, simply add it to the "Provider" enum and add a providerMap.put
> +               //below with the appropriate parameters.
> +               providerMap.put(Provider.IBM, "libcloud.providers.ibm.IBMDriver");
> +               providerMap.put(Provider.RACKSPACE, "libcloud.providers.rackspace.XXX");
> +               providerMap.put(Provider.SLICEHOST, "libcloud.providers.slicehost.XXX");
> +               providerMap.put(Provider.EC2_US_EAST, "libcloud.providers.amazon.EC2USEastDriver");
> +               providerMap.put(Provider.EC2_EU_WEST, "libcloud.providers.amazon.EC2EUWestDriver");
> +               providerMap.put(Provider.EC2_US_WEST, "libcloud.providers.amazon.EC2USWestDriver");
> +               providerMap.put(Provider.EC2_AP_SOUTHEAST, "libcloud.providers.amazon.EC2APSoutheastDriver");
> +               providerMap.put(Provider.ECP, "");
> +               providerMap.put(Provider.GOGRID, "");
> +               providerMap.put(Provider.VPSNET, "");
> +               providerMap.put(Provider.LINODE, "");
> +               providerMap.put(Provider.RIMUHOSTING, "");
> +               providerMap.put(Provider.VOXEL, "");
> +               providerMap.put(Provider.SOFTLAYER, "");
> +               providerMap.put(Provider.EUCALYPTUS, "");
> +               providerMap.put(Provider.OPENNEBULA, "");
> +               providerMap.put(Provider.DREAMHOST, "");
> +       }
> +
> +       /*
> +        * Retrieves the driver for the given provider.
> +        *
> +        * @param p defines the provider to retrieve the driver for
> +        *
> +        * @return Class<NodeDriver> is the provider's corresponding driver class
> +        */
> +       @SuppressWarnings("unchecked")
> +       public static Class<NodeDriver> getDriver(Provider p)
> +       {
> +               if (providerMap == null)
> +                       initProviderMap();
> +
> +               @SuppressWarnings("rawtypes")
> +               Class driverClass = null;
> +               try {
> +                       String classname = providerMap.get(p);
> +                       driverClass = Class.forName(classname).asSubclass(NodeDriver.class);
> +               } catch (ClassNotFoundException e) {
> +                       e.printStackTrace();
> +               }
> +               return driverClass;
> +       }
> +
> +       /*
> +        * Constructs a driver from the given driver class and constructor arguments.
> +        *
> +        * @param driverClass is the class of the driver to construct
> +        * @param args are the arguments to the driver's constructor
> +        *
> +        * @return NodeDriver is the initialized driver.  Typecast this to the specific driver type.
> +        */
> +       public static NodeDriver constructDriver(Class<? extends NodeDriver> driverClass, Object ... args) {
> +               // Convert arguments to class array
> +               Class<?>[] classArgs = new Class[args.length];
> +               for (int i = 0; i < args.length; i++) {
> +                       classArgs[i] = args[i].getClass();
> +               }
> +
> +               try {
> +                       // Get constructor and create instance
> +                       Constructor<?> constructor = driverClass.getConstructor(classArgs);
> +                       return (NodeDriver)constructor.newInstance(args);
> +               } catch (SecurityException e) {
> +                       e.printStackTrace();
> +               } catch (NoSuchMethodException e) {
> +                       e.printStackTrace();
> +               } catch (IllegalArgumentException e) {
> +                       e.printStackTrace();
> +               } catch (InstantiationException e) {
> +                       e.printStackTrace();
> +               } catch (IllegalAccessException e) {
> +                       e.printStackTrace();
> +               } catch (InvocationTargetException e) {
> +                       e.printStackTrace();
> +               }
> +
> +               return null;
> +       }
> +}
>
> Propchange: incubator/libcloud/sandbox/java/trunk/src/libcloud/DriverFactory.java
> ------------------------------------------------------------------------------
>    svn:executable = *
>
> Added: incubator/libcloud/sandbox/java/trunk/src/libcloud/NodeDriver.java
> URL: http://svn.apache.org/viewvc/incubator/libcloud/sandbox/java/trunk/src/libcloud/NodeDriver.java?rev=997113&view=auto
> ==============================================================================
> --- incubator/libcloud/sandbox/java/trunk/src/libcloud/NodeDriver.java (added)
> +++ incubator/libcloud/sandbox/java/trunk/src/libcloud/NodeDriver.java Tue Sep 14 21:57:01 2010
> @@ -0,0 +1,8 @@
> +package libcloud;
> +
> +import libcloud.interfaces.INodeDriver;
> +import base.Driver;
> +
> +public abstract class NodeDriver extends Driver implements INodeDriver {
> +
> +}
>
> Propchange: incubator/libcloud/sandbox/java/trunk/src/libcloud/NodeDriver.java
> ------------------------------------------------------------------------------
>    svn:executable = *
>
> Added: incubator/libcloud/sandbox/java/trunk/src/libcloud/data/Node.java
> URL: http://svn.apache.org/viewvc/incubator/libcloud/sandbox/java/trunk/src/libcloud/data/Node.java?rev=997113&view=auto
> ==============================================================================
> --- incubator/libcloud/sandbox/java/trunk/src/libcloud/data/Node.java (added)
> +++ incubator/libcloud/sandbox/java/trunk/src/libcloud/data/Node.java Tue Sep 14 21:57:01 2010
> @@ -0,0 +1,85 @@
> +package libcloud.data;
> +
> +import java.util.Map;
> +import java.util.UUID;
> +
> +import libcloud.interfaces.INode;
> +import libcloud.interfaces.INodeDriver;
> +
> +public class Node implements INode {
> +
> +       private String id;
> +
> +       private String name;
> +
> +       private NodeState state;
> +
> +       private String publicIp;
> +
> +       private String privateIp;
> +
> +       private Map<String, Object> extra;
> +
> +       private INodeDriver driver;
> +
> +       public Node(String id, String name, NodeState state, String publicIp, String privateIp, Map<String, Object> extra, INodeDriver driver) {
> +               this.id = id;
> +               this.name = name;
> +               this.state = state;
> +               this.publicIp = publicIp;
> +               this.privateIp = privateIp;
> +               this.extra = extra;
> +               this.driver = driver;
> +       }
> +
> +       public boolean destroy() {
> +               return driver.destroyNode(this);
> +       }
> +
> +       public boolean reboot() {
> +               return driver.rebootNode(this);
> +       }
> +
> +       public INodeDriver getDriver() {
> +               return driver;
> +       }
> +
> +       public Map<String, Object> getExtra() {
> +               return extra;
> +       }
> +
> +       public String getId() {
> +               return id;
> +       }
> +
> +       public String getName() {
> +               return name;
> +       }
> +
> +       public String getPrivateIp() {
> +               return privateIp;
> +       }
> +
> +       public String getPublicIp() {
> +               return publicIp;
> +       }
> +
> +       public NodeState getState() {
> +               return state;
> +       }
> +
> +       public String getUuid() {
> +               return UUID.randomUUID().toString();
> +       }
> +
> +       public String toString() {
> +               return "<Node" +
> +               ": uuid=" + getUuid() +
> +               ", id=" + id +
> +               ", name=" + name +
> +               ", state=" + state +
> +               ", publicIp=" + publicIp +
> +               ", driver=" + driver.getName() +
> +               " ...>";
> +       }
> +}
>
> Propchange: incubator/libcloud/sandbox/java/trunk/src/libcloud/data/Node.java
> ------------------------------------------------------------------------------
>    svn:executable = *
>
> Added: incubator/libcloud/sandbox/java/trunk/src/libcloud/data/NodeAuth.java
> URL: http://svn.apache.org/viewvc/incubator/libcloud/sandbox/java/trunk/src/libcloud/data/NodeAuth.java?rev=997113&view=auto
> ==============================================================================
> --- incubator/libcloud/sandbox/java/trunk/src/libcloud/data/NodeAuth.java (added)
> +++ incubator/libcloud/sandbox/java/trunk/src/libcloud/data/NodeAuth.java Tue Sep 14 21:57:01 2010
> @@ -0,0 +1,10 @@
> +package libcloud.data;
> +
> +public class NodeAuth {
> +
> +       public String secret;
> +
> +       public NodeAuth(String secret) {
> +               this.secret = secret;
> +       }
> +}
>
> Propchange: incubator/libcloud/sandbox/java/trunk/src/libcloud/data/NodeAuth.java
> ------------------------------------------------------------------------------
>    svn:executable = *
>
> Added: incubator/libcloud/sandbox/java/trunk/src/libcloud/data/NodeImage.java
> URL: http://svn.apache.org/viewvc/incubator/libcloud/sandbox/java/trunk/src/libcloud/data/NodeImage.java?rev=997113&view=auto
> ==============================================================================
> --- incubator/libcloud/sandbox/java/trunk/src/libcloud/data/NodeImage.java (added)
> +++ incubator/libcloud/sandbox/java/trunk/src/libcloud/data/NodeImage.java Tue Sep 14 21:57:01 2010
> @@ -0,0 +1,31 @@
> +package libcloud.data;
> +
> +import java.util.Map;
> +
> +import libcloud.interfaces.INodeDriver;
> +
> +public class NodeImage {
> +
> +       public String id;
> +
> +       public String name;
> +
> +       public Map<String, Object> extra;
> +
> +       public INodeDriver driver;
> +
> +       public NodeImage(String id, String name, Map<String, Object> extra, INodeDriver driver) {
> +               this.id = id;
> +               this.name = name;
> +               this.extra = extra;
> +               this.driver = driver;
> +       }
> +
> +       public String toString() {
> +               return "<NodeImage" +
> +               ": id=" + id +
> +               ", name=" + name +
> +               ", driver=" + driver.getName() +
> +               " ...>";
> +       }
> +}
>
> Propchange: incubator/libcloud/sandbox/java/trunk/src/libcloud/data/NodeImage.java
> ------------------------------------------------------------------------------
>    svn:executable = *
>
> Added: incubator/libcloud/sandbox/java/trunk/src/libcloud/data/NodeLocation.java
> URL: http://svn.apache.org/viewvc/incubator/libcloud/sandbox/java/trunk/src/libcloud/data/NodeLocation.java?rev=997113&view=auto
> ==============================================================================
> --- incubator/libcloud/sandbox/java/trunk/src/libcloud/data/NodeLocation.java (added)
> +++ incubator/libcloud/sandbox/java/trunk/src/libcloud/data/NodeLocation.java Tue Sep 14 21:57:01 2010
> @@ -0,0 +1,30 @@
> +package libcloud.data;
> +
> +import libcloud.interfaces.INodeDriver;
> +
> +public class NodeLocation {
> +
> +       public String id;
> +
> +       public String name;
> +
> +       public String country;
> +
> +       public INodeDriver driver;
> +
> +       public NodeLocation(String id, String name, String country, INodeDriver driver) {
> +               this.id = id;
> +               this.name = name;
> +               this.country = country;
> +               this.driver = driver;
> +       }
> +
> +       public String toString() {
> +               return "<NodeLocation" +
> +                       ": id=" + id +
> +                       ", name=" + name +
> +                       ", country=" + country +
> +                       ", driver=" + driver.getName() +
> +                       " ...>";
> +       }
> +}
>
> Propchange: incubator/libcloud/sandbox/java/trunk/src/libcloud/data/NodeLocation.java
> ------------------------------------------------------------------------------
>    svn:executable = *
>
> Added: incubator/libcloud/sandbox/java/trunk/src/libcloud/data/NodeSize.java
> URL: http://svn.apache.org/viewvc/incubator/libcloud/sandbox/java/trunk/src/libcloud/data/NodeSize.java?rev=997113&view=auto
> ==============================================================================
> --- incubator/libcloud/sandbox/java/trunk/src/libcloud/data/NodeSize.java (added)
> +++ incubator/libcloud/sandbox/java/trunk/src/libcloud/data/NodeSize.java Tue Sep 14 21:57:01 2010
> @@ -0,0 +1,43 @@
> +package libcloud.data;
> +
> +import libcloud.interfaces.INodeDriver;
> +
> +public class NodeSize {
> +
> +       public String id;
> +
> +       public String name;
> +
> +       public int ram;
> +
> +       public int disk;
> +
> +       public int bandwidth;
> +
> +       public float price;
> +
> +       public INodeDriver driver;
> +
> +       public NodeSize(String id, String name, int ram, int disk, int bandwidth,
> +                       float price, INodeDriver driver) {
> +               this.id = id;
> +               this.name = name;
> +               this.ram = ram;
> +               this.disk = disk;
> +               this.bandwidth = bandwidth;
> +               this.price = price;
> +               this.driver = driver;
> +       }
> +
> +       public String toString() {
> +               return "<NodeSize" +
> +                       ": id=" + id +
> +                       ", name=" + name +
> +                       ", ram=" + ram +
> +                       ", disk=" + disk +
> +                       ", bandwidth=" + bandwidth +
> +                       ", price=" + price +
> +                       ", driver=" + driver.getName() +
> +                       " ...>";
> +       }
> +}
>
> Propchange: incubator/libcloud/sandbox/java/trunk/src/libcloud/data/NodeSize.java
> ------------------------------------------------------------------------------
>    svn:executable = *
>
> Added: incubator/libcloud/sandbox/java/trunk/src/libcloud/data/NodeState.java
> URL: http://svn.apache.org/viewvc/incubator/libcloud/sandbox/java/trunk/src/libcloud/data/NodeState.java?rev=997113&view=auto
> ==============================================================================
> --- incubator/libcloud/sandbox/java/trunk/src/libcloud/data/NodeState.java (added)
> +++ incubator/libcloud/sandbox/java/trunk/src/libcloud/data/NodeState.java Tue Sep 14 21:57:01 2010
> @@ -0,0 +1,9 @@
> +package libcloud.data;
> +
> +public enum NodeState {
> +       RUNNING,
> +       REBOOTING,
> +       TERMINATED,
> +       PENDING,
> +       UNKNOWN;
> +}
>
> Propchange: incubator/libcloud/sandbox/java/trunk/src/libcloud/data/NodeState.java
> ------------------------------------------------------------------------------
>    svn:executable = *
>
> Added: incubator/libcloud/sandbox/java/trunk/src/libcloud/exceptions/InvalidCredsException.java
> URL: http://svn.apache.org/viewvc/incubator/libcloud/sandbox/java/trunk/src/libcloud/exceptions/InvalidCredsException.java?rev=997113&view=auto
> ==============================================================================
> --- incubator/libcloud/sandbox/java/trunk/src/libcloud/exceptions/InvalidCredsException.java (added)
> +++ incubator/libcloud/sandbox/java/trunk/src/libcloud/exceptions/InvalidCredsException.java Tue Sep 14 21:57:01 2010
> @@ -0,0 +1,14 @@
> +package libcloud.exceptions;
> +
> +public class InvalidCredsException extends RuntimeException {
> +
> +       private static final long serialVersionUID = 1L;
> +
> +       public InvalidCredsException() {
> +               super();
> +       }
> +
> +       public InvalidCredsException(String msg) {
> +               super(msg);
> +       }
> +}
>
> Propchange: incubator/libcloud/sandbox/java/trunk/src/libcloud/exceptions/InvalidCredsException.java
> ------------------------------------------------------------------------------
>    svn:executable = *
>
> Added: incubator/libcloud/sandbox/java/trunk/src/libcloud/interfaces/INode.java
> URL: http://svn.apache.org/viewvc/incubator/libcloud/sandbox/java/trunk/src/libcloud/interfaces/INode.java?rev=997113&view=auto
> ==============================================================================
> --- incubator/libcloud/sandbox/java/trunk/src/libcloud/interfaces/INode.java (added)
> +++ incubator/libcloud/sandbox/java/trunk/src/libcloud/interfaces/INode.java Tue Sep 14 21:57:01 2010
> @@ -0,0 +1,28 @@
> +package libcloud.interfaces;
> +
> +import java.util.Map;
> +
> +import libcloud.data.NodeState;
> +
> +public interface INode {
> +
> +       public boolean reboot();
> +
> +       public boolean destroy();
> +
> +       public String getUuid();
> +
> +       public String getId();
> +
> +       public String getName();
> +
> +       public NodeState getState();
> +
> +       public String getPublicIp();
> +
> +       public String getPrivateIp();
> +
> +       public INodeDriver getDriver();
> +
> +       public Map<String, Object> getExtra();
> +}
>
> Propchange: incubator/libcloud/sandbox/java/trunk/src/libcloud/interfaces/INode.java
> ------------------------------------------------------------------------------
>    svn:executable = *
>
> Added: incubator/libcloud/sandbox/java/trunk/src/libcloud/interfaces/INodeDriver.java
> URL: http://svn.apache.org/viewvc/incubator/libcloud/sandbox/java/trunk/src/libcloud/interfaces/INodeDriver.java?rev=997113&view=auto
> ==============================================================================
> --- incubator/libcloud/sandbox/java/trunk/src/libcloud/interfaces/INodeDriver.java (added)
> +++ incubator/libcloud/sandbox/java/trunk/src/libcloud/interfaces/INodeDriver.java Tue Sep 14 21:57:01 2010
> @@ -0,0 +1,30 @@
> +package libcloud.interfaces;
> +
> +import java.util.List;
> +import java.util.Map;
> +
> +import libcloud.data.NodeAuth;
> +import libcloud.data.NodeImage;
> +import libcloud.data.NodeLocation;
> +import libcloud.data.NodeSize;
> +
> +public interface INodeDriver {
> +
> +       public INode createNode(String name, NodeSize size,
> +                       NodeImage image, NodeLocation location, NodeAuth auth,
> +                       Map<String, Object> extra);
> +
> +       public boolean destroyNode(INode node);
> +
> +       public boolean rebootNode(INode node);
> +
> +       public List<INode> listNodes();
> +
> +       public List<NodeImage> listImages();
> +
> +       public List<NodeSize> listSizes();
> +
> +       public List<NodeLocation> listLocations();
> +
> +       public String getName();
> +}
>
> Propchange: incubator/libcloud/sandbox/java/trunk/src/libcloud/interfaces/INodeDriver.java
> ------------------------------------------------------------------------------
>    svn:executable = *
>
> Added: incubator/libcloud/sandbox/java/trunk/src/libcloud/providers/amazon/EC2APSEDriver.java
> URL: http://svn.apache.org/viewvc/incubator/libcloud/sandbox/java/trunk/src/libcloud/providers/amazon/EC2APSEDriver.java?rev=997113&view=auto
> ==============================================================================
> --- incubator/libcloud/sandbox/java/trunk/src/libcloud/providers/amazon/EC2APSEDriver.java (added)
> +++ incubator/libcloud/sandbox/java/trunk/src/libcloud/providers/amazon/EC2APSEDriver.java Tue Sep 14 21:57:01 2010
> @@ -0,0 +1,46 @@
> +package libcloud.providers.amazon;
> +
> +import java.util.ArrayList;
> +import java.util.HashMap;
> +import java.util.List;
> +import java.util.Map;
> +
> +import libcloud.data.NodeLocation;
> +
> +public class EC2APSEDriver extends EC2Driver {
> +
> +       private static final String EC2_AP_SE_HOST = "ec2.ap-southeast-1.amazonaws.com";
> +
> +       private static final Map<String, Float> EC2_AP_SE_PRICES = initNodePrices();
> +
> +       public EC2APSEDriver(String accessId, String accessKey) {
> +               super(accessId, accessKey, EC2_AP_SE_HOST);
> +       }
> +
> +       public List<NodeLocation> listLocations() {
> +               List<NodeLocation> locations = new ArrayList<NodeLocation>();
> +               locations.add(new NodeLocation("0", "Amazon Asia-Pacific Singapore", "SG", this));
> +               return locations;
> +       }
> +
> +       public String getName() {
> +               return "Amazon EC2 (ap-southeast-1)";
> +       }
> +
> +       protected float getPrice(String sizeId) {
> +               return EC2_AP_SE_PRICES.get(sizeId);
> +       }
> +
> +       private static Map<String, Float> initNodePrices() {
> +               Map<String, Float> prices = new HashMap<String, Float>();
> +               prices.put("m1.small", .095f);
> +               prices.put("m1.large", .38f);
> +               prices.put("m1.xlarge", .76f);
> +               prices.put("c1.medium", .19f);
> +               prices.put("c1.xlarge", .76f);
> +               prices.put("m2.xlarge", .57f);
> +               prices.put("m2.2xlarge", 1.14f);
> +               prices.put("m2.4xlarge", 2.28f);
> +               return prices;
> +       }
> +}
>
> Added: incubator/libcloud/sandbox/java/trunk/src/libcloud/providers/amazon/EC2Connection.java
> URL: http://svn.apache.org/viewvc/incubator/libcloud/sandbox/java/trunk/src/libcloud/providers/amazon/EC2Connection.java?rev=997113&view=auto
> ==============================================================================
> --- incubator/libcloud/sandbox/java/trunk/src/libcloud/providers/amazon/EC2Connection.java (added)
> +++ incubator/libcloud/sandbox/java/trunk/src/libcloud/providers/amazon/EC2Connection.java Tue Sep 14 21:57:01 2010
> @@ -0,0 +1,77 @@
> +package libcloud.providers.amazon;
> +
> +import java.security.InvalidKeyException;
> +import java.security.NoSuchAlgorithmException;
> +import java.text.SimpleDateFormat;
> +import java.util.Date;
> +import java.util.HashMap;
> +import java.util.Map;
> +import java.util.SimpleTimeZone;
> +import java.util.TreeSet;
> +
> +import javax.crypto.Mac;
> +import javax.crypto.spec.SecretKeySpec;
> +
> +import org.apache.commons.codec.binary.Base64;
> +
> +import base.Driver;
> +import base.connection.ConnectionKey;
> +import base.connection.ConnectionUserAndKey;
> +
> +public class EC2Connection extends ConnectionUserAndKey {
> +
> +       private static final boolean DEFAULT_SECURE = true;
> +
> +       private static final String API_VERSION = "2010-06-15";
> +
> +       public EC2Connection(String accessId, String accessKey, String host,
> +                       Driver driver) {
> +               super(accessId, accessKey, DEFAULT_SECURE, host, driver);
> +       }
> +
> +       protected Map<String, String> addDefaultParams(Map<String, String> params) {
> +               params.put("SignatureVersion", "2");
> +               params.put("SignatureMethod", "HmacSHA256");
> +               params.put("AWSAccessKeyId", accessId);
> +               params.put("Version", API_VERSION);
> +               SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'");
> +               sdf.setTimeZone(new SimpleTimeZone(0, "GMT"));
> +               params.put("Timestamp", sdf.format(new Date()));
> +               params.put("Signature", getAWSAuthParams(params, accessKey, path));
> +               return params;
> +       }
> +
> +       /*
> +        * Generates the request signature as defined at:
> +        * http://docs.amazonwebservices.com/AWSEC2/2010-06-15/DeveloperGuide/index.html?using-query-api.html
> +        */
> +       private String getAWSAuthParams(Map<String, String> params, String accessKey, String path) {
> +               // Sort the parameters by key
> +               TreeSet<String> sortedKeys = new TreeSet<String>(params.keySet());
> +               Map<String, String> sortedParams = new HashMap<String, String>();
> +               for (String key : sortedKeys){
> +                       sortedParams.put(key, params.get(key));
> +               }
> +
> +               // Generate stringToSign
> +               String qs = ConnectionKey.urlEncodeMap(sortedParams);
> +               qs = qs.replace("+", "%20");
> +               String stringToSign = this.method + '\n' + host + '\n' + path + '\n' + qs;
> +
> +               // Calculate HMAC of stringToSign
> +               byte[] hmac = null;
> +               try {
> +                       Mac mac = Mac.getInstance("HmacSHA256");
> +                       SecretKeySpec key = new SecretKeySpec(accessKey.getBytes(), "UTF-8");
> +                       mac.init(key);
> +                       hmac = mac.doFinal(stringToSign.getBytes());
> +               } catch (NoSuchAlgorithmException e) {
> +                       e.printStackTrace();
> +               } catch (InvalidKeyException e) {
> +                       e.printStackTrace();
> +               }
> +
> +               // Base 64 encode HMAC
> +               return new String(Base64.encodeBase64(hmac));
> +       }
> +}
>
> Added: incubator/libcloud/sandbox/java/trunk/src/libcloud/providers/amazon/EC2Driver.java
> URL: http://svn.apache.org/viewvc/incubator/libcloud/sandbox/java/trunk/src/libcloud/providers/amazon/EC2Driver.java?rev=997113&view=auto
> ==============================================================================
> --- incubator/libcloud/sandbox/java/trunk/src/libcloud/providers/amazon/EC2Driver.java (added)
> +++ incubator/libcloud/sandbox/java/trunk/src/libcloud/providers/amazon/EC2Driver.java Tue Sep 14 21:57:01 2010
> @@ -0,0 +1,404 @@
> +package libcloud.providers.amazon;
> +
> +import java.util.ArrayList;
> +import java.util.HashMap;
> +import java.util.List;
> +import java.util.Map;
> +
> +import javax.xml.xpath.XPath;
> +import javax.xml.xpath.XPathConstants;
> +import javax.xml.xpath.XPathExpressionException;
> +import javax.xml.xpath.XPathFactory;
> +
> +import libcloud.NodeDriver;
> +import libcloud.data.Node;
> +import libcloud.data.NodeAuth;
> +import libcloud.data.NodeImage;
> +import libcloud.data.NodeLocation;
> +import libcloud.data.NodeSize;
> +import libcloud.data.NodeState;
> +import libcloud.interfaces.INode;
> +
> +import org.apache.commons.codec.binary.Base64;
> +import org.w3c.dom.Document;
> +import org.w3c.dom.Element;
> +import org.w3c.dom.NodeList;
> +
> +import base.interfaces.IResponse;
> +
> +/*
> + * Base driver to interact with Amazon EC2.
> + *
> + * TODO: comment ec2 classes
> + * TODO: Formal tests of EC2 drivers
> + */
> +public abstract class EC2Driver extends NodeDriver {
> +
> +       private XPath xpath;
> +       protected static final String API_VERSION = "2010-06-15";
> +       protected static final String NAMESPACE = "http://ec2.amazonaws.com/doc/" + API_VERSION + "/";
> +       private static final Map<String, NodeSize> NODE_SIZES = initNodeSizes();
> +       private static final Map<String, NodeState> NODE_STATE_MAP = new HashMap<String, NodeState>();
> +
> +       /*
> +        * Constructs the base driver for location-specific drivers to subclass.
> +        *
> +        * @param accessId is the user's Amazon access key ID
> +        * @param accessKey is the user's Amazon secret key
> +        */
> +       public EC2Driver(String accessId, String accessKey, String host) {
> +               connection = new EC2Connection(accessId, accessKey, host, this);
> +               xpath = XPathFactory.newInstance().newXPath();
> +
> +               // Map Amazon EC2 instance states to libcloud
> +               NODE_STATE_MAP.put("pending", NodeState.PENDING);
> +               NODE_STATE_MAP.put("running", NodeState.RUNNING);
> +               NODE_STATE_MAP.put("shutting-down", NodeState.TERMINATED);
> +               NODE_STATE_MAP.put("terminated", NodeState.TERMINATED);
> +               NODE_STATE_MAP.put("stopping", NodeState.PENDING);
> +               NODE_STATE_MAP.put("stopped", NodeState.TERMINATED);
> +       }
> +
> +       /*
> +        * Creates a node on Amazon EC2.
> +        *
> +        * See http://bit.ly/8ZyPSy [docs.amazonwebservices.com]
> +        *
> +        * Supported keyword arguments:
> +        *      ex_mincount: Minimum number of instances to launch
> +        *      ex_maxcount: Maximum number of instances to launch
> +        *      ex_securitygroup: Name of security group(s)
> +        *      ex_keyname: The name of the key pair
> +        *      ex_userdata: User data
> +        */
> +       @SuppressWarnings("unchecked")
> +       public INode createNode(String name, NodeSize size, NodeImage image,
> +                       NodeLocation location, NodeAuth auth, Map<String, Object> extra) {
> +               // Add base parameters
> +               Map<String, String> params = new HashMap<String, String>();
> +               params.put("Action", "RunInstances");
> +               params.put("ImageId", image.id);
> +               params.put("InstanceType", size.id);
> +               params.put("MinCount", "1");
> +               params.put("MaxCount", "1");
> +
> +               // Process extra map
> +               if (extra != null) {
> +                       // Minimum & Maximum nodes to create
> +                       if (extra.containsKey("ex_mincount")) {
> +                               params.put("MinCount", (String)extra.get("ex_mincount"));
> +                       }
> +                       if (extra.containsKey("ex_maxcount")) {
> +                               params.put("MaxCount", (String)extra.get("ex_maxcount"));
> +                       }
> +
> +                       // SecurityGroups
> +                       if (extra.containsKey("ex_securitygroup")) {
> +                               Object securityGroup = extra.get("ex_securitygroup");
> +                               List<String> groups = null;
> +                               if (securityGroup instanceof List) {
> +                                       groups = (List<String>)securityGroup;
> +                               } else {
> +                                       groups = new ArrayList<String>();
> +                                       groups.add((String)securityGroup);
> +                               }
> +                               for (int i = 0; i < groups.size(); i++) {
> +                                       params.put("SecurityGroup." + (i + 1), groups.get(i));
> +                               }
> +                       }
> +
> +                       // KeyName
> +                       if (extra.containsKey("ex_keyname")) {
> +                               params.put("KeyName", (String)extra.get("ex_keyname"));
> +                       }
> +
> +                       // UserData
> +                       if (extra.containsKey("ex_userdata")) {
> +                               String userData = (String)extra.get("ex_userdata");
> +                               params.put("UserData", new String(Base64.encodeBase64(userData.getBytes())));
> +                       }
> +               }
> +
> +               // Send & process request
> +               IResponse response = connection.request("GET", "/", null, params, null);
> +               EC2Handler handler = new EC2Handler(response);
> +               return parseNodes(((Document)handler.getParsedObject()).getDocumentElement(), "instancesSet/item", null).get(0);
> +       }
> +
> +       public boolean destroyNode(INode node) {
> +               Map<String, String> params = new HashMap<String, String>();
> +               params.put("Action", "TerminateInstances");
> +               String[] values = {node.getId()};
> +               params.putAll(pathList("InstanceId", values));
> +               IResponse response = connection.request("GET", "/", null, params, null);
> +               EC2Handler handler = new EC2Handler(response);
> +               return parseTerminateBoolean((Document)handler.getParsedObject());
> +       }
> +
> +       public boolean rebootNode(INode node) {
> +               Map<String, String> params = new HashMap<String, String>();
> +               params.put("Action", "RebootInstances");
> +               String[] values = {node.getId()};
> +               params.putAll(pathList("InstanceId", values));
> +               IResponse response = connection.request("GET", "/", null, params, null);
> +               EC2Handler handler = new EC2Handler(response);
> +               return parseRebootBoolean(((Document)handler.getParsedObject()));
> +       }
> +
> +       public List<INode> listNodes() {
> +               Map<String, String> params = new HashMap<String, String>();
> +               params.put("Action", "DescribeInstances");
> +               IResponse response = connection.request("GET", "/", null, params, null);
> +               EC2Handler handler = new EC2Handler(response);
> +               return parseNodesByGroup(((Document)handler.getParsedObject()).getDocumentElement());
> +       }
> +
> +       public List<NodeImage> listImages() {
> +               Map<String, String> params = new HashMap<String, String>();
> +               params.put("Action", "DescribeImages");
> +               IResponse response = connection.request("GET", "/", null, params, null);
> +               EC2Handler handler = new EC2Handler(response);
> +               return parseImages((Document)handler.getParsedObject());
> +       }
> +
> +       public List<NodeSize> listSizes() {
> +               List<NodeSize> sizes = new ArrayList<NodeSize>();
> +               for (NodeSize size : NODE_SIZES.values()) {
> +                       sizes.add(new NodeSize(size.id, size.name, size.ram, size.disk,
> +                                       size.bandwidth, getPrice(size.id), this));
> +               }
> +               return sizes;
> +       }
> +
> +       /*
> +        * Creates a new Security Group.
> +        *
> +        * Note: This is a non-standard extension API and only works with EC2.
> +        *
> +        * TODO: Test this method.
> +        *
> +        * @param name is the nam eof the security group to create
> +        * @param description is a human-readable description of the group
> +        *
> +        * @return Object is the parsed object as defined and handled by EC2Handler
> +        */
> +       public Object exCreateSecurityGroup(String name, String description) {
> +               Map<String, String> params = new HashMap<String, String>();
> +               params.put("Action", "CreateSecurityGroup");
> +               params.put("GroupName", name);
> +               params.put("GroupDescription", description);
> +               IResponse response = connection.request("GET", "/", null, params, null);
> +               EC2Handler handler = new EC2Handler(response);
> +               return handler.getParsedObject();
> +       }
> +
> +       /*
> +        * Edit a Security Group to allow all traffic.
> +        *
> +        * Note: This is a non-standard extension API and only works with EC2.
> +        *
> +        * TODO: Test this method.
> +        *
> +        * @param name is the name of the security group to edit
> +        *
> +        * @return List<Object> is a list of parsed objects as defined & handled by EC2Handler
> +        */
> +       public List<Object> exAuthorizeSecurityGroupPermissive(String name) {
> +               List<Object> results = new ArrayList<Object>();
> +
> +               // Request 1
> +               Map<String, String> params = new HashMap<String, String>();
> +               params.put("Action", "AuthorizeSecurityGroupIngress");
> +               params.put("GroupName", name);
> +               params.put("IpProtocol", "tcp");
> +               params.put("FromPort", "0");
> +               params.put("ToPort", "65535");
> +               params.put("CidrIp", "0.0.0.0/0");
> +               try {
> +                       IResponse response = connection.request("GET", "/", null, params, null);
> +                       EC2Handler handler = new EC2Handler(response);
> +                       results.add(handler.getParsedObject());
> +               } catch(Exception e) {
> +                       if (!e.getMessage().contains("InvalidPermission.Duplicate")) {
> +                               throw new RuntimeException(e);
> +                       }
> +               }
> +
> +               // Request 2
> +               params.put("IpProtocol", "udo");
> +               try {
> +                       IResponse response = connection.request("GET", "/", null, params, null);
> +                       EC2Handler handler = new EC2Handler(response);
> +                       results.add(handler.getParsedObject());
> +               } catch(Exception e) {
> +                       if (!e.getMessage().contains("InvalidPermission.Duplicate")) {
> +                               throw new RuntimeException(e);
> +                       }
> +               }
> +
> +               // Request 3
> +               params.put("IpProtocol", "icmp");
> +               params.put("FromPort", "-1");
> +               params.put("ToPort", "-1");
> +               try {
> +                       IResponse response = connection.request("GET", "/", null, params, null);
> +                       EC2Handler handler = new EC2Handler(response);
> +                       results.add(handler.getParsedObject());
> +               } catch(Exception e) {
> +                       if (!e.getMessage().contains("InvalidPermission.Duplicate")) {
> +                               throw new RuntimeException(e);
> +                       }
> +               }
> +               return results;
> +       }
> +
> +       // ----------------------------- HIDDEN HELPERS ---------------------------
> +       private List<INode> parseNodesByGroup(Element elem) {
> +               try {
> +                       List<INode> nodes = new ArrayList<INode>();
> +                       NodeList reservationList = (NodeList)xpath.evaluate("reservationSet/item", elem, XPathConstants.NODESET);
> +                       for (int rIdx = 0; rIdx < reservationList.getLength(); rIdx++) {
> +                               Element rs = (Element)reservationList.item(rIdx);
> +                               List<String> groups = new ArrayList<String>();
> +                               NodeList groupList = (NodeList)xpath.evaluate("groupSet/item", rs, XPathConstants.NODESET);
> +                               for (int gsIdx = 0; gsIdx < groupList.getLength(); gsIdx++) {
> +                                       groups.add(xpath.evaluate("groupId", groupList.item(gsIdx)));
> +                               }
> +                               nodes.addAll(parseNodes(rs, "instancesSet/item", groups));
> +                       }
> +                       return nodes;
> +               } catch (XPathExpressionException e) {
> +                       e.printStackTrace();
> +               }
> +               return null;    // Error
> +       }
> +
> +       private List<INode> parseNodes(Element elem, String path, List<String> groups) {
> +               try {
> +                       List<INode> nodes = new ArrayList<INode>();
> +                       NodeList instanceSet = (NodeList)xpath.evaluate(path, elem, XPathConstants.NODESET);
> +                       for (int i = 0; i < instanceSet.getLength(); i++) {
> +                               nodes.add(parseNode((Element)instanceSet.item(i), groups));
> +                       }
> +                       return nodes;
> +               } catch (XPathExpressionException e) {
> +                       e.printStackTrace();
> +               }
> +               return null;    // Error
> +       }
> +
> +       private INode parseNode(Element elem, List<String> groups) throws XPathExpressionException {
> +               // Node parameters
> +               String id = xpath.evaluate("instanceId", elem);
> +               String name = xpath.evaluate("instanceId", elem);
> +               NodeState state = NODE_STATE_MAP.get(xpath.evaluate("instanceState/name", elem));
> +               String publicIp = xpath.evaluate("dnsName", elem);
> +               String privateIp = xpath.evaluate("privateDnsName", elem);
> +
> +               // Extra parameter
> +               Map<String, Object> extra = new HashMap<String, Object>();
> +               extra.put("dnsName", xpath.evaluate("dnsName", elem));
> +               extra.put("instanceId", xpath.evaluate("instanceId", elem));
> +               extra.put("imageId", xpath.evaluate("imageId", elem));
> +               extra.put("privateDns", xpath.evaluate("privateDns", elem));
> +               extra.put("status", xpath.evaluate("instanceState/name", elem));
> +               extra.put("keyName", xpath.evaluate("keyName", elem));
> +               extra.put("launchIndex", xpath.evaluate("amiLaunchIndex", elem));
> +               NodeList productSet = (NodeList)xpath.evaluate("productCodesSet/item", elem, XPathConstants.NODESET);
> +               List<String> productCodes = new ArrayList<String>();
> +               for (int i = 0; i < productSet.getLength(); i++) {
> +                       productCodes.add(xpath.evaluate("productCode", productSet.item(i)));
> +               }
> +               extra.put("productCode", productCodes);
> +               extra.put("instanceType", xpath.evaluate("instanceType", elem));
> +               extra.put("launchdatetime", xpath.evaluate("launchTime", elem));
> +               extra.put("availability", xpath.evaluate("placement/availabilityZone", elem));
> +               extra.put("kernelId", xpath.evaluate("kernelId", elem));
> +               extra.put("ramdiskId", xpath.evaluate("ramdiskId", elem));
> +               if (groups != null) extra.put("groups", groups);
> +
> +               // Construct final node and return!
> +               return new Node(id, name, state, publicIp, privateIp, extra, this);
> +       }
> +
> +       private List<NodeImage> parseImages(Document doc) {
> +               List<NodeImage> images = new ArrayList<NodeImage>();
> +               try {
> +                       NodeList imageSet = (NodeList)xpath.evaluate("imagesSet/item", doc.getDocumentElement(), XPathConstants.NODESET);
> +                       for (int i = 0; i < imageSet.getLength(); i++) {
> +                               images.add(parseImage((Element)imageSet.item(i)));
> +                       }
> +                       return images;
> +               } catch (XPathExpressionException e) {
> +                       e.printStackTrace();
> +               }
> +               return null;    // Error
> +       }
> +
> +       private NodeImage parseImage(Element elem) throws XPathExpressionException {
> +               return new NodeImage(xpath.evaluate("imageId", elem),
> +                               xpath.evaluate("imageLocation", elem),
> +                               null,
> +                               this);
> +       }
> +
> +       /*
> +        * Converts a key and array of values into a map for AWS query parameters.
> +        *
> +        * @param key is the key for the array of values
> +        * @param values are the values to compose the query
> +        *
> +        * @return Map<String, String> are parameters for the AWS query
> +        */
> +       private Map<String, String> pathList(String key, String[] values) {
> +               Map<String, String> params = new HashMap<String, String>();
> +               for (int i = 0; i < values.length; i++) {
> +                       params.put(key + '.' + (i + 1), values[i]);
> +               }
> +               return params;
> +       }
> +
> +       private boolean parseRebootBoolean(Document doc) {
> +               try {
> +                       return ((String)xpath.evaluate("return", doc.getDocumentElement())).equals("true");
> +               } catch (XPathExpressionException e) {
> +                       e.printStackTrace();
> +               }
> +               return false;
> +       }
> +
> +       private boolean parseTerminateBoolean(Document doc) {
> +               try {
> +                       String currentState = (String)xpath.evaluate("instancesSet/item/currentState/name", doc.getDocumentElement());
> +                       return currentState.equals("shutting-down") || currentState.equals("terminated");
> +               } catch (XPathExpressionException e) {
> +                       e.printStackTrace();
> +               }
> +               return false;
> +       }
> +
> +       /*
> +        * Base Amazon EC2 instance types.  Subclasses set the prices.
> +        */
> +       protected static Map<String, NodeSize> initNodeSizes() {
> +               Map<String, NodeSize> sizes = new HashMap<String, NodeSize>();
> +               sizes.put("m1.small", new NodeSize("m1.small", "Small Instance", 1740, 160, -1, -1f, null));
> +               sizes.put("m1.large", new NodeSize("m1.large", "Large Instance", 7680, 850, -1, -1f, null));
> +               sizes.put("m1.xlarge", new NodeSize("m1.xlarge", "Extra Large Instance", 15360, 1690, -1, -1f, null));
> +               sizes.put("c1.medium", new NodeSize("c1.medium", "High-CPU Medium Instance", 1740, 350, -1, -1f, null));
> +               sizes.put("c1.xlarge", new NodeSize("c1.xlarge", "High-CPU Extra Large Instance", 7680, 1960, -1, -1f, null));
> +               sizes.put("m2.xlarge", new NodeSize("m2.xlarge", "High-Memory Extra Large Instance", 17510, 420, -1, -1f, null));
> +               sizes.put("m2.2xlarge", new NodeSize("m2.2xlarge", "High-Memory Double Extra Large Instance", 35021, 850, -1, -1f, null));
> +               sizes.put("m2.4xlarge", new NodeSize("m2.4xlarge", "High-Memory Quadruple Extra Large Instance", 70042, 1690, -1, -1f, null));
> +               return sizes;
> +       }
> +
> +       /*
> +        * Retrieves the price for a NodeSize.  Subclass implements its own prices.
> +        *
> +        * @param sizeId identifies the node configuration
> +        *
> +        * @return float is the price of the node configuration
> +        */
> +       protected abstract float getPrice(String sizeId);
> +}
>
> Added: incubator/libcloud/sandbox/java/trunk/src/libcloud/providers/amazon/EC2EUWestDriver.java
> URL: http://svn.apache.org/viewvc/incubator/libcloud/sandbox/java/trunk/src/libcloud/providers/amazon/EC2EUWestDriver.java?rev=997113&view=auto
> ==============================================================================
> --- incubator/libcloud/sandbox/java/trunk/src/libcloud/providers/amazon/EC2EUWestDriver.java (added)
> +++ incubator/libcloud/sandbox/java/trunk/src/libcloud/providers/amazon/EC2EUWestDriver.java Tue Sep 14 21:57:01 2010
> @@ -0,0 +1,46 @@
> +package libcloud.providers.amazon;
> +
> +import java.util.ArrayList;
> +import java.util.HashMap;
> +import java.util.List;
> +import java.util.Map;
> +
> +import libcloud.data.NodeLocation;
> +
> +public class EC2EUWestDriver extends EC2Driver {
> +
> +       private static final String EC2_EU_WEST_HOST = "ec2.eu-west-1.amazonaws.com";
> +
> +       private static final Map<String, Float> EC2_EU_WEST_PRICES = initNodePrices();
> +
> +       public EC2EUWestDriver(String accessId, String accessKey) {
> +               super(accessId, accessKey, EC2_EU_WEST_HOST);
> +       }
> +
> +       public List<NodeLocation> listLocations() {
> +               List<NodeLocation> locations = new ArrayList<NodeLocation>();
> +               locations.add(new NodeLocation("0", "Amazon Europe Ireland", "IE", this));
> +               return locations;
> +       }
> +
> +       public String getName() {
> +               return "Amazon EC2 (eu-west-1)";
> +       }
> +
> +       protected float getPrice(String sizeId) {
> +               return EC2_EU_WEST_PRICES.get(sizeId);
> +       }
> +
> +       private static Map<String, Float> initNodePrices() {
> +               Map<String, Float> prices = new HashMap<String, Float>();
> +               prices.put("m1.small", .095f);
> +               prices.put("m1.large", .38f);
> +               prices.put("m1.xlarge", .76f);
> +               prices.put("c1.medium", .19f);
> +               prices.put("c1.xlarge", .76f);
> +               prices.put("m2.xlarge", .57f);
> +               prices.put("m2.2xlarge", 1.14f);
> +               prices.put("m2.4xlarge", 2.28f);
> +               return prices;
> +       }
> +}
>
> Added: incubator/libcloud/sandbox/java/trunk/src/libcloud/providers/amazon/EC2Handler.java
> URL: http://svn.apache.org/viewvc/incubator/libcloud/sandbox/java/trunk/src/libcloud/providers/amazon/EC2Handler.java?rev=997113&view=auto
> ==============================================================================
> --- incubator/libcloud/sandbox/java/trunk/src/libcloud/providers/amazon/EC2Handler.java (added)
> +++ incubator/libcloud/sandbox/java/trunk/src/libcloud/providers/amazon/EC2Handler.java Tue Sep 14 21:57:01 2010
> @@ -0,0 +1,83 @@
> +package libcloud.providers.amazon;
> +
> +import java.io.IOException;
> +import java.io.StringReader;
> +
> +import javax.xml.parsers.DocumentBuilder;
> +import javax.xml.parsers.DocumentBuilderFactory;
> +import javax.xml.parsers.ParserConfigurationException;
> +import javax.xml.xpath.XPath;
> +import javax.xml.xpath.XPathConstants;
> +import javax.xml.xpath.XPathExpressionException;
> +import javax.xml.xpath.XPathFactory;
> +
> +import libcloud.exceptions.InvalidCredsException;
> +
> +import org.w3c.dom.Document;
> +import org.w3c.dom.NodeList;
> +import org.xml.sax.InputSource;
> +import org.xml.sax.SAXException;
> +
> +import base.connection.ResponseHandler;
> +import base.interfaces.IResponse;
> +
> +public class EC2Handler extends ResponseHandler {
> +
> +       public EC2Handler(IResponse response) {
> +               super(response);
> +       }
> +
> +       protected void parseBody() {
> +               object = null;
> +               try {
> +                       DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
> +                       DocumentBuilder db = dbf.newDocumentBuilder();
> +                       object = db.parse(new InputSource(new StringReader(response.getBody())));
> +               } catch (ParserConfigurationException e) {
> +                       e.printStackTrace();
> +               } catch (SAXException e) {
> +                       e.printStackTrace();
> +               } catch (IOException e) {
> +                       e.printStackTrace();
> +               }
> +       }
> +
> +       protected String parseError() {
> +               try {
> +                       // Parse errors
> +                       DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
> +                       DocumentBuilder db = dbf.newDocumentBuilder();
> +                       Document doc = db.parse(new InputSource(new StringReader(response.getBody())));
> +                       XPath xpath = XPathFactory.newInstance().newXPath();
> +                       NodeList errors = (NodeList)xpath.evaluate("Errors/Error", doc.getDocumentElement(), XPathConstants.NODESET);
> +
> +                       // Process errors
> +                       StringBuffer sb = new StringBuffer();
> +                       for (int i = 0; i < errors.getLength(); i++) {
> +                               String error = (String)xpath.evaluate("Code", errors.item(i));
> +                               String message = (String)xpath.evaluate("Message", errors.item(i));
> +                               if (error.equals("InvalidClientTokenId")) {
> +                                       throw new InvalidCredsException(response.getStatus() + " " + error + ": " + message);
> +                               } else if (error.equals("SignatureDoesNotMatch")) {
> +                                       throw new InvalidCredsException(response.getStatus() + " " + error + ": " + message);
> +                               } else if (error.equals("AuthFailure")) {
> +                                       throw new InvalidCredsException(response.getStatus() + " " + error + ": " + message);
> +                               } else if (error.equals("OptInRequired")) {
> +                                       throw new InvalidCredsException(response.getStatus() + " " + error + ": " + message);
> +                               } else {
> +                                       sb.append(response.getStatus() + " " + error + ": " + message + '\n');
> +                               }
> +                       }
> +                       return sb.toString().trim();
> +               } catch (ParserConfigurationException e) {
> +                       e.printStackTrace();
> +               } catch (SAXException e) {
> +                       e.printStackTrace();
> +               } catch (IOException e) {
> +                       e.printStackTrace();
> +               } catch (XPathExpressionException e) {
> +                       e.printStackTrace();
> +               }
> +               return super.parseError();
> +       }
> +}
>
> Added: incubator/libcloud/sandbox/java/trunk/src/libcloud/providers/amazon/EC2USEastDriver.java
> URL: http://svn.apache.org/viewvc/incubator/libcloud/sandbox/java/trunk/src/libcloud/providers/amazon/EC2USEastDriver.java?rev=997113&view=auto
> ==============================================================================
> --- incubator/libcloud/sandbox/java/trunk/src/libcloud/providers/amazon/EC2USEastDriver.java (added)
> +++ incubator/libcloud/sandbox/java/trunk/src/libcloud/providers/amazon/EC2USEastDriver.java Tue Sep 14 21:57:01 2010
> @@ -0,0 +1,46 @@
> +package libcloud.providers.amazon;
> +
> +import java.util.ArrayList;
> +import java.util.HashMap;
> +import java.util.List;
> +import java.util.Map;
> +
> +import libcloud.data.NodeLocation;
> +
> +public class EC2USEastDriver extends EC2Driver {
> +
> +       private static final String EC2_US_EAST_HOST = "ec2.us-east-1.amazonaws.com";
> +
> +       private static final Map<String, Float> EC2_US_EAST_PRICES = initNodePrices();
> +
> +       public EC2USEastDriver(String accessId, String accessKey) {
> +               super(accessId, accessKey, EC2_US_EAST_HOST);
> +       }
> +
> +       public List<NodeLocation> listLocations() {
> +               List<NodeLocation> locations = new ArrayList<NodeLocation>();
> +               locations.add(new NodeLocation("0", "Amazon US N. Virginia", "US", this));
> +               return locations;
> +       }
> +
> +       public String getName() {
> +               return "Amazon EC2 (us-east-1)";
> +       }
> +
> +       protected float getPrice(String sizeId) {
> +               return EC2_US_EAST_PRICES.get(sizeId);
> +       }
> +
> +       private static Map<String, Float> initNodePrices() {
> +               Map<String, Float> prices = new HashMap<String, Float>();
> +               prices.put("m1.small", .085f);
> +               prices.put("m1.large", .34f);
> +               prices.put("m1.xlarge", .68f);
> +               prices.put("c1.medium", .17f);
> +               prices.put("c1.xlarge", .68f);
> +               prices.put("m2.xlarge", .50f);
> +               prices.put("m2.2xlarge", 1.00f);
> +               prices.put("m2.4xlarge", 2.00f);
> +               return prices;
> +       }
> +}
>
> Added: incubator/libcloud/sandbox/java/trunk/src/libcloud/providers/amazon/EC2USWestDriver.java
> URL: http://svn.apache.org/viewvc/incubator/libcloud/sandbox/java/trunk/src/libcloud/providers/amazon/EC2USWestDriver.java?rev=997113&view=auto
> ==============================================================================
> --- incubator/libcloud/sandbox/java/trunk/src/libcloud/providers/amazon/EC2USWestDriver.java (added)
> +++ incubator/libcloud/sandbox/java/trunk/src/libcloud/providers/amazon/EC2USWestDriver.java Tue Sep 14 21:57:01 2010
> @@ -0,0 +1,46 @@
> +package libcloud.providers.amazon;
> +
> +import java.util.ArrayList;
> +import java.util.HashMap;
> +import java.util.List;
> +import java.util.Map;
> +
> +import libcloud.data.NodeLocation;
> +
> +public class EC2USWestDriver extends EC2Driver {
> +
> +       private static final String EC2_US_WEST_HOST = "ec2.us-west-1.amazonaws.com";
> +
> +       private static final Map<String, Float> EC2_US_WEST_PRICES = initNodePrices();
> +
> +       public EC2USWestDriver(String accessId, String accessKey) {
> +               super(accessId, accessKey, EC2_US_WEST_HOST);
> +       }
> +
> +       public List<NodeLocation> listLocations() {
> +               List<NodeLocation> locations = new ArrayList<NodeLocation>();
> +               locations.add(new NodeLocation("0", "Amazon US N. California", "US", this));
> +               return locations;
> +       }
> +
> +       public String getName() {
> +               return "Amazon EC2 (us-west-1)";
> +       }
> +
> +       protected float getPrice(String sizeId) {
> +               return EC2_US_WEST_PRICES.get(sizeId);
> +       }
> +
> +       private static Map<String, Float> initNodePrices() {
> +               Map<String, Float> prices = new HashMap<String, Float>();
> +               prices.put("m1.small", .095f);
> +               prices.put("m1.large", .38f);
> +               prices.put("m1.xlarge", .76f);
> +               prices.put("c1.medium", .19f);
> +               prices.put("c1.xlarge", .76f);
> +               prices.put("m2.xlarge", .57f);
> +               prices.put("m2.2xlarge", 1.14f);
> +               prices.put("m2.4xlarge", 2.28f);
> +               return prices;
> +       }
> +}
>
> Added: incubator/libcloud/sandbox/java/trunk/src/libcloud/providers/ibm/IBMConnection.java
> URL: http://svn.apache.org/viewvc/incubator/libcloud/sandbox/java/trunk/src/libcloud/providers/ibm/IBMConnection.java?rev=997113&view=auto
> ==============================================================================
> --- incubator/libcloud/sandbox/java/trunk/src/libcloud/providers/ibm/IBMConnection.java (added)
> +++ incubator/libcloud/sandbox/java/trunk/src/libcloud/providers/ibm/IBMConnection.java Tue Sep 14 21:57:01 2010
> @@ -0,0 +1,32 @@
> +package libcloud.providers.ibm;
> +
> +import java.util.Map;
> +
> +import libcloud.NodeDriver;
> +
> +import org.apache.commons.codec.binary.Base64;
> +
> +import base.connection.ConnectionUserAndKey;
> +
> +public class IBMConnection extends ConnectionUserAndKey {
> +
> +       private static final String DEFAULT_HOST = "www-147.ibm.com";
> +       private static final boolean DEFAULT_SECURE = true;
> +
> +       public IBMConnection(String userId, String key, NodeDriver driver) {
> +               super(userId, key, DEFAULT_SECURE, DEFAULT_HOST, driver);
> +       }
> +
> +       public IBMConnection(String userId, String password, boolean secure,
> +                       String host, int port, NodeDriver driver) {
> +               super(userId, password, secure, host, port, driver);
> +       }
> +
> +       protected Map<String, String> addDefaultHeaders(Map<String, String> headers) {
> +               headers.put("Accept", "text/xml");
> +               String authorization = "Basic " + new String(Base64.encodeBase64((accessId + ":" + accessKey).getBytes()));
> +               headers.put("Authorization", authorization);
> +               headers.put("Content-Type", "text/xml");
> +               return headers;
> +       }
> +}
>
> Propchange: incubator/libcloud/sandbox/java/trunk/src/libcloud/providers/ibm/IBMConnection.java
> ------------------------------------------------------------------------------
>    svn:executable = *
>
> Added: incubator/libcloud/sandbox/java/trunk/src/libcloud/providers/ibm/IBMDriver.java
> URL: http://svn.apache.org/viewvc/incubator/libcloud/sandbox/java/trunk/src/libcloud/providers/ibm/IBMDriver.java?rev=997113&view=auto
> ==============================================================================
> --- incubator/libcloud/sandbox/java/trunk/src/libcloud/providers/ibm/IBMDriver.java (added)
> +++ incubator/libcloud/sandbox/java/trunk/src/libcloud/providers/ibm/IBMDriver.java Tue Sep 14 21:57:01 2010
> @@ -0,0 +1,229 @@
> +package libcloud.providers.ibm;
> +
> +import java.util.ArrayList;
> +import java.util.HashMap;
> +import java.util.List;
> +import java.util.Map;
> +
> +import libcloud.NodeDriver;
> +import libcloud.data.Node;
> +import libcloud.data.NodeAuth;
> +import libcloud.data.NodeImage;
> +import libcloud.data.NodeLocation;
> +import libcloud.data.NodeSize;
> +import libcloud.data.NodeState;
> +import libcloud.interfaces.INode;
> +
> +import org.w3c.dom.Document;
> +import org.w3c.dom.Element;
> +import org.w3c.dom.NodeList;
> +
> +import base.connection.ConnectionKey;
> +import base.interfaces.IResponse;
> +
> +/*
> + * TODO: comment all classes
> + * TODO: overload constructor with userId, key, host, and port
> + * TODO: listImages(NodeLocation)
> + * TODO: listSizes(NodeLocation)
> + * TODO: update to use XPath -- See Amazon EC2 Driver
> + */
> +public class IBMDriver extends NodeDriver {
> +
> +       private static final String REST_BASE = "/computecloud/enterprise/api/rest/20100331";
> +
> +       private static final Map<Integer, NodeState> NODE_STATE_MAP = new HashMap<Integer, NodeState>();
> +
> +       public IBMDriver(String userId, String key) {
> +               connection = new IBMConnection(userId, key, this);
> +
> +               // Map IBM instance states to libcloud
> +               NODE_STATE_MAP.put(0, NodeState.PENDING);
> +               NODE_STATE_MAP.put(1, NodeState.PENDING);
> +               NODE_STATE_MAP.put(2, NodeState.TERMINATED);
> +               NODE_STATE_MAP.put(3, NodeState.TERMINATED);
> +               NODE_STATE_MAP.put(4, NodeState.TERMINATED);
> +               NODE_STATE_MAP.put(5, NodeState.RUNNING);
> +               NODE_STATE_MAP.put(6, NodeState.UNKNOWN);
> +               NODE_STATE_MAP.put(7, NodeState.PENDING);
> +               NODE_STATE_MAP.put(8, NodeState.REBOOTING);
> +               NODE_STATE_MAP.put(9, NodeState.PENDING);
> +               NODE_STATE_MAP.put(10, NodeState.PENDING);
> +               NODE_STATE_MAP.put(11, NodeState.TERMINATED);
> +               NODE_STATE_MAP.put(12, NodeState.PENDING);      // Deprovision pending
> +               NODE_STATE_MAP.put(13, NodeState.PENDING);      // Restart pending
> +       }
> +
> +       public String getName() {
> +               return "IBM Smart Business Development and Test Cloud";
> +       }
> +
> +       public INode createNode(String name, NodeSize size, NodeImage image,
> +                       NodeLocation location, NodeAuth auth, Map<String, Object> extra) {
> +               // Compose headers for message body
> +               Map<String, String> data = new HashMap<String, String>();
> +               data.put("name", name);
> +               data.put("imageID", image.id);
> +               data.put("instanceType", size.id);
> +               if (location != null) {
> +                       data.put("location", location.id);
> +               }
> +               if (auth != null) {
> +                       data.put("publicKey", auth.secret);
> +               }
> +               if (extra != null) {
> +                       for (String key : extra.keySet()) {
> +                               data.put(key, (String)extra.get(key));
> +                       }
> +               }
> +
> +               String encoded = ConnectionKey.urlEncodeMap(data);
> +               Map<String, String> headers = new HashMap<String, String>();
> +               headers.put("Content-Type", "application/x-www-form-urlencoded");
> +               IResponse response = connection.request("POST", REST_BASE + "/instances", headers, null, encoded);
> +               IBMHandler handler = new IBMHandler(response);
> +               return parseNodes((Document)handler.getParsedObject()).get(0);
> +       }
> +
> +       public boolean rebootNode(INode node) {
> +               Map<String, String> headers = new HashMap<String, String>();
> +               headers.put("Content-Type", "application/x-www-form-urlencoded");
> +               Map<String, String> data = new HashMap<String, String>();
> +               data.put("state", "restart");
> +               IResponse response = connection.request("PUT", REST_BASE + "/instances/" + node.getId(), headers, null, ConnectionKey.urlEncodeMap(data));
> +               new IBMHandler(response);
> +               return response.getStatus() == 200;
> +       }
> +
> +       public boolean destroyNode(INode node) {
> +               IResponse response = connection.request("DELETE", REST_BASE + "/instances/" + node.getId(), null, null, "");
> +               new IBMHandler(response);
> +               return response.getStatus() == 200;
> +       }
> +
> +       public List<NodeImage> listImages() {
> +               IResponse response = connection.request("GET", REST_BASE + "/offerings/image", null, null, "");
> +               IBMHandler handler = new IBMHandler(response);
> +               return parseImages((Document)handler.getParsedObject());
> +       }
> +
> +       public List<NodeLocation> listLocations() {
> +               IResponse response = connection.request("GET", REST_BASE + "/locations", null, null, "");
> +               IBMHandler handler = new IBMHandler(response);
> +               return parseLocations((Document)handler.getParsedObject());
> +       }
> +
> +       public List<INode> listNodes() {
> +               IResponse response = connection.request("GET", REST_BASE + "/instances", null, null, "");
> +               IBMHandler handler = new IBMHandler(response);
> +               return parseNodes((Document)handler.getParsedObject());
> +       }
> +
> +       public List<NodeSize> listSizes() {
> +               List<NodeSize> sizes = new ArrayList<NodeSize>();
> +               sizes.add(new NodeSize("BRZ32.1/2048/175", "Bronze 32 bit", -1, -1, -1, -1, this));
> +               sizes.add(new NodeSize("BRZ64.2/4096/850", "Bronze 64 bit", -1, -1, -1, -1, this));
> +               sizes.add(new NodeSize("SLV32.2/4096/350", "Silver 32 bit", -1, -1, -1, -1, this));
> +               sizes.add(new NodeSize("SLV64.4/8192/1024", "Silver 64 bit", -1, -1, -1, -1, this));
> +               sizes.add(new NodeSize("GLD32.4/4096/350", "Bronze 32 bit", -1, -1, -1, -1, this));
> +               sizes.add(new NodeSize("GLD64.8/16384/1024", "Gold 64 bit", -1, -1, -1, -1, this));
> +               sizes.add(new NodeSize("PLT64.16/16384/2045", "Platinum 64 bit", -1, -1, -1, -1, this));
> +               return sizes;
> +       }
> +
> +       // ----------------------------- PRIVATE HELPERS ---------------------------
> +
> +       private List<NodeImage> parseImages(Document doc) {
> +               List<NodeImage> images = new ArrayList<NodeImage>();
> +               List<Element> elems = getFirstElementsByTagName(doc
> +                               .getDocumentElement(), "Image");
> +               for (Element elem : elems) {
> +                       images.add(parseImage(elem));
> +               }
> +               return images;
> +       }
> +
> +       private NodeImage parseImage(Element elem) {
> +               return new NodeImage(getTextValue(elem, "ID"),
> +                               getTextValue(elem, "Name"),
> +                               null, // TODO: include parametersUrl in extra
> +                               this);
> +       }
> +
> +       private List<INode> parseNodes(Document doc) {
> +               List<INode> nodes = new ArrayList<INode>();
> +               List<Element> elems = getFirstElementsByTagName(doc.getDocumentElement(), "Instance");
> +               for (Element elem : elems) {
> +                       nodes.add(parseNode(elem));
> +               }
> +               return nodes;
> +       }
> +
> +       private INode parseNode(Element elem) {
> +               return new Node(getTextValue(elem, "ID"),
> +                               getTextValue(elem, "Name"),
> +                               NODE_STATE_MAP.get(new Integer(getTextValue(elem, "Status"))),
> +                               getTextValue(elem, "IP"),
> +                               null,
> +                               null,
> +                               this);
> +       }
> +
> +       private List<NodeLocation> parseLocations(Document doc) {
> +               List<NodeLocation> locations = new ArrayList<NodeLocation>();
> +               List<Element> elems = getFirstElementsByTagName(doc
> +                               .getDocumentElement(), "Location");
> +               for (Element elem : elems) {
> +                       locations.add(parseLocation(elem));
> +               }
> +               return locations;
> +       }
> +
> +       private NodeLocation parseLocation(Element elem) {
> +               return new NodeLocation(getTextValue(elem, "ID"), getTextValue(elem, "Name"), "US", this);
> +       }
> +
> +       /*
> +        * Utility function to extract the text value of the given element.
> +        *
> +        * @param elem is the element to find the tag in
> +        * @param tagName is the name of the tag to find the value for
> +        *
> +        * @return String is the text value of the given tag
> +        */
> +       public static String getTextValue(Element elem, String tagName) {
> +               NodeList nl = elem.getElementsByTagName(tagName);
> +               if (nl.getLength() > 0) {
> +                       if (nl.item(0).getFirstChild() == null) {
> +                               return "";
> +                       } else {
> +                               return nl.item(0).getFirstChild().getNodeValue();
> +                       }
> +               } else {
> +                       return null;
> +               }
> +       }
> +
> +       /*
> +        * Utility function that returns a list of immediate children to the given
> +        * Element and that matches the given tagName.
> +        *
> +        * TODO: Use XPath instead (see Amazon EC2 driver)
> +        *
> +        * @param elem is the parent of the elements to search
> +        * @param tagName identifies the elements to find
> +        *
> +        * @return List<Element> is a list of immediate children matching tagName
> +        */
> +       public static List<Element> getFirstElementsByTagName(Element elem, String tagName) {
> +               List<Element> elements = new ArrayList<Element>();
> +               NodeList children = elem.getChildNodes();
> +               for (int i = 0; i < children.getLength(); i++) {
> +                       Element child = (Element) children.item(i);
> +                       if (child.getTagName().equals(tagName)) {
> +                               elements.add(child);
> +                       }
> +               }
> +               return elements;
> +       }
> +}
>
> Propchange: incubator/libcloud/sandbox/java/trunk/src/libcloud/providers/ibm/IBMDriver.java
> ------------------------------------------------------------------------------
>    svn:executable = *
>
> Added: incubator/libcloud/sandbox/java/trunk/src/libcloud/providers/ibm/IBMHandler.java
> URL: http://svn.apache.org/viewvc/incubator/libcloud/sandbox/java/trunk/src/libcloud/providers/ibm/IBMHandler.java?rev=997113&view=auto
> ==============================================================================
> --- incubator/libcloud/sandbox/java/trunk/src/libcloud/providers/ibm/IBMHandler.java (added)
> +++ incubator/libcloud/sandbox/java/trunk/src/libcloud/providers/ibm/IBMHandler.java Tue Sep 14 21:57:01 2010
> @@ -0,0 +1,51 @@
> +package libcloud.providers.ibm;
> +
> +import java.io.IOException;
> +import java.io.StringReader;
> +
> +import javax.xml.parsers.DocumentBuilder;
> +import javax.xml.parsers.DocumentBuilderFactory;
> +import javax.xml.parsers.ParserConfigurationException;
> +
> +import libcloud.exceptions.InvalidCredsException;
> +
> +import org.xml.sax.InputSource;
> +import org.xml.sax.SAXException;
> +
> +import base.connection.ResponseHandler;
> +import base.interfaces.IResponse;
> +
> +public class IBMHandler extends ResponseHandler {
> +
> +       public IBMHandler(IResponse response) {
> +               super(response);
> +       }
> +
> +       protected void parseBody() {
> +               object = null;
> +               DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
> +               try {
> +                       DocumentBuilder db = dbf.newDocumentBuilder();
> +                       object = db.parse(new InputSource(new StringReader(response.getBody())));
> +               } catch (ParserConfigurationException e) {
> +                       e.printStackTrace();
> +               } catch (SAXException e) {
> +                       e.printStackTrace();
> +               } catch (IOException e) {
> +                       e.printStackTrace();
> +               }
> +       }
> +
> +       protected String parseError() {
> +               if (response.getStatus() == 401) {
> +                       if (response.getBody().equals("")) {
> +                               throw new InvalidCredsException(response.getStatus() + ": "
> +                                               + response.getPhrase());
> +                       } else {
> +                               throw new InvalidCredsException(response.getBody());
> +                       }
> +               } else {
> +                       return (String)response.getBody();
> +               }
> +       }
> +}
>
> Propchange: incubator/libcloud/sandbox/java/trunk/src/libcloud/providers/ibm/IBMHandler.java
> ------------------------------------------------------------------------------
>    svn:executable = *
>
>
>
Mime
View raw message