From b1acbe0affc89a3d56ecdaf65d45f29c3b731afc Mon Sep 17 00:00:00 2001 From: Lowell Vaughn Date: Thu, 6 Aug 2009 10:19:57 -0500 Subject: [PATCH 01/64] Moving to com.rackspacecloud --- .../client/cloudfiles/FilesAccountInfo.java | 48 + .../FilesAuthorizationException.java | 29 + .../client/cloudfiles/FilesCDNContainer.java | 116 + .../client/cloudfiles/FilesClient.java | 2552 +++++++++++++++++ .../client/cloudfiles/FilesConstants.java | 83 + .../client/cloudfiles/FilesContainer.java | 197 ++ .../FilesContainerExistsException.java | 30 + .../client/cloudfiles/FilesContainerInfo.java | 62 + .../FilesContainerNotEmptyException.java | 25 + .../client/cloudfiles/FilesException.java | 91 + .../cloudfiles/FilesInvalidNameException.java | 20 + .../cloudfiles/FilesNotFoundException.java | 30 + .../client/cloudfiles/FilesObject.java | 354 +++ .../cloudfiles/FilesObjectMetaData.java | 177 ++ .../client/cloudfiles/FilesResponse.java | 307 ++ .../client/cloudfiles/FilesUtil.java | 113 + .../cloudfiles/IFilesTransferCallback.java | 13 + .../client/cloudfiles/MIME.types | 580 ++++ .../client/cloudfiles/sample/FilesAuth.java | 33 + .../client/cloudfiles/sample/FilesCli.java | 401 +++ .../client/cloudfiles/sample/FilesCopy.java | 456 +++ .../client/cloudfiles/sample/FilesList.java | 247 ++ .../cloudfiles/sample/FilesMakeContainer.java | 116 + .../client/cloudfiles/sample/FilesRemove.java | 180 ++ .../wrapper/OutputStreamWrapper.java | 80 + .../wrapper/RequestEntityWrapper.java | 55 + .../cloudfiles/FilesClientTestCase.java | 1513 ++++++++++ .../client/cloudfiles/LongRunningTest.java | 42 + src/test/resources/cloudfiles.properties | 4 +- 29 files changed, 7952 insertions(+), 2 deletions(-) create mode 100644 src/main/java/com/rackspacecloud/client/cloudfiles/FilesAccountInfo.java create mode 100644 src/main/java/com/rackspacecloud/client/cloudfiles/FilesAuthorizationException.java create mode 100644 src/main/java/com/rackspacecloud/client/cloudfiles/FilesCDNContainer.java create mode 100644 src/main/java/com/rackspacecloud/client/cloudfiles/FilesClient.java create mode 100644 src/main/java/com/rackspacecloud/client/cloudfiles/FilesConstants.java create mode 100644 src/main/java/com/rackspacecloud/client/cloudfiles/FilesContainer.java create mode 100644 src/main/java/com/rackspacecloud/client/cloudfiles/FilesContainerExistsException.java create mode 100644 src/main/java/com/rackspacecloud/client/cloudfiles/FilesContainerInfo.java create mode 100644 src/main/java/com/rackspacecloud/client/cloudfiles/FilesContainerNotEmptyException.java create mode 100644 src/main/java/com/rackspacecloud/client/cloudfiles/FilesException.java create mode 100644 src/main/java/com/rackspacecloud/client/cloudfiles/FilesInvalidNameException.java create mode 100644 src/main/java/com/rackspacecloud/client/cloudfiles/FilesNotFoundException.java create mode 100644 src/main/java/com/rackspacecloud/client/cloudfiles/FilesObject.java create mode 100644 src/main/java/com/rackspacecloud/client/cloudfiles/FilesObjectMetaData.java create mode 100644 src/main/java/com/rackspacecloud/client/cloudfiles/FilesResponse.java create mode 100644 src/main/java/com/rackspacecloud/client/cloudfiles/FilesUtil.java create mode 100644 src/main/java/com/rackspacecloud/client/cloudfiles/IFilesTransferCallback.java create mode 100644 src/main/java/com/rackspacecloud/client/cloudfiles/MIME.types create mode 100644 src/main/java/com/rackspacecloud/client/cloudfiles/sample/FilesAuth.java create mode 100644 src/main/java/com/rackspacecloud/client/cloudfiles/sample/FilesCli.java create mode 100644 src/main/java/com/rackspacecloud/client/cloudfiles/sample/FilesCopy.java create mode 100644 src/main/java/com/rackspacecloud/client/cloudfiles/sample/FilesList.java create mode 100644 src/main/java/com/rackspacecloud/client/cloudfiles/sample/FilesMakeContainer.java create mode 100644 src/main/java/com/rackspacecloud/client/cloudfiles/sample/FilesRemove.java create mode 100644 src/main/java/com/rackspacecloud/client/cloudfiles/wrapper/OutputStreamWrapper.java create mode 100644 src/main/java/com/rackspacecloud/client/cloudfiles/wrapper/RequestEntityWrapper.java create mode 100644 src/test/java/com/rackspacecloud/client/cloudfiles/FilesClientTestCase.java create mode 100644 src/test/java/com/rackspacecloud/client/cloudfiles/LongRunningTest.java diff --git a/src/main/java/com/rackspacecloud/client/cloudfiles/FilesAccountInfo.java b/src/main/java/com/rackspacecloud/client/cloudfiles/FilesAccountInfo.java new file mode 100644 index 0000000..950bc5d --- /dev/null +++ b/src/main/java/com/rackspacecloud/client/cloudfiles/FilesAccountInfo.java @@ -0,0 +1,48 @@ +/** + * + */ +package com.rackspacecloud.client.cloudfiles; + +/** + * @author lvaughn + * + */ +public class FilesAccountInfo { + private long bytesUsed; + private int containerCount; + + public FilesAccountInfo(long bytes, int containers) { + bytesUsed = bytes; + containerCount = containers; + } + /** + * Returns the total number of bytes used by all objects in a given account. + * + * @return the bytesUsed + */ + public long getBytesUsed() { + return bytesUsed; + } + /** + * @param bytesUsed The number of bytes in the account + */ + public void setBytesUsed(long bytesUsed) { + this.bytesUsed = bytesUsed; + } + /** + * The number of containers in a given account. + * + * @return the containerCount + */ + public int getContainerCount() { + return containerCount; + } + /** + * @param containerCount the containerCount to set + */ + public void setContainerCount(int containerCount) { + this.containerCount = containerCount; + } + + +} diff --git a/src/main/java/com/rackspacecloud/client/cloudfiles/FilesAuthorizationException.java b/src/main/java/com/rackspacecloud/client/cloudfiles/FilesAuthorizationException.java new file mode 100644 index 0000000..9be66c2 --- /dev/null +++ b/src/main/java/com/rackspacecloud/client/cloudfiles/FilesAuthorizationException.java @@ -0,0 +1,29 @@ +/* + * See COPYING for license information. + */ + +package com.rackspacecloud.client.cloudfiles; + +import org.apache.commons.httpclient.Header; +import org.apache.commons.httpclient.StatusLine; + +public class FilesAuthorizationException extends FilesException +{ + /** + * + */ + private static final long serialVersionUID = -3142674319839157198L; + + /** + * An exception generated when a client tries to do something they aren't authorized to do. + * + * @param message The message + * @param httpHeaders The returned HTTP headers + * @param httpStatusLine The HTTP Status lined returned + */ + public FilesAuthorizationException(String message, Header [] httpHeaders, StatusLine httpStatusLine) + { + super (message, httpHeaders, httpStatusLine); + } + +} diff --git a/src/main/java/com/rackspacecloud/client/cloudfiles/FilesCDNContainer.java b/src/main/java/com/rackspacecloud/client/cloudfiles/FilesCDNContainer.java new file mode 100644 index 0000000..8740fa2 --- /dev/null +++ b/src/main/java/com/rackspacecloud/client/cloudfiles/FilesCDNContainer.java @@ -0,0 +1,116 @@ +/** + * + */ +package com.rackspacecloud.client.cloudfiles; + +/** + * @author lvaughn + * + */ +public class FilesCDNContainer { + private boolean enabled; +// private String userAgentACL; +// private String referrerACL; + private int ttl; + private String cdnURL; + private String name; + + public FilesCDNContainer() { + } + + public FilesCDNContainer(String cdnURL) { + this.cdnURL = cdnURL; + } + + public FilesCDNContainer(String name, boolean enabled, int ttl) { + this.enabled = enabled; + this.ttl = ttl; + this.name = name; + //this(enabled, ttl, null, null); + } + +// public FilesCDNContainer(boolean enabled, int ttl, String userAgentACL, String referrerACL) { +// this.enabled = enabled; +// this.ttl = ttl; +// this.userAgentACL = userAgentACL; +// this.referrerACL = referrerACL; +// } + + /** + * @return Is this container CDN enabled + */ + public boolean isEnabled() { + return enabled; + } + /** + * @param enabled the enabled to set + */ + public void setEnabled(boolean enabled) { + this.enabled = enabled; + } +// /** +// * @return the userAgentACL +// */ +// public String getUserAgentACL() { +// return userAgentACL; +// } +// /** +// * @param userAgentACL the userAgentACL to set +// */ +// public void setUserAgentACL(String userAgentACL) { +// this.userAgentACL = userAgentACL; +// } +// /** +// * @return the refererACL +// */ +// public String getReferrerACL() { +// return referrerACL; +// } +// /** +// * @param refererACL the refererACL to set +// */ +// public void setReferrerACL(String referrerACL) { +// this.referrerACL = referrerACL; +// } + /** + * @return the ttl + */ + public int getTtl() { + return ttl; + } + /** + * @param ttl the ttl to set + */ + public void setTtl(int ttl) { + this.ttl = ttl; + } + + /** + * @return the cdnURL + */ + public String getCdnURL() { + return cdnURL; + } + + /** + * @param cdnURL the cdnURL to set + */ + public void setCdnURL(String cdnURL) { + this.cdnURL = cdnURL; + } + /** + * @return the name + */ + public String getName() { + return name; + } + + /** + * @param name the name to set + */ + public void setName(String name) { + this.name = name; + } + + +} diff --git a/src/main/java/com/rackspacecloud/client/cloudfiles/FilesClient.java b/src/main/java/com/rackspacecloud/client/cloudfiles/FilesClient.java new file mode 100644 index 0000000..9aa1f21 --- /dev/null +++ b/src/main/java/com/rackspacecloud/client/cloudfiles/FilesClient.java @@ -0,0 +1,2552 @@ +/* + * See COPYING for license information. + */ + +package com.rackspacecloud.client.cloudfiles; + +import org.apache.log4j.Logger; +import org.apache.commons.codec.DecoderException; +import org.apache.commons.codec.EncoderException; +import org.apache.commons.codec.net.URLCodec; +import org.apache.commons.httpclient.*; +import org.apache.commons.httpclient.methods.*; +import org.apache.commons.httpclient.params.HttpMethodParams; +import org.apache.commons.lang.text.StrTokenizer; +import org.w3c.dom.Document; +import org.w3c.dom.Node; +import org.w3c.dom.NodeList; +import org.xml.sax.SAXException; + +import com.rackspacecloud.client.cloudfiles.wrapper.RequestEntityWrapper; + +import java.io.IOException; +import java.util.LinkedList; +import java.util.List; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.Map; +import java.io.BufferedOutputStream; +import java.io.File; +import java.io.FileInputStream; +import java.io.FileNotFoundException; +import java.io.FileOutputStream; +import java.io.InputStream; +import java.io.InputStreamReader; +import java.math.BigInteger; +import java.security.MessageDigest; +import java.security.NoSuchAlgorithmException; + +import javax.xml.parsers.DocumentBuilder; +import javax.xml.parsers.DocumentBuilderFactory; +import javax.xml.parsers.ParserConfigurationException; + +/** + * + * A client for Cloud Files. Here follows a basic example of logging in, creating a container and an + * object, retrieving the object, and then deleting both the object and container. For more examples, + * see the code in com.rackspacecloud.client.cloudfiles.sample, which contains a series of examples. + * + *
+ * 
+ *  //  Create the client object for username "jdoe", password "johnsdogsname". 
+ * 	FilesClient myClient = FilesClient("jdoe", "johnsdogsname");
+ * 
+ *  // Log in (login() will return false if the login was unsuccessful.
+ *  assert(myClient.login());
+ * 
+ *  // Make sure there are no containers in the account
+ *  assert(myClient.listContainers.length() == 0);
+ *  
+ *  // Create the container
+ *  assert(myClient.createContainer("myContainer"));
+ *  
+ *  // Now we should have one
+ *  assert(myClient.listContainers.length() == 1);
+ *  
+ *  // Upload the file "alpaca.jpg"
+ *  assert(myClient.storeObject("myContainer", new File("alapca.jpg"), "image/jpeg"));
+ *  
+ *  // Download "alpaca.jpg"
+ *  FilesObject obj = myClient.getObject("myContainer", "alpaca.jpg");
+ *  byte data[] = obj.getObject();
+ *  
+ *  // Clean up after ourselves.
+ *  // Note:  Order here is important, you can't delete non-empty containers.
+ *  assert(myClient.deleteObject("myContainer", "alpaca.jpg"));
+ *  assert(myClient.deleteContainer("myContainer");
+ * 
+ * + * @see com.rackspacecloud.client.cloudfiles.sample.FilesCli + * @see com.rackspacecloud.client.cloudfiles.sample.FilesAuth + * @see com.rackspacecloud.client.cloudfiles.sample.FilesCopy + * @see com.rackspacecloud.client.cloudfiles.sample.FilesList + * @see com.rackspacecloud.client.cloudfiles.sample.FilesRemove + * @see com.rackspacecloud.client.cloudfiles.sample.FilesMakeContainer + * + * @author lvaughn + */ +public class FilesClient +{ + public static final String VERSION = "v1"; + + private String username = null; + private String password = null; + private String account = null; + private String authenticationURL; + private int connectionTimeOut; + private String storageURL = null; + private String cdnManagementURL = null; + private String authToken = null; + private boolean isLoggedin = false; + private boolean useETag = true; + + private HttpClient client = new HttpClient(new MultiThreadedHttpConnectionManager()); + + private static Logger logger = Logger.getLogger(FilesClient.class); + + /** + * @param username The username to log in to + * @param password The password + * @param account The Cloud Files account to use + * @param connectionTimeOut The connection timeout, in ms. + */ + public FilesClient(String username, String password, String account, int connectionTimeOut) + { + this.username = username; + this.password = password; + this.account = account; + if (account != null && account.length() > 0) { + this.authenticationURL = FilesUtil.getProperty("auth_url")+VERSION+"/"+account+FilesUtil.getProperty("auth_url_post"); + } + else { + this.authenticationURL = FilesUtil.getProperty("auth_url"); + } + this.connectionTimeOut = connectionTimeOut; + + client.getParams().setParameter("http.socket.timeout", this.connectionTimeOut ); + setUserAgent(FilesConstants.USER_AGENT); + + if (logger.isDebugEnabled()) { + logger.debug("UserName: "+ this.username); + logger.debug("AuthenticationURL: "+ this.authenticationURL); + logger.debug("ConnectionTimeOut: "+ this.connectionTimeOut); + } + //logger.debug("LGV:" + client.getHttpConnectionManager()); + } + + /** + * This method uses the default connection time out of CONNECTON_TIMEOUT. If account + * is null, "Mosso Style" authentication is assumed, otherwise standard Cloud Files authentication is used. + * + * @param username + * @param password + * @param account + */ + public FilesClient(String username, String password, String account) + { + this (username, password, account, FilesUtil.getIntProperty("connection_timeout")); + } + + /** + * Mosso-style authentication (No accounts). + * + * @param username Your CloudFiles username + * @param apiAccessKey Your CloudFiles API Access Key + */ + public FilesClient(String username, String apiAccessKey) + { + this (username, apiAccessKey, null, FilesUtil.getIntProperty("connection_timeout")); + //lConnectionManagerogger.warn("LGV"); + //logger.debug("LGV:" + client.getHttpConnectionManager()); + } + + /** + * This method uses the default connection time out of CONNECTON_TIMEOUT and username, password, + * and account from FilesUtil + * + */ + public FilesClient() + { + this (FilesUtil.getProperty("username"), + FilesUtil.getProperty("password"), + FilesUtil.getProperty("account"), + FilesUtil.getIntProperty("connection_timeout")); + } + + /** + * Returns the Account associated with the URL + * + * @return The account name + */ + public String getAccount() + { + return account; + } + + /** + * Set the Account value and reassemble the Authentication URL. + * + * @param account + */ + public void setAccount(String account) + { + this.account = account; + if (account != null && account.length() > 0) { + this.authenticationURL = FilesUtil.getProperty("auth_url")+VERSION+"/"+account+FilesUtil.getProperty("auth_url_post"); + } + else { + this.authenticationURL = FilesUtil.getProperty("auth_url"); + } + } + + /** + * Log in to CloudFiles. This method performs the authentication and sets up the client's internal state. + * + * @return true if the login was successful, false otherwise. + * + * @throws IOException There was an IO error doing network communication + * @throws HttpException There was an error with the http protocol + */ + public boolean login() throws IOException, HttpException + { + GetMethod method = new GetMethod(authenticationURL); + method.getParams().setSoTimeout(connectionTimeOut); + + method.setRequestHeader(FilesConstants.X_STORAGE_USER, username); + method.setRequestHeader(FilesConstants.X_STORAGE_PASS, password); + + logger.debug ("Logging in user: "+username+" using URL: "+authenticationURL); + client.executeMethod(method); + + FilesResponse response = new FilesResponse(method); + + if (response.loginSuccess()) + { + isLoggedin = true; + storageURL = response.getStorageURL(); + cdnManagementURL = response.getCDNManagementURL(); + authToken = response.getAuthToken(); + logger.debug("storageURL: " + storageURL); + logger.debug("authToken: " + authToken); + logger.debug("cdnManagementURL:" + cdnManagementURL); + logger.debug("ConnectionManager:" + client.getHttpConnectionManager()); + } + method.releaseConnection(); + + return this.isLoggedin; + } + + /** + * List all of the containers available in an account, ordered by container name. + * + * @return null if the user is not logged in or the Account is not found. A List of FSContainers with all of the containers in the account. + * if there are no containers in the account, the list will be zero length. + * @throws IOException There was an IO error doing network communication + * @throws HttpException There was an error with the http protocol + * @throws FilesException There was another error in the request to the server. + * @throws FilesAuthorizationException The client's login was invalid. + */ + public List listContainersInfo() throws IOException, HttpException, FilesAuthorizationException, FilesException + { + return listContainersInfo(-1, null); + } + + /** + * List the containers available in an account, ordered by container name. + * + * @param limit The maximum number of containers to return. -1 returns an unlimited number. + * + * @return null if the user is not logged in or the Account is not found. A List of FSContainers with all of the containers in the account. + * if there are no containers in the account, the list will be zero length. + * @throws IOException There was an IO error doing network communication + * @throws HttpException There was an error with the http protocol + * @throws FilesException There was another error in the request to the server. + * @throws FilesAuthorizationException The client's login was invalid. + */ + public List listContainersInfo(int limit) throws IOException, HttpException, FilesAuthorizationException, FilesException + { + return listContainersInfo(limit, null); + } + + /** + * List the containers available in an account, ordered by container name. + * + * @param limit The maximum number of containers to return. -1 returns an unlimited number. + * @param marker Return containers that occur after this lexicographically. + * + * @return null if the user is not logged in or the Account is not found. A List of FSContainers with all of the containers in the account. + * if there are no containers in the account, the list will be zero length. + * @throws IOException There was an IO error doing network communication + * @throws HttpException There was an error with the http protocol + * @throws FilesException There was another error in the request to the server. + * @throws FilesAuthorizationException The client's login was invalid. + */ + public List listContainersInfo(int limit, String marker) throws IOException, HttpException, FilesAuthorizationException, FilesException + { + if (!this.isLoggedin()) { + throw new FilesAuthorizationException("You must be logged in", null, null); + } + GetMethod method = null; + try { + method = new GetMethod(storageURL); + method.getParams().setSoTimeout(connectionTimeOut); + method.setRequestHeader(FilesConstants.X_AUTH_TOKEN, authToken); + + LinkedList parameters = new LinkedList(); + if(limit > 0) { + parameters.add(new NameValuePair("limit", String.valueOf(limit))); + } + if(marker != null) { + parameters.add(new NameValuePair("marker", marker)); + } + parameters.add(new NameValuePair("format", "xml")); + method.setQueryString(parameters.toArray(new NameValuePair[parameters.size()])); + client.executeMethod(method); + FilesResponse response = new FilesResponse(method); + + if (response.getStatusCode() == HttpStatus.SC_UNAUTHORIZED) { + method.removeRequestHeader(FilesConstants.X_AUTH_TOKEN); + if(login()) { + method = new GetMethod(storageURL); + method.getParams().setSoTimeout(connectionTimeOut); + method.setRequestHeader(FilesConstants.X_AUTH_TOKEN, authToken); + method.setQueryString(parameters.toArray(new NameValuePair[parameters.size()])); + client.executeMethod(method); + response = new FilesResponse(method); + } + else { + throw new FilesAuthorizationException("Re-login failed", response.getResponseHeaders(), response.getStatusLine()); + } + } + + if (response.getStatusCode() == HttpStatus.SC_OK) + { + DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); + DocumentBuilder builder = factory.newDocumentBuilder(); + Document document = builder.parse(response.getResponseBodyAsStream()); + + NodeList nodes = document.getChildNodes(); + Node accountNode = nodes.item(0); + if (! "account".equals(accountNode.getNodeName())) { + logger.error("Got unexpected type of XML"); + return null; + } + ArrayList containerList = new ArrayList(); + NodeList containerNodes = accountNode.getChildNodes(); + for(int i=0; i < containerNodes.getLength(); ++i) { + Node containerNode = containerNodes.item(i); + if(!"container".equals(containerNode.getNodeName())) continue; + String name = null; + int count = -1; + long size = -1; + NodeList objectData = containerNode.getChildNodes(); + for(int j=0; j < objectData.getLength(); ++j) { + Node data = objectData.item(j); + if ("name".equals(data.getNodeName())) { + name = data.getTextContent(); + } + else if ("bytes".equals(data.getNodeName())) { + size = Long.parseLong(data.getTextContent()); + } + else if ("count".equals(data.getNodeName())) { + count = Integer.parseInt(data.getTextContent()); + } + else { + logger.warn("Unexpected container-info tag:" + data.getNodeName()); + } + } + if (name != null) { + FilesContainerInfo obj = new FilesContainerInfo(name, count, size); + containerList.add(obj); + } + } + return containerList; + } + else if (response.getStatusCode() == HttpStatus.SC_NO_CONTENT) + { + return new ArrayList(); + } + else if (response.getStatusCode() == HttpStatus.SC_NOT_FOUND) + { + throw new FilesNotFoundException("Account not Found", response.getResponseHeaders(), response.getStatusLine()); + } + else { + throw new FilesException("Unexpected Return Code", response.getResponseHeaders(), response.getStatusLine()); + } + } + catch (Exception ex) { + throw new FilesException("Unexpected problem, probably in parsing Server XML", ex); + } + finally { + if (method != null) + method.releaseConnection(); + } + } + + /** + * List the containers available in an account. + * + * @return null if the user is not logged in or the Account is not found. A List of FilesContainer with all of the containers in the account. + * if there are no containers in the account, the list will be zero length. + * @throws IOException There was an IO error doing network communication + * @throws HttpException There was an error with the http protocol + * @throws FilesException There was another error in the request to the server. + * @throws FilesAuthorizationException The client's login was invalid. + */ + public List listContainers() throws IOException, HttpException, FilesAuthorizationException, FilesException + { + return listContainers(-1, null); + } + /** + * List the containers available in an account. + * + * @param limit The maximum number of containers to return. -1 denotes no limit. + + * @return null if the user is not logged in or the Account is not found. A List of FilesContainer with all of the containers in the account. + * if there are no containers in the account, the list will be zero length. + * @throws IOException There was an IO error doing network communication + * @throws HttpException There was an error with the http protocol + * @throws FilesException There was another error in the request to the server. + * @throws FilesAuthorizationException The client's login was invalid. + */ + public List listContainers(int limit) throws IOException, HttpException, FilesAuthorizationException, FilesException + { + return listContainers(limit, null); + } + + /** + * List the containers available in an account. + * + * @param limit The maximum number of containers to return. -1 denotes no limit. + * @param marker Only return containers after this container. Null denotes starting at the beginning (lexicographically). + * + * @return A List of FilesContainer with all of the containers in the account. + * if there are no containers in the account, the list will be zero length. + * @throws IOException There was an IO error doing network communication + * @throws HttpException There was an error with the http protocol + * @throws FilesException There was another error in the request to the server. + * @throws FilesAuthorizationException The client's login was invalid. + */ + public List listContainers(int limit, String marker) throws IOException, HttpException, FilesException + { + if (!this.isLoggedin()) { + throw new FilesAuthorizationException("You must be logged in", null, null); + } + GetMethod method = null; + try { + method = new GetMethod(storageURL); + method.getParams().setSoTimeout(connectionTimeOut); + method.setRequestHeader(FilesConstants.X_AUTH_TOKEN, authToken); + LinkedList parameters = new LinkedList(); + + if(limit > 0) { + parameters.add(new NameValuePair("limit", String.valueOf(limit))); + } + if(marker != null) { + parameters.add(new NameValuePair("marker", marker)); + } + + if (parameters.size() > 0) { + method.setQueryString(parameters.toArray(new NameValuePair[parameters.size()])); + } + client.executeMethod(method); + FilesResponse response = new FilesResponse(method); + + if (response.getStatusCode() == HttpStatus.SC_UNAUTHORIZED) { + method.releaseConnection(); + if(login()) { + method = new GetMethod(storageURL); + method.getParams().setSoTimeout(connectionTimeOut); + method.setRequestHeader(FilesConstants.X_AUTH_TOKEN, authToken); + if (parameters.size() > 0) { + method.setQueryString(parameters.toArray(new NameValuePair[parameters.size()])); + } + client.executeMethod(method); + response = new FilesResponse(method); + } + else { + throw new FilesAuthorizationException("Re-login failed", response.getResponseHeaders(), response.getStatusLine()); + } + } + + if (response.getStatusCode() == HttpStatus.SC_OK) + { + // logger.warn(method.getResponseCharSet()); + StrTokenizer tokenize = new StrTokenizer(inputStreamToString(response.getResponseBodyAsStream(), method.getResponseCharSet())); + tokenize.setDelimiterString("\n"); + String [] containers = tokenize.getTokenArray(); + ArrayList containerList = new ArrayList(); + for(String container : containers) { + containerList.add(new FilesContainer(container, this)); + } + return containerList; + } + else if (response.getStatusCode() == HttpStatus.SC_NO_CONTENT) + { + return new ArrayList(); + } + else if (response.getStatusCode() == HttpStatus.SC_NOT_FOUND) + { + throw new FilesNotFoundException("Account was not found", response.getResponseHeaders(), response.getStatusLine()); + } + else { + throw new FilesException("Unexpected resposne from server", response.getResponseHeaders(), response.getStatusLine()); + } + } + catch (Exception ex) { + throw new FilesException("Unexpected error, probably parsing Server XML", ex); + } + finally { + if (method != null) method.releaseConnection(); + } + } + + /** + * List all of the objects in a container with the given starting string. + * + * @param container The container name + * @param startsWith The string to start with + * @param path Only look for objects in this path + * @param limit Return at most limit objects + * @param marker Returns objects lexicographically greater than marker. Used in conjunction with limit to paginate the list. + * + * @return A list of FilesObjects starting with the given string + * @throws IOException There was an IO error doing network communication + * @throws HttpException There was an error with the http protocol + * @throws FilesException There was another error in the request to the server. + * @throws FilesAuthorizationException The client's login was invalid. + */ + public List listObjectsStaringWith (String container, String startsWith, String path, int limit, String marker) throws IOException, HttpException, FilesException + { + if (!this.isLoggedin()) { + throw new FilesAuthorizationException("You must be logged in", null, null); + } + if (!isValidContianerName(container)) { + throw new FilesInvalidNameException(container); + } + GetMethod method = null; + try { + method = new GetMethod(storageURL+"/"+sanitizeForURI(container)); + method.getParams().setSoTimeout(connectionTimeOut); + method.setRequestHeader(FilesConstants.X_AUTH_TOKEN, authToken); + + LinkedList parameters = new LinkedList(); + parameters.add(new NameValuePair ("format", "xml")); + if (startsWith != null) { + parameters.add(new NameValuePair (FilesConstants.LIST_CONTAINER_NAME_QUERY, startsWith)); + } + if(path != null) { + parameters.add(new NameValuePair("path", path)); + } + if(limit > 0) { + parameters.add(new NameValuePair("limit", String.valueOf(limit))); + } + if(marker != null) { + parameters.add(new NameValuePair("marker", marker)); + } + + if (parameters.size() > 0) { + method.setQueryString(parameters.toArray(new NameValuePair[parameters.size()])); + } + client.executeMethod(method); + FilesResponse response = new FilesResponse(method); + + if (response.getStatusCode() == HttpStatus.SC_UNAUTHORIZED) { + method.removeRequestHeader(FilesConstants.X_AUTH_TOKEN); + if(login()) { + method = new GetMethod(storageURL+"/"+sanitizeForURI(container)); + method.getParams().setSoTimeout(connectionTimeOut); + method.setRequestHeader(FilesConstants.X_AUTH_TOKEN, authToken); + if (parameters.size() > 0) { + method.setQueryString(parameters.toArray(new NameValuePair[parameters.size()])); + } + client.executeMethod(method); + response = new FilesResponse(method); + } + else { + throw new FilesAuthorizationException("Re-login failed", response.getResponseHeaders(), response.getStatusLine()); + } + } + + if (response.getStatusCode() == HttpStatus.SC_OK) + { + DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); + DocumentBuilder builder = factory.newDocumentBuilder(); + Document document = builder.parse(response.getResponseBodyAsStream()); + + NodeList nodes = document.getChildNodes(); + Node containerList = nodes.item(0); + if (! "container".equals(containerList.getNodeName())) { + logger.error("Got unexpected type of XML"); + return null; + } + ArrayList objectList = new ArrayList(); + NodeList objectNodes = containerList.getChildNodes(); + for(int i=0; i < objectNodes.getLength(); ++i) { + Node objectNode = objectNodes.item(i); + if(!"object".equals(objectNode.getNodeName())) continue; + String name = null; + String eTag = null; + long size = -1; + String mimeType = null; + String lastModified = null; + NodeList objectData = objectNode.getChildNodes(); + for(int j=0; j < objectData.getLength(); ++j) { + Node data = objectData.item(j); + if ("name".equals(data.getNodeName())) { + name = data.getTextContent(); + } + else if ("content_type".equals(data.getNodeName())) { + mimeType = data.getTextContent(); + } + else if ("hash".equals(data.getNodeName())) { + eTag = data.getTextContent(); + } + else if ("bytes".equals(data.getNodeName())) { + size = Long.parseLong(data.getTextContent()); + } + else if ("last_modified".equals(data.getNodeName())) { + lastModified = data.getTextContent(); + } + else { + logger.warn("Unexpected tag:" + data.getNodeName()); + } + } + if (name != null) { + FilesObject obj = new FilesObject(name, container, this); + if (eTag != null) obj.setMd5sum(eTag); + if (mimeType != null) obj.setMimeType(mimeType); + if (size > 0) obj.setSize(size); + if (lastModified != null) obj.setLastModified(lastModified); + objectList.add(obj); + } + } + return objectList; + } + else if (response.getStatusCode() == HttpStatus.SC_NO_CONTENT) + { + logger.debug ("Container "+container+" has no Objects"); + return new ArrayList(); + } + else if (response.getStatusCode() == HttpStatus.SC_NOT_FOUND) + { + throw new FilesNotFoundException("Container was not found", response.getResponseHeaders(), response.getStatusLine()); + } + else { + throw new FilesException("Unexpected Server Result", response.getResponseHeaders(), response.getStatusLine()); + } + } + catch (Exception ex) { + logger.error("Error parsing xml", ex); + throw new FilesException("Error parsing server resposne", ex); + } + finally { + if (method != null) method.releaseConnection(); + } + } + + /** + * List the objects in a container in lexicographic order. + * + * @param container The container name + * + * @return A list of FilesObjects starting with the given string + * @throws IOException There was an IO error doing network communication + * @throws HttpException There was an error with the http protocol + * @throws FilesException There was another error in the request to the server. + * @throws FilesAuthorizationException The client's login was invalid. + */ + public List listObjects(String container) throws IOException, HttpException, FilesAuthorizationException, FilesException { + return listObjectsStaringWith(container, null, null, -1, null); + } + + /** + * List the objects in a container in lexicographic order. + * + * @param container The container name + * @param limit Return at most limit objects + * + * @return A list of FilesObjects starting with the given string + * @throws IOException There was an IO error doing network communication + * @throws HttpException There was an error with the http protocol + * @throws FilesException There was another error in the request to the server. + * @throws FilesAuthorizationException The client's login was invalid. + */ + public List listObjects(String container, int limit) throws IOException, HttpException, FilesAuthorizationException, FilesException { + return listObjectsStaringWith(container, null, null, limit, null); + } + + /** + * List the objects in a container in lexicographic order. + * + * @param container The container name + * @param path Only look for objects in this path + * + * @return A list of FilesObjects starting with the given string + * @throws IOException There was an IO error doing network communication + * @throws HttpException There was an error with the http protocol + * @throws FilesException There was another error in the request to the server. + */ + public List listObjects(String container, String path) throws IOException, HttpException, FilesAuthorizationException, FilesException { + return listObjectsStaringWith(container, null, path, -1, null); + } + + /** + * List the objects in a container in lexicographic order. + * + * @param container The container name + * @param path Only look for objects in this path + * @param limit Return at most limit objects + * @param marker Returns objects lexicographically greater than marker. Used in conjunction with limit to paginate the list. + * + * @return A list of FilesObjects starting with the given string + * @throws IOException There was an IO error doing network communication + * @throws HttpException There was an error with the http protocol + * @throws FilesException There was another error in the request to the server. + * @throws FilesAuthorizationException The client's login was invalid. + */ + public List listObjects(String container, String path, int limit) throws IOException, HttpException, FilesAuthorizationException, FilesException { + return listObjectsStaringWith(container, null, path, limit, null); + } + + /** + * List the objects in a container in lexicographic order. + * + * @param container The container name + * @param path Only look for objects in this path + * @param limit Return at most limit objects + * @param marker Returns objects lexicographically greater than marker. Used in conjunction with limit to paginate the list. + * + * @return A list of FilesObjects starting with the given string + * @throws IOException There was an IO error doing network communication + * @throws HttpException There was an error with the http protocol + * @throws FilesException There was another error in the request to the server. + */ + public List listObjects(String container, String path, int limit, String marker) throws IOException, HttpException, FilesAuthorizationException, FilesException { + return listObjectsStaringWith(container, null, path, limit, marker); + } + + /** + * List the objects in a container in lexicographic order. + * + * @param container The container name + * @param limit Return at most limit objects + * @param marker Returns objects lexicographically greater than marker. Used in conjunction with limit to paginate the list. + * + * @return A list of FilesObjects starting with the given string + * @throws IOException There was an IO error doing network communication + * @throws HttpException There was an error with the http protocol + * @throws FilesException There was another error in the request to the server. + * @throws FilesAuthorizationException The client's login was invalid. + */ + public List listObjects(String container, int limit, String marker) throws IOException, HttpException, FilesAuthorizationException, FilesException { + return listObjectsStaringWith(container, null, null, limit, marker); + } + + /** + * Convenience method to test for the existence of a container in Cloud Files. + * + * @param container + * @return true if the container exists. false otherwise. + * @throws IOException + * @throws IOException There was an IO error doing network communication + * @throws HttpException There was an error with the http protocol + */ + public boolean containerExists (String container) throws IOException, HttpException + { + try { + this.getContainerInfo(container); + return true; + } + catch(FilesException fnfe) { + return false; + } + } + + /** + * Gets information for the given account. + * + * @return The FilesAccountInfo with information about the number of containers and number of bytes used + * by the given account. + * @throws IOException There was an IO error doing network communication + * @throws HttpException There was an error with the http protocol + * @throws FilesException There was another error in the request to the server. + * @throws FilesAuthorizationException The client's login was invalid. + */ + public FilesAccountInfo getAccountInfo() throws IOException, HttpException, FilesAuthorizationException, FilesException + { + if (this.isLoggedin()) { + HeadMethod method = new HeadMethod(storageURL); + method.getParams().setSoTimeout(connectionTimeOut); + method.setRequestHeader(FilesConstants.X_AUTH_TOKEN, authToken); + client.executeMethod(method); + + FilesResponse response = new FilesResponse(method); + if (response.getStatusCode() == HttpStatus.SC_UNAUTHORIZED) { + method.removeRequestHeader(FilesConstants.X_AUTH_TOKEN); + if(login()) { + method = new HeadMethod(storageURL); + method.getParams().setSoTimeout(connectionTimeOut); + method.setRequestHeader(FilesConstants.X_AUTH_TOKEN, authToken); + client.executeMethod(method); + response = new FilesResponse(method); + } + else { + throw new FilesAuthorizationException("Re-login failed", response.getResponseHeaders(), response.getStatusLine()); + } + } + + if (response.getStatusCode() == HttpStatus.SC_NO_CONTENT) + { + int nContainers = response.getAccountContainerCount(); + long totalSize = response.getAccountBytesUsed(); + return new FilesAccountInfo(totalSize,nContainers); + } + else { + throw new FilesException("Unexpected return from server", response.getResponseHeaders(), response.getStatusLine()); + } + } + else { + throw new FilesAuthorizationException("You must be logged in", null, null); + } + } + + /** + * Get basic information on a container (number of items and the total size). + * + * @param container The container to get information for + * @return ContainerInfo object of the container is present or null if its not present + * @throws IOException There was a socket level exception while talking to CloudFiles + * @throws HttpException There was an protocol level exception while talking to Cloudfiles + * @throws FilesNotFoundException The container was not found + * @throws FilesAuthorizationException The client was not logged in or the log in expired. + */ + public FilesContainerInfo getContainerInfo (String container) throws IOException, HttpException, FilesException + { + if (this.isLoggedin()) + { + if (isValidContianerName(container)) + { + + HeadMethod method = null; + try { + method = new HeadMethod(storageURL+"/"+sanitizeForURI(container)); + method.getParams().setSoTimeout(connectionTimeOut); + method.setRequestHeader(FilesConstants.X_AUTH_TOKEN, authToken); + client.executeMethod(method); + + FilesResponse response = new FilesResponse(method); + + if (response.getStatusCode() == HttpStatus.SC_UNAUTHORIZED) { + method.removeRequestHeader(FilesConstants.X_AUTH_TOKEN); + if(login()) { + method = new HeadMethod(storageURL+"/"+sanitizeForURI(container)); + method.getParams().setSoTimeout(connectionTimeOut); + method.setRequestHeader(FilesConstants.X_AUTH_TOKEN, authToken); + client.executeMethod(method); + response = new FilesResponse(method); + } + else { + throw new FilesAuthorizationException("Re-login failed", response.getResponseHeaders(), response.getStatusLine()); + } + } + + if (response.getStatusCode() == HttpStatus.SC_NO_CONTENT) + { + int objCount = response.getContainerObjectCount(); + long objSize = response.getContainerBytesUsed(); + return new FilesContainerInfo(container, objCount,objSize); + } + else if (response.getStatusCode() == HttpStatus.SC_NOT_FOUND) + { + throw new FilesNotFoundException("Container not found: " + container, response.getResponseHeaders(), response.getStatusLine()); + } + else { + throw new FilesException("Unexpected result from server", response.getResponseHeaders(), response.getStatusLine()); + } + } + finally { + if (method != null) method.releaseConnection(); + } + } + else + { + throw new FilesInvalidNameException(container); + } + } + else + throw new FilesAuthorizationException("You must be logged in", null, null); + } + + + /** + * Creates a container + * + * @param name The name of the container to be created + * @throws IOException There was an IO error doing network communication + * @throws HttpException There was an error with the http protocol + * @throws FilesAuthorizationException The client was not property logged in + * @throws FilesInvalidNameException The container name was invalid + */ + public void createContainer(String name) throws IOException, HttpException, FilesAuthorizationException, FilesException + { + if (this.isLoggedin()) + { + if (isValidContianerName(name)) + { + // logger.warn(name + ":" + sanitizeForURI(name)); + PutMethod method = new PutMethod(storageURL+"/"+sanitizeForURI(name)); + method.getParams().setSoTimeout(connectionTimeOut); + method.setRequestHeader(FilesConstants.X_AUTH_TOKEN, authToken); + + try { + client.executeMethod(method); + + FilesResponse response = new FilesResponse(method); + + if (response.getStatusCode() == HttpStatus.SC_UNAUTHORIZED) { + method.releaseConnection(); + if(login()) { + method = new PutMethod(storageURL+"/"+sanitizeForURI(name)); + method.getParams().setSoTimeout(connectionTimeOut); + method.setRequestHeader(FilesConstants.X_AUTH_TOKEN, authToken); + client.executeMethod(method); + response = new FilesResponse(method); + } + else { + throw new FilesAuthorizationException("Re-login failed", response.getResponseHeaders(), response.getStatusLine()); + } + } + + if (response.getStatusCode() == HttpStatus.SC_CREATED) + { + return; + } + else if (response.getStatusCode() == HttpStatus.SC_ACCEPTED) + { + throw new FilesContainerExistsException(name, response.getResponseHeaders(), response.getStatusLine()); + } + else { + throw new FilesException("Unexpected Response", response.getResponseHeaders(), response.getStatusLine()); + } + } + finally { + method.releaseConnection(); + } + } + else + { + throw new FilesInvalidNameException(name); + } + } + else { + throw new FilesAuthorizationException("You must be logged in", null, null); + } + } + + /** + * Deletes a container + * + * @param name The name of the container + * @throws IOException There was an IO error doing network communication + * @throws HttpException There was an error with the http protocol + * @throws FilesAuthorizationException The user is not Logged in + * @throws FilesInvalidNameException The container name is invalid + * @throws FilesNotFoundException The container doesn't exist + * @throws FilesContainerNotEmptyException The container was not empty + */ + public boolean deleteContainer(String name) throws IOException, HttpException, FilesAuthorizationException, FilesInvalidNameException, FilesNotFoundException, FilesContainerNotEmptyException + { + if (this.isLoggedin()) + { + if (isValidContianerName(name)) + { + DeleteMethod method = new DeleteMethod(storageURL+"/"+sanitizeForURI(name)); + try { + method.getParams().setSoTimeout(connectionTimeOut); + method.setRequestHeader(FilesConstants.X_AUTH_TOKEN, authToken); + client.executeMethod(method); + FilesResponse response = new FilesResponse(method); + + if (response.getStatusCode() == HttpStatus.SC_UNAUTHORIZED) { + method.releaseConnection(); + if(login()) { + method = new DeleteMethod(storageURL+"/"+sanitizeForURI(name)); + method.getParams().setSoTimeout(connectionTimeOut); + method.setRequestHeader(FilesConstants.X_AUTH_TOKEN, authToken); + client.executeMethod(method); + response = new FilesResponse(method); + } + else { + throw new FilesAuthorizationException("Re-login failed", response.getResponseHeaders(), response.getStatusLine()); + } + } + + if (response.getStatusCode() == HttpStatus.SC_NO_CONTENT) + { + logger.debug ("Container Deleted : "+name); + return true; + } + else if (response.getStatusCode() == HttpStatus.SC_NOT_FOUND) + { + logger.debug ("Container does not exist !"); + throw new FilesNotFoundException("You can't delete an non-empty container", response.getResponseHeaders(), response.getStatusLine()); + } + else if (response.getStatusCode() == HttpStatus.SC_CONFLICT) + { + logger.debug ("Container is not empty, can not delete a none empty container !"); + throw new FilesContainerNotEmptyException("You can't delete an non-empty container", response.getResponseHeaders(), response.getStatusLine()); + } + } + finally { + method.releaseConnection(); + } + } + else + { + throw new FilesInvalidNameException(name); + } + } + else + { + throw new FilesAuthorizationException("You must be logged in", null, null); + } + return false; + } + + /** + * Enables access of files in this container via the Content Delivery Network. + * + * @param name The name of the container to enable + * @return The CDN Url of the container + * @throws IOException There was an IO error doing network communication + * @throws HttpException There was an error with the http protocol + * @throws FilesException There was an error talking to the CDN Server. + */ + public String cdnEnableContainer(String name) throws IOException, HttpException, FilesException + { + String returnValue = null; + if (this.isLoggedin()) + { + if (isValidContianerName(name)) + { + PutMethod method = null; + try { + method = new PutMethod(cdnManagementURL+"/"+sanitizeForURI(name)); + method.getParams().setSoTimeout(connectionTimeOut); + method.setRequestHeader(FilesConstants.X_AUTH_TOKEN, authToken); + client.executeMethod(method); + + FilesResponse response = new FilesResponse(method); + + if (response.getStatusCode() == HttpStatus.SC_UNAUTHORIZED) { + method.releaseConnection(); + if(login()) { + method = new PutMethod(cdnManagementURL+"/"+sanitizeForURI(name)); + method.getParams().setSoTimeout(connectionTimeOut); + method.setRequestHeader(FilesConstants.X_AUTH_TOKEN, authToken); + client.executeMethod(method); + response = new FilesResponse(method); + } + else { + throw new FilesAuthorizationException("Re-login failed", response.getResponseHeaders(), response.getStatusLine()); + } + } + + if (response.getStatusCode() == HttpStatus.SC_CREATED || response.getStatusCode() == HttpStatus.SC_ACCEPTED) + { + returnValue = response.getCdnUrl(); + } + else if (response.getStatusCode() == HttpStatus.SC_UNAUTHORIZED) { + logger.warn("Unauthorized access"); + throw new FilesAuthorizationException("User not Authorized!",response.getResponseHeaders(), response.getStatusLine()); + } + else { + throw new FilesException("Unexpected Server Response",response.getResponseHeaders(), response.getStatusLine()); + } + } + finally { + method.releaseConnection(); + } + } + else + { + throw new FilesInvalidNameException(name); + } + } + else + { + throw new FilesAuthorizationException("You must be logged in", null, null); + } + return returnValue; + } + + /** + * Enables access of files in this container via the Content Delivery Network. + * + * @param name The name of the container to enable + * @param ttl How long the CDN can use the content before checking for an update. A negative value will result in this not being changed. + * @param enabled True if this folder should be accessible, false otherwise + * @return The CDN Url of the container + * @throws IOException There was an IO error doing network communication + * @throws HttpException There was an error with the http protocol + * @throws FilesException There was an error talking to the CDN Service + */ + /* + * @param referrerAcl Unused for now + * @param userAgentACL Unused for now + */ +// private String cdnUpdateContainer(String name, int ttl, boolean enabled, String referrerAcl, String userAgentACL) + public String cdnUpdateContainer(String name, int ttl, boolean enabled) + throws IOException, HttpException, FilesException + { + String returnValue = null; + if (this.isLoggedin()) + { + if (isValidContianerName(name)) + { + PostMethod method = null; + try { + method = new PostMethod(cdnManagementURL+"/"+sanitizeForURI(name)); + + method.getParams().setSoTimeout(connectionTimeOut); + method.setRequestHeader(FilesConstants.X_AUTH_TOKEN, authToken); + // TTL + if (ttl > 0) { + method.setRequestHeader(FilesConstants.X_CDN_TTL, Integer.toString(ttl)); + } + // Enabled + method.setRequestHeader(FilesConstants.X_CDN_ENABLED, Boolean.toString(enabled)); + +// // Referrer ACL +// if(referrerAcl != null) { +// method.setRequestHeader(FilesConstants.X_CDN_REFERRER_ACL, referrerAcl); +// } + +// // User Agent ACL +// if(userAgentACL != null) { +// method.setRequestHeader(FilesConstants.X_CDN_USER_AGENT_ACL, userAgentACL); +// } + client.executeMethod(method); + + FilesResponse response = new FilesResponse(method); + + if (response.getStatusCode() == HttpStatus.SC_UNAUTHORIZED) { + method.releaseConnection(); + if(login()) { + new PostMethod(cdnManagementURL+"/"+sanitizeForURI(name)); + method.getParams().setSoTimeout(connectionTimeOut); + method.setRequestHeader(FilesConstants.X_AUTH_TOKEN, authToken); + // TTL + if (ttl > 0) { + method.setRequestHeader(FilesConstants.X_CDN_TTL, Integer.toString(ttl)); + } + // Enabled + method.setRequestHeader(FilesConstants.X_CDN_ENABLED, Boolean.toString(enabled)); + + client.executeMethod(method); + response = new FilesResponse(method); + } + else { + throw new FilesAuthorizationException("Re-login failed", response.getResponseHeaders(), response.getStatusLine()); + } + } + + if (response.getStatusCode() == HttpStatus.SC_ACCEPTED) + { + returnValue = response.getCdnUrl(); + } + else if (response.getStatusCode() == HttpStatus.SC_UNAUTHORIZED) { + logger.warn("Unauthorized access"); + throw new FilesAuthorizationException("User not Authorized!",response.getResponseHeaders(), response.getStatusLine()); + } + else { + throw new FilesException("Unexpected Server Response",response.getResponseHeaders(), response.getStatusLine()); + } + } finally { + if (method != null) { + method.releaseConnection(); + } + } + } + else + { + throw new FilesInvalidNameException(name); + } + } + else { + throw new FilesAuthorizationException("You must be logged in", null, null); + } + return returnValue; + } + + /* * + * Enables access of files in this container via the Content Delivery Network. + * + * @param name The name of the container to enable + * @param ttl How long the CDN can use the content before checking for an update. A negative value will result in this not being changed. + * @param enabled True if this folder should be accesible, false otherwise + * @return The CDN Url of the container + * @throws IOException There was an IO error doing network communication + * @throws HttpException There was an error with the http protocol + * @throws FilesAuthorizationException Authentication failed + */ +// public String cdnUpdateContainer(String name, int ttl, boolean enabled) throws IOException, HttpException, FilesAuthorizationException +// { +// return cdnUpdateContainer(name, ttl, enabled, (String) null, (String) null); +// } + + /** + * Gets current CDN sharing status of the container + * + * @param name The name of the container to enable + * @return Information on the container + * @throws IOException There was an IO error doing network communication + * @throws HttpException There was an error with the http protocol + * @throws FilesException There was an error talking to the CloudFiles Server + */ + public FilesCDNContainer getCDNContainerInfo(String container) throws IOException, HttpException, FilesException + { + if (isLoggedin()) { + if (isValidContianerName(container)) + { + HeadMethod method = null; + try { + method= new HeadMethod(cdnManagementURL+"/"+sanitizeForURI(container)); + method.getParams().setSoTimeout(connectionTimeOut); + method.setRequestHeader(FilesConstants.X_AUTH_TOKEN, authToken); + client.executeMethod(method); + + FilesResponse response = new FilesResponse(method); + + if (response.getStatusCode() == HttpStatus.SC_UNAUTHORIZED) { + method.releaseConnection(); + if(login()) { + method= new HeadMethod(cdnManagementURL+"/"+sanitizeForURI(container)); + method.getParams().setSoTimeout(connectionTimeOut); + method.setRequestHeader(FilesConstants.X_AUTH_TOKEN, authToken); + client.executeMethod(method); + response = new FilesResponse(method); + } + else { + throw new FilesAuthorizationException("Re-login failed", response.getResponseHeaders(), response.getStatusLine()); + } + } + + if (response.getStatusCode() == HttpStatus.SC_NO_CONTENT) + { + FilesCDNContainer result = new FilesCDNContainer(response.getCdnUrl()); + result.setName(container); + for (Header hdr : response.getResponseHeaders()) { + String name = hdr.getName().toLowerCase(); + if ("x-cdn-enabled".equals(name)) { + result.setEnabled(Boolean.valueOf(hdr.getValue())); + } + else if ("x-ttl".equals(name)) { + result.setTtl(Integer.parseInt(hdr.getValue())); + } + } + return result; + } + else if (response.getStatusCode() == HttpStatus.SC_UNAUTHORIZED) { + logger.warn("Unauthorized access"); + throw new FilesAuthorizationException("User not Authorized!",response.getResponseHeaders(), response.getStatusLine()); + } + else { + throw new FilesException("Unexpected result from server: ", response.getResponseHeaders(), response.getStatusLine()); + } + } + finally { + if (method != null) { + method.releaseConnection(); + } + } + } + else + { + throw new FilesInvalidNameException(container); + } + } + else { + throw new FilesAuthorizationException("You must be logged in", null, null); + } + } + + /* * + * Not currently used (but soon will be) + * @param container + */ + // public void purgeCDNContainer(String container) { +/// // Stub +// } + + /* * + * Not currently used (but soon will be) + * @param container + */ +// public void purgeCDNObject(String container, String object) { + // // Stub +// } + + /** + * Creates a path (but not any of the sub portions of the path) + * + * @param container The name of the container. + * @param path The name of the Path + * @throws HttpException There was an error at the protocol layer while talking to CloudFiles + * @throws IOException There was an error at the socket layer while talking to CloudFiles + * @throws FilesException There was another error while taking to the CloudFiles server + */ + public void createPath(String container, String path) throws HttpException, IOException, FilesException { + + if (!isValidContianerName(container)) + throw new FilesInvalidNameException(container); + if (!isValidObjectName(path)) + throw new FilesInvalidNameException(path); + storeObject(container, new byte[0], "application/directory", path, + new HashMap()); + } + + /** + * Create all of the path elements for the entire tree for a given path. Thus, createFullPath("myContainer", "foo/bar/baz") + * creates the paths "foo", "foo/bar" and "foo/bar/baz". + * + * @param container The name of the container + * @param path The full name of the path + * @throws HttpException There was an error at the protocol layer while talking to CloudFiles + * @throws IOException There was an error at the socket layer while talking to CloudFiles + * @throws FilesException There was another error while taking to the CloudFiles server + */ + public void createFullPath(String container, String path) throws HttpException, IOException, FilesException { + String parts[] = path.split("/"); + + for(int i=0; i < parts.length; ++i) { + StringBuilder sb = new StringBuilder(); + for (int j=0; j <= i; ++j) { + if (sb.length() != 0) + sb.append("/"); + sb.append(parts[j]); + } + createPath(container, sb.toString()); + } + + } + + /** + * Gets the names of all of the containers associated with this account. + * + * @param limit The maximum number of container names to return + * @return A list of container names + * + * @throws IOException There was an IO error doing network communication + * @throws HttpException There was an error with the http protocol + * @throws FilesException + */ + public List listCdnContainers(int limit) throws IOException, HttpException, FilesException + { + return listCdnContainers(limit, null); + } + + /** + * Gets the names of all of the containers associated with this account. + * + * @return A list of container names + * + * @throws IOException There was an IO error doing network communication + * @throws HttpException There was an error with the http protocol + * @throws FilesException + */ + public List listCdnContainers() throws IOException, HttpException, FilesException + { + return listCdnContainers(-1, null); + } + + + /** + * Gets the names of all of the containers associated with this account. + * + * @param limit The maximum number of container names to return + * @param marker All of the results will come after marker lexicographically. + * @return A list of container names + * + * @throws IOException There was an IO error doing network communication + * @throws HttpException There was an error with the http protocol + * @throws FilesException + */ + public List listCdnContainers(int limit, String marker) throws IOException, HttpException, FilesException + { + if (this.isLoggedin()) + { + GetMethod method = null; + try { + method = new GetMethod(cdnManagementURL); + method.getParams().setSoTimeout(connectionTimeOut); + method.setRequestHeader(FilesConstants.X_AUTH_TOKEN, authToken); + LinkedList params = new LinkedList(); + if (limit > 0) { + params.add(new NameValuePair("limit", String.valueOf(limit))); + } + if (marker != null) { + params.add(new NameValuePair("marker", marker)); + } + if (params.size() > 0) { + method.setQueryString(params.toArray(new NameValuePair[params.size()])); + } + client.executeMethod(method); + FilesResponse response = new FilesResponse(method); + + if (response.getStatusCode() == HttpStatus.SC_UNAUTHORIZED) { + method.releaseConnection(); + if(login()) { + method = new GetMethod(cdnManagementURL); + method.getParams().setSoTimeout(connectionTimeOut); + method.setRequestHeader(FilesConstants.X_AUTH_TOKEN, authToken); + if (params.size() > 0) { + method.setQueryString(params.toArray(new NameValuePair[params.size()])); + } + client.executeMethod(method); + response = new FilesResponse(method); + } + else { + throw new FilesAuthorizationException("Re-login failed", response.getResponseHeaders(), response.getStatusLine()); + } + } + + if (response.getStatusCode() == HttpStatus.SC_OK) + { + StrTokenizer tokenize = new StrTokenizer(inputStreamToString(response.getResponseBodyAsStream(), method.getResponseCharSet())); + tokenize.setDelimiterString("\n"); + String [] containers = tokenize.getTokenArray(); + List returnValue = new ArrayList(); + for (String containerName: containers) + { + returnValue.add(containerName); + } + return returnValue; + } + else if (response.getStatusCode() == HttpStatus.SC_UNAUTHORIZED) { + logger.warn("Unauthorized access"); + throw new FilesAuthorizationException("User not Authorized!",response.getResponseHeaders(), response.getStatusLine()); + } + else { + throw new FilesException("Unexpected server response",response.getResponseHeaders(), response.getStatusLine()); + } + } + finally { + if (method != null) method.releaseConnection(); + } + } + else { + throw new FilesAuthorizationException("You must be logged in", null, null); + } + } + + /** + * Gets list of all of the containers associated with this account. + * + * @return A list of containers + * + * @throws IOException There was an IO error doing network communication + * @throws HttpException There was an error with the http protocol + * @throws FilesException + */ + public List listCdnContainerInfo() throws IOException, HttpException, FilesException + { + return listCdnContainerInfo(-1, null); + } + /** + * Gets list of all of the containers associated with this account. + * + * @param limit The maximum number of container names to return + * @return A list of containers + * + * @throws IOException There was an IO error doing network communication + * @throws HttpException There was an error with the http protocol + * @throws FilesException + */ + public List listCdnContainerInfo(int limit) throws IOException, HttpException, FilesException + { + return listCdnContainerInfo(limit, null); + } + /** + * Gets list of all of the containers associated with this account. + * + * @param limit The maximum number of container names to return + * @param marker All of the names will come after marker lexicographically. + * @return A list of containers + * + * @throws IOException There was an IO error doing network communication + * @throws HttpException There was an error with the http protocol + * @throws FilesException + */ + public List listCdnContainerInfo(int limit, String marker) throws IOException, HttpException, FilesException + { + if (this.isLoggedin()) + { + GetMethod method = null; + try { + method = new GetMethod(cdnManagementURL); + method.getParams().setSoTimeout(connectionTimeOut); + method.setRequestHeader(FilesConstants.X_AUTH_TOKEN, authToken); + LinkedList params = new LinkedList(); + params.add(new NameValuePair("format", "xml")); + if (limit > 0) { + params.add(new NameValuePair("limit", String.valueOf(limit))); + } + if (marker != null) { + params.add(new NameValuePair("marker", marker)); + } + method.setQueryString(params.toArray(new NameValuePair[params.size()])); + + client.executeMethod(method); + FilesResponse response = new FilesResponse(method); + + if (response.getStatusCode() == HttpStatus.SC_UNAUTHORIZED) { + method.releaseConnection(); + if(login()) { + method = new GetMethod(cdnManagementURL); + method.getParams().setSoTimeout(connectionTimeOut); + method.setRequestHeader(FilesConstants.X_AUTH_TOKEN, authToken); + method.setQueryString(params.toArray(new NameValuePair[params.size()])); + + client.executeMethod(method); + response = new FilesResponse(method); + } + else { + throw new FilesAuthorizationException("Re-login failed", response.getResponseHeaders(), response.getStatusLine()); + } + } + + if (response.getStatusCode() == HttpStatus.SC_OK) + { + DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); + DocumentBuilder builder = factory.newDocumentBuilder(); + Document document = builder.parse(response.getResponseBodyAsStream()); + + NodeList nodes = document.getChildNodes(); + Node accountNode = nodes.item(0); + if (! "account".equals(accountNode.getNodeName())) { + logger.error("Got unexpected type of XML"); + return null; + } + ArrayList containerList = new ArrayList(); + NodeList containerNodes = accountNode.getChildNodes(); + for(int i=0; i < containerNodes.getLength(); ++i) { + Node containerNode = containerNodes.item(i); + if(!"container".equals(containerNode.getNodeName())) continue; + FilesCDNContainer container = new FilesCDNContainer(); + NodeList objectData = containerNode.getChildNodes(); + for(int j=0; j < objectData.getLength(); ++j) { + Node data = objectData.item(j); + if ("name".equals(data.getNodeName())) { + container.setName(data.getTextContent()); + } + else if ("cdn_url".equals(data.getNodeName())) { + container.setCdnURL(data.getTextContent()); + } + else if ("cdn_enabled".equals(data.getNodeName())) { + container.setEnabled(Boolean.parseBoolean(data.getTextContent())); + } + else if ("ttl".equals(data.getNodeName())) { + container.setTtl(Integer.parseInt(data.getTextContent())); + } + else { + //logger.warn("Unexpected container-info tag:" + data.getNodeName()); + } + } + if (container.getName() != null) { + containerList.add(container); + } + } + return containerList; + } + else if (response.getStatusCode() == HttpStatus.SC_UNAUTHORIZED) { + logger.warn("Unauthorized access"); + throw new FilesAuthorizationException("User not Authorized!",response.getResponseHeaders(), response.getStatusLine()); + } + else { + throw new FilesException("Unexpected server response",response.getResponseHeaders(), response.getStatusLine()); + } + } + catch (SAXException ex) { + // probably a problem parsing the XML + throw new FilesException("Problem parsing XML", ex); + } + catch (ParserConfigurationException ex) { + // probably a problem parsing the XML + throw new FilesException("Problem parsing XML", ex); + } + finally { + if (method != null) method.releaseConnection(); + } + } + else { + throw new FilesAuthorizationException("You must be logged in", null, null); + } + } + + /** + * Store a file on the server + * + * @param container The name of the container + * @param obj The File containing the file to copy over + * @param contentType The MIME type of the file + * @param name The name of the file on the server + * @throws IOException There was an IO error doing network communication + * @throws HttpException There was an error with the http protocol + * @throws FilesException + */ + public boolean storeObjectAs (String container, File obj, String contentType, String name) throws IOException, HttpException, FilesException + { + return storeObjectAs(container, obj, contentType, name, new HashMap(), null); + } + + /** + * Store a file on the server + * + * @param container The name of the container + * @param obj The File containing the file to copy over + * @param contentType The MIME type of the file + * @param name The name of the file on the server + * @throws IOException There was an IO error doing network communication + * @throws HttpException There was an error with the http protocol + * @throws FilesException + */ + public boolean storeObjectAs (String container, File obj, String contentType, String name, IFilesTransferCallback callback) throws IOException, HttpException, FilesException + { + return storeObjectAs(container, obj, contentType, name, new HashMap(), callback); + } + + /** + * Store a file on the server, including metadata + * + * @param container The name of the container + * @param obj The File containing the file to copy over + * @param contentType The MIME type of the file + * @param name The name of the file on the server + * @param metadata A map with the metadata as key names and values as the metadata values + * @throws IOException There was an IO error doing network communication + * @throws HttpException There was an error with the http protocol + * @throws FilesAuthorizationException + */ + public boolean storeObjectAs (String container, File obj, String contentType, String name, Map metadata) throws IOException, HttpException, FilesException + { + return storeObjectAs (container, obj, contentType, name, metadata, null); + } + + /** + * Store a file on the server, including metadata + * + * @param container The name of the container + * @param obj The File containing the file to copy over + * @param contentType The MIME type of the file + * @param name The name of the file on the server + * @param metadata A map with the metadata as key names and values as the metadata values + * @param metadata The callback object that will be called as the data is sent + * @throws IOException There was an IO error doing network communication + * @throws HttpException There was an error with the http protocol + * @throws FilesException + */ + public boolean storeObjectAs (String container, File obj, String contentType, String name, Map metadata, IFilesTransferCallback callback) throws IOException, HttpException, FilesException + { + if (this.isLoggedin()) + { + if (isValidContianerName(container) && isValidObjectName(name) ) + { + if (!obj.exists()) + { + throw new FileNotFoundException(name + " does not exist"); + } + + if (obj.isDirectory()) + { + throw new IOException("The alleged file was a directory"); + } + + PutMethod method = null; + try { + method = new PutMethod(storageURL+"/"+sanitizeForURI(container)+"/"+sanitizeForURI(name)); + method.getParams().setSoTimeout(connectionTimeOut); + method.setRequestHeader(FilesConstants.X_AUTH_TOKEN, authToken); + if (useETag) { + method.setRequestHeader(FilesConstants.E_TAG, md5Sum (obj)); + } + method.setRequestEntity( new RequestEntityWrapper(new FileRequestEntity (obj, contentType), callback)); + for(String key : metadata.keySet()) { + method.setRequestHeader(FilesConstants.X_OBJECT_META + key, sanitizeForURI(metadata.get(key))); + } + client.executeMethod(method); + FilesResponse response = new FilesResponse(method); + + if (response.getStatusCode() == HttpStatus.SC_UNAUTHORIZED) { + method.releaseConnection(); + if(login()) { + method = new PutMethod(storageURL+"/"+sanitizeForURI(container)+"/"+sanitizeForURI(name)); + method.getParams().setSoTimeout(connectionTimeOut); + method.setRequestHeader(FilesConstants.X_AUTH_TOKEN, authToken); + if (useETag) { + method.setRequestHeader(FilesConstants.E_TAG, md5Sum (obj)); + } + method.setRequestEntity( new RequestEntityWrapper(new FileRequestEntity (obj, contentType), callback)); + for(String key : metadata.keySet()) { + method.setRequestHeader(FilesConstants.X_OBJECT_META + key, sanitizeForURI(metadata.get(key))); + } + client.executeMethod(method); + response = new FilesResponse(method); + } + else { + throw new FilesAuthorizationException("Re-login failed", response.getResponseHeaders(), response.getStatusLine()); + } + } + if (response.getStatusCode() == HttpStatus.SC_CREATED) + { + return true; + } + else if (response.getStatusCode() == HttpStatus.SC_PRECONDITION_FAILED) + { + throw new FilesException("Etag missmatch", response.getResponseHeaders(), response.getStatusLine()); + } + else if (response.getStatusCode() == HttpStatus.SC_LENGTH_REQUIRED) + { + throw new FilesException("Length miss-match", response.getResponseHeaders(), response.getStatusLine()); + } + else + { + throw new FilesException("Unexpected Server Response", response.getResponseHeaders(), response.getStatusLine()); + } + } + finally { + if (method != null) method.releaseConnection(); + } + } + else + { + if (!isValidObjectName(name)) { + throw new FilesInvalidNameException(name); + } + else { + throw new FilesInvalidNameException(container); + } + } + } + else { + throw new FilesAuthorizationException("You must be logged in", null, null); + } + } + + + /** + * Copies the file to Cloud Files, keeping the original file name in Cloud Files. + * + * @param container The name of the container to place the file in + * @param obj The File to transfer + * @param contentType The file's MIME type + * @throws IOException There was an IO error doing network communication + * @throws HttpException There was an error with the http protocol + * @throws FilesException + */ + public boolean storeObject (String container, File obj, String contentType) throws IOException, HttpException, FilesException + { + return storeObjectAs(container, obj, contentType, obj.getName()); + } + + /** + * Store a file on the server, including metadata + * + * @param container The name of the container + * @param obj The File containing the file to copy over + * @param contentType The MIME type of the file + * @param name The name of the file on the server + * @param metadata A map with the metadata as key names and values as the metadata values + * @throws IOException There was an IO error doing network communication + * @throws HttpException There was an error with the http protocol + * @throws FilesException + */ + public boolean storeObject(String container, byte obj[], String contentType, String name, Map metadata) throws IOException, HttpException, FilesException + { + return storeObject(container, obj, contentType, name, metadata, null); + } + + /** + * Store a file on the server, including metadata + * + * @param container The name of the container + * @param obj The File containing the file to copy over + * @param contentType The MIME type of the file + * @param name The name of the file on the server + * @param metadata A map with the metadata as key names and values as the metadata values + * @param callback The object to which any callbacks will be sent (null if you don't want callbacks) + * @throws IOException There was an IO error doing network communication + * @throws HttpException There was an error with the http protocol + * @throws FilesException + */ + public boolean storeObject(String container, byte obj[], String contentType, String name, Map metadata, IFilesTransferCallback callback) throws IOException, HttpException, FilesException + { + if (this.isLoggedin()) + { + String objName = name; + if (isValidContianerName(container) && isValidObjectName(objName)) + { + + PutMethod method = null; + try { + method = new PutMethod(storageURL+"/"+sanitizeForURI(container)+"/"+sanitizeForURI(objName)); + method.getParams().setSoTimeout(connectionTimeOut); + method.setRequestHeader(FilesConstants.X_AUTH_TOKEN, authToken); + if (useETag) { + method.setRequestHeader(FilesConstants.E_TAG, md5Sum (obj)); + } + method.setRequestEntity(new RequestEntityWrapper(new ByteArrayRequestEntity (obj, contentType), callback)); + for(String key : metadata.keySet()) { + // logger.warn("Key:" + key + ":" + sanitizeForURI(metadata.get(key))); + method.setRequestHeader(FilesConstants.X_OBJECT_META + key, sanitizeForURI(metadata.get(key))); + } + client.executeMethod(method); + FilesResponse response = new FilesResponse(method); + + if (response.getStatusCode() == HttpStatus.SC_UNAUTHORIZED) { + method.releaseConnection(); + if(login()) { + method = new PutMethod(storageURL+"/"+sanitizeForURI(container)+"/"+sanitizeForURI(objName)); + method.getParams().setSoTimeout(connectionTimeOut); + method.setRequestHeader(FilesConstants.X_AUTH_TOKEN, authToken); + if (useETag) { + method.setRequestHeader(FilesConstants.E_TAG, md5Sum (obj)); + } + method.setRequestEntity(new RequestEntityWrapper(new ByteArrayRequestEntity (obj, contentType), callback)); + for(String key : metadata.keySet()) { + method.setRequestHeader(FilesConstants.X_OBJECT_META + key, sanitizeForURI(metadata.get(key))); + } + client.executeMethod(method); + response = new FilesResponse(method); + } + else { + throw new FilesAuthorizationException("Re-login failed", response.getResponseHeaders(), response.getStatusLine()); + } + } + + if (response.getStatusCode() == HttpStatus.SC_CREATED) + { + return true; + } + else if (response.getStatusCode() == HttpStatus.SC_PRECONDITION_FAILED) + { + throw new FilesException("Etag missmatch", response.getResponseHeaders(), response.getStatusLine()); + } + else if (response.getStatusCode() == HttpStatus.SC_LENGTH_REQUIRED) + { + throw new FilesException("Length miss-match", response.getResponseHeaders(), response.getStatusLine()); + } + else + { + throw new FilesException("Unexpected Server Response", response.getResponseHeaders(), response.getStatusLine()); + } + } + finally{ + if (method != null) method.releaseConnection(); + } + } + else + { + if (!isValidObjectName(objName)) { + throw new FilesInvalidNameException(objName); + } + else { + throw new FilesInvalidNameException(container); + } + } + } + else { + throw new FilesAuthorizationException("You must be logged in", null, null); + } + } + + /** + * Store a file on the server, including metadata, with the contents coming from an input stream. This allows you to + * not know the entire length of your content when you start to write it. Nor do you have to hold it entirely in memory + * at the same time. + * + * @param container The name of the container + * @param data Any object that implements InputStream + * @param contentType The MIME type of the file + * @param name The name of the file on the server + * @param metadata A map with the metadata as key names and values as the metadata values + * @param callback The object to which any callbacks will be sent (null if you don't want callbacks) + * @throws IOException There was an IO error doing network communication + * @throws HttpException There was an error with the http protocol + * @throws FilesException + */ + public boolean storeStreamedObject(String container, InputStream data, String contentType, String name, Map metadata) throws IOException, HttpException, FilesException + { + if (this.isLoggedin()) + { + String objName = name; + if (isValidContianerName(container) && isValidObjectName(objName)) + { + PutMethod method = new PutMethod(storageURL+"/"+sanitizeForURI(container)+"/"+sanitizeForURI(objName)); + method.setContentChunked(true); + method.getParams().setSoTimeout(connectionTimeOut); + method.setRequestHeader(FilesConstants.X_AUTH_TOKEN, authToken); + method.setRequestEntity(new InputStreamRequestEntity(data, contentType)); + for(String key : metadata.keySet()) { + // logger.warn("Key:" + key + ":" + sanitizeForURI(metadata.get(key))); + method.setRequestHeader(FilesConstants.X_OBJECT_META + key, sanitizeForURI(metadata.get(key))); + } + method.removeRequestHeader("Content-Length"); + + try { + client.executeMethod(method); + FilesResponse response = new FilesResponse(method); + + if (response.getStatusCode() == HttpStatus.SC_CREATED) + { + logger.debug ("Object stored : " + name); + return true; + } + else { + logger.error(response.getStatusLine()); + throw new FilesException("Unexpected result", response.getResponseHeaders(), response.getStatusLine()); + } + } + finally { + method.releaseConnection(); + } + } + else + { + if (!isValidObjectName(objName)) { + throw new FilesInvalidNameException(objName); + } + else { + throw new FilesInvalidNameException(container); + } + } + } + else { + throw new FilesAuthorizationException("You must be logged in", null, null); + } + } + + /** + * + * + * @param container The name of the container + * @param name The name of the object + * @param entity The name of the request entity (make sure to set the Content-Type + * @param metadata The metadata for the object + * @param md5sum The 32 character hex encoded MD5 sum of the data + * @return True of the save was successful + * @throws IOException There was a socket level exception talking to CloudFiles + * @throws HttpException There was a protocol level error talking to CloudFiles + * @throws FilesException There was an error talking to CloudFiles. + */ +public boolean storeObjectAs(String container, String name, RequestEntity entity, Map metadata, String md5sum) throws IOException, HttpException, FilesException + { + if (this.isLoggedin()) + { + String objName = name; + if (isValidContianerName(container) && isValidObjectName(objName)) + { + PutMethod method = new PutMethod(storageURL+"/"+sanitizeForURI(container)+"/"+sanitizeForURI(objName)); + method.getParams().setSoTimeout(connectionTimeOut); + method.setRequestHeader(FilesConstants.X_AUTH_TOKEN, authToken); + method.setRequestEntity(entity); + if (useETag && md5sum != null) { + method.setRequestHeader(FilesConstants.E_TAG, md5sum); + } + method.setRequestHeader("Content-Type", entity.getContentType()); + + for(String key : metadata.keySet()) { + method.setRequestHeader(FilesConstants.X_OBJECT_META + key, sanitizeForURI(metadata.get(key))); + } + + try { + client.executeMethod(method); + FilesResponse response = new FilesResponse(method); + if (response.getStatusCode() == HttpStatus.SC_UNAUTHORIZED) { + login(); + method = new PutMethod(storageURL+"/"+sanitizeForURI(container)+"/"+sanitizeForURI(objName)); + method.getParams().setSoTimeout(connectionTimeOut); + method.setRequestHeader(FilesConstants.X_AUTH_TOKEN, authToken); + method.setRequestEntity(entity); + method.setRequestHeader("Content-Type", entity.getContentType()); + for(String key : metadata.keySet()) { + method.setRequestHeader(FilesConstants.X_OBJECT_META + key, sanitizeForURI(metadata.get(key))); + } + client.executeMethod(method); + response = new FilesResponse(method); + } + + if (response.getStatusCode() == HttpStatus.SC_CREATED) + { + logger.debug ("Object stored : " + name); + return true; + } + else { + logger.debug(response.getStatusLine()); + throw new FilesException("Unexpected result", response.getResponseHeaders(), response.getStatusLine()); + } + } + finally { + method.releaseConnection(); + } + } + else + { + if (!isValidObjectName(objName)) { + throw new FilesInvalidNameException(objName); + } + else { + throw new FilesInvalidNameException(container); + } + } + } + else { + throw new FilesAuthorizationException("You must be logged in", null, null); + } + } + + /** + * Delete the given object from it's container. + * + * @param container The container name + * @param objName The object name + * @return FilesConstants.OBJECT_DELETED + * @throws IOException There was an IO error doing network communication + * @throws HttpException There was an error with the http protocol + * @throws FilesException + */ + public void deleteObject (String container, String objName) throws IOException, HttpException, FilesException + { + if (this.isLoggedin()) + { + if (isValidContianerName(container) && isValidObjectName(objName)) + { + DeleteMethod method = null; + try { + method = new DeleteMethod(storageURL+"/"+sanitizeForURI(container)+"/"+sanitizeForURI(objName)); + method.getParams().setSoTimeout(connectionTimeOut); + method.setRequestHeader(FilesConstants.X_AUTH_TOKEN, authToken); + client.executeMethod(method); + FilesResponse response = new FilesResponse(method); + + if (response.getStatusCode() == HttpStatus.SC_NO_CONTENT) + { + logger.debug ("Object Deleted : "+objName); + } + else if (response.getStatusCode() == HttpStatus.SC_NOT_FOUND) + { + throw new FilesNotFoundException("Object was not found " + objName, response.getResponseHeaders(), response.getStatusLine()); + } + else { + throw new FilesException("Unexpected status from server", response.getResponseHeaders(), response.getStatusLine()); + } + } + finally { + if (method != null) method.releaseConnection(); + } + } + else + { + if (!isValidObjectName(objName)) { + throw new FilesInvalidNameException(objName); + } + else { + throw new FilesInvalidNameException(container); + } + } + } + else { + throw new FilesAuthorizationException("You must be logged in", null, null); + } + } + + /** + * Get an object's metadata + * + * @param container The name of the container + * @param objName The name of the object + * @return The object's metadata + * @throws IOException There was an IO error doing network communication + * @throws HttpException There was an error with the http protocol + * @throws FilesAuthorizationException The Client's Login was invalid. + * @throws FilesInvalidNameException The container or object name was not valid + */ + public FilesObjectMetaData getObjectMetaData (String container, String objName) throws IOException, HttpException, FilesAuthorizationException, FilesInvalidNameException + { + FilesObjectMetaData metaData; + if (this.isLoggedin()) + { + if (isValidContianerName(container) && isValidObjectName(objName)) + { + HeadMethod method = new HeadMethod(storageURL+"/"+sanitizeForURI(container)+"/"+sanitizeForURI(objName)); + method.getParams().setSoTimeout(connectionTimeOut); + method.setRequestHeader(FilesConstants.X_AUTH_TOKEN, authToken); + + client.executeMethod(method); + + FilesResponse response = new FilesResponse(method); + + if (response.getStatusCode() == HttpStatus.SC_NO_CONTENT) + { + logger.debug ("Object metadata retreived : "+objName); + String mimeType = response.getContentType(); + String lastModified = response.getLastModified(); + String eTag = response.getETag(); + String contentLength = response.getContentLength(); + + metaData = new FilesObjectMetaData(mimeType, contentLength, eTag, lastModified); + + Header [] headers = response.getResponseHeaders(); + HashMap headerMap = new HashMap(); + + for (Header h: headers) + { + if ( h.getName().startsWith(FilesConstants.X_OBJECT_META) ) + { + headerMap.put(h.getName().substring(FilesConstants.X_OBJECT_META.length()), unencodeURI(h.getValue())); + } + } + if (headerMap.size() > 0) + metaData.setMetaData(headerMap); + + return metaData; + } + else if (response.getStatusCode() == HttpStatus.SC_NOT_FOUND) + { + logger.info ("Object " + objName + " was not found !"); + return null; + } + + method.releaseConnection(); + } + else + { + if (!isValidObjectName(objName)) { + throw new FilesInvalidNameException(objName); + } + else { + throw new FilesInvalidNameException(container); + } + } + } + else { + throw new FilesAuthorizationException("You must be logged in", null, null); + } + return null; + } + + + /** + * Get the content of the given object + * + * @param container The name of the container + * @param objName The name of the object + * @return The content of the object + * @throws IOException There was an IO error doing network communication + * @throws HttpException There was an error with the http protocol + * @throws FilesAuthorizationException + * @throws FilesInvalidNameException + * @throws FilesNotFoundException + */ + public byte[] getObject (String container, String objName) throws IOException, HttpException, FilesAuthorizationException, FilesInvalidNameException, FilesNotFoundException + { + if (this.isLoggedin()) + { + if (isValidContianerName(container) && isValidObjectName(objName)) + { + GetMethod method = new GetMethod(storageURL+"/"+sanitizeForURI(container)+"/"+sanitizeForURI(objName)); + method.getParams().setSoTimeout(connectionTimeOut); + method.setRequestHeader(FilesConstants.X_AUTH_TOKEN, authToken); + + client.executeMethod(method); + + FilesResponse response = new FilesResponse(method); + + if (response.getStatusCode() == HttpStatus.SC_OK) + { + logger.debug ("Object data retreived : "+objName); + return response.getResponseBody(); + } + else if (response.getStatusCode() == HttpStatus.SC_NOT_FOUND) + { + throw new FilesNotFoundException("Container: " + container + " did not have object " + objName, response.getResponseHeaders(), response.getStatusLine()); + } + + method.releaseConnection(); + } + else + { + if (!isValidObjectName(objName)) { + throw new FilesInvalidNameException(objName); + } + else { + throw new FilesInvalidNameException(container); + } + } + } + else { + throw new FilesAuthorizationException("You must be logged in", null, null); + } + return null; + } + + /** + * Get's the given object's content as a stream + * + * @param container The name of the container + * @param objName The name of the object + * @return An input stream that will give the objects content when read from. + * @throws IOException There was an IO error doing network communication + * @throws HttpException There was an error with the http protocol + * @throws FilesAuthorizationException + * @throws FilesInvalidNameException + */ + public InputStream getObjectAsStream (String container, String objName) throws IOException, HttpException, FilesAuthorizationException, FilesInvalidNameException + { + if (this.isLoggedin()) + { + if (isValidContianerName(container) && isValidObjectName(objName)) + { + if (objName.length() > FilesConstants.OBJECT_NAME_LENGTH) + { + logger.warn ("Object Name supplied was truncated to Max allowed of " + FilesConstants.OBJECT_NAME_LENGTH + " characters !"); + objName = objName.substring(0, FilesConstants.OBJECT_NAME_LENGTH); + logger.warn ("Truncated Object Name is: " + objName); + } + + GetMethod method = new GetMethod(storageURL+"/"+sanitizeForURI(container)+"/"+sanitizeForURI(objName)); + method.getParams().setSoTimeout(connectionTimeOut); + method.setRequestHeader(FilesConstants.X_AUTH_TOKEN, authToken); + + client.executeMethod(method); + + FilesResponse response = new FilesResponse(method); + + if (response.getStatusCode() == HttpStatus.SC_OK) + { + logger.info ("Object data retreived : "+objName); + return response.getResponseBodyAsStream(); + } + else if (response.getStatusCode() == HttpStatus.SC_NOT_FOUND) + { + logger.info ("Object " + objName + " was not found !"); + return null; + } + + method.releaseConnection(); + } + else + { + if (!isValidObjectName(objName)) { + throw new FilesInvalidNameException(objName); + } + else { + throw new FilesInvalidNameException(container); + } + } + } + else { + throw new FilesAuthorizationException("You must be logged in", null, null); + } + return null; + } + + /** + * Utility function to write an InputStream to a file + * + * @param is + * @param f + * @throws IOException + */ + static void writeInputStreamToFile (InputStream is, File f) throws IOException + { + BufferedOutputStream bf = new BufferedOutputStream (new FileOutputStream (f)); + byte[] buffer = new byte [1024]; + int read = 0; + + while ((read = is.read(buffer)) > 0) + { + bf.write(buffer, 0, read); + } + + is.close(); + bf.flush(); + bf.close(); + } + + /** + * Reads an input stream into a stream + * + * @param is The input stream + * @return The contents of the stream stored in a string. + * @throws IOException + */ + static String inputStreamToString(InputStream stream, String encoding) throws IOException { + char buffer[] = new char[4096]; + StringBuilder sb = new StringBuilder(); + InputStreamReader isr = new InputStreamReader(stream, "utf-8"); // For now, assume utf-8 to work around server bug + + int nRead = 0; + while((nRead = isr.read(buffer)) >= 0) { + sb.append(buffer, 0, nRead); + } + isr.close(); + + return sb.toString(); + } + + /** + * Calculates the MD5 checksum of a file, returned as a hex encoded string + * + * @param f The file + * @return The MD5 checksum, as a base 16 encoded string + * @throws IOException + */ + public static String md5Sum (File f) throws IOException + { + MessageDigest digest; + try { + digest = MessageDigest.getInstance("MD5"); + InputStream is = new FileInputStream(f); + byte[] buffer = new byte[1024]; + int read = 0; + + while( (read = is.read(buffer)) > 0) + { + digest.update(buffer, 0, read); + } + + is.close (); + + byte[] md5sum = digest.digest(); + BigInteger bigInt = new BigInteger(1, md5sum); + + // Front load any zeros cut off by BigInteger + String md5 = bigInt.toString(16); + while (md5.length() != 32) { + md5 = "0" + md5; + } + return md5; + } catch (NoSuchAlgorithmException e) { + logger.fatal("The JRE is misconfigured on this computer", e); + return null; + } + } + + /** + * Calculates the MD5 checksum of an array of data + * + * @param data The data to checksum + * @return The checksum, represented as a base 16 encoded string. + * @throws IOException + */ + public static String md5Sum (byte[] data) throws IOException + { + try { + MessageDigest digest = MessageDigest.getInstance("MD5"); + byte[] md5sum = digest.digest(data); + BigInteger bigInt = new BigInteger(1, md5sum); + + // Front load any zeros cut off by BigInteger + String md5 = bigInt.toString(16); + while (md5.length() != 32) { + md5 = "0" + md5; + } + return md5; + } + catch (NoSuchAlgorithmException nsae) { + logger.fatal("Major problems with your Java configuration", nsae); + return null; + } + + } + + /** + * Encode any unicode characters that will cause us problems. + * + * @param str + * @return The string encoded for a URI + */ + public static String sanitizeForURI(String str) { + URLCodec codec= new URLCodec(); + try { + return codec.encode(str).replaceAll("\\+", "%20").replaceAll("%2F", "/"); + } + catch (EncoderException ee) { + logger.warn("Error trying to encode string for URI", ee); + return str; + } + } + + public static String unencodeURI(String str) { + URLCodec codec= new URLCodec(); + try { + return codec.decode(str); + } + catch (DecoderException ee) { + logger.warn("Error trying to encode string for URI", ee); + return str; + } + + } + + /** + * @return The connection timeout used for communicating with the server (in milliseconds) + */ + public int getConnectionTimeOut() + { + return connectionTimeOut; + } + + /** + * The timeout we will use for communicating with the server (in milliseconds) + * + * @param connectionTimeOut The new timeout for this connection + */ + public void setConnectionTimeOut(int connectionTimeOut) + { + this.connectionTimeOut = connectionTimeOut; + } + + /** + * @return The storage URL on the other end of the ReST api + */ + public String getStorageURL() + { + return storageURL; + } + + /** + * @return Get's our storage token. + */ + public String getStorageToken() + { + return authToken; + } + + /** + * Has this instance of the client authenticated itself? + * + * @return True if we logged in, false otherwise. + */ + public boolean isLoggedin() + { + return isLoggedin; + } + + /** + * The username we are logged in with. + * + * @return The username + */ + public String getUserName() + { + return username; + } + + /** + * Set's the username for this client. Note, setting this after login has no real impact unless the login() + * method is called again. + * + * @param userName the username + */ + public void setUserName(String userName) + { + this.username = userName; + } + + /** + * The password the client will use for the login. + * + * @return The password + */ + public String getPassword() + { + return password; + } + + /** + * Set's the password for this client. Note, setting this after login has no real impact unless the login() + * method is called again. + * + * @param password The new password + */ + public void setPassword(String password) + { + this.password = password; + } + + /** + * The URL we will use for Authentication + * + * @return The URL (represented as a string) + */ + public String getAuthenticationURL() + { + return authenticationURL; + } + + /** + * Changes the URL of the authentication service. Note, if one is logged in, this doesn't have an effect unless one calls login again. + * + * @param authenticationURL The new authentication URL + */ + public void setAuthenticationURL(String authenticationURL) + { + this.authenticationURL = authenticationURL; + } + + /** + * @return the useETag + */ + public boolean getUseETag() { + return useETag; + } + + /** + * @param useETag the useETag to set + */ + public void setUseETag(boolean useETag) { + this.useETag = useETag; + } + + public void setUserAgent(String userAgent) { + client.getParams().setParameter(HttpMethodParams.USER_AGENT, userAgent); + } + + public String getUserAgent() { + return client.getParams().getParameter(HttpMethodParams.USER_AGENT).toString(); + } + + private boolean isValidContianerName(String name) { + if (name == null) return false; + int length = name.length(); + if (length == 0 || length > FilesConstants.CONTAINER_NAME_LENGTH) return false; + if (name.indexOf('/') != -1) return false; + //if (name.indexOf('?') != -1) return false; + return true; + } + private boolean isValidObjectName(String name) { + if (name == null) return false; + int length = name.length(); + if (length == 0 || length > FilesConstants.OBJECT_NAME_LENGTH) return false; + //if (name.indexOf('?') != -1) return false; + return true; + } + + /** + * @return the cdnManagementURL + */ + public String getCdnManagementURL() { + return cdnManagementURL; + } + + + /** + * @param config + */ + public void setHostConfiguration(HostConfiguration config) { + client.setHostConfiguration(config); + } +} diff --git a/src/main/java/com/rackspacecloud/client/cloudfiles/FilesConstants.java b/src/main/java/com/rackspacecloud/client/cloudfiles/FilesConstants.java new file mode 100644 index 0000000..05f43e8 --- /dev/null +++ b/src/main/java/com/rackspacecloud/client/cloudfiles/FilesConstants.java @@ -0,0 +1,83 @@ +/* + * See COPYING for license information. + */ + +package com.rackspacecloud.client.cloudfiles; + +import java.util.Properties; +import java.io.IOException; +import org.apache.log4j.Logger; + +public class FilesConstants +{ + private static Logger logger = Logger.getLogger(FilesConstants.class); + + public static final String USER_AGENT = "java-cloudfiles/1.3.2"; + + /** HTTP Header token that identifies the username to Cloud Files **/ + public static final String X_STORAGE_USER = "x-auth-user"; + /** HTTP header token that identifies the password to Cloud Files **/ + public static final String X_STORAGE_PASS = "x-auth-key"; + /** HTTP header token that identifies the Storage URL after a successful user login to Cloud Files **/ + public static final String X_STORAGE_URL = "X-Storage-Url"; + /** HTTP header that identifies the CDN Management URL after a successful login to Cloud Files **/ + public static final String X_CDN_MANAGEMENT_URL = "X-CDN-Management-URL"; + /** HTTP header token that identifies the Storage Token after a successful user login to Cloud Files **/ + public static final String X_AUTH_TOKEN = "X-Auth-Token"; + /** HTTP header token that is returned on a HEAD request against a Container. The value of this header is the number of Objects in the Container **/ + public static final String X_CONTAINER_OBJECT_COUNT = "X-Container-Object-Count"; + /** HTTP header token that is returned on a HEAD request against a Container. The value of this header is the number of Objects in the Container **/ + public static final String X_CONTAINER_BYTES_USED = "X-Container-Bytes-Used"; + /** HTTP header token that is returned on a HEAD request against an Account. The value of this header is the number of Containers in the Account **/ + public static final String X_ACCOUNT_CONTAINER_COUNT = "X-Account-Container-Count"; + /** HTTP header token that is returned on a HEAD request against an Account. The value of this header is the total size of the Objects in the Account **/ + public static final String X_ACCOUNT_BYTES_USED = "X-Account-Bytes-Used"; + /** HTTP header token that is returned by calls to the CDN Management API **/ + public static final String X_CDN_URI = "X-CDN-URI"; + /** HTTP header token that is returned by calls to the CDN Management API **/ + public static final String X_CDN_TTL = "X-TTL"; + /** HTTP header token that is returned by calls to the CDN Management API **/ + public static final String X_CDN_ENABLED = "X-CDN-Enabled"; + /** HTTP header token that is returned by calls to the CDN Management API **/ + public static final String X_CDN_USER_AGENT_ACL = "X-User-Agent-ACL"; + /** HTTP header token that is returned by calls to the CDN Management API **/ + public static final String X_CDN_REFERRER_ACL = "X-Referrer-ACL "; + /** HTTP Header used by Cloud Files for the MD5Sum of the object being created in a Container **/ + public static final String E_TAG = "ETag"; + /** These constants are used for performing queries on the content of a container **/ + public static final String LIST_CONTAINER_NAME_QUERY = "prefix"; + public static final String LIST_CONTAINER_LIMIT_OBJ_COUNT_QUERY = "limit"; + public static final String LIST_CONTAINER_START_OFFSET_QUERY = "offset"; + + public static final int CONTAINER_NAME_LENGTH = 256; + public static final int OBJECT_NAME_LENGTH = 1024; + public static final int METADATA_NAME_LENGTH = 1024; + public static final int METADATA_VALUE_LENGTH = 1024; + + /** Prefix Cloud Files expects on all Meta data headers on Objects **/ + public static final String X_OBJECT_META = "X-Object-Meta-"; + + public static Properties MIMETYPES = new Properties (); + + static { + try + { + MIMETYPES.load (FilesConstants.class.getResourceAsStream("MIME.types")); + } + catch (IOException err) + { + logger.warn ("Could not load MIME.types all refrences to FilesConstants.MIMETYPES will return null.", err); + } + } + + /** + * Convenience method to get a MIME Type. If none is found it will return "application/octet-stream" + * + * @param fileExt + * @return The suggested MIME type for the file extention. + */ + public static String getMimetype (String fileExt) + { + return FilesConstants.MIMETYPES.getProperty(fileExt.toLowerCase(), "application/octet-stream"); + } +} diff --git a/src/main/java/com/rackspacecloud/client/cloudfiles/FilesContainer.java b/src/main/java/com/rackspacecloud/client/cloudfiles/FilesContainer.java new file mode 100644 index 0000000..cd2c73d --- /dev/null +++ b/src/main/java/com/rackspacecloud/client/cloudfiles/FilesContainer.java @@ -0,0 +1,197 @@ +/* + * See COPYING for license information. + */ + +package com.rackspacecloud.client.cloudfiles; + +import org.apache.commons.httpclient.HttpException; +import org.apache.log4j.Logger; + +import java.util.List; +import java.io.File; +import java.io.IOException; +import java.security.NoSuchAlgorithmException; + +public class FilesContainer +{ + private String name; + private List objects = null; + private FilesClient client = null; + private static Logger logger = Logger.getLogger(FilesContainer.class); + + /** + * Create a new container (Note, this does not actually create a container on the server) + * + * @param name The name of the container + * @param objs The objects in that container + * @param client The client we are currently using + */ + public FilesContainer(String name, List objs, FilesClient client) + { + this.name = name; + this.objects = objs; + this.client = client; + } + + /** + * @param name The name of the container + * @param client A logged in client + */ + public FilesContainer(String name, FilesClient client) + { + this.name = name; + this.client = client; + } + + /** + * Get the name of the container + * + * @return The name of this container + */ + public String getName() + { + return name; + } + + /** + * Set the name of the container + * + * @param name The new name + */ + public void setName(String name) + { + this.name = name; + } + + /** + * Returns the contents of this container + * + * @return A list of the contents + * @throws HttpException There was a problem communicating with the server + * @throws IOException There was a problem communicating with the server + * @throws FilesAuthorizationException + * @throws FilesInvalidNameException + */ + public List getObjects() throws HttpException, IOException, FilesAuthorizationException, FilesException + { + + if (client != null) + { + if(objects == null) { + objects = client.listObjects(this.name); + } + return objects; + } + else + { + logger.fatal("This Container has no FilesClient defined !"); + } + return null; + } + + /** + * Returns the contents of this container + * + * @param path Limit the results to files under the following path + * + * @return A list of the contents + * @throws HttpException There was a problem communicating with the server + * @throws IOException There was a problem communicating with the server + * @throws FilesAuthorizationException + * @throws FilesInvalidNameException + */ + public List getObjects(String path) throws HttpException, IOException, FilesAuthorizationException, FilesException + { + + if (client != null) + { + if(objects == null) { + objects = client.listObjects(this.name, path); + } + return objects; + } + else + { + logger.fatal("This Container has no FilesClient defined !"); + } + return null; + } + + /** + * Get useful information on this container + * + * @return The container info + * @throws HttpException There was a problem communicating with the server + * @throws IOException There was a problem communicating with the server + * @throws FilesException + */ + public FilesContainerInfo getInfo() throws HttpException, IOException, FilesException + { + if (client != null) + { + return client.getContainerInfo(this.name); + } + else + { + logger.fatal("This container does not have a valid client !"); + } + return null; + } + + /** + * Returns the instance of the client we're using + * + * @return The FilesClient + */ + public FilesClient getClient() + { + return this.client; + } + + /** + * Adds a new object to the container + * + * @param f The file for this object + * @param mimeType It's MIME type + * @return The return code from the server + * @throws NoSuchAlgorithmException The MD5 implementation is not installed in the client + * @throws IOException + * @throws FilesAuthorizationException + * @throws FilesInvalidNameException + */ + public boolean addObject (File f, String mimeType) throws NoSuchAlgorithmException, IOException, FilesAuthorizationException, FilesException + { + FilesObject obj = new FilesObject(f, mimeType, this); + + if (objects != null) + objects.add(obj); + else + { + objects = getObjects(); + if (objects != null) + return objects.add (obj); + } + logger.fatal("Could not add Object, it seems something is wrong with this Container or FilesClient"); + return false; + } + + /** + * Creates the container represented by this instance on the server + * + * @return Either FilesConstants.CONTAINER_CREATED or FilesConstants.CONTAINER_EXISTED or -1 if the client has not been set + * @throws HttpException + * @throws IOException + * @throws FilesAuthorizationException + * @throws FilesInvalidNameException + */ + public void createContainer () throws HttpException, IOException, FilesAuthorizationException, FilesException + { + if (client != null) + { + client.createContainer(this.name); + } + else + logger.fatal("This Container has no FilesClient defined !"); + + } +} diff --git a/src/main/java/com/rackspacecloud/client/cloudfiles/FilesContainerExistsException.java b/src/main/java/com/rackspacecloud/client/cloudfiles/FilesContainerExistsException.java new file mode 100644 index 0000000..c430253 --- /dev/null +++ b/src/main/java/com/rackspacecloud/client/cloudfiles/FilesContainerExistsException.java @@ -0,0 +1,30 @@ +/** + * + */ +package com.rackspacecloud.client.cloudfiles; + +import org.apache.commons.httpclient.Header; +import org.apache.commons.httpclient.StatusLine; + +/** + * @author lvaughn + * + */ +public class FilesContainerExistsException extends FilesException { + + /** + * + */ + private static final long serialVersionUID = 7282149064519490145L; + + /** + * @param message + * @param httpHeaders + * @param httpStatusLine + */ + public FilesContainerExistsException(String message, Header[] httpHeaders, + StatusLine httpStatusLine) { + super(message, httpHeaders, httpStatusLine); + } + +} diff --git a/src/main/java/com/rackspacecloud/client/cloudfiles/FilesContainerInfo.java b/src/main/java/com/rackspacecloud/client/cloudfiles/FilesContainerInfo.java new file mode 100644 index 0000000..cff1b95 --- /dev/null +++ b/src/main/java/com/rackspacecloud/client/cloudfiles/FilesContainerInfo.java @@ -0,0 +1,62 @@ +/* + * See COPYING for license information. + */ + +package com.rackspacecloud.client.cloudfiles; + +/** + * Contains basic information about the container + * + * @author lvaughn + * + */ +public class FilesContainerInfo +{ + private int objectCount; + private long totalSize; + private String name; + + /** + * @return the name + */ + public String getName() { + return name; + } + + /** + * @param name the name to set + */ + public void setName(String name) { + this.name = name; + } + + /** + * @param containerCount The number of objects in the container + * @param totalSize The total size of the container (in bytes) + */ + FilesContainerInfo(String name, int containerCount, long totalSize) + { + this.name = name; + this.objectCount = containerCount; + this.totalSize = totalSize; + } + + /** + * Returns the number of objects in the container + * + * @return The number of objects + */ + public int getObjectCount() + { + return objectCount; + } + + /** + * @return The total size of the objects in the container (in bytes) + */ + public long getTotalSize() + { + return totalSize; + } + +} diff --git a/src/main/java/com/rackspacecloud/client/cloudfiles/FilesContainerNotEmptyException.java b/src/main/java/com/rackspacecloud/client/cloudfiles/FilesContainerNotEmptyException.java new file mode 100644 index 0000000..56164a7 --- /dev/null +++ b/src/main/java/com/rackspacecloud/client/cloudfiles/FilesContainerNotEmptyException.java @@ -0,0 +1,25 @@ +/** + * + */ +package com.rackspacecloud.client.cloudfiles; + +import org.apache.commons.httpclient.Header; +import org.apache.commons.httpclient.StatusLine; + +/** + * @author lvaughn + * + */ +@SuppressWarnings("serial") +public class FilesContainerNotEmptyException extends FilesException { + /** + * @param message + * @param httpHeaders + * @param httpStatusLine + */ + public FilesContainerNotEmptyException(String message, + Header[] httpHeaders, StatusLine httpStatusLine) { + super(message, httpHeaders, httpStatusLine); + } + +} diff --git a/src/main/java/com/rackspacecloud/client/cloudfiles/FilesException.java b/src/main/java/com/rackspacecloud/client/cloudfiles/FilesException.java new file mode 100644 index 0000000..65d9036 --- /dev/null +++ b/src/main/java/com/rackspacecloud/client/cloudfiles/FilesException.java @@ -0,0 +1,91 @@ +/** + * + */ +package com.rackspacecloud.client.cloudfiles; + +import org.apache.commons.httpclient.Header; +import org.apache.commons.httpclient.StatusLine; +import org.apache.commons.httpclient.HttpException; + +/** + * @author lvaughn + * + */ +@SuppressWarnings("serial") +public class FilesException extends HttpException { + private Header [] httpHeaders; + private StatusLine httpStatusLine; + + /** + * An exception generated when a client tries to do something they aren't authorized to do. + * + * @param message The message + * @param httpHeaders The returned HTTP headers + * @param httpStatusLine The HTTP Status lined returned + */ + public FilesException(String message, Header [] httpHeaders, StatusLine httpStatusLine) + { + super (message); + this.httpHeaders = httpHeaders; + this.httpStatusLine = httpStatusLine; + } + + public FilesException(String message, Throwable cause) { + super(message, cause); + } + + /** + * @return The HTTP headers returned by the server + */ + public Header[] getHttpHeaders () + { + return httpHeaders; + } + + /** + * @return The HTTP Headers returned by the server in a human-readable string. + */ + public String getHttpHeadersAsString () + { + if (httpHeaders == null) return ""; + + StringBuffer httpHeaderString = new StringBuffer(); + for (Header h: httpHeaders) + httpHeaderString.append(h.toExternalForm()); + + return httpHeaderString.toString(); + } + + /** + * @return The HTTP status line from the server + */ + public StatusLine getHttpStatusLine () + { + return httpStatusLine; + } + + /** + * @return The numeric HTTP status code from the server + */ + public int getHttpStatusCode () + { + return httpStatusLine == null? -1 : httpStatusLine.getStatusCode(); + } + + /** + * @return The HTTP status message from the server + */ + public String getHttpStatusMessage () + { + return httpStatusLine == null ? null : httpStatusLine.getReasonPhrase(); + } + + /** + * @return The version of HTTP used. + */ + public String getHttpVersion () + { + return httpStatusLine == null ? null : httpStatusLine.getHttpVersion(); + } + +} diff --git a/src/main/java/com/rackspacecloud/client/cloudfiles/FilesInvalidNameException.java b/src/main/java/com/rackspacecloud/client/cloudfiles/FilesInvalidNameException.java new file mode 100644 index 0000000..d223355 --- /dev/null +++ b/src/main/java/com/rackspacecloud/client/cloudfiles/FilesInvalidNameException.java @@ -0,0 +1,20 @@ +/** + * + */ +package com.rackspacecloud.client.cloudfiles; + +/** + * @author lvaughn + * + */ +public class FilesInvalidNameException extends FilesException { + /** + * + */ + private static final long serialVersionUID = -9043382616400647532L; + + public FilesInvalidNameException(String name) { + super("Invalid name: " + name, null, null); + } + +} diff --git a/src/main/java/com/rackspacecloud/client/cloudfiles/FilesNotFoundException.java b/src/main/java/com/rackspacecloud/client/cloudfiles/FilesNotFoundException.java new file mode 100644 index 0000000..6580639 --- /dev/null +++ b/src/main/java/com/rackspacecloud/client/cloudfiles/FilesNotFoundException.java @@ -0,0 +1,30 @@ +/** + * + */ +package com.rackspacecloud.client.cloudfiles; + +import org.apache.commons.httpclient.Header; +import org.apache.commons.httpclient.StatusLine; + +/** + * @author lvaughn + * + */ +public class FilesNotFoundException extends FilesException { + + /** + * + */ + private static final long serialVersionUID = 111718445621236026L; + + /** + * @param message + * @param httpHeaders + * @param httpStatusLine + */ + public FilesNotFoundException(String message, Header[] httpHeaders, + StatusLine httpStatusLine) { + super(message, httpHeaders, httpStatusLine); + } + +} diff --git a/src/main/java/com/rackspacecloud/client/cloudfiles/FilesObject.java b/src/main/java/com/rackspacecloud/client/cloudfiles/FilesObject.java new file mode 100644 index 0000000..3e5b995 --- /dev/null +++ b/src/main/java/com/rackspacecloud/client/cloudfiles/FilesObject.java @@ -0,0 +1,354 @@ +/* + * See COPYING for license information. + */ + +package com.rackspacecloud.client.cloudfiles; + +import org.apache.log4j.Logger; +import org.apache.commons.httpclient.HttpException; + +import java.io.*; +import java.security.NoSuchAlgorithmException; + +public class FilesObject +{ + private String container; + private String name; + private String md5sum = null; + private long size = -1; + private String mimeType = null; + private String lastModified = null; + private FilesClient client = null; + + private static Logger logger = Logger.getLogger(FilesObject.class); + + /** + * Constructs a new FilesObject (from the file system) + * + * @param obj A file representing the object + * @param mimeType Its MIME type + * @param container The container it lives in + * @throws NullPointerException A null parameter was passed in + * @throws NoSuchAlgorithmException MD5 was not installed on the client. + * @throws IOException There was an I/O error talking to the server + */ + FilesObject (File obj, String mimeType, FilesContainer container) throws NullPointerException, NoSuchAlgorithmException, IOException + { + if (obj != null) + { + if (obj.exists()) + { + if (!obj.isDirectory()) + { + setName (obj.getName()); + setMd5sum(FilesClient.md5Sum(obj)); + setSize(obj.length()); + setMimeType(mimeType); + setClient(container.getClient ()); + setContainer(container.getName()); + } + else + { + logger.fatal("Can not create Directories as FSObjects create a FilesContainer for this object"); + throw new NullPointerException("File Object was a directory !"); + } + } + else + { + logger.fatal("File object must exist so we can create an MD5SUM for it !"); + throw new NullPointerException ("The file object provided does not exist."); + } + } + else + { + logger.fatal("Not possible to create a FilesObject from a null File."); + throw new NullPointerException ("File Object passed was null !"); + } + } + + /** + * Creates a new FilesObject with data from the server + * + * @param name The name of the object + * @param container The name of it's container + * @param client The client it can be accessed through. + */ + FilesObject(String name, String container, FilesClient client ) + { + this.name = name; + this.container = container; + this.client = client; + } + + /** + * @return The object's name on the server + */ + public String getName() + { + return name; + } + + /** + * Set's the objects name (up to a maximum of 128 characters) + * + * @param name The new name + */ + public void setName(String name) + { + if (name.length() > FilesConstants.OBJECT_NAME_LENGTH) + { + logger.warn("Object name larger than " + FilesConstants.OBJECT_NAME_LENGTH + " characters truncating from: "+name); + this.name = name.substring(0, FilesConstants.OBJECT_NAME_LENGTH); + logger.warn("Object name truncated to : "+name); + } + this.name = name; + } + + /** + * @return The MIME type of the object, pulled from the server + * @throws HttpException + * @throws IOException + * @throws FilesAuthorizationException + * @throws FilesInvalidNameException + */ + public String getMimeType() throws HttpException, IOException, FilesAuthorizationException, FilesInvalidNameException + { + if (mimeType == null) { + getMetaData(); + } + return mimeType; + } + + /** + * @param mimeType The new MIME type for this object + */ + public void setMimeType(String mimeType) + { + this.mimeType = mimeType; + } + + /** + * Get's the MD5 Checksum for this object + * + * @return The MD5 checksum, returned as a base 16 encoded string + * @throws HttpException + * @throws IOException + * @throws FilesAuthorizationException + * @throws FilesInvalidNameException + */ + public String getMd5sum() throws HttpException, IOException, FilesAuthorizationException, FilesInvalidNameException + { + if (md5sum == null) { + getMetaData(); + } + return md5sum; + } + + /** + * + * @param md5sum The MD5 sum of the file (as a hex-encoded string) + */ + public void setMd5sum(String md5sum) + { + this.md5sum = md5sum; + } + + /** + * Returns the size of the object, in bytes + * + * @return The size of the object in bytes + * @throws HttpException + * @throws IOException + * @throws FilesAuthorizationException + * @throws FilesInvalidNameException + */ + public long getSize() throws HttpException, IOException, FilesAuthorizationException, FilesInvalidNameException + { + if (size == -1) { + getMetaData(); + } + return size; + } + + /** + * Set the size of the object + * + * @param size The size, in bytes + */ + public void setSize(long size) + { + this.size = size; + } + + /** + * Download the object and write it to a local file + * + * @param localFile The file + * @return The number of bytes written + * @throws FileNotFoundException Could not find the local file (does the path to it exist?) + * @throws HttpException There was an error communicating with the server + * @throws IOException There was an I/O exception communicating with the server or writing the file. + * @throws FilesAuthorizationException + * @throws FilesInvalidNameException + */ + public long writeObjectToFile (File localFile) throws FileNotFoundException, HttpException, IOException, FilesAuthorizationException, FilesInvalidNameException + { + long bytesWritten = 0; + FileOutputStream out = new FileOutputStream(localFile); + InputStream in = getObjectAsStream(); + byte[] data = new byte[1024]; + + int ret = in.read (data, 0, data.length); + if (ret == -1) + { + out.write(data, 0, data.length); + return data.length; + } + + while (ret != -1) + { + bytesWritten += ret; + out.write(data, 0, ret); + ret = in.read (data, 0, data.length); + } + out.flush(); + out.close(); + in.close (); + + return bytesWritten; + } + + /** + * Returns an inputStream with the contents of the object + * + * @return An inputStream that will return the contents of the object + * @throws HttpException There was an error communicating with the server + * @throws IOException There was an I/O exception communicating with the server or writing the file. + * @throws FilesAuthorizationException + * @throws FilesInvalidNameException + */ + public InputStream getObjectAsStream() throws HttpException, IOException, FilesAuthorizationException, FilesInvalidNameException + { + return client.getObjectAsStream(container, name); + } + + /** + * Download the contents of the object + * + * @return The content of the object + * @throws HttpException There was an error communicating with the server + * @throws IOException There was an I/O exception communicating with the server or writing the file. + * @throws FilesAuthorizationException + * @throws FilesInvalidNameException + * @throws FilesNotFoundException + */ + public byte[] getObject() throws HttpException, IOException, FilesAuthorizationException, FilesInvalidNameException, FilesNotFoundException + { + return client.getObject(container, name); + } + + /** + * Return any metadata associated with this object + * + * @return The metadata + * @throws HttpException There was an error communicating with the server + * @throws IOException There was an I/O exception communicating with the server or writing the file. + * @throws FilesAuthorizationException + * @throws FilesInvalidNameException + */ + public FilesObjectMetaData getMetaData() throws HttpException, IOException, FilesAuthorizationException, FilesInvalidNameException + { + FilesObjectMetaData metaData = client.getObjectMetaData(container, name); + if (metaData != null) + { + setMd5sum(metaData.getETag()); + setSize(Long.parseLong (metaData.getContentLength())); + setMimeType(metaData.getMimeType()); + setLastModified(metaData.getLastModified()); + } + return metaData; + } + + /** + * @param client The new client for this object + */ + void setClient(FilesClient client) + { + this.client = client; + } + + /** + * @param container The new container + */ + void setContainer (String container) + { + this.container = container; + } + + public static FilesObject uploadObject(File obj, String mimeType, FilesContainer container) throws IOException, FilesException { + return uploadObject(obj, mimeType, container, null); + } + + public static FilesObject uploadObject(File obj, String mimeType, FilesContainer container, IFilesTransferCallback callback) throws IOException, FilesException { + FilesObject result = null; + try { + result = new FilesObject(obj, mimeType, container); + FilesClient client = container.getClient(); + client.storeObjectAs(container.getName(), obj, mimeType, obj.getName(), callback); + } + catch (NoSuchAlgorithmException nsae) { + // This should never happen + logger.fatal("Install doesn't have MD5, can't upload files", nsae); + } + + return result; + } + + /** + * Returns the size as a human readable string, rounding to the nearest KB/MB/GB + * + * @return The size of the object as a human readable string. + * @throws HttpException There was an error communicating with the server + * @throws IOException There was an I/O exception communicating with the server or writing the file. + * @throws FilesAuthorizationException + * @throws FilesInvalidNameException + */ + public String getSizeString () throws HttpException, IOException, FilesAuthorizationException, FilesInvalidNameException + { + long kb = 1024; + long mb = kb*1024; + long gb = mb*1024; + + //Make sure the size is correct. + getMetaData(); + + //KB + if (size > gb) + return (size/gb) + " GB"; + else if (size > mb) + return (size/mb)+" MB"; + else if (size > kb) + return (size/kb) +" KB"; + else + return getSize ()+" Bytes"; + + } + + /** + * @return the lastModified + */ + public String getLastModified() throws HttpException, IOException, FilesAuthorizationException, FilesInvalidNameException + { + if (lastModified == null) { + getMetaData(); + } + return lastModified; + } + + /** + * @param lastModified the lastModified to set + */ + public void setLastModified(String lastModified) { + this.lastModified = lastModified; + } +} diff --git a/src/main/java/com/rackspacecloud/client/cloudfiles/FilesObjectMetaData.java b/src/main/java/com/rackspacecloud/client/cloudfiles/FilesObjectMetaData.java new file mode 100644 index 0000000..0651352 --- /dev/null +++ b/src/main/java/com/rackspacecloud/client/cloudfiles/FilesObjectMetaData.java @@ -0,0 +1,177 @@ +/* + * See COPYING for license information. + */ + +package com.rackspacecloud.client.cloudfiles; + +import java.util.HashMap; +import java.util.Map; + +public class FilesObjectMetaData +{ + private String mimeType; + private String contentLength; + private String eTag; + private String lastModified; + private Map metaData = new HashMap(); + + /** + * An object storing the metadata for an FS Cloud object + * + * @param mimeType The MIME type for the object + * @param contentLength The content-length (e.g., size) of the object + * @param eTag The MD5 check-sum of the object's contents + * @param lastModified The last time the object was modified. + */ + public FilesObjectMetaData(String mimeType, String contentLength, String eTag, String lastModified) + { + this.mimeType = mimeType; + this.contentLength = contentLength; + this.eTag = eTag; + this.lastModified = lastModified; + } + + /** + * An object storing the metadata for an FS Cloud object + * + * @param mimeType The MIME type for the object + * @param contentLength The content-length (e.g., size) of the object + * @param lastModified The last time the object was modified. + */ + public FilesObjectMetaData(String mimeType, String contentLength, String lastModified) + { + this.mimeType = mimeType; + this.contentLength = contentLength; + this.lastModified = lastModified; + } + + /** + * The last time the object was modified + * + * @return The last modification date + */ + public String getLastModified() + { + return lastModified; + } + + /** + * Set the last time the object was modified + */ + void setLastModified(String lastModified) + { + this.lastModified = lastModified; + } + + /** + * The MIME type of the object + * + * @return The MIME type of the object + */ + public String getMimeType() + { + return mimeType; + } + + /** + * Set's the MIME type of the object + * + * @param mimeType + */ + void setMimeType(String mimeType) + { + this.mimeType = mimeType; + } + + /** + * The size of the object, in bytes + * + * @return The size of the object + */ + public String getContentLength() + { + return contentLength; + } + + /** + * Set the size of the object + * + * @param contentLength The new content length + */ + void setContentLength(String contentLength) + { + this.contentLength = contentLength; + } + + /** + * The MD5 checksum represented in a hex-encoded string + * + * @return The eTag + */ + public String getETag() + { + return eTag; + } + + /** + * Set the MD5 checksum for this object + * + * @param eTag The new eTag + */ + void setETag(String eTag) + { + this.eTag = eTag; + } + + /** + * The metadata associated with this object. + * + * @return The object's metadata + */ + public Map getMetaData() + { + return metaData; + } + + /** + * Set new metatdata for this object. Warning, this metadata clears out all old metadata. To add new fields, use + * setMetaData instead. + * + * @param metaData The new metadata + */ + public void setMetaData(Map metaData) + { + this.metaData = metaData; + } + + /** + * Add a new meta-data entry (or overwrite an old one) + * + * @param key The key for this key-value pair + * @param value The value for this key-value pair + */ + public void addMetaData (String key, String value) + { + metaData.put(FilesConstants.X_OBJECT_META.concat(key), value); + } + + /** Constructs a new header for a given metadata key + * @param key The key + * @return The name of a header for this key + */ + public String getMetaKey (String key) + { + return metaData.get(FilesConstants.X_OBJECT_META.concat(key)); + } + + /** + * Tests to see if a given metadata key is present for this object + * + * @param key The key to check for + * @return True if it's present, false otherwise. + */ + public boolean containesKey (String key) + { + return metaData.containsKey(FilesConstants.X_OBJECT_META.concat(key)); + } +} diff --git a/src/main/java/com/rackspacecloud/client/cloudfiles/FilesResponse.java b/src/main/java/com/rackspacecloud/client/cloudfiles/FilesResponse.java new file mode 100644 index 0000000..4df4dc7 --- /dev/null +++ b/src/main/java/com/rackspacecloud/client/cloudfiles/FilesResponse.java @@ -0,0 +1,307 @@ +/* + * See COPYING for license information. + */ + +package com.rackspacecloud.client.cloudfiles; + +import org.apache.commons.httpclient.Header; +import org.apache.commons.httpclient.StatusLine; +import org.apache.commons.httpclient.HttpMethod; +import org.apache.commons.httpclient.HttpStatus; +import org.apache.log4j.Logger; + +import java.io.IOException; +import java.io.InputStream; + +public class FilesResponse +{ + private HttpMethod httpmethod = null; + + private static Logger logger = Logger.getLogger(FilesResponse.class); + + /** + * @param method The HttpMethod that generated this response + */ + public FilesResponse (HttpMethod method) + { + httpmethod = method; + + if (logger.isDebugEnabled()) + { + logger.debug ("Request Method: "+method.getName()); + logger.debug ("Request Path: " + method.getPath()); + logger.debug ("Status Line: " + getStatusLine()); + Header[] reqHeaders = method.getRequestHeaders(); + for (Header rH: reqHeaders) + logger.debug(rH.toExternalForm()); + + Header [] responseHeaders = getResponseHeaders(); + for (int i=0; i < responseHeaders.length;i++) + logger.debug(responseHeaders[i]); + } + } + + /** + * Checks to see if the user managed to login with their credentials. + * + * @return true is login succeeded false otherwise + */ + public boolean loginSuccess () + { + if (getStatusCode() == HttpStatus.SC_UNAUTHORIZED ) + return false; + + if (getStatusCode() == HttpStatus.SC_NO_CONTENT) + return true; + + return false; + } + + /** + * This method makes no assumptions about the user having been logged in. It simply looks for the Storage Token header + * as defined by FilesConstants.X_STORAGE_TOKEN and if this exists it returns its value otherwise the value returned will be null. + * + * @return null if the user is not logged into Cloud FS or the Storage token + */ + public String getAuthToken () + { + return getResponseHeader(FilesUtil.getProperty("auth_token_name", FilesConstants.X_AUTH_TOKEN)).getValue(); + } + + /** + * This method makes no assumptions about the user having been logged in. It simply looks for the Storage URL header + * as defined by FilesConstants.X_STORAGE_URL and if this exists it returns its value otherwise the value returned will be null. + * + * @return null if the user is not logged into Cloud FS or the Storage URL + */ + public String getStorageURL () + { + return getResponseHeader(FilesConstants.X_STORAGE_URL).getValue(); + } + + /** + * This method makes no assumptions about the user having been logged in. It simply looks for the CDN Management URL header + * as defined by FilesConstants.X_CDN_MANAGEMENT_URL and if this exists it returns its value otherwise the value returned will be null. + * + * @return null if the user is not logged into Cloud FS or the Storage URL + */ + public String getCDNManagementURL () + { + Header header = getResponseHeader(FilesConstants.X_CDN_MANAGEMENT_URL); + return header == null ? null : header.getValue(); + } + + /** + * Get the content type + * + * @return The content type (e.g., MIME type) of the response + */ + public String getContentType () + { + return getResponseHeader("Content-Type").getValue(); + } + + /** + * Get the content length of the response (as reported in the header) + * + * @return the length of the content + */ + public String getContentLength () + { + Header hdr = getResponseHeader("Content-Length"); + if (hdr == null) return "0"; + return hdr.getValue(); + } + + /** + * The Etag is the same as the objects MD5SUM + * + * @return The ETAG + */ + public String getETag () + { + Header hdr = getResponseHeader(FilesConstants.E_TAG); + if (hdr == null) return null; + return hdr.getValue(); + } + + /** + * The last modified header + * + * @return The last modified header + */ + public String getLastModified () + { + return getResponseHeader("Last-Modified").getValue(); + } + + /** + * The HTTP headers from the response + * + * @return The headers + */ + public Header[] getResponseHeaders() + { + return httpmethod.getResponseHeaders(); + } + + /** + * The HTTP Status line (both the status code and the status message). + * + * @return The status line + */ + public StatusLine getStatusLine() + { + return httpmethod.getStatusLine(); + } + + /** + * Get the HTTP status code + * + * @return The status code + */ + public int getStatusCode () + { + return httpmethod.getStatusCode(); + } + + /** + * Get the HTTP status message + * + * @return The message portion of the status line + */ + public String getStatusMessage () + { + return httpmethod.getStatusText(); + } + + /** + * The HTTP Method (put, get, etc) of the request that generated this response + * + * @return The method name + */ + public String getMethodName () + { + return httpmethod.getName(); + } + + /** + * Returns the response body as text + * + * @return The response body + * @throws IOException + */ + public String getResponseBodyAsString () throws IOException + { + return httpmethod.getResponseBodyAsString(); + } + + /** + * Get the response body as a Stream + * + * @return An input stream that will return the response body when read + * @throws IOException + */ + public InputStream getResponseBodyAsStream () throws IOException + { + return httpmethod.getResponseBodyAsStream(); + } + + /** + * Get the body of the response as a byte array + * + * @return The body of the response. + * @throws IOException + */ + public byte[] getResponseBody () throws IOException + { + return httpmethod.getResponseBody(); + } + + /** + * Returns the specified response header. Note that header-name matching is case insensitive. + * + * @param headerName - The name of the header to be returned. + * @return The specified response header. If the response contained multiple instances of the header, its values will be combined using the ',' separator as specified by RFC2616. + */ + public Header getResponseHeader(String headerName) + { + return httpmethod.getResponseHeader(headerName); + } + + /** + * Get the number of objects in the header + * + * @return -1 if the header is not present or the correct value as defined by the header + */ + public int getContainerObjectCount () + { + Header contCountHeader = getResponseHeader (FilesConstants.X_CONTAINER_OBJECT_COUNT); + if (contCountHeader != null ) + return Integer.parseInt(contCountHeader.getValue()); + return -1; + } + + /** + * Get the number of bytes used by the container + * + * @return -1 if the header is not present or the correct value as defined by the header + */ + public long getContainerBytesUsed () + { + Header contBytesUsedHeader = getResponseHeader (FilesConstants.X_CONTAINER_BYTES_USED); + if (contBytesUsedHeader != null ) + return Long.parseLong(contBytesUsedHeader.getValue()); + return -1; + } + + /** + * Get the number of objects in the header + * + * @return -1 if the header is not present or the correct value as defined by the header + */ + public int getAccountContainerCount () + { + Header contCountHeader = getResponseHeader (FilesConstants.X_ACCOUNT_CONTAINER_COUNT); + if (contCountHeader != null ) + return Integer.parseInt(contCountHeader.getValue()); + return -1; + } + + /** + * Get the number of bytes used by the container + * + * @return -1 if the header is not present or the correct value as defined by the header + */ + public long getAccountBytesUsed () + { + Header accountBytesUsedHeader = getResponseHeader (FilesConstants.X_ACCOUNT_BYTES_USED); + if (accountBytesUsedHeader != null ) + return Long.parseLong(accountBytesUsedHeader.getValue()); + return -1; + } + + /** + * Get the URL For a shared container + * + * @return null if the header is not present or the correct value as defined by the header + */ + public String getCdnUrl () + { + Header cdnHeader = getResponseHeader (FilesConstants.X_CDN_URI); + if (cdnHeader != null ) + return cdnHeader.getValue(); + return null; + } + + /** + * Returns the response headers with the given name. Note that header-name matching is case insensitive. + * + * @param headerName - the name of the headers to be returned. + * @return An array of zero or more headers + */ + public Header[] getResponseHeaders(String headerName) + { + return httpmethod.getResponseHeaders(headerName); + } +} diff --git a/src/main/java/com/rackspacecloud/client/cloudfiles/FilesUtil.java b/src/main/java/com/rackspacecloud/client/cloudfiles/FilesUtil.java new file mode 100644 index 0000000..a4a0a75 --- /dev/null +++ b/src/main/java/com/rackspacecloud/client/cloudfiles/FilesUtil.java @@ -0,0 +1,113 @@ +/* + * See COPYING for license information. + */ + +package com.rackspacecloud.client.cloudfiles; + +import java.io.FileNotFoundException; +import java.io.InputStream; +import java.io.IOException; +import java.util.Properties; + +import org.apache.log4j.Logger; + +/** + * Cloud Files utilities + */ +public class FilesUtil { + private static Logger logger = Logger.getLogger(FilesUtil.class); + /** + * The name of the properties file we're looking for + */ + private final static String file = "cloudfiles.properties"; + + /** + * A cache of the properties + */ + private static Properties props = null; + + /** + * Find the properties file in the class path and load it. + * + * @throws IOException + */ + private static void loadPropertiesFromClasspath() throws IOException { + props = new Properties(); + InputStream inputStream = FilesUtil.class.getClassLoader() + .getResourceAsStream(file); + + if (inputStream == null) { + throw new FileNotFoundException("Property file '" + file + + "' not found in the classpath"); + } + props.load(inputStream); + } + + /** + * Look up a property from the properties file. + * + * @param key The name of the property to be found + * @return The value of the property + */ + public static String getProperty(String key) + { + if (props == null) + { + try + { + loadPropertiesFromClasspath(); + } + catch (Exception IOException) + { + logger.warn("Unable to load properties file."); + return null; + } + } + return props.getProperty(key); + } + + /** + * Look up a property from the properties file. + * + * @param key The name of the property to be found + * @return The value of the property + */ + public static String getProperty(String key, String defaultValue) + { + if (props == null) + { + try + { + loadPropertiesFromClasspath(); + } + catch (Exception IOException) + { + logger.warn("Unable to load properties file."); + return null; + } + } + return props.getProperty(key, defaultValue); + } + + /** + * Looks up the value of a key from the properties file and converts it to an integer. + * + * @param key + * @return The value of that key + */ + public static int getIntProperty(String key) { + String property = getProperty(key); + + if (property == null) { + logger.warn("Could not load integer property " + key); + return -1; + } + try { + return Integer.parseInt(property); + } + catch (NumberFormatException nfe) { + logger.warn("Invalid format for a number in properties file: " + property, nfe); + return -1; + } + } +} diff --git a/src/main/java/com/rackspacecloud/client/cloudfiles/IFilesTransferCallback.java b/src/main/java/com/rackspacecloud/client/cloudfiles/IFilesTransferCallback.java new file mode 100644 index 0000000..12e5238 --- /dev/null +++ b/src/main/java/com/rackspacecloud/client/cloudfiles/IFilesTransferCallback.java @@ -0,0 +1,13 @@ +/** + * + */ +package com.rackspacecloud.client.cloudfiles; + +/** + * @author lvaughn + * + */ +public interface IFilesTransferCallback { + public void progress(long n); + +} diff --git a/src/main/java/com/rackspacecloud/client/cloudfiles/MIME.types b/src/main/java/com/rackspacecloud/client/cloudfiles/MIME.types new file mode 100644 index 0000000..9f91f79 --- /dev/null +++ b/src/main/java/com/rackspacecloud/client/cloudfiles/MIME.types @@ -0,0 +1,580 @@ +3dm x-world/x-3dmf +3dmf x-world/x-3dmf +a application/octet-stream +aab application/x-authorware-bin +aam application/x-authorware-map +aas application/x-authorware-seg +abc text/vnd.abc +acgi text/html +afl video/animaflex +ai application/postscript +aif audio/aiff +#aif audio/x-aiff +aifc audio/aiff +#aifc audio/x-aiff +aiff audio/aiff +#aiff audio/x-aiff +aim application/x-aim +aip text/x-audiosoft-intra +ani application/x-navi-animation +aos application/x-nokia-9000-communicator-add-on-software +aps application/mime +arc application/octet-stream +arj application/arj +#arj application/octet-stream +art image/x-jg +asf video/x-ms-asf +asm text/x-asm +asp text/asp +asx application/x-mplayer2 +#asx video/x-ms-asf +#asx video/x-ms-asf-plugin +au audio/basic +#au audio/x-au +avi application/x-troff-msvideo +#avi video/avi +#avi video/msvideo +#avi video/x-msvideo +avs video/avs-video +bcpio application/x-bcpio +#bin application/mac-binary +#bin application/macbinary +#bin application/octet-stream +bin application/x-binary +#bin application/x-macbinary +bm image/bmp +bmp image/bmp +#bmp image/x-windows-bmp +boo application/book +book application/book +boz application/x-bzip2 +bsh application/x-bsh +bz application/x-bzip +bz2 application/x-bzip2 +c text/plain +#c text/x-c +c++ text/plain +cat application/vnd.ms-pki.seccat +cc text/plain +#cc text/x-c +ccad application/clariscad +cco application/x-cocoa +cdf application/cdf +#cdf application/x-cdf +#cdf application/x-netcdf +cer application/pkix-cert +#cer application/x-x509-ca-cert +cha application/x-chat +chat application/x-chat +class application/java +#class application/java-byte-code +#class application/x-java-class +com application/octet-stream +#com text/plain +conf text/plain +cpio application/x-cpio +cpp text/x-c +cpt application/mac-compactpro +#cpt application/x-compactpro +#cpt application/x-cpt +crl application/pkcs-crl +#crl application/pkix-crl +crt application/pkix-cert +#crt application/x-x509-ca-cert +#crt application/x-x509-user-cert +csh application/x-csh +#csh text/x-script.csh +css application/x-pointplus +#css text/css +cxx text/plain +dcr application/x-director +deepv application/x-deepv +def text/plain +der application/x-x509-ca-cert +dif video/x-dv +dir application/x-director +dl video/dl +#dl video/x-dl +doc application/msword +dot application/msword +dp application/commonground +drw application/drafting +dump application/octet-stream +dv video/x-dv +dvi application/x-dvi +#dwf drawing/x-dwf (old) +dwf model/vnd.dwf +dwg application/acad +#dwg image/vnd.dwg +#dwg image/x-dwg +dxf application/dxf +#dxf image/vnd.dwg +#dxf image/x-dwg +dxr application/x-director +el text/x-script.elisp +elc application/x-bytecode.elisp (compiled elisp) +#elc application/x-elc +env application/x-envoy +eps application/postscript +es application/x-esrehber +etx text/x-setext +evy application/envoy +#evy application/x-envoy +exe application/octet-stream +f text/plain +#f text/x-fortran +f77 text/x-fortran +f90 text/plain +#f90 text/x-fortran +fdf application/vnd.fdf +fif application/fractals +#fif image/fif +fli video/fli +#fli video/x-fli +flo image/florian +flx text/vnd.fmi.flexstor +fmf video/x-atomic3d-feature +for text/plain +#for text/x-fortran +fpx image/vnd.fpx +#fpx image/vnd.net-fpx +frl application/freeloader +funk audio/make +g text/plain +g3 image/g3fax +gif image/gif +gl video/gl +#gl video/x-gl +gsd audio/x-gsm +gsm audio/x-gsm +gsp application/x-gsp +gss application/x-gss +gtar application/x-gtar +gz application/x-compressed +#gz application/x-gzip +gzip application/x-gzip +#gzip multipart/x-gzip +h text/plain +#h text/x-h +hdf application/x-hdf +help application/x-helpfile +hgl application/vnd.hp-hpgl +hh text/plain +#hh text/x-h +#hlb text/x-script +hlp application/hlp +#hlp application/x-helpfile +#hlp application/x-winhelp +hpg application/vnd.hp-hpgl +hpgl application/vnd.hp-hpgl +hqx application/binhex +#hqx application/binhex4 +#hqx application/mac-binhex +#hqx application/mac-binhex40 +#hqx application/x-binhex40 +#hqx application/x-mac-binhex40 +hta application/hta +htc text/x-component +htm text/html +html text/html +htmls text/html +htt text/webviewhtml +htx text/html +ice x-conference/x-cooltalk +ico image/x-icon +idc text/plain +ief image/ief +iefs image/ief +iges application/iges +#iges model/iges +igs application/iges +igs model/iges +ima application/x-ima +imap application/x-httpd-imap +inf application/inf +ins application/x-internett-signup +ip application/x-ip2 +isu video/x-isvideo +it audio/it +iv application/x-inventor +ivr i-world/i-vrml +ivy application/x-livescreen +jam audio/x-jam +java text/plain +#java text/x-java-source +jcm application/x-java-commerce +jfif image/jpeg +#jfif image/pjpeg +#jpe image/jpeg +#jpe image/pjpeg +jpeg image/jpeg +#jpeg image/pjpeg +jpg image/jpeg +#jpg image/pjpeg +jps image/x-jps +js application/x-javascript +jut image/jutvision +kar audio/midi +#kar music/x-karaoke +#ksh application/x-ksh +ksh text/x-script.ksh +la audio/nspaudio +#la audio/x-nspaudio +lam audio/x-liveaudio +latex application/x-latex +#lha application/lha +lha application/octet-stream +#lha application/x-lha +lhx application/octet-stream +list text/plain +lma audio/nspaudio +#lma audio/x-nspaudio +log text/plain +#lsp application/x-lisp +#lsp text/x-script.lisp +lst text/plain +lsx text/x-la-asf +ltx application/x-latex +lzh application/octet-stream +#lzh application/x-lzh +#lzx application/lzx +lzx application/octet-stream +#lzx application/x-lzx +m text/plain +# +m1v video/mpeg +#m2a audio/mpeg +m2v video/mpeg +#m3u audio/x-mpequrl +man application/x-troff-man +mht message/rfc822 +#mhtml message/rfc822 +#mid application/x-midi +#midi audio/midi +mif application/x-frame +#mjf audio/x-vnd.audioexplosion.mjuicemediafile +mjpg video/x-motion-jpeg +mod audio/mod +mov video/quicktime +movie video/x-sgi-movie +mp2 audio/mpeg +mp3 audio/mpeg3 +mpa audio/mpeg +#mpa video/mpeg +mpc application/x-project +#mpeg video/mpeg +mpg audio/mpeg +#mpg video/mpeg +#mpga audio/mpeg +p text/x-pascal +p10 application/pkcs10 +#p10 application/x-pkcs10 +p12 application/pkcs-12 +p12 application/x-pkcs12 +p7a application/x-pkcs7-signature +#p7c application/pkcs7-mime +p7c application/x-pkcs7-mime +p7m application/pkcs7-mime +#p7m application/x-pkcs7-mime +p7r application/x-pkcs7-certreqresp +p7s application/pkcs7-signature +part application/pro_eng +pas text/pascal +pbm image/x-portable-bitmap +#.pcl application/vnd.hp-pcl +pcl application/x-pcl +pct image/x-pict +pcx image/x-pcx +pdb chemical/x-pdb +pdf application/pdf +pfunk audio/make +#pfunk audio/make.my.funk +pgm image/x-portable-graymap +pgm image/x-portable-greymap +pic image/pict +pict image/pict +pkg application/x-newton-compatible-pkg +pko application/vnd.ms-pki.pko +pl text/plain +pl text/x-script.perl +plx application/x-pixclscript +pm image/x-xpixmap +#pm text/x-script.perl-module +pm4 application/x-pagemaker +pm5 application/x-pagemaker +png image/png +pnm application/x-portable-anymap +pnm image/x-portable-anymap +pot application/mspowerpoint +pot application/vnd.ms-powerpoint +pov model/x-pov +ppa application/vnd.ms-powerpoint +ppm image/x-portable-pixmap +pps application/mspowerpoint +pps application/vnd.ms-powerpoint +ppt application/mspowerpoint +#ppt application/powerpoint +#ppt application/vnd.ms-powerpoint +#ppt application/x-mspowerpoint +ppz application/mspowerpoint +pre application/x-freelance +prt application/pro_eng +ps application/postscript +psd application/octet-stream +pvu paleovu/x-pv +pwz application/vnd.ms-powerpoint +py text/x-script.phyton +pyc applicaiton/x-bytecode.python +qcp audio/vnd.qcelp +qd3 x-world/x-3dmf +#qd3d x-world/x-3dmf +qif image/x-quicktime +qt video/quicktime +qtc video/x-qtc +qti image/x-quicktime +qtif image/x-quicktime +ra audio/x-pn-realaudio +#ra audio/x-pn-realaudio-plugin +#ra audio/x-realaudio +ram audio/x-pn-realaudio +ras application/x-cmu-raster +#ras image/cmu-raster +#ras image/x-cmu-raster +#rast image/cmu-raster +#rexx text/x-script.rexx +#rf image/vnd.rn-realflash +rgb image/x-rgb +rm application/vnd.rn-realmedia +#rm audio/x-pn-realaudio +rmi audio/mid +rmm audio/x-pn-realaudio +rmp audio/x-pn-realaudio +#rmp audio/x-pn-realaudio-plugin +rng application/ringing-tones +#rng application/vnd.nokia.ringing-tone +rnx application/vnd.rn-realplayer +roff application/x-troff +rp image/vnd.rn-realpix +rpm audio/x-pn-realaudio-plugin +rt text/richtext +#rt text/vnd.rn-realtext +rtf application/rtf +#rtf application/x-rtf +#rtf text/richtext +#rtx application/rtf +#rtx text/richtext +rv video/vnd.rn-realvideo +s text/x-asm +s3m audio/s3m +#saveme application/octet-stream +sbk application/x-tbook +scm application/x-lotusscreencam +#scm text/x-script.guile +#scm text/x-script.scheme +#scm video/x-scm +sdml text/plain +sdp application/sdp +#sdp application/x-sdp +sdr application/sounder +sea application/sea +#sea application/x-sea +set application/set +sgm text/sgml +#sgm text/x-sgml +sgml text/sgml +#sgml text/x-sgml +sh application/x-bsh +#sh application/x-sh +#sh application/x-shar +#sh text/x-script.sh +shar application/x-bsh +#shar application/x-shar +shtml text/html +#shtml text/x-server-parsed-html +sid audio/x-psid +#sit application/x-sit +sit application/x-stuffit +skd application/x-koan +skm application/x-koan +skp application/x-koan +skt application/x-koan +sl application/x-seelogo +smi application/smil +smil application/smil +#snd audio/basic +snd audio/x-adpcm +sol application/solids +#spc application/x-pkcs7-certificates +spc text/x-speech +spl application/futuresplash +spr application/x-sprite +sprite application/x-sprite +src application/x-wais-source +ssi text/x-server-parsed-html +ssm application/streamingmedia +sst application/vnd.ms-pki.certstore +step application/step +stl application/sla +#stl application/vnd.ms-pki.stl +#stl application/x-navistyle +stp application/step +sv4cpio application/x-sv4cpio +sv4crc application/x-sv4crc +svf image/vnd.dwg +#svf image/x-dwg +svr application/x-world +#svr x-world/x-svr +swf application/x-shockwave-flash +t application/x-troff +talk text/x-speech +tar application/x-tar +tbk application/toolbook +#tbk application/x-tbook +tcl application/x-tcl +#tcl text/x-script.tcl +tcsh text/x-script.tcsh +tex application/x-tex +texi application/x-texinfo +texinfo application/x-texinfo +#text application/plain +text text/plain +#tgz application/gnutar +tgz application/x-compressed +tif image/tiff +#tif image/x-tiff +tiff image/tiff +#tiff image/x-tiff +tr application/x-troff +tsi audio/tsp-audio +tsp application/dsptype +#tsp audio/tsplayer +tsv text/tab-separated-values +turbot image/florian +txt text/plain +uil text/x-uil +uni text/uri-list +unis text/uri-list +unv application/i-deas +uri text/uri-list +uris text/uri-list +ustar application/x-ustar +#ustar multipart/x-ustar +uu application/octet-stream +#uu text/x-uuencode +uue text/x-uuencode +vcd application/x-cdlink +vcs text/x-vcalendar +vda application/vda +vdo video/vdo +vew application/groupwise +viv video/vivo +#viv video/vnd.vivo +vivo video/vivo +#vivo video/vnd.vivo +vmd application/vocaltec-media-desc +vmf application/vocaltec-media-file +voc audio/voc +#voc audio/x-voc +vos video/vosaic +vox audio/voxware +vqe audio/x-twinvq-plugin +vqf audio/x-twinvq +vql audio/x-twinvq-plugin +vrml application/x-vrml +#vrml model/vrml +#vrml x-world/x-vrml +vrt x-world/x-vrt +vsd application/x-visio +vst application/x-visio +vsw application/x-visio +w60 application/wordperfect6.0 +w61 application/wordperfect6.1 +w6w application/msword +wav audio/wav +#wav audio/x-wav +wb1 application/x-qpro +wbmp image/vnd.wap.wbmp +web application/vnd.xara +wiz application/msword +wk1 application/x-123 +wmf windows/metafile +wml text/vnd.wap.wml +wmlc application/vnd.wap.wmlc +wmls text/vnd.wap.wmlscript +wmlsc application/vnd.wap.wmlscriptc +word application/msword +wp application/wordperfect +wp5 application/wordperfect +#wp5 application/wordperfect6.0 +wp6 application/wordperfect +wpd application/wordperfect +#wpd application/x-wpwin +wq1 application/x-lotus +wri application/mswrite +#wri application/x-wri +#wrl application/x-world +wrl model/vrml +#wrl x-world/x-vrml +#wrz model/vrml +#wrz x-world/x-vrml +#wsc text/scriplet +wsrc application/x-wais-source +wtk application/x-wintalk +xbm image/x-xbitmap +#xbm image/x-xbm +xbm image/xbm +xdr video/x-amt-demorun +xgz xgl/drawing +xif image/vnd.xiff +xl application/excel +xla application/excel +#xla application/x-excel +#xla application/x-msexcel +xlb application/excel +#xlb application/vnd.ms-excel +xlb application/x-excel +#xlc application/excel +#xlc application/vnd.ms-excel +#xlc application/x-excel +xld application/excel +#xld application/x-excel +#xlk application/excel +xlk application/x-excel +#xll application/excel +#xll application/vnd.ms-excel +xll application/x-excel +#xlm application/excel +#xlm application/vnd.ms-excel +xlm application/x-excel +#xls application/excel +#xls application/vnd.ms-excel +#xls application/x-excel +xls application/x-msexcel +#xlt application/excel +xlt application/x-excel +#xlv application/excel +xlv application/x-excel +#xlw application/excel +#xlw application/vnd.ms-excel +#xlw application/x-excel +xlw application/x-msexcel +xm audio/xm +#xml application/xml +xml text/xml +xmz xgl/movie +xpix application/x-vnd.ls-xpix +#xpm image/x-xpixmap +xpm image/xpm +x-png image/png +xsr video/x-amt-showrun +#xwd image/x-xwd +xwd image/x-xwindowdump +xyz chemical/x-pdb +#z application/x-compress +z application/x-compressed +zip application/x-compressed +#zip application/x-zip-compressed +#zip application/zip +#zip multipart/x-zip +zoo application/octet-stream +zsh text/x-script.zsh \ No newline at end of file diff --git a/src/main/java/com/rackspacecloud/client/cloudfiles/sample/FilesAuth.java b/src/main/java/com/rackspacecloud/client/cloudfiles/sample/FilesAuth.java new file mode 100644 index 0000000..230fd55 --- /dev/null +++ b/src/main/java/com/rackspacecloud/client/cloudfiles/sample/FilesAuth.java @@ -0,0 +1,33 @@ +/* + * See COPYING for license information. + */ + +package com.rackspacecloud.client.cloudfiles.sample; + +import com.rackspacecloud.client.cloudfiles.*; + +public class FilesAuth +{ + public static void main(String[] args) + { + try + { + FilesClient client = new FilesClient(); + boolean success = client.login(); + if (success) + { + System.out.println("username: "+client.getUserName()); + System.out.println("url: "+client.getStorageURL()); + System.out.println("token: "+client.getStorageToken()); + } + else + { + System.out.println("login failed."); + } + } + catch (Exception e) + { + System.err.println(e.toString()); + } + } +} diff --git a/src/main/java/com/rackspacecloud/client/cloudfiles/sample/FilesCli.java b/src/main/java/com/rackspacecloud/client/cloudfiles/sample/FilesCli.java new file mode 100644 index 0000000..0b328e7 --- /dev/null +++ b/src/main/java/com/rackspacecloud/client/cloudfiles/sample/FilesCli.java @@ -0,0 +1,401 @@ +/* + * See COPYING for license information. + */ + +package com.rackspacecloud.client.cloudfiles.sample; + +import java.io.BufferedReader; +import java.io.File; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.InputStreamReader; +import java.text.DecimalFormat; +import java.util.List; +import java.util.Map; + +import com.rackspacecloud.client.cloudfiles.FilesAccountInfo; +import com.rackspacecloud.client.cloudfiles.FilesClient; +import com.rackspacecloud.client.cloudfiles.FilesConstants; +import com.rackspacecloud.client.cloudfiles.FilesContainer; +import com.rackspacecloud.client.cloudfiles.FilesContainerExistsException; +import com.rackspacecloud.client.cloudfiles.FilesContainerInfo; +import com.rackspacecloud.client.cloudfiles.FilesContainerNotEmptyException; +import com.rackspacecloud.client.cloudfiles.FilesInvalidNameException; +import com.rackspacecloud.client.cloudfiles.FilesNotFoundException; +import com.rackspacecloud.client.cloudfiles.FilesObject; +import com.rackspacecloud.client.cloudfiles.FilesObjectMetaData; + +/** + * @author lvaughn + * + */ +public class FilesCli { + FilesClient client = null; + BufferedReader console = new BufferedReader(new InputStreamReader(System.in)); + + private boolean doLogin() { + + try { + System.out.print("Username: "); + String username = console.readLine().trim(); + + System.out.print("Password: "); + String password = console.readLine().trim(); + + System.out.print("Account (return if using Mosso directly): "); + String account = console.readLine().trim(); + + if (account.length() == 0) { + account = null; + } + + client = new FilesClient(username, password, account); + boolean result = client.login(); + + if (result) { + System.out.println("Logged in!"); + } + else { + System.out.println("Login failed"); + } + + return result; + } catch (IOException e) { + System.out.println("Error logging in!"); + e.printStackTrace(); + return false; + } + + + } + + private static final String HELP_STRING = + "Commands:\n" + + " get List the containers for this account\n" + + " get container List the contents of the given container\n" + + " get container/object destination Download the given object and store it at the destination\n" + + " head Get information about this account\n" + + " head container Get the container's information\n" + + " head container/object Get the objects's information and metadata\n" + + " put container Create the given container\n" + + " put container localfile Upload the local file to the container\n" + + " delete container Delete the container\n" + + " delete container/object Delete the given object\n" + + " help Print this help message\n" + + " exit Exit the program\n"; + + private boolean evaluateCommand(String cmd) { + cmd = cmd.trim(); + + String components[] = cmd.split("\\s+"); + if (cmd.length() == 0 || "help".equals(components[0].toLowerCase())) { + System.out.println(HELP_STRING); + return true; + } + + String command = components[0].toLowerCase(); + + // Exit + if("exit".equals(command) || "quit".equals(command)) { + System.out.println("Exiting"); + return false; + } + + //-- "get" - lists containers + //-- "get " - list contents of specified container + // --"get " - downloads object + if("get".equals(command)) { + if(components.length == 1) { + try { + // List containers + List containers = client.listContainers(); + int nContainers = containers.size(); + System.out.println("The account has " + nContainers + ((nContainers == 1) ? " container" : " containers")); + for(FilesContainer container : containers) { + System.out.println(" " + container.getName()); + } + return true; + } + catch (Exception ex) { + System.out.println("Problem listing containers"); + ex.printStackTrace(); + return true; + } + } + else { + String name = components[1]; + int slashLocation = name.indexOf('/'); + if (slashLocation == -1) { + // It's a container + try { + List objects = client.listObjects(name); + if (objects.size() == 0) { + System.out.println("Container " + name + " was empty"); + return true; + } + + System.out.println("Contents of " + name + ":"); + for(FilesObject obj : objects) { + System.out.println(" " + obj.getName() + " " + obj.getSizeString()); + } + System.out.println(); + } catch (Exception e) { + System.out.println("Error trying to list container contents"); + e.printStackTrace(); + return true; + } + } + else { + // It's an object + if (components.length != 3) { + System.out.println("usage: get container/filename.ext destination.ext"); + return true; + } + + String container = name.substring(0, slashLocation); + String object = name.substring(slashLocation + 1); + String destination = components[2]; + + try { + InputStream is = client.getObjectAsStream(container, object); + FileOutputStream fos = new FileOutputStream(destination); + byte buffer[] = new byte[4096]; + int read = -1; + while ((read = is.read(buffer)) > 0) { + fos.write(buffer, 0, read); + } + fos.close(); + is.close(); + System.out.println(name + " downlaoded to " + destination); + } + catch (Exception ex) { + System.out.println("Problem getting " + name); + ex.printStackTrace(); + return true; + } + } + } + return true; + } + + // -- "head " - show container info + // -- "head " - shown object info, incl meta data + if ("head".equals(command)) { + if (components.length == 1) { + try { + FilesAccountInfo info = client.getAccountInfo(); + System.out.println("Account information:"); + System.out.println(" Number of Containers: " + info.getContainerCount()); + System.out.println(" Total Account Size: " + info.getBytesUsed()); + System.out.println(); + } + catch (Exception e) { + System.err.println("Error getting container info"); + e.printStackTrace(); + return true; + } + } + DecimalFormat format = new DecimalFormat(); + for(int i=1; i < components.length; i++) { + String name = components[i]; + int slashLocation = name.indexOf('/'); + if (slashLocation == -1) { + // assume it's a container + try { + FilesContainerInfo containerInfo = client.getContainerInfo(name); + System.out.println("Information for " + name); + System.out.println(" Object Count: " + containerInfo.getObjectCount()); + System.out.println(" Total Size: " + format.format(containerInfo.getTotalSize()) + " bytes"); + System.out.println(); + } catch (Exception e) { + System.err.println("Error getting container info"); + e.printStackTrace(); + return true; + } + } + else { + String container = name.substring(0, slashLocation); + String object = name.substring(slashLocation + 1); + try { + FilesObjectMetaData metadata = client.getObjectMetaData(container, object); + if (metadata == null) { + System.out.println("Could not get metadata for " + name); + } + else { + System.out.println("LGV: " + container + ":" + object + ":" + metadata); + System.out.println("Information for " + name); + System.out.println(" Total Size: " + metadata.getContentLength() + " bytes"); + System.out.println(" MIME type: " + metadata.getMimeType()); + Map md = metadata.getMetaData(); + if (md.size() == 0) { + System.out.println(" Contains no metadata"); + } + else { + System.out.println(" Metadata:"); + for(String key : md.keySet()) { + System.out.println(" " + key + " => " + md.get(key)); + } + } + System.out.println(); + } + } + catch (Exception e) { + System.err.println("Error getting object info"); + e.printStackTrace(); + return true; + } + } + } + return true; + } + + // --"put " - create new container + // --"put " - upload object + if("put".equals(command)) { + if (components.length == 2) { + String newContainerName = components[1]; + if(newContainerName.indexOf('/') != -1) { + System.out.println("Container names may not contain slashes"); + return true; + } + try { + client.createContainer(newContainerName); + } + catch (FilesContainerExistsException fcee) { + System.out.println(newContainerName + " already existed"); + } catch (Exception e) { + System.out.println("Error creating container"); + e.printStackTrace(); + return true; + } + return true; + } + else if(components.length == 3) { + String containerName = components[1]; + String filename = components[2]; + + File file = new File(filename); + if (!file.exists()) { + System.out.println("Could not find file " + file.getAbsolutePath()); + return true; + } + String name = file.getName(); + String extention = ""; + int dotLocation = name.lastIndexOf('.'); + if (dotLocation > 0) { + extention = name.substring(dotLocation + 1); + } + String mimeType = FilesConstants.getMimetype(extention); + + try { + if (!client.containerExists(containerName)) { + System.out.println("Container " + containerName + " does not exist"); + return true; + } + if (client.storeObject(containerName, file, mimeType)) { + System.out.println("Object " + file.getName() + " was created"); + } + return true; + } + catch (Exception e) { + System.out.println("Problem uploading file"); + e.printStackTrace(); + return true; + } + } + else { + System.out.println("Usage:\n put container\n put container file"); + } + return true; + } + + //--"delete " - delete the specified object + // --"delete " - delete the specified container + if("delete".equals(command)) { + for(int i=1; i < components.length; i++) { + String name = components[i]; + int slashLocation = name.indexOf('/'); + if (slashLocation == -1) { + // assume it's a container + boolean returnCode = false; + try { + returnCode = client.deleteContainer(name); + } catch (FilesInvalidNameException fine) { + System.out.println(name + " is not a valid container name"); + } catch (FilesNotFoundException fine) { + System.out.println(name + " could not be found"); + } catch (FilesContainerNotEmptyException fine) { + System.out.println(name + " was not empty. Please delete the contents and try again"); + } + catch (Exception e) { + System.out.println("Error deleting container"); + e.printStackTrace(); + return true; + } + if (returnCode) { + System.out.println ("Container \"" + name + "\" deleted"); + } + else { + System.out.println("Unexpected result deleting container "); + } + } + else { + // object + String container = name.substring(0, slashLocation); + String object = name.substring(slashLocation + 1); + try { + client.deleteObject(container, object); + System.out.println ("Object \"" + name + "\" deleted"); + } + catch (FilesNotFoundException fnfe) { + System.out.println(name + " could not be found"); + } + catch (Exception e) { + System.out.println("Error deleting object"); + e.printStackTrace(); + return true; + } + } + } + return true; + } + + // We should never get here + System.out.println("Unrecognized command " + cmd); + System.out.println(HELP_STRING); + return true; + } + + + /** + * @param args + */ + public static void main(String[] args) { + + FilesCli commandLine = new FilesCli(); + + if (commandLine.doLogin()) { + System.out.println("Type 'help' for assistance"); + String cmd = ""; + do { + String account = commandLine.client.getAccount(); + account = (account == null) ? commandLine.client.getUserName() : account; + System.out.print(account + ": "); + try { + cmd = commandLine.console.readLine(); + } + catch (IOException e) { + cmd = ""; + } + + } while(commandLine.evaluateCommand(cmd)); + + System.exit(0); + } + else { + System.err.println("Login failed"); + System.exit(-1); + } + } +} diff --git a/src/main/java/com/rackspacecloud/client/cloudfiles/sample/FilesCopy.java b/src/main/java/com/rackspacecloud/client/cloudfiles/sample/FilesCopy.java new file mode 100644 index 0000000..3ee215c --- /dev/null +++ b/src/main/java/com/rackspacecloud/client/cloudfiles/sample/FilesCopy.java @@ -0,0 +1,456 @@ +/* + * See COPYING for license information. + */ + +package com.rackspacecloud.client.cloudfiles.sample; + +import org.apache.commons.cli.*; +import org.apache.commons.lang.SystemUtils; +import org.apache.commons.lang.StringUtils; +import org.apache.commons.io.FilenameUtils; +import org.apache.commons.httpclient.HttpException; + +import org.apache.log4j.Logger; + +import com.rackspacecloud.client.cloudfiles.FilesAuthorizationException; +import com.rackspacecloud.client.cloudfiles.FilesClient; +import com.rackspacecloud.client.cloudfiles.FilesConstants; +import com.rackspacecloud.client.cloudfiles.FilesException; +import com.rackspacecloud.client.cloudfiles.FilesObject; + +import java.io.*; +import java.util.zip.*; +import java.util.*; +import java.security.NoSuchAlgorithmException; + +public class FilesCopy +{ + private static final Logger logger = Logger.getLogger(FilesCopy.class); + + private static final String ZIPEXTENSION = ".zip"; + + private static File SYSTEM_TMP = SystemUtils.getJavaIoTmpDir(); + + public static void main (String args[]) throws NoSuchAlgorithmException, FilesException + { + //Build the command line options + Options options = addCommandLineOptions (); + + if (args.length <= 0) + printHelp (options); + + CommandLineParser parser = new GnuParser(); + try + { + // parse the command line arguments + CommandLine line = parser.parse( options, args ); + + if (line.hasOption("help")) + printHelp (options); + + if (line.hasOption("file") && line.hasOption("folder")) + { + System.err.println ("Can not use both -file and -folder on the command line at the same time."); + System.exit(-1); + }//if (line.hasOption("file") && line.hasOption("folder")) + + if (line.hasOption("download")) + { + if (line.hasOption("folder") ) + { + String localFolder = FilenameUtils.normalize( line.getOptionValue("folder") ); + String containerName = null; + if (StringUtils.isNotBlank(localFolder)) + { + File localFolderObj = new File (localFolder); + if (localFolderObj.exists() && localFolderObj.isDirectory()) + { + if (line.hasOption("container")) + { + containerName = line.getOptionValue("container"); + if (!StringUtils.isNotBlank(containerName)) + { + System.err.println ("You must provide a valid value for the Container to upload to !"); + System.exit (-1); + }//if (!StringUtils.isNotBlank(ontainerName)) + } + else + { + System.err.println ("You must provide the -container for a copy operation to work as expected."); + System.exit (-1); + } + + System.out.println ("Downloading all objects from: "+containerName+ " to local folder: "+ localFolder); + + getContainerObjects (localFolderObj, containerName); + + } + else + { + if ( !localFolderObj.exists() ) + { + System.err.println ("The local folder: "+ localFolder + " does not exist. Create it first and then run this command."); + } + + if ( !localFolderObj.isDirectory() ) + { + System.err.println ("The local folder name supplied : "+ localFolder + " is not a folder !"); + } + + System.exit (-1); + } + } + } + System.exit (0); + }//if (line.hasOption("download")) + + + if (line.hasOption("folder")) + { + String containerName = null; + String folderPath = null; + + if (line.hasOption("container")) + { + containerName = line.getOptionValue("container"); + if (!StringUtils.isNotBlank(containerName)) + { + System.err.println ("You must provide a valid value for the Container to upload to !"); + System.exit (-1); + }//if (!StringUtils.isNotBlank(containerName)) + + } + else + { + System.err.println ("You must provide the -container for a copy operation to work as expected."); + System.exit (-1); + } + + folderPath = line.getOptionValue("folder"); + if (StringUtils.isNotBlank(folderPath)) + { + File folder = new File ( FilenameUtils.normalize (folderPath) ); + if (folder.isDirectory()) + { + if (line.hasOption("z")) + { + System.out.println ("Zipping: "+folderPath); + System.out.println ("Nested folders are ignored !"); + + File zipedFolder = zipFolder(folder); + String mimeType = FilesConstants.getMimetype(ZIPEXTENSION); + copyToCreateContainerIfNeeded (zipedFolder, mimeType, containerName); + } + else + { + File [] files = folder.listFiles(); + for (File f: files) + { + String mimeType = FilesConstants.getMimetype(FilenameUtils.getExtension(f.getName())); + System.out.println ("Uploading :"+f.getName()+" to "+folder.getName()); + copyToCreateContainerIfNeeded (f, mimeType, containerName); + System.out.println ("Upload :"+f.getName()+" to "+folder.getName()+" completed."); + } + } + } + else + { + System.err.println ("You must provide a valid folder value for the -folder option !"); + System.err.println ("The value provided is: "+FilenameUtils.normalize (folderPath)); + System.exit (-1); + } + + } + }//if (line.hasOption("folder")) + + if (line.hasOption("file")) + { + String containerName = null; + String fileNamePath = null; + + if (line.hasOption("container")) + { + containerName = line.getOptionValue("container"); + if (!StringUtils.isNotBlank(containerName) || containerName.indexOf('/') != -1) + { + System.err.println ("You must provide a valid value for the Container to upload to !"); + System.exit (-1); + }//if (!StringUtils.isNotBlank(containerName)) + } + else + { + System.err.println ("You must provide the -container for a copy operation to work as expected."); + System.exit (-1); + } + + fileNamePath = line.getOptionValue("file"); + if (StringUtils.isNotBlank(fileNamePath)) + { + String fileName = FilenameUtils.normalize (fileNamePath); + String fileExt = FilenameUtils.getExtension(fileNamePath); + String mimeType = FilesConstants.getMimetype(fileExt); + File file = new File (fileName); + + if (line.hasOption("z")) + { + logger.info("Zipping "+fileName); + if (!file.isDirectory()) + { + File zippedFile = zipFile(file); + mimeType = FilesConstants.getMimetype(ZIPEXTENSION); + copyTo (zippedFile, mimeType, containerName); + zippedFile.delete(); + } + + }//if (line.hasOption("z")) + else + { + + logger.info("Uploading "+fileName+ "."); + if (!file.isDirectory()) + copyTo (file, mimeType, containerName); + else + { + System.err.println ("The path you provided is a folder. For uploading folders use the -folder option."); + System.exit (-1); + } + } + }//if (StringUtils.isNotBlank(file)) + else + { + System.err.println ("You must provide a valid value for the file to upload !"); + System.exit (-1); + } + }//if (line.hasOption("file")) + }//end try + catch( ParseException err ) + { + System.err.println( "Please see the logs for more details. Error Message: "+err.getMessage() ); + err.printStackTrace(System.err); + }//catch( ParseException err ) + catch (FilesAuthorizationException err) + { + logger.fatal("FilesAuthorizationException : Failed to login to your account !"+ err); + System.err.println( "Please see the logs for more details. Error Message: "+err.getMessage() ); + }//catch (FilesAuthorizationException err) + + catch ( IOException err) + { + logger.fatal("IOException : "+ err); + System.err.println( "Please see the logs for more details. Error Message: "+err.getMessage() ); + }//catch ( IOException err) + } + + public static void getContainerObjects (File localFolder, String containerName) throws IOException, HttpException, FilesAuthorizationException, NoSuchAlgorithmException, FilesException + { + FilesClient client = new FilesClient(); + if ( client.login() ) + { + if (client.containerExists(containerName)) + { + List objects = client.listObjects(containerName); + for (FilesObject obj: objects) + { + System.out.println ("\t"+StringUtils.rightPad(obj.getName (), 35)+ obj.getSizeString()); + File localFile = new File ( FilenameUtils.concat(localFolder.getAbsolutePath(), obj.getName()) ); + obj.writeObjectToFile (localFile); + }//for (Object obj: objects) + } + else + { + logger.fatal("The container: "+containerName+" does not exist."); + System.out.println ("The container: "+containerName+" does not exist!"); + System.exit (0); + } + }//if ( client.login() ) + } + + /** + * + * @param file + * @param mimeType + * @param containerName + * @throws IOException + * @throws HttpException + * @throws NoSuchAlgorithmException + * @throws FilesException + */ + private static void copyToCreateContainerIfNeeded (File file, String mimeType,String containerName) throws IOException, HttpException, NoSuchAlgorithmException, FilesException + { + FilesClient client = new FilesClient(); + if ( client.login() ) + { + if (client.containerExists(containerName)) + { + logger.info ("Copying files to "+containerName); + copyTo (file, mimeType, containerName); + } + else + { + logger.warn("The container: "+containerName+" does not exist. Creating it first before placing objects into it."); + System.out.println ("The container: "+containerName+" does not exist. Creating it first before placing objects into it."); + client.createContainer(containerName); + copyTo (file, mimeType, containerName); + } + + } + } + + /** + * + * @param file + * @param mimeType + * @param containerName + * @throws IOException + * @throws HttpException + * @throws NoSuchAlgorithmException + * @throws FilesException + */ + private static void copyTo (File file, String mimeType,String containerName) throws IOException, HttpException, NoSuchAlgorithmException, FilesException + { + FilesClient client = new FilesClient(); + if ( client.login() ) + { + if (client.containerExists(containerName)) + client.storeObject(containerName, file, mimeType); + else + { + logger.info("The container: "+containerName+" does not exist. Create it first before placing objects into it."); + System.out.println ("The container: "+containerName+" does not exist. Create it first before placing objects into it."); + System.exit (0); + } + + }//if ( client.login() ) + } + + /** + * + * @param folder + * @return null if the input is not a folder otherwise a zip file containing all the files in the folder with nested folders skipped. + * @throws IOException + */ + public static File zipFolder (File folder) throws IOException + { + byte[] buf = new byte[1024]; + int len; + + // Create the ZIP file + String filenameWithZipExt = folder.getName()+ZIPEXTENSION; + File zippedFile = new File (FilenameUtils.concat( SYSTEM_TMP.getAbsolutePath(), filenameWithZipExt )); + + ZipOutputStream out = new ZipOutputStream(new FileOutputStream(zippedFile)); + + if (folder.isDirectory()) + { + File [] files = folder.listFiles(); + + for (File f: files) + { + if (!f.isDirectory()) + { + FileInputStream in = new FileInputStream(f); + + // Add ZIP entry to output stream. + out.putNextEntry(new ZipEntry(f.getName())); + + // Transfer bytes from the file to the ZIP file + while ((len = in.read(buf)) > 0) + { + out.write(buf, 0, len); + } + + // Complete the entry + out.closeEntry(); + in.close(); + } + else + logger.warn ("Skipping nested folder: "+f.getAbsoluteFile()); + } + + out.flush(); + out.close(); + } + else + { + logger.warn ("The folder name supplied is not a folder!"); + System.err.println("The folder name supplied is not a folder!"); + return null; + } + + return zippedFile; + } + + public static File zipFile (File f) throws IOException + { + byte[] buf = new byte[1024]; + int len; + + // Create the ZIP file + String filenameWithZipExt = f.getName()+ZIPEXTENSION; + File zippedFile = new File (FilenameUtils.concat( SYSTEM_TMP.getAbsolutePath(), filenameWithZipExt )); + + ZipOutputStream out = new ZipOutputStream(new FileOutputStream(zippedFile)); + FileInputStream in = new FileInputStream(f); + + // Add ZIP entry to output stream. + out.putNextEntry(new ZipEntry(f.getName())); + + // Transfer bytes from the file to the ZIP file + while ((len = in.read(buf)) > 0) + { + out.write(buf, 0, len); + } + + // Complete the entry + out.closeEntry(); + out.flush(); + + in.close(); + out.close(); + + return zippedFile; + } + + private static void printHelp (Options options) + { + HelpFormatter formatter = new HelpFormatter(); + formatter.printHelp( "List -file filename -container ContainerName [-z]", options ); + }//private static void printHelp () + + @SuppressWarnings("static-access") + private static Options addCommandLineOptions () + { + Option help = new Option( "help", "print this message" ); + + Option folder = OptionBuilder.withArgName("folder") + .hasArg (true) + .withDescription ("Name of folder to upload. Only top level objects that are not folders will be uploaded.") + .create ("folder"); + + Option file = OptionBuilder.withArgName("file") + .hasArg (true) + .withDescription ("Name of file to upload to .") + .create ("file"); + + Option container = OptionBuilder.withArgName("container") + .hasArg (true) + .withDescription ("Name of container to place objects into.") + .create ("container"); + + Option zip = new Option ("z","zip", false, "Compress the object being placed into . This option can be used with other options e.g. -tar"); +// Option tar = new Option ("t","tar", false, "Create a tar of the folder. Using this option without a -folder has no effect !"); + Option download = new Option ("d","download", false, "Copy files from to the local system. Must be used in conjunction to -folder -file -container"); + + Options options = new Options(); + + options.addOption(folder); + options.addOption(file); + options.addOption(zip); + options.addOption(help); + options.addOption(container); + //options.addOption(tar); + options.addOption(download); + + return options; + } +} diff --git a/src/main/java/com/rackspacecloud/client/cloudfiles/sample/FilesList.java b/src/main/java/com/rackspacecloud/client/cloudfiles/sample/FilesList.java new file mode 100644 index 0000000..6f1bf9e --- /dev/null +++ b/src/main/java/com/rackspacecloud/client/cloudfiles/sample/FilesList.java @@ -0,0 +1,247 @@ +/* + * See COPYING for license information. + */ + +package com.rackspacecloud.client.cloudfiles.sample; + +import java.io.IOException; + +import org.apache.commons.cli.Option; +import org.apache.commons.cli.OptionBuilder; +import org.apache.commons.cli.Options; +import org.apache.commons.cli.HelpFormatter; +import org.apache.commons.cli.CommandLine; +import org.apache.commons.cli.CommandLineParser; +import org.apache.commons.cli.GnuParser; +import org.apache.commons.cli.ParseException; +import org.apache.commons.lang.StringUtils; + +// import org.apache.log4j.Logger; +import org.apache.commons.httpclient.HttpException; + +import com.rackspacecloud.client.cloudfiles.*; + +import java.util.*; + +/* + * TODO: Add List Metadata for all objects as a switch on the all + * TODO: Add list Metadata for one object as a switch on a specific object of a container + * TODO: Add list specific Objects of a container + */ + +public class FilesList +{ + // private static Logger logger = Logger.getLogger(List.class); + + public static void main (String args[]) + { + //Build the command line options + Options options = addCommandLineOptions (); + + if (args.length <= 0) + printHelp (options); + + CommandLineParser parser = new GnuParser(); + try + { + // parse the command line arguments + CommandLine line = parser.parse( options, args ); + + if (line.hasOption("help")) + printHelp (options); + + if (line.hasOption("containersOnly")) + { + if (line.hasOption("H")) + printContainers (true); + else + printContainers (false); + } + else if (line.hasOption("all")) + { + if (line.hasOption("H")) + printContainersAll (true); + else + printContainersAll (false); + }//if (line.hasOption("all")) + else if (line.hasOption("container")) + { + String containerName = line.getOptionValue("container"); + if (StringUtils.isNotBlank(containerName)) + { + if (line.hasOption("H")) + printContainer (containerName, true); + else + printContainer (containerName, false); + } + }//if (line.hasOption("container")) + else if (line.hasOption("H")) + { + System.out.println ("This option needs to be used in conjunction with another option that lists objects or container."); + } + } + catch( ParseException err ) + { + System.err.println( "Please see the logs for more details. Error Message: "+err.getMessage() ); + err.printStackTrace(System.err); + }//catch( ParseException err ) + catch (FilesException err) + { + System.err.println( "Please see the logs for more details. Error Message: "+err.getMessage() ); + }//catch (FilesAuthorizationException err) + + catch ( IOException err) + { + System.err.println( "Please see the logs for more details. Error Message: "+err.getMessage() ); + }//catch ( IOException err) + } + + private static void printContainer (String containerName, boolean humanReadable) throws IOException, HttpException, FilesException + { + boolean notFound = true; + FilesClient client = new FilesClient(); + if ( client.login() ) + { + List containers = client.listContainers(); + System.out.println (client.getAccount() + " containers: "); + for (FilesContainer value: containers ) + { + if (value.getName().equalsIgnoreCase(containerName)) + { + notFound = false; + + FilesContainerInfo info = value.getInfo(); + System.out.println ("\t"+value.getName ()+" - "+info.getObjectCount()+" objects:"); + + List objects = value.getObjects(); + for (FilesObject obj: objects) + { + if (humanReadable) + System.out.println ("\t\t"+StringUtils.rightPad(obj.getName (), 35) + obj.getSizeString()); + else + System.out.println ("\t\t"+StringUtils.rightPad(obj.getName (), 35) + obj.getSize()+" Bytes"); + } + + if (humanReadable) + { + System.out.println ("\tTotal Size: "+info.getTotalSize()/1024+"KB\n"); + } + else + System.out.println ("\tTotal Size: "+info.getTotalSize()+"Bytes\n"); + }//if (value.getName().equalsIgnoreCase(containerName)) + else + notFound = true; + }//end for + + if (notFound) + System.out.println ("Container: "+containerName +" was not found !"); + } + }//end private static void printContainersAndContent () throws IOException, HttpException, FilesAuthorizationException + + private static void printContainersAll (boolean humanReadable) throws IOException, HttpException, FilesException + { + FilesClient client = new FilesClient(); + if ( client.login() ) + { + List containers = client.listContainers(); + System.out.println (client.getAccount() + " containers: "); + for (FilesContainer value: containers ) + { + FilesContainerInfo info = value.getInfo(); + System.out.println ("\t"+value.getName ()+" - "+info.getObjectCount()+" objects:"); + + List objects = value.getObjects(); + for (FilesObject obj: objects) + { + if (humanReadable) + System.out.println ("\t\t"+StringUtils.rightPad(obj.getName (), 35) + obj.getSizeString()); + else + System.out.println ("\t\t"+StringUtils.rightPad(obj.getName (), 35) + obj.getSize()+"Bytes"); + } + + if (humanReadable) + { + System.out.println ("\tTotal Size: "+info.getTotalSize()/1024+"KB\n"); + } + else + System.out.println ("\tTotal Size: "+info.getTotalSize()+"Bytes\n"); + } + } + }//end private static void printContainersAndContent () throws IOException, HttpException, FilesAuthorizationException + + private static void printContainers (boolean humanReadable) throws IOException, HttpException, FilesException + { + FilesClient client = new FilesClient(); + if ( client.login() ) + { + List containers = client.listContainers(); + System.out.println (client.getAccount() + " containers: "); + for (FilesContainer value: containers ) + { + FilesContainerInfo info = value.getInfo(); + System.out.println ("\t"+value.getName ()+" - "+info.getObjectCount()+" objects:"); + + if (humanReadable) + { + System.out.println ("\tTotal Size: "+ getSizeString (info.getTotalSize())+"\n"); + } + else + System.out.println ("\tTotal Size: "+info.getTotalSize()+"Bytes\n"); + } + } + }//end private static void printContainers () + + private static void printHelp (Options options) + { + HelpFormatter formatter = new HelpFormatter(); + formatter.printHelp( "FilesList", options ); + }//private static void printHelp () + + @SuppressWarnings("static-access") + private static Options addCommandLineOptions () + { + Option help = new Option( "help", "print this message" ); + + Option containersOnly = OptionBuilder.hasArg (false) + .withDescription ("Show ONLY Containers in account. No Object information is provided.") + .create ("containersOnly"); + + Option containers = OptionBuilder.hasArg (false) + .withDescription ("Show Containers and their objects in this account") + .create ("all"); + + Option container = OptionBuilder.withArgName("container") + .hasArg (true) + .withDescription ("Show Containers and their objects in this account") + .create ("container"); + + Option kb = new Option ("H","humanReadable", false, "Show size of objects in human readable form. On its own this has no meaning and needs to be used in conjuction to a command that provides size of objects and containers"); + + Options options = new Options(); + + options.addOption(containersOnly); + options.addOption(containers); + options.addOption(container); + options.addOption(kb); + options.addOption(help); + + return options; + } + + public static String getSizeString (long size) + { + long kb = 1024; + long mb = 1024*1024; + long gb = 1024*1024*1024; + + //KB + if (size > gb) + return (size/gb) + "GB"; + else if (size > mb) + return (size/mb)+"MB"; + else if (size > kb) + return (size/kb) +"KB"; + else + return size+"Bytes"; + } +} diff --git a/src/main/java/com/rackspacecloud/client/cloudfiles/sample/FilesMakeContainer.java b/src/main/java/com/rackspacecloud/client/cloudfiles/sample/FilesMakeContainer.java new file mode 100644 index 0000000..5b3ef2a --- /dev/null +++ b/src/main/java/com/rackspacecloud/client/cloudfiles/sample/FilesMakeContainer.java @@ -0,0 +1,116 @@ +/* + * See COPYING for license information. + */ + +package com.rackspacecloud.client.cloudfiles.sample; + +//import org.apache.log4j.Logger; +import org.apache.commons.lang.StringUtils; +import org.apache.commons.cli.*; +import org.apache.commons.httpclient.HttpException; + +import java.io.IOException; +import java.security.NoSuchAlgorithmException; + +import com.rackspacecloud.client.cloudfiles.*; + +public class FilesMakeContainer +{ + //private static final Logger logger = Logger.getLogger(FilesMakeContainer.class); + + public static void main (String args[]) throws NoSuchAlgorithmException, FilesException + { + //Build the command line options + Options options = addCommandLineOptions (); + + if (args.length <= 0) + printHelp (options); + + CommandLineParser parser = new GnuParser(); + try + { + // parse the command line arguments + CommandLine line = parser.parse( options, args ); + + if (line.hasOption("help")) + printHelp (options); + + String containerName = null; + if (line.hasOption("container")) + { + containerName = line.getOptionValue("container"); + createContaier (containerName); + }//end if (line.hasOption("container")) + else if (args.length > 0) + { + //If we got this far there are command line arguments but none of what we expected treat the first one as the Container name + containerName = args[0]; + createContaier (containerName); + } + else + { + System.err.println ("You must provide the -container with a valid value for this to work !"); + System.exit (-1); + } + + }//end try + catch( ParseException err ) + { + System.err.println( "Please see the logs for more details. Error Message: "+err.getMessage() ); + err.printStackTrace(System.err); + }//catch( ParseException err ) + + catch ( IOException err) + { + System.err.println( "Please see the logs for more details. Error Message: "+err.getMessage() ); + }//catch ( IOException err) + + }//end main + + private static void createContaier (String containerName) throws HttpException, IOException, FilesException + { + if (!StringUtils.isNotBlank(containerName) || containerName.indexOf('/') != -1) + { + System.err.println ("You must provide a valid value for the Container name !"); + System.exit (-1); + }//if (!StringUtils.isNotBlank(containerName)) + + //Check to see if a Container with this name already exists + + FilesClient client = new FilesClient(); + if ( client.login() ) + { + client.createContainer(containerName); + } + else + System.out.println ("Failed to login to Cloud Files!"); + + System.exit(0); + + } + + private static void printHelp (Options options) + { + HelpFormatter formatter = new HelpFormatter(); + formatter.printHelp( "MkDir [-container] ContainerName", options ); + }//private static void printHelp () + + @SuppressWarnings("static-access") + private static Options addCommandLineOptions () + { + Option help = new Option( "help", "print this message" ); + + Option container = OptionBuilder.withArgName("container") + .hasArg (true) + .withDescription ("Name of container to create.") + .create ("container"); + + Options options = new Options(); + + options.addOption(help); + options.addOption(container); + + return options; + } + +} diff --git a/src/main/java/com/rackspacecloud/client/cloudfiles/sample/FilesRemove.java b/src/main/java/com/rackspacecloud/client/cloudfiles/sample/FilesRemove.java new file mode 100644 index 0000000..e48c7eb --- /dev/null +++ b/src/main/java/com/rackspacecloud/client/cloudfiles/sample/FilesRemove.java @@ -0,0 +1,180 @@ +/* + * See COPYING for license information. + */ + +package com.rackspacecloud.client.cloudfiles.sample; + +import org.apache.log4j.Logger; +import org.apache.commons.lang.StringUtils; +import org.apache.commons.cli.*; +import org.apache.commons.httpclient.HttpException; + +import java.io.*; +import java.security.NoSuchAlgorithmException; +import java.util.*; + +import com.rackspacecloud.client.cloudfiles.*; + +public class FilesRemove +{ + private static final Logger logger = Logger.getLogger(FilesRemove.class); + + public static void main (String args[]) throws NoSuchAlgorithmException, FilesException + { + //Build the command line options + Options options = addCommandLineOptions (); + + if (args.length <= 0) + printHelp (options); + + CommandLineParser parser = new GnuParser(); + try + { + // parse the command line arguments + CommandLine line = parser.parse( options, args ); + + if (line.hasOption("help")) { + printHelp (options); + System.exit(0); + } + + if (line.hasOption("container")) + { + String containerName = null; + containerName = line.getOptionValue("container"); + removeContainer (containerName, line.hasOption('r')); + }//if (line.hasOption("container")) + + if (line.hasOption("object")) + { + String ObjectNameWithPath = null; + ObjectNameWithPath = line.getOptionValue("object"); + removeObject (ObjectNameWithPath); + }//if (line.hasOption("container")) + + + }//end try + catch( ParseException err ) + { + logger.fatal("Parsing exception on the command line: "+ err); + System.err.println( "Please see the logs for more details. Error Message: "+err.getMessage() ); + err.printStackTrace(System.err); + }//catch( ParseException err ) + catch ( IOException err) + { + logger.fatal("IOException : "+ err); + System.err.println( "Please see the logs for more details. Error Message: "+err.getMessage() ); + }//catch ( IOException err) + }//end main + + private static void removeObject (String objectNameWithPath) throws HttpException, IOException, FilesException + { + if (!StringUtils.isNotBlank(objectNameWithPath)) + { + System.err.println ("You must provide a valid value for the Object name and path !"); + System.exit (0); + }//if (!StringUtils.isNotBlank(ObjectNameWithPath)) + + int firstSlashLocation = objectNameWithPath.indexOf('/'); + if (firstSlashLocation > -1) + { + String container = objectNameWithPath.substring(0, firstSlashLocation - 1); + String object = objectNameWithPath.substring(firstSlashLocation + 1); + FilesClient client = new FilesClient(); + if ( client.login() ) { + client.deleteObject(container, object); + } + else { + System.err.println("Failed to log in to Cloud FS"); + System.exit(-1); + } + } + else + { + System.err.println("Please specify the object path in the form containerName/objectName"); + System.exit(-1); + } + } + + private static void removeContainer (String containerName, boolean recurse) throws HttpException, IOException, FilesAuthorizationException, FilesException + { + if (!StringUtils.isNotBlank(containerName)) + { + System.out.println ("You must provide a valid value for the Container name !"); + logger.fatal("You must provide a valid value for the Container name !"); + System.exit (0); + }//if (!StringUtils.isNotBlank(containerName)) + + //Check to see if a Container with this name already exists + + FilesClient client = new FilesClient(); + if ( client.login() ) + { + if(recurse) { + List objects = client.listObjects(containerName); + for (FilesObject obj : objects) { + client.deleteObject(containerName, obj.getName()); + } + } + + try { + if (client.deleteContainer(containerName)) { + System.out.println(containerName+" deleted"); + System.exit (0); + } + else{ + System.out.println(containerName+" was not deleted"); + System.exit (-1); + } + } + catch (FilesNotFoundException fnfe) { + System.out.println(containerName+" not found !"); + System.exit (0); + } + catch (FilesContainerNotEmptyException fcnee) { + System.out.println(containerName+" is not empty use -r !"); + System.exit (0); + } + } + else + System.out.println ("Failed to login to !"); + + System.exit(0); + + } + + private static void printHelp (Options options) + { + HelpFormatter formatter = new HelpFormatter(); + formatter.printHelp( "Remove [-container] ContainerName [-rf]", options ); + }//private static void printHelp () + + + @SuppressWarnings("static-access") + private static Options addCommandLineOptions () + { + Option help = new Option( "help", "print this message" ); + Option recurse = new Option( "r", "Recursively go through the folders and files" ); + + Option container = OptionBuilder.withArgName("container") + .hasArg (true) + .withDescription ("Name of container to remove.") + .create ("container"); + + Option object = OptionBuilder.withArgName("object") + .hasArg (true) + .withDescription ("Name and path of object to remove.") + .create ("object"); + + Options options = new Options(); + + options.addOption(help); + options.addOption(recurse); + + options.addOption(container); + options.addOption(object); + + return options; + } + +} diff --git a/src/main/java/com/rackspacecloud/client/cloudfiles/wrapper/OutputStreamWrapper.java b/src/main/java/com/rackspacecloud/client/cloudfiles/wrapper/OutputStreamWrapper.java new file mode 100644 index 0000000..3961e0a --- /dev/null +++ b/src/main/java/com/rackspacecloud/client/cloudfiles/wrapper/OutputStreamWrapper.java @@ -0,0 +1,80 @@ +/** + * + */ +package com.rackspacecloud.client.cloudfiles.wrapper; + +import java.io.IOException; +import java.io.OutputStream; + +import com.rackspacecloud.client.cloudfiles.IFilesTransferCallback; + +/** + * @author lvaughn + * + */ +public class OutputStreamWrapper extends OutputStream { + private OutputStream stream; + private IFilesTransferCallback callback = null; + private final static int callbackInterval = 1024 * 8; + private long lastCallback = 0; + private long bytesTransfered = 0; + + public OutputStreamWrapper(OutputStream os, IFilesTransferCallback callback) { + this.stream = os; + this.callback = callback; + } + + /* (non-Javadoc) + * @see java.io.OutputStream#write(int) + */ + @Override + public void write(int b) throws IOException { + stream.write(b); + ++bytesTransfered; + checkCallback(false); + } + + public void write(byte[] b, int off, int len) throws IOException { + // Short circuit this if we don't have a callback. + if (callback == null) { + stream.write(b, off, len); + return; + } + + // Otherwise, dole this out on chunks + while(len > 0) { + int toWrite = Math.min(len, callbackInterval); + stream.write(b, off, toWrite); + bytesTransfered += toWrite; + off += toWrite; + len -= toWrite; + checkCallback(false); + } + checkCallback(true); + } + + public void write(byte[] b) throws IOException { + write(b, 0, b.length); + } + + public void close() throws IOException { + stream.close(); + checkCallback(true); + } + + public void flush() throws IOException { + stream.flush(); + checkCallback(true); + } + + private void checkCallback(boolean force) { + if (callback != null) { + if ((bytesTransfered - lastCallback >= callbackInterval) || + (force && bytesTransfered != lastCallback)) { + callback.progress(bytesTransfered); + lastCallback = bytesTransfered; + } + } + } + +} diff --git a/src/main/java/com/rackspacecloud/client/cloudfiles/wrapper/RequestEntityWrapper.java b/src/main/java/com/rackspacecloud/client/cloudfiles/wrapper/RequestEntityWrapper.java new file mode 100644 index 0000000..dc6bcca --- /dev/null +++ b/src/main/java/com/rackspacecloud/client/cloudfiles/wrapper/RequestEntityWrapper.java @@ -0,0 +1,55 @@ +/** + * + */ +package com.rackspacecloud.client.cloudfiles.wrapper; + +import java.io.IOException; +import java.io.OutputStream; + +import org.apache.commons.httpclient.methods.RequestEntity; + +import com.rackspacecloud.client.cloudfiles.IFilesTransferCallback; + +/** + * @author lvaughn + * + */ +public class RequestEntityWrapper implements RequestEntity { + private RequestEntity entity; + private IFilesTransferCallback callback = null; + + public RequestEntityWrapper(RequestEntity entity, IFilesTransferCallback callback) { + this.entity = entity; + this.callback = callback; + } + + /* (non-Javadoc) + * @see org.apache.commons.httpclient.methods.RequestEntity#getContentLength() + */ + public long getContentLength() { + return entity.getContentLength(); + } + + /* (non-Javadoc) + * @see org.apache.commons.httpclient.methods.RequestEntity#getContentType() + */ + public String getContentType() { + return entity.getContentType(); + } + + /* (non-Javadoc) + * @see org.apache.commons.httpclient.methods.RequestEntity#isRepeatable() + */ + public boolean isRepeatable() { + return entity.isRepeatable(); + } + + /* (non-Javadoc) + * @see org.apache.commons.httpclient.methods.RequestEntity#writeRequest(java.io.OutputStream) + */ + public void writeRequest(OutputStream stream) throws IOException { + entity.writeRequest(new OutputStreamWrapper(stream, callback)); + + } + +} diff --git a/src/test/java/com/rackspacecloud/client/cloudfiles/FilesClientTestCase.java b/src/test/java/com/rackspacecloud/client/cloudfiles/FilesClientTestCase.java new file mode 100644 index 0000000..2b8c150 --- /dev/null +++ b/src/test/java/com/rackspacecloud/client/cloudfiles/FilesClientTestCase.java @@ -0,0 +1,1513 @@ +package com.rackspacecloud.client.cloudfiles; + +import java.io.ByteArrayInputStream; +import java.io.File; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.InputStream; +import java.math.BigInteger; +import java.security.MessageDigest; +import java.security.NoSuchAlgorithmException; +import java.text.SimpleDateFormat; +import java.util.Date; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Random; + +import org.apache.commons.httpclient.methods.ByteArrayRequestEntity; +import org.apache.commons.io.FilenameUtils; +import org.apache.commons.lang.SystemUtils; +import org.apache.log4j.Logger; + +import com.rackspacecloud.client.cloudfiles.FilesAccountInfo; +import com.rackspacecloud.client.cloudfiles.FilesCDNContainer; +import com.rackspacecloud.client.cloudfiles.FilesClient; +import com.rackspacecloud.client.cloudfiles.FilesConstants; +import com.rackspacecloud.client.cloudfiles.FilesContainer; +import com.rackspacecloud.client.cloudfiles.FilesContainerExistsException; +import com.rackspacecloud.client.cloudfiles.FilesContainerInfo; +import com.rackspacecloud.client.cloudfiles.FilesInvalidNameException; +import com.rackspacecloud.client.cloudfiles.FilesNotFoundException; +import com.rackspacecloud.client.cloudfiles.FilesObject; +import com.rackspacecloud.client.cloudfiles.FilesObjectMetaData; +import com.rackspacecloud.client.cloudfiles.FilesUtil; +import com.rackspacecloud.client.cloudfiles.IFilesTransferCallback; + + +import junit.framework.TestCase; + +public class FilesClientTestCase extends TestCase { + private static Logger logger = Logger.getLogger(FilesClientTestCase.class); + private static File SYSTEM_TMP = SystemUtils.getJavaIoTmpDir(); + private static int NUMBER_RANDOM_BYTES = 513; + + public void testConstructor() { + FilesClient client = new FilesClient("foo", "bar", "baz"); + + assertNotNull(client); + assertEquals("foo", client.getUserName()); + assertEquals("bar", client.getPassword()); + assertEquals("baz", client.getAccount()); + + } + + public void testNoArgConstructor() { + FilesClient client = new FilesClient(); + + assertNotNull(client); + assertEquals(FilesUtil.getProperty("username"), client.getUserName()); + assertEquals(FilesUtil.getProperty("password"), client.getPassword()); + assertEquals(FilesUtil.getProperty("account"), client.getAccount()); + } + + public void testLogin() { + FilesClient client = new FilesClient(); + + try { + assertTrue(client.login()); + } catch (Exception e) { + fail(e.getMessage()); + } + + // Now try a failed login + client = new FilesClient(FilesUtil.getProperty("username"), + FilesUtil.getProperty("password") + " this is a bogus password", + FilesUtil.getProperty("account")); + try { + assertFalse(client.login()); + } catch (Exception e) { + fail(e.getMessage()); + } + } + + public void testAccountInfo() { + String containerName = createTempContainerName("byte-array"); + String filename = makeFileName("accountinfo"); + FilesClient client = new FilesClient(); + try { + assertTrue(client.login()); + + // Make sure it's not there + assertFalse(client.containerExists(containerName)); + + // Add it + client.createContainer(containerName); + + // See that it's there + assertTrue(client.containerExists(containerName)); + assertNotNull(client.getContainerInfo(containerName)); + + // Add some data + byte randomData[] = makeRandomBytes(); + assertTrue(client.storeObject(containerName, randomData, "application/octet-stream", filename, new HashMap())); + + // Do the test if we have an account + if (FilesUtil.getProperty("account") != null) { + FilesAccountInfo info = client.getAccountInfo(); + assertTrue(info.getContainerCount() > 0); + assertTrue(info.getBytesUsed() >= randomData.length); + } + + // Clean up + client.deleteObject(containerName, filename); + assertTrue(client.deleteContainer(containerName)); + } catch (Exception e) { + e.printStackTrace(); + fail(e.getMessage()); + } + } + + public void testContainerCreation() { + FilesClient client = new FilesClient(); + try { + assertTrue(client.login()); + String containerName = createTempContainerName(""); + + // Make sure it's not there + assertFalse(client.containerExists(containerName)); + + // Add it + client.createContainer(containerName); + + // See that it's there + assertTrue(client.containerExists(containerName)); + assertNotNull(client.getContainerInfo(containerName)); + + // Try Adding it again + try { + client.createContainer(containerName); + fail("Allowed duplicate container creation"); + } + catch (FilesContainerExistsException fcee) { + // Hooray! + } + + // See that it's still there + assertTrue(client.containerExists(containerName)); + + // Delete it + assertTrue(client.deleteContainer(containerName)); + + // Make sure it's gone + assertFalse(client.containerExists(containerName)); + + + } catch (Exception e) { + fail(e.getMessage()); + } + } + + public void testContainerNotThereDeletion() { + FilesClient client = new FilesClient(); + try { + assertTrue(client.login()); + String containerName = createTempContainerName("I'mNotHere!"); + + // Make sure it's not there + assertFalse(client.containerExists(containerName)); + + boolean exceptionThrown = false; + try { + client.deleteContainer(containerName); + fail("Exception not thrown"); + } + catch (FilesNotFoundException fnfe) { + exceptionThrown = true; + } + assertTrue (exceptionThrown); + + // Make still not there + assertFalse(client.containerExists(containerName)); + + + } catch (Exception e) { + fail(e.getMessage()); + } + } + + public void testContainerCreationWithSpaces() { + FilesClient client = new FilesClient(); + try { + assertTrue(client.login()); + String containerName = createTempContainerName("with space+and+plus"); + + // Make sure it's not there + assertFalse(client.containerExists(containerName)); + + // Add it + client.createContainer(containerName); + + // See that it's there + assertTrue(client.containerExists(containerName)); + assertNotNull(client.getContainerInfo(containerName)); + + // Try Adding it again + try { + client.createContainer(containerName); + fail("Allowed duplicate container creation"); + } + catch (FilesContainerExistsException fcee) { + // Pass this case + } + + // See that it's still there + assertTrue(client.containerExists(containerName)); + + boolean found = false; + List containers = client.listContainers(); + for (FilesContainer cont : containers) { + // logger.warn(cont.getName()); + if(containerName.equals(cont.getName())) found = true; + } + assertTrue(found); + + + // Delete it + assertTrue(client.deleteContainer(containerName)); + + // Make sure it's gone + assertFalse(client.containerExists(containerName)); + + + } catch (Exception e) { + fail(e.getMessage()); + } + } + + public void testContainerInfoListing() { + FilesClient client = new FilesClient(); + try { + assertTrue(client.login()); + String containerName = createTempContainerName(""); + + // Make sure it's not there + assertFalse(client.containerExists(containerName)); + + // Add it + client.createContainer(containerName); + + // See that it's there + assertTrue(client.containerExists(containerName)); + assertNotNull(client.getContainerInfo(containerName)); + + // Try Adding it again + try { + client.createContainer(containerName); + fail("Allowed duplicate container creation"); + } + catch (FilesContainerExistsException fcee) { + // Hooray! + } + + // See that it's still there + assertTrue(client.containerExists(containerName)); + + boolean found = false; + List containers = client.listContainersInfo(); + for (FilesContainerInfo info : containers) { + if(containerName.equals(info.getName())) { + found = true; + assertEquals(0, info.getTotalSize()); + assertEquals(0, info.getObjectCount()); + } + } + assertTrue(found); + + + // Delete it + assertTrue(client.deleteContainer(containerName)); + + // Make sure it's gone + assertFalse(client.containerExists(containerName)); + + + } catch (Exception e) { + e.printStackTrace(); + fail(e.getMessage()); + } + } + + public void testUserAgent() { + FilesClient client = new FilesClient(); + assertEquals(FilesConstants.USER_AGENT, client.getUserAgent()); + client.setUserAgent("Java-Test-User-Agent"); + assertEquals("Java-Test-User-Agent", client.getUserAgent()); + try { + assertTrue(client.login()); + String containerName = createTempContainerName("user-agent"); + + // Make sure it's not there + assertFalse(client.containerExists(containerName)); + + // Add it + client.createContainer(containerName); + + // See that it's there + assertTrue(client.containerExists(containerName)); + assertNotNull(client.getContainerInfo(containerName)); + + // Delete it + assertTrue(client.deleteContainer(containerName)); + + // Make sure it's gone + assertFalse(client.containerExists(containerName)); + + + } catch (Exception e) { + fail(e.getMessage()); + } + } + + public void testContainerNameNoSlashes() { + FilesClient client = new FilesClient(); + try { + assertTrue(client.login()); + String containerName = createTempContainerName("/"); + + // Make sure they're not there + assertFalse(client.containerExists(containerName)); + + // Try to add it + boolean exceptionThrown = false; + try { + client.createContainer(containerName); + fail("Should not have been able to create container: " + containerName); + } + catch (FilesInvalidNameException fine) { + exceptionThrown = true; + } + assertTrue(exceptionThrown); + } catch (Exception e) { + fail(e.getMessage()); + } + } + + public void testFileSaving() { + String containerName = createTempContainerName("file-test"); + String filename = makeFileName("random"); + String fullPath = FilenameUtils.concat(SYSTEM_TMP.getAbsolutePath(), filename); + logger.info("Test File Location: " + fullPath); + try { + byte randomData[] = makeRandomFile(fullPath); + FilesClient client = new FilesClient(); + assertTrue(client.login()); + + // Set up + client.createContainer(containerName); + + // Store it + logger.info("About to save: " + filename); + assertTrue(client.storeObjectAs(containerName, new File(fullPath), "application/octet-stream", filename)); + + // Make sure it's there + List objects = client.listObjects(containerName); + assertEquals(1, objects.size()); + FilesObject obj = objects.get(0); + assertEquals(filename, obj.getName()); + assertEquals("application/octet-stream", obj.getMimeType()); + + // Make sure the data is correct + assertArrayEquals(randomData, client.getObject(containerName, filename)); + + // Make sure the data is correct as a stream + InputStream is = client.getObjectAsStream(containerName, filename); + byte otherData[] = new byte[NUMBER_RANDOM_BYTES]; + is.read(otherData); + assertArrayEquals(randomData, otherData); + assertEquals(-1, is.read()); // Could hang if there's a bug on the other end + + // Clean up + client.deleteObject(containerName, filename); + assertTrue(client.deleteContainer(containerName)); + + } + catch (Exception e) { + fail(e.getMessage()); + } + finally { + File f = new File(fullPath); + f.delete(); + } + + } + public void testSaveAs() { + String containerName = createTempContainerName("file-test"); + String filename = makeFileName("random"); + String fullPath = FilenameUtils.concat(SYSTEM_TMP.getAbsolutePath(), filename); + String otherFileName = "Bob"; + logger.info("Test File Location: " + fullPath); + try { + byte randomData[] = makeRandomFile(fullPath); + FilesClient client = new FilesClient(); + assertTrue(client.login()); + + // Set up + client.createContainer(containerName); + + // Store it + logger.info("About to save: " + filename); + assertTrue(client.storeObjectAs(containerName, new File(fullPath), "application/octet-stream", otherFileName)); + + // Make sure it's there + List objects = client.listObjects(containerName); + assertEquals(1, objects.size()); + FilesObject obj = objects.get(0); + assertEquals("Bob", obj.getName()); + assertEquals("application/octet-stream", obj.getMimeType()); + + // Make sure the data is correct + assertArrayEquals(randomData, client.getObject(containerName, otherFileName)); + + // Make sure the data is correct as a stream + InputStream is = client.getObjectAsStream(containerName, otherFileName); + byte otherData[] = new byte[NUMBER_RANDOM_BYTES]; + is.read(otherData); + assertArrayEquals(randomData, otherData); + assertEquals(-1, is.read()); // Could hang if there's a bug on the other end + + // Clean up + client.deleteObject(containerName, otherFileName); + assertTrue(client.deleteContainer(containerName)); + + } + catch (Exception e) { + fail(e.getMessage()); + } + finally { + File f = new File(fullPath); + f.delete(); + } + + } + public void testFileSavingWithCallback() { + String containerName = createTempContainerName("file-test"); + String filename = makeFileName("random"); + String fullPath = FilenameUtils.concat(SYSTEM_TMP.getAbsolutePath(), filename); + logger.info("Test File Location: " + fullPath); + try { + byte randomData[] = makeRandomFile(fullPath); + FilesClient client = new FilesClient(); + assertTrue(client.login()); + + // Set up + client.createContainer(containerName); + + // Store it + logger.info("About to save: " + filename); + TesterCallback callback = new TesterCallback(); + assertTrue(client.storeObjectAs(containerName, new File(fullPath), "application/octet-stream", filename, callback)); + + // Make sure the callback was called + assertEquals(randomData.length, callback.bytesSent); + assertEquals(1, callback.nCalls); + + // Make sure it's there + List objects = client.listObjects(containerName); + assertEquals(1, objects.size()); + FilesObject obj = objects.get(0); + assertEquals(filename, obj.getName()); + assertEquals("application/octet-stream", obj.getMimeType()); + + // Make sure the data is correct + assertArrayEquals(randomData, client.getObject(containerName, filename)); + + // Make sure the data is correct as a stream + InputStream is = client.getObjectAsStream(containerName, filename); + byte otherData[] = new byte[NUMBER_RANDOM_BYTES]; + is.read(otherData); + assertArrayEquals(randomData, otherData); + assertEquals(-1, is.read()); // Could hang if there's a bug on the other end + + // Clean up + client.deleteObject(containerName, filename); + assertTrue(client.deleteContainer(containerName)); + + } + catch (Exception e) { + e.printStackTrace(); + if (e.getCause() != null) e.getCause().printStackTrace(); + fail(e.getMessage()); + } + finally { + File f = new File(fullPath); + f.delete(); + } + + } + public void testFileSavingWithMetadata() { + String containerName = createTempContainerName("meta-data-test"); + String filename = makeFileName("random-with-meta"); + String fullPath = FilenameUtils.concat(SYSTEM_TMP.getAbsolutePath(), filename); + logger.info("Test File Location: " + fullPath); + try { + byte randomData[] = makeRandomFile(fullPath); + FilesClient client = new FilesClient(); + assertTrue(client.login()); + + // Set up + client.createContainer(containerName); + + // Store it + HashMap meta = new HashMap(); + meta.put("Foo", "bar"); + meta.put("Uni", "\u0169\u00f1\u00efcode-test"); + meta.put("Width", "336"); + meta.put("Height", "183"); + assertTrue(client.storeObjectAs(containerName, new File(fullPath), "application/octet-stream", filename, meta)); + + // Make sure it's there + List objects = client.listObjects(containerName); + assertEquals(1, objects.size()); + FilesObject obj = objects.get(0); + assertEquals(filename, obj.getName()); + assertEquals("application/octet-stream", obj.getMimeType()); + + // Make sure the data is correct + assertArrayEquals(randomData, client.getObject(containerName, filename)); + + // Make sure the data is correct as a stream + InputStream is = client.getObjectAsStream(containerName, filename); + byte otherData[] = new byte[NUMBER_RANDOM_BYTES]; + is.read(otherData); + assertArrayEquals(randomData, otherData); + assertEquals(-1, is.read()); // Could hang if there's a bug on the other end + + // Make sure the metadata is correct + FilesObjectMetaData metadata = client.getObjectMetaData(containerName, filename); + Map serverMetadata = metadata.getMetaData(); + assertEquals(meta.size(), serverMetadata.size()); + for(String key : meta.keySet()) { + assertTrue(serverMetadata.containsKey(key)); + assertEquals(meta.get(key), serverMetadata.get(key)); + } + + // Clean up + client.deleteObject(containerName, filename); + assertTrue(client.deleteContainer(containerName)); + + } + catch (Exception e) { + fail(e.getMessage()); + } + finally { + File f = new File(fullPath); + f.delete(); + } + + } + + public void testFileSavingNoETag() { + String containerName = createTempContainerName("etagless"); + String filename = makeFileName("etagless"); + String fullPath = FilenameUtils.concat(SYSTEM_TMP.getAbsolutePath(), filename); + logger.info("Test File Location: " + fullPath); + try { + byte randomData[] = makeRandomFile(fullPath); + FilesClient client = new FilesClient(); + assertTrue(client.getUseETag()); + client.setUseETag(false); + assertFalse(client.getUseETag()); + + assertTrue(client.login()); + + // Set up + client.createContainer(containerName); + + // Store it + assertTrue(client.storeObjectAs(containerName, new File(fullPath), "application/octet-stream", filename)); + + // Make sure it's there + List objects = client.listObjects(containerName); + assertEquals(1, objects.size()); + FilesObject obj = objects.get(0); + assertEquals(filename, obj.getName()); + assertEquals("application/octet-stream", obj.getMimeType()); + + // Make sure the data is correct + assertArrayEquals(randomData, client.getObject(containerName, filename)); + + // Make sure the data is correct as a stream + InputStream is = client.getObjectAsStream(containerName, filename); + byte otherData[] = new byte[NUMBER_RANDOM_BYTES]; + is.read(otherData); + assertArrayEquals(randomData, otherData); + assertEquals(-1, is.read()); // Could hang if there's a bug on the other end + + // Clean up + client.deleteObject(containerName, filename); + assertTrue(client.deleteContainer(containerName)); + + } + catch (Exception e) { + fail(e.getMessage()); + } + finally { + File f = new File(fullPath); + f.delete(); + } + + } + + public void testContainerListing() { + String containerName = createTempContainerName(""); + String filename = makeFileName(""); + String fullPath = FilenameUtils.concat(SYSTEM_TMP.getAbsolutePath(), filename); + logger.info("Test File Location: " + fullPath); + try { + byte randomData[] = makeRandomFile(fullPath); + FilesClient client = new FilesClient(); + assertTrue(client.login()); + + // Set up + client.createContainer(containerName); + + // Store it + logger.info("About to save: " + filename); + assertTrue(client.storeObjectAs(containerName, new File(fullPath), "application/octet-stream", filename)); + + // Make sure it's there + List objects = client.listObjects(containerName); + assertEquals(1, objects.size()); + FilesObject obj = objects.get(0); + assertEquals(filename, obj.getName()); + assertEquals("application/octet-stream", obj.getMimeType()); + assertEquals(NUMBER_RANDOM_BYTES, obj.getSize()); + assertEquals(md5Sum(randomData), obj.getMd5sum()); + + // Make sure the data is correct + assertArrayEquals(randomData, client.getObject(containerName, filename)); + + // Make sure the data is correct as a stream + InputStream is = client.getObjectAsStream(containerName, filename); + byte otherData[] = new byte[NUMBER_RANDOM_BYTES]; + is.read(otherData); + assertArrayEquals(randomData, otherData); + assertEquals(-1, is.read()); // Could hang if there's a bug on the other end + + // Clean up + client.deleteObject(containerName, filename); + assertTrue(client.deleteContainer(containerName)); + + } + catch (Exception e) { + fail(e.getMessage()); + } + finally { + File f = new File(fullPath); + f.delete(); + } + + } + + public void testContainerListingWithXML() { + String containerName = createTempContainerName(""); + String filename = makeFileName(""); + try { + byte randomData[] = makeRandomBytes(); + FilesClient client = new FilesClient(); + assertTrue(client.login()); + + // Set up + client.createContainer(containerName); + + // Store it + logger.info("About to save: " + filename); + assertTrue(client.storeObject(containerName, randomData, "application/octet-stream", filename, new HashMap())); + + // Make sure it's there + List objects = client.listObjects(containerName); + assertEquals(1, objects.size()); + FilesObject obj = objects.get(0); + assertEquals(filename, obj.getName()); + assertEquals("application/octet-stream", obj.getMimeType()); + assertEquals(NUMBER_RANDOM_BYTES, obj.getSize()); + assertEquals(md5Sum(randomData), obj.getMd5sum()); + + // Make sure the data is correct + assertArrayEquals(randomData, client.getObject(containerName, filename)); + + // Make sure the data is correct as a stream + InputStream is = client.getObjectAsStream(containerName, filename); + byte otherData[] = new byte[NUMBER_RANDOM_BYTES]; + is.read(otherData); + assertArrayEquals(randomData, otherData); + assertEquals(-1, is.read()); // Could hang if there's a bug on the other end + + // Clean up + client.deleteObject(containerName, filename); + assertTrue(client.deleteContainer(containerName)); + + } + catch (Exception e) { + fail(e.getMessage()); + } + + } + + public void testByteArraySaving() { + String containerName = createTempContainerName("byte-array"); + String filename = makeFileName("bytearray"); + try { + byte randomData[] = makeRandomBytes(); + FilesClient client = new FilesClient(); + // client.setUseETag(false); + assertTrue(client.login()); + + // Set up + client.createContainer(containerName); + + // Store it + assertTrue(client.storeObject(containerName, randomData, "application/octet-stream", filename, new HashMap())); + + // Make sure it's there + List objects = client.listObjects(containerName); + assertEquals(1, objects.size()); + FilesObject obj = objects.get(0); + assertEquals(filename, obj.getName()); + assertEquals("application/octet-stream", obj.getMimeType()); + + // Make sure the data is correct + assertArrayEquals(randomData, client.getObject(containerName, filename)); + + // Make sure the data is correct as a stream + InputStream is = client.getObjectAsStream(containerName, filename); + byte otherData[] = new byte[NUMBER_RANDOM_BYTES]; + is.read(otherData); + assertArrayEquals(randomData, otherData); + assertEquals(-1, is.read()); // Could hang if there's a bug on the other end + + // Clean up + client.deleteObject(containerName, filename); + assertTrue(client.deleteContainer(containerName)); + + } + catch (Exception e) { + e.printStackTrace(); + fail(e.getMessage()); + } + } + + public void testLineNoiseSaving() { + String containerName = createTempContainerName("[]<>{}!@#$%^&*()_-+=|,.?"); + String filename = makeFileName("/[]<>{}!@#$%^&*()_-+=|,.?/"); + try { + byte randomData[] = makeRandomBytes(); + FilesClient client = new FilesClient(); + // client.setUseETag(false); + assertTrue(client.login()); + + // Set up + client.createContainer(containerName); + + // Store it + assertTrue(client.storeObject(containerName, randomData, "application/octet-stream", filename, new HashMap())); + + // Make sure it's there + List objects = client.listObjects(containerName); + assertEquals(1, objects.size()); + FilesObject obj = objects.get(0); + assertEquals(filename, obj.getName()); + assertEquals("application/octet-stream", obj.getMimeType()); + + // Make sure the data is correct + assertArrayEquals(randomData, client.getObject(containerName, filename)); + + // Make sure the data is correct as a stream + InputStream is = client.getObjectAsStream(containerName, filename); + byte otherData[] = new byte[NUMBER_RANDOM_BYTES]; + is.read(otherData); + assertArrayEquals(randomData, otherData); + assertEquals(-1, is.read()); // Could hang if there's a bug on the other end + + // Clean up + client.deleteObject(containerName, filename); + assertTrue(client.deleteContainer(containerName)); + + } + catch (Exception e) { + e.printStackTrace(); + fail(e.getMessage()); + } + } + + public void testRequestEntitySaving() { + String containerName = createTempContainerName("requst-entity"); + String filename = makeFileName("req-entity"); + try { + byte randomData[] = makeRandomBytes(); + FilesClient client = new FilesClient(); + assertTrue(client.login()); + + // Set up + client.createContainer(containerName); + + // Store it + ByteArrayRequestEntity entity = new ByteArrayRequestEntity(randomData, "test/content_type"); + assertTrue(client.storeObjectAs(containerName, filename, entity, new HashMap(), FilesClient.md5Sum(randomData))); + + // Make sure it's there + List objects = client.listObjects(containerName); + assertEquals(1, objects.size()); + FilesObject obj = objects.get(0); + assertEquals(filename, obj.getName()); + assertEquals("test/content_type", obj.getMimeType()); + + // Make sure the data is correct + assertArrayEquals(randomData, client.getObject(containerName, filename)); + + // Make sure the data is correct as a stream + InputStream is = client.getObjectAsStream(containerName, filename); + byte otherData[] = new byte[NUMBER_RANDOM_BYTES]; + is.read(otherData); + assertArrayEquals(randomData, otherData); + assertEquals(-1, is.read()); // Could hang if there's a bug on the other end + + // Clean up + client.deleteObject(containerName, filename); + assertTrue(client.deleteContainer(containerName)); + + } + catch (Exception e) { + e.printStackTrace(); + fail(e.getMessage()); + } + } + + public void testObjectListing() { + String containerName = createTempContainerName("object-listing-marker"); + try { + byte randomData[] = makeRandomBytes(); + FilesClient client = new FilesClient(); + // client.setUseETag(false); + assertTrue(client.login()); + + // Set up + client.createContainer(containerName); + + // Store it + for (int i=0; i < 10; i++) { + assertTrue(client.storeObject(containerName, randomData, "application/octet-stream", "testfile" + i + ".bogus", new HashMap())); + } + + // Make sure it's there + List objects = client.listObjects(containerName); + assertEquals(10, objects.size()); + for (int i=0; i < 10; i++) { + FilesObject obj = objects.get(i); + assertEquals("testfile" + i + ".bogus", obj.getName()); + assertEquals("application/octet-stream", obj.getMimeType()); + } + + // Now do a limit + objects = client.listObjects(containerName, 3); + assertEquals(3, objects.size()); + for (int i=0; i < 3; i++) { + FilesObject obj = objects.get(i); + assertEquals("testfile" + i + ".bogus", obj.getName()); + assertEquals("application/octet-stream", obj.getMimeType()); + } + + // Now check out a marker + objects = client.listObjects(containerName, 4, "testfile3.bogus"); + assertEquals(4, objects.size()); + for (int i=0; i < 4; i++) { + FilesObject obj = objects.get(i); + assertEquals("testfile" + (i + 4) + ".bogus", obj.getName()); + assertEquals("application/octet-stream", obj.getMimeType()); + } + + // Clean up + for (int i=0; i < 10; i++) { + client.deleteObject(containerName, "testfile" + i + ".bogus"); + } + assertTrue(client.deleteContainer(containerName)); + + } + catch (Exception e) { + e.printStackTrace(); + fail(e.getMessage()); + } + } + + public void testContainerListingWithLimitMarker() { + try { + FilesClient client = new FilesClient(); + assertTrue(client.login()); + + // Populate our account + for (int i=0; i < 20; i++) { + client.createContainer("test_container_" + i); + } + + // Make sure it's there + List originalContainers = client.listContainers(); + assertTrue(20 <=originalContainers.size()); + + // Now do a limit + List containers = client.listContainers(5); + assertEquals(5, containers.size()); + for (int i=0; i < 5; i++) { + FilesContainer container = containers.get(i); + assertEquals(originalContainers.get(i).getName(), container.getName()); + } + + // Now check out a marker + containers = client.listContainers(10, originalContainers.get(originalContainers.size() - 5).getName()); + assertEquals(4, containers.size()); + for (int i=0; i < 2; i++) { + FilesContainer container = containers.get(i); + assertEquals(originalContainers.get(originalContainers.size() - 4 + i).getName(), container.getName()); + } + + // Clean up + for (int i=0; i < 20; i++) { + assertTrue(client.deleteContainer("test_container_" + i)); + } + } + catch (Exception e) { + e.printStackTrace(); + fail(e.getMessage()); + } + } + + public void testByteArraySavingWithCallback() { + String containerName = createTempContainerName("byte-array"); + String filename = makeFileName("bytearray"); + try { + byte randomData[] = makeRandomBytes(1024 * 100); // 100 K to make sure we do more with the callback + FilesClient client = new FilesClient(); + // client.setUseETag(false); + assertTrue(client.login()); + + // Set up + client.createContainer(containerName); + + // Store it + TesterCallback callback = new TesterCallback(); + assertTrue(client.storeObject(containerName, randomData, "application/octet-stream", filename, new HashMap(), callback)); + + // Make sure it all got written + assertEquals(randomData.length, callback.bytesSent); + assertEquals(randomData.length/8192 + 1, callback.nCalls); + + // Make sure it's there + List objects = client.listObjects(containerName); + assertEquals(1, objects.size()); + FilesObject obj = objects.get(0); + assertEquals(filename, obj.getName()); + assertEquals("application/octet-stream", obj.getMimeType()); + + // Make sure the data is correct + assertArrayEquals(randomData, client.getObject(containerName, filename)); + + // Make sure the data is correct as a stream + InputStream is = client.getObjectAsStream(containerName, filename); + byte otherData[] = new byte[randomData.length]; + int loc = 0; + int bytesRead = 0; + while ((bytesRead = is.read(otherData, loc, otherData.length - loc)) > 0) { + loc += bytesRead; + } + assertArrayEquals(randomData, otherData); + assertEquals(-1, is.read()); // Could hang if there's a bug on the other end + + // Clean up + client.deleteObject(containerName, filename); + assertTrue(client.deleteContainer(containerName)); + + } + catch (Exception e) { + e.printStackTrace(); + fail(e.getMessage()); + } + } + + public void testStreamedSaving() { + String containerName = createTempContainerName("streamed"); + String filename = makeFileName("streamed"); + try { + byte randomData[] = makeRandomBytes(1024 * 100); // 100 K to make sure it's interesting + FilesClient client = new FilesClient(); + assertTrue(client.login()); + + // Set up + client.createContainer(containerName); + + // Store it + assertTrue(client.storeStreamedObject(containerName, new ByteArrayInputStream(randomData), "application/octet-stream", filename, new HashMap())); + + // Make sure it's there + List objects = client.listObjects(containerName); + assertEquals(1, objects.size()); + FilesObject obj = objects.get(0); + assertEquals(filename, obj.getName()); + assertEquals("application/octet-stream", obj.getMimeType()); + + // Make sure the data is correct + assertArrayEquals(randomData, client.getObject(containerName, filename)); + + // Make sure the data is correct as a stream + InputStream is = client.getObjectAsStream(containerName, filename); + byte otherData[] = new byte[randomData.length]; + int loc = 0; + int bytesRead = 0; + while ((bytesRead = is.read(otherData, loc, otherData.length - loc)) > 0) { + loc += bytesRead; + } + assertArrayEquals(randomData, otherData); + assertEquals(-1, is.read()); // Could hang if there's a bug on the other end + + // Clean up + client.deleteObject(containerName, filename); + assertTrue(client.deleteContainer(containerName)); + + } + catch (Exception e) { + e.printStackTrace(); + fail(e.getMessage()); + } + } + + public void testMD5IssueSaving() { + String containerName = createTempContainerName("byte-array"); + String filename = makeFileName("bytearray"); + try { + byte randomData[] = makeRandomBytes(); + + while(zeroStripMd5Sum(randomData).length() ==32) { + randomData = makeRandomBytes(); + } + FilesClient client = new FilesClient(); + // client.setUseETag(false); + assertTrue(client.login()); + + // Set up + client.createContainer(containerName); + + // Store it + assertTrue(client.storeObject(containerName, randomData, "application/octet-stream", filename, new HashMap())); + + // Make sure it's there + List objects = client.listObjects(containerName); + assertEquals(1, objects.size()); + FilesObject obj = objects.get(0); + assertEquals(filename, obj.getName()); + assertEquals("application/octet-stream", obj.getMimeType()); + + // Make sure the data is correct + assertArrayEquals(randomData, client.getObject(containerName, filename)); + + // Make sure the data is correct as a stream + InputStream is = client.getObjectAsStream(containerName, filename); + byte otherData[] = new byte[NUMBER_RANDOM_BYTES]; + is.read(otherData); + assertArrayEquals(randomData, otherData); + assertEquals(-1, is.read()); // Could hang if there's a bug on the other end + + // Clean up + client.deleteObject(containerName, filename); + assertTrue(client.deleteContainer(containerName)); + + } + catch (Exception e) { + e.printStackTrace(); + fail(e.getMessage()); + } + } + + private static String zeroStripMd5Sum (byte[] data) throws IOException, NoSuchAlgorithmException + { + MessageDigest digest = MessageDigest.getInstance("MD5"); + + byte[] md5sum = digest.digest(data); + BigInteger bigInt = new BigInteger(1, md5sum); + + return bigInt.toString(16); + } + + private static String md5Sum (byte[] data) throws IOException, NoSuchAlgorithmException + { + MessageDigest digest = MessageDigest.getInstance("MD5"); + + byte[] md5sum = digest.digest(data); + BigInteger bigInt = new BigInteger(1, md5sum); + + String result = bigInt.toString(16); + + while(result.length() < 32) { + result = "0" + result; + } + + return result; + } + + public void testUnicodeContainer() { + String containerName = createTempContainerName("\u0169\u00f1\u00efcode-test-\u03de"); + try { + FilesClient client = new FilesClient(FilesUtil.getProperty("username"), FilesUtil.getProperty("password"), FilesUtil.getProperty("account")); + assertTrue(client.login()); + + // Set up + client.createContainer(containerName); + + + // Make sure it's there + assertTrue(client.containerExists(containerName)); + + // Make sure we can get the container info + assertNotNull(client.getContainerInfo(containerName)); + + // Clean up + assertTrue(client.deleteContainer(containerName)); + + } + catch (Exception e) { + e.printStackTrace(); + fail(e.getMessage()); + } + } + + public void testUnicode() { + String containerName = createTempContainerName("\u0169\u00f1\u00efcode-test-\u03de"); + String filename = makeFileName("unicode_\u03DA_\u2042"); + filename = makeFileName("\u00f1\u00efcode-test-\u03de"); + String fullPath = FilenameUtils.concat(SYSTEM_TMP.getAbsolutePath(), filename); + logger.info("Test File Location: " + fullPath); + try { + byte randomData[] = makeRandomFile(fullPath); + FilesClient client = new FilesClient(FilesUtil.getProperty("username"), FilesUtil.getProperty("password"), FilesUtil.getProperty("account")); + assertTrue(client.login()); + + // Set up + client.createContainer(containerName); + + // Store it + assertTrue(client.storeObjectAs(containerName, new File(fullPath), "application/octet-stream", filename)); + + // Make sure it's there + List objects = client.listObjects(containerName); + assertEquals(1, objects.size()); + FilesObject obj = objects.get(0); + assertEquals(filename, obj.getName()); + assertEquals("application/octet-stream", obj.getMimeType()); + + assertNotNull(obj.getMetaData()); + + // Make sure the data is correct + assertArrayEquals(randomData, client.getObject(containerName, filename)); + + // Make sure the data is correct as a stream + InputStream is = client.getObjectAsStream(containerName, filename); + byte otherData[] = new byte[NUMBER_RANDOM_BYTES]; + is.read(otherData); + assertArrayEquals(randomData, otherData); + assertEquals(-1, is.read()); // Could hang if there's a bug on the other end + + // Make sure we can get the container info + assertNotNull(client.getContainerInfo(containerName)); + + // Clean up + client.deleteObject(containerName, filename); + assertTrue(client.deleteContainer(containerName)); + + } + catch (Exception e) { + e.printStackTrace(); + fail(e.getMessage()); + } + finally { + File f = new File(fullPath); + f.delete(); + } + + } + + public void testCDNContainerList() { + FilesClient client = new FilesClient(); + try { + assertTrue(client.login()); + + List containers = client.listCdnContainers(); + assertTrue(containers.size() > 0); + } catch (Exception e) { + fail(e.getMessage()); + } + } + + public void testCDNContainerListLimitMarker() { + FilesClient client = new FilesClient(); + try { + assertTrue(client.login()); + + List originalContainers = client.listCdnContainers(); + assertTrue(originalContainers.size() > 0); + + // Now do a limit + List containers = client.listCdnContainers(5); + assertEquals(5, containers.size()); + for (int i=0; i < 5; i++) { + assertEquals(originalContainers.get(i), containers.get(i)); + } + + // Now check out a marker + containers = client.listCdnContainers(10, originalContainers.get(originalContainers.size() - 5)); + assertEquals(4, containers.size()); + for (int i=0; i < 2; i++) { + assertEquals(originalContainers.get(originalContainers.size() - 4 + i), containers.get(i)); + } + } catch (Exception e) { + fail(e.getMessage()); + } + } + public void testCDNContainerFullListing() { + FilesClient client = new FilesClient(); + try { + assertTrue(client.login()); + + List originalContainers = client.listCdnContainers(); + assertTrue(originalContainers.size() > 0); + + // Now do a limit + List containers = client.listCdnContainerInfo(5); + assertEquals(5, containers.size()); + for (int i=0; i < 5; i++) { + assertEquals(originalContainers.get(i), containers.get(i).getName()); + } + + // Now check out a marker + containers = client.listCdnContainerInfo(10, originalContainers.get(originalContainers.size() - 5)); + assertEquals(4, containers.size()); + for (int i=0; i < 2; i++) { + assertEquals(originalContainers.get(originalContainers.size() - 4 + i), containers.get(i).getName()); + } + } catch (Exception e) { + fail(e.getMessage()); + } + } + + public void testCDNApi() { + String containerName = createTempContainerName("java api Test\u03DA_\u2042\u03de#<>\u2043\u2042\u2044\u2045"); + //containerName = createTempContainerName("java Api Test no uniocde"); + //logger.warn("Container:" + containerName.length() + ":" + containerName); + FilesClient client = new FilesClient(); + try { + assertTrue(client.login()); + + List containers = client.listCdnContainers(); + int originalContainerListSize = containers.size(); + + String url = client.cdnEnableContainer(containerName); + assertNotNull(url); + containers = client.listCdnContainers(); + assertEquals(originalContainerListSize + 1, containers.size()); + + boolean found = false; + for(String container : containers) { + // logger.warn(container); + if (containerName.equals(container)) found = true; + } + assertTrue(found); + + FilesCDNContainer info = client.getCDNContainerInfo(containerName); + assertTrue(info.isEnabled()); +// assertEquals("", info.getUserAgentACL()); +// assertEquals("", info.getReferrerACL()); + String cdnUrl = info.getCdnURL(); + assertNotNull(cdnUrl); + + client.cdnUpdateContainer(containerName, 31415, false); + info = client.getCDNContainerInfo(containerName); + assertFalse(info.isEnabled()); + assertEquals(31415, info.getTtl()); + assertEquals(cdnUrl, info.getCdnURL()); + + //client.cdnUpdateContainer(containerName, 54321, true, "Referrer Test", "User Agent Acl Test"); + client.cdnUpdateContainer(containerName, 54321, true); + info = client.getCDNContainerInfo(containerName); + assertTrue(info.isEnabled()); + assertEquals(54321, info.getTtl()); + assertEquals(cdnUrl, info.getCdnURL()); +// assertEquals("Referrer Test", info.getReferrerACL()); +// assertEquals("User Agent Acl Test", info.getUserAgentACL()); + + + } catch (Exception e) { + fail(e.getMessage()); + } + } + + // Test container name limits + public void testContainerNameLimits() { + FilesClient fc = new FilesClient(); + try { + assertTrue(fc.login()); + StringBuilder nameBuilder = new StringBuilder(createTempContainerName("long")); + while(nameBuilder.length() <= FilesConstants.CONTAINER_NAME_LENGTH) { + nameBuilder.append("a"); + } + try { + fc.createContainer(nameBuilder.toString()); + // Note, we shouldn't get here, but want to clean up if we do + fc.deleteContainer(nameBuilder.toString()); + fail("No exception thrown"); + } + catch (FilesInvalidNameException fine) { + // Hooray! + } + } + catch (Exception ex) { + fail(ex.getMessage()); + } + } + + public void testPathCreationAndListing() { + FilesClient client = new FilesClient(); + try { + assertTrue(client.login()); + String containerName = createTempContainerName("pathTest"); + + // Make sure it's not there + assertFalse(client.containerExists(containerName)); + + // Add it + client.createContainer(containerName); + + // See that it's there + assertTrue(client.containerExists(containerName)); + + // Add a path and two files + byte randomData[] = makeRandomBytes(); + client.createPath(containerName, "foo"); + client.storeObject(containerName, randomData, "application/octet-stream", "notInContainer.dat", new HashMap()); + client.storeObject(containerName, randomData, "application/octet-stream", "foo/inContainer.dat", new HashMap()); + + List allObjects = client.listObjects(containerName); + List pathObjects = client.listObjects(containerName, "foo"); + + assertEquals(3, allObjects.size()); + assertEquals(1, pathObjects.size()); + assertEquals("foo/inContainer.dat", pathObjects.get(0).getName()); + + // Delete it + client.deleteObject(containerName, "notInContainer.dat"); + client.deleteObject(containerName, "foo/inContainer.dat"); + client.deleteObject(containerName, "foo"); + assertTrue(client.deleteContainer(containerName)); + + // Make sure it's gone + assertFalse(client.containerExists(containerName)); + + } catch (Exception e) { + e.printStackTrace(); + fail(e.getMessage()); + } + } + + public void testPathCreation() { + FilesClient client = new FilesClient(); + try { + assertTrue(client.login()); + String containerName = createTempContainerName("pathTest"); + + // Make sure it's not there + assertFalse(client.containerExists(containerName)); + + // Add it + client.createContainer(containerName); + + // See that it's there + assertTrue(client.containerExists(containerName)); + + // Add a path and two files + client.createFullPath(containerName, "foo/bar/baz"); + + List allObjects = client.listObjects(containerName); + + assertEquals(3, allObjects.size()); + + // If we don't throw an exception, we should be OK + client.getObject(containerName, "foo"); + client.getObject(containerName, "foo/bar"); + client.getObject(containerName, "foo/bar/baz"); + + // Delete it + client.deleteObject(containerName, "foo/bar/baz"); + client.deleteObject(containerName, "foo/bar"); + client.deleteObject(containerName, "foo"); + assertTrue(client.deleteContainer(containerName)); + + // Make sure it's gone + assertFalse(client.containerExists(containerName)); + + } catch (Exception e) { + e.printStackTrace(); + fail(e.getMessage()); + } + } + + public void testFilesObjectPath() { + FilesClient client = new FilesClient(); + try { + assertTrue(client.login()); + String containerName = createTempContainerName("FOpathTest"); + + // Make sure it's not there + assertFalse(client.containerExists(containerName)); + + // Add it + client.createContainer(containerName); + + // See that it's there + assertTrue(client.containerExists(containerName)); + + // Add a path and two files + client.createPath(containerName, "test"); + + List allObjects = client.listObjects(containerName); + + assertEquals(1, allObjects.size()); + + FilesObject obj = allObjects.get(0); + assertEquals(0, obj.getSize()); + assertEquals("application/directory", obj.getMimeType()); + + // If we don't throw an exception, we should be OK + client.getObject(containerName, "test"); + + // Delete it + client.deleteObject(containerName, "test"); + assertTrue(client.deleteContainer(containerName)); + + // Make sure it's gone + assertFalse(client.containerExists(containerName)); + + } catch (Exception e) { + e.printStackTrace(); + fail(e.getMessage()); + } + } + + public void testURLs() { + // Test to make sure these are getting set and are visible to the outside world (needed for Cyberduck's SSL). + FilesClient client = new FilesClient(); + try { + assertTrue(client.login()); + assertNotNull(client.getCdnManagementURL()); + assertNotNull(client.getStorageURL()); + + } catch (Exception e) { + fail(e.getMessage()); + } + } + + // Fun utilities + private String createTempContainerName(String addition) { + SimpleDateFormat sdf = new SimpleDateFormat("yyyy_MM_dd_HH_mm_ss_SSSS"); + return "test-container-" + addition + "-" + sdf.format(new Date(System.currentTimeMillis())); + } + + private String makeFileName(String addition) { + SimpleDateFormat sdf = new SimpleDateFormat("yyyy_MM_dd_HH_mm_ss_SSSS"); + return "test-file-" + addition + "-" + sdf.format(new Date(System.currentTimeMillis())); + } + + private byte[] makeRandomFile(String name) throws IOException { + + File file = new File(name); + FileOutputStream fos = new FileOutputStream(file); + byte randomData[] = makeRandomBytes(); + fos.write(randomData); + fos.close(); + + return randomData; + } + + private byte[] makeRandomBytes() { + return makeRandomBytes(NUMBER_RANDOM_BYTES); + } + private byte[] makeRandomBytes(int nBytes) { + byte results[] = new byte[nBytes]; + Random gen = new Random(); + gen.nextBytes(results); + + // Uncomment to get some not so random data + // for(int i=0; i < results.length; ++i) results[i] = (byte) (i % Byte.MAX_VALUE); + + return results; + } + + private void assertArrayEquals(byte a[], byte b[]) { + assertEquals(a.length, b.length); + for(int i=0; i < a.length; ++i) assertEquals(a[i], b[i]); + } + + private class TesterCallback implements IFilesTransferCallback { + public long bytesSent = 0; + public int nCalls = 0; + public void progress(long n) { + bytesSent = n; + ++nCalls; + } + } +} \ No newline at end of file diff --git a/src/test/java/com/rackspacecloud/client/cloudfiles/LongRunningTest.java b/src/test/java/com/rackspacecloud/client/cloudfiles/LongRunningTest.java new file mode 100644 index 0000000..845c70a --- /dev/null +++ b/src/test/java/com/rackspacecloud/client/cloudfiles/LongRunningTest.java @@ -0,0 +1,42 @@ +/** + * + */ +package com.rackspacecloud.client.cloudfiles; + +import com.rackspacecloud.client.cloudfiles.FilesClient; + +/** + * @author lvaughn + * + */ +public class LongRunningTest { + + /** + * @param args + */ + public static void main(String[] args) { + try { + FilesClient client = new FilesClient(); + + client.login(); + + for(int i=0; i < 120; ++i) { + byte data[] = client.getObject("test_html", "test.html"); + assert (data != null); + System.out.println("Got object " + i); + try { + Thread.sleep(1000 * 60); + } + catch (InterruptedException ie) { + // No Op + } + } + + + } + catch (Exception ex) { + ex.printStackTrace(); + } + } + +} diff --git a/src/test/resources/cloudfiles.properties b/src/test/resources/cloudfiles.properties index 07234ca..0af675c 100644 --- a/src/test/resources/cloudfiles.properties +++ b/src/test/resources/cloudfiles.properties @@ -1,6 +1,6 @@ # user properties -username=your-username-here -password=your-password-here +username=lvaughn +password=9927bd8ae6ec22f6af44a408bf74ef25 auth_url=https://api.mosso.com/auth # cloudfs properties From 404540adcf4bd00125a3dfc37dc47b65368eedac Mon Sep 17 00:00:00 2001 From: Lowell Vaughn Date: Fri, 7 Aug 2009 11:41:38 -0500 Subject: [PATCH 02/64] Code from Akrasoft, clean up two misspellings, add log retention --- build.xml | 8 +- .../client/cloudfiles/FilesCDNContainer.java | 26 ++-- .../client/cloudfiles/FilesClient.java | 122 ++++++++++++++---- .../client/cloudfiles/FilesConstants.java | 4 +- .../cloudfiles/FilesClientTestCase.java | 6 +- 5 files changed, 123 insertions(+), 43 deletions(-) diff --git a/build.xml b/build.xml index f40ed2d..b40386d 100644 --- a/build.xml +++ b/build.xml @@ -64,8 +64,8 @@ - + @@ -91,7 +91,7 @@ - + @@ -100,7 +100,7 @@ - + diff --git a/src/main/java/com/rackspacecloud/client/cloudfiles/FilesCDNContainer.java b/src/main/java/com/rackspacecloud/client/cloudfiles/FilesCDNContainer.java index 8740fa2..a21bb49 100644 --- a/src/main/java/com/rackspacecloud/client/cloudfiles/FilesCDNContainer.java +++ b/src/main/java/com/rackspacecloud/client/cloudfiles/FilesCDNContainer.java @@ -14,7 +14,22 @@ public class FilesCDNContainer { private int ttl; private String cdnURL; private String name; + private boolean retainLogs; + /** + * @return the retainLogs + */ + public boolean getRetainLogs() { + return retainLogs; + } + + /** + * @param retainLogs the retainLogs to set + */ + public void setRetainLogs(boolean retainLogs) { + this.retainLogs = retainLogs; + } + public FilesCDNContainer() { } @@ -22,19 +37,14 @@ public FilesCDNContainer(String cdnURL) { this.cdnURL = cdnURL; } - public FilesCDNContainer(String name, boolean enabled, int ttl) { + public FilesCDNContainer(String name, boolean enabled, int ttl, boolean retainLogs) { this.enabled = enabled; this.ttl = ttl; this.name = name; - //this(enabled, ttl, null, null); + this.retainLogs = retainLogs; } -// public FilesCDNContainer(boolean enabled, int ttl, String userAgentACL, String referrerACL) { -// this.enabled = enabled; -// this.ttl = ttl; -// this.userAgentACL = userAgentACL; -// this.referrerACL = referrerACL; -// } + /** * @return Is this container CDN enabled diff --git a/src/main/java/com/rackspacecloud/client/cloudfiles/FilesClient.java b/src/main/java/com/rackspacecloud/client/cloudfiles/FilesClient.java index 9aa1f21..09af900 100644 --- a/src/main/java/com/rackspacecloud/client/cloudfiles/FilesClient.java +++ b/src/main/java/com/rackspacecloud/client/cloudfiles/FilesClient.java @@ -516,12 +516,12 @@ else if (response.getStatusCode() == HttpStatus.SC_NOT_FOUND) * @throws FilesException There was another error in the request to the server. * @throws FilesAuthorizationException The client's login was invalid. */ - public List listObjectsStaringWith (String container, String startsWith, String path, int limit, String marker) throws IOException, HttpException, FilesException + public List listObjectsStartingWith (String container, String startsWith, String path, int limit, String marker) throws IOException, HttpException, FilesException { if (!this.isLoggedin()) { throw new FilesAuthorizationException("You must be logged in", null, null); } - if (!isValidContianerName(container)) { + if (!isValidContainerName(container)) { throw new FilesInvalidNameException(container); } GetMethod method = null; @@ -657,7 +657,7 @@ else if (response.getStatusCode() == HttpStatus.SC_NOT_FOUND) * @throws FilesAuthorizationException The client's login was invalid. */ public List listObjects(String container) throws IOException, HttpException, FilesAuthorizationException, FilesException { - return listObjectsStaringWith(container, null, null, -1, null); + return listObjectsStartingWith(container, null, null, -1, null); } /** @@ -673,7 +673,7 @@ public List listObjects(String container) throws IOException, HttpE * @throws FilesAuthorizationException The client's login was invalid. */ public List listObjects(String container, int limit) throws IOException, HttpException, FilesAuthorizationException, FilesException { - return listObjectsStaringWith(container, null, null, limit, null); + return listObjectsStartingWith(container, null, null, limit, null); } /** @@ -688,7 +688,7 @@ public List listObjects(String container, int limit) throws IOExcep * @throws FilesException There was another error in the request to the server. */ public List listObjects(String container, String path) throws IOException, HttpException, FilesAuthorizationException, FilesException { - return listObjectsStaringWith(container, null, path, -1, null); + return listObjectsStartingWith(container, null, path, -1, null); } /** @@ -706,7 +706,7 @@ public List listObjects(String container, String path) throws IOExc * @throws FilesAuthorizationException The client's login was invalid. */ public List listObjects(String container, String path, int limit) throws IOException, HttpException, FilesAuthorizationException, FilesException { - return listObjectsStaringWith(container, null, path, limit, null); + return listObjectsStartingWith(container, null, path, limit, null); } /** @@ -723,7 +723,7 @@ public List listObjects(String container, String path, int limit) t * @throws FilesException There was another error in the request to the server. */ public List listObjects(String container, String path, int limit, String marker) throws IOException, HttpException, FilesAuthorizationException, FilesException { - return listObjectsStaringWith(container, null, path, limit, marker); + return listObjectsStartingWith(container, null, path, limit, marker); } /** @@ -740,7 +740,7 @@ public List listObjects(String container, String path, int limit, S * @throws FilesAuthorizationException The client's login was invalid. */ public List listObjects(String container, int limit, String marker) throws IOException, HttpException, FilesAuthorizationException, FilesException { - return listObjectsStaringWith(container, null, null, limit, marker); + return listObjectsStartingWith(container, null, null, limit, marker); } /** @@ -825,7 +825,7 @@ public FilesContainerInfo getContainerInfo (String container) throws IOException { if (this.isLoggedin()) { - if (isValidContianerName(container)) + if (isValidContainerName(container)) { HeadMethod method = null; @@ -892,7 +892,7 @@ public void createContainer(String name) throws IOException, HttpException, File { if (this.isLoggedin()) { - if (isValidContianerName(name)) + if (isValidContainerName(name)) { // logger.warn(name + ":" + sanitizeForURI(name)); PutMethod method = new PutMethod(storageURL+"/"+sanitizeForURI(name)); @@ -959,7 +959,7 @@ public boolean deleteContainer(String name) throws IOException, HttpException, F { if (this.isLoggedin()) { - if (isValidContianerName(name)) + if (isValidContainerName(name)) { DeleteMethod method = new DeleteMethod(storageURL+"/"+sanitizeForURI(name)); try { @@ -1028,7 +1028,7 @@ public String cdnEnableContainer(String name) throws IOException, HttpException, String returnValue = null; if (this.isLoggedin()) { - if (isValidContianerName(name)) + if (isValidContainerName(name)) { PutMethod method = null; try { @@ -1086,8 +1086,9 @@ else if (response.getStatusCode() == HttpStatus.SC_UNAUTHORIZED) { * * @param name The name of the container to enable * @param ttl How long the CDN can use the content before checking for an update. A negative value will result in this not being changed. - * @param enabled True if this folder should be accessible, false otherwise - * @return The CDN Url of the container + * @param enabled True if this container should be accessible, false otherwise + * @param retainLogs True if cdn access logs should be kept for this container, false otherwise + * @return The CDN Url of the container * @throws IOException There was an IO error doing network communication * @throws HttpException There was an error with the http protocol * @throws FilesException There was an error talking to the CDN Service @@ -1097,13 +1098,13 @@ else if (response.getStatusCode() == HttpStatus.SC_UNAUTHORIZED) { * @param userAgentACL Unused for now */ // private String cdnUpdateContainer(String name, int ttl, boolean enabled, String referrerAcl, String userAgentACL) - public String cdnUpdateContainer(String name, int ttl, boolean enabled) + public String cdnUpdateContainer(String name, int ttl, boolean enabled, boolean retainLogs) throws IOException, HttpException, FilesException { String returnValue = null; if (this.isLoggedin()) { - if (isValidContianerName(name)) + if (isValidContainerName(name)) { PostMethod method = null; try { @@ -1115,8 +1116,11 @@ public String cdnUpdateContainer(String name, int ttl, boolean enabled) if (ttl > 0) { method.setRequestHeader(FilesConstants.X_CDN_TTL, Integer.toString(ttl)); } - // Enabled + // Enabled method.setRequestHeader(FilesConstants.X_CDN_ENABLED, Boolean.toString(enabled)); + + // Log Retention + method.setRequestHeader(FilesConstants.X_CDN_RETAIN_LOGS, Boolean.toString(retainLogs)); // // Referrer ACL // if(referrerAcl != null) { @@ -1208,7 +1212,7 @@ else if (response.getStatusCode() == HttpStatus.SC_UNAUTHORIZED) { public FilesCDNContainer getCDNContainerInfo(String container) throws IOException, HttpException, FilesException { if (isLoggedin()) { - if (isValidContianerName(container)) + if (isValidContainerName(container)) { HeadMethod method = null; try { @@ -1242,6 +1246,9 @@ public FilesCDNContainer getCDNContainerInfo(String container) throws IOExceptio if ("x-cdn-enabled".equals(name)) { result.setEnabled(Boolean.valueOf(hdr.getValue())); } + else if ("x-log-retention".equals(name)) { + result.setRetainLogs(Boolean.valueOf(hdr.getValue())); + } else if ("x-ttl".equals(name)) { result.setTtl(Integer.parseInt(hdr.getValue())); } @@ -1299,7 +1306,7 @@ else if (response.getStatusCode() == HttpStatus.SC_UNAUTHORIZED) { */ public void createPath(String container, String path) throws HttpException, IOException, FilesException { - if (!isValidContianerName(container)) + if (!isValidContainerName(container)) throw new FilesInvalidNameException(container); if (!isValidObjectName(path)) throw new FilesInvalidNameException(path); @@ -1547,6 +1554,9 @@ else if ("cdn_url".equals(data.getNodeName())) { else if ("cdn_enabled".equals(data.getNodeName())) { container.setEnabled(Boolean.parseBoolean(data.getTextContent())); } + else if ("log_retention".equals(data.getNodeName())) { + container.setRetainLogs(Boolean.parseBoolean(data.getTextContent())); + } else if ("ttl".equals(data.getNodeName())) { container.setTtl(Integer.parseInt(data.getTextContent())); } @@ -1651,7 +1661,7 @@ public boolean storeObjectAs (String container, File obj, String contentType, St { if (this.isLoggedin()) { - if (isValidContianerName(container) && isValidObjectName(name) ) + if (isValidContainerName(container) && isValidObjectName(name) ) { if (!obj.exists()) { @@ -1785,7 +1795,7 @@ public boolean storeObject(String container, byte obj[], String contentType, Str if (this.isLoggedin()) { String objName = name; - if (isValidContianerName(container) && isValidObjectName(objName)) + if (isValidContainerName(container) && isValidObjectName(objName)) { PutMethod method = null; @@ -1881,7 +1891,7 @@ public boolean storeStreamedObject(String container, InputStream data, String co if (this.isLoggedin()) { String objName = name; - if (isValidContianerName(container) && isValidObjectName(objName)) + if (isValidContainerName(container) && isValidObjectName(objName)) { PutMethod method = new PutMethod(storageURL+"/"+sanitizeForURI(container)+"/"+sanitizeForURI(objName)); method.setContentChunked(true); @@ -1945,7 +1955,7 @@ public boolean storeObjectAs(String container, String name, RequestEntity entity if (this.isLoggedin()) { String objName = name; - if (isValidContianerName(container) && isValidObjectName(objName)) + if (isValidContainerName(container) && isValidObjectName(objName)) { PutMethod method = new PutMethod(storageURL+"/"+sanitizeForURI(container)+"/"+sanitizeForURI(objName)); method.getParams().setSoTimeout(connectionTimeOut); @@ -2020,7 +2030,7 @@ public void deleteObject (String container, String objName) throws IOException, { if (this.isLoggedin()) { - if (isValidContianerName(container) && isValidObjectName(objName)) + if (isValidContainerName(container) && isValidObjectName(objName)) { DeleteMethod method = null; try { @@ -2077,7 +2087,7 @@ public FilesObjectMetaData getObjectMetaData (String container, String objName) FilesObjectMetaData metaData; if (this.isLoggedin()) { - if (isValidContianerName(container) && isValidObjectName(objName)) + if (isValidContainerName(container) && isValidObjectName(objName)) { HeadMethod method = new HeadMethod(storageURL+"/"+sanitizeForURI(container)+"/"+sanitizeForURI(objName)); method.getParams().setSoTimeout(connectionTimeOut); @@ -2153,7 +2163,7 @@ public byte[] getObject (String container, String objName) throws IOException, H { if (this.isLoggedin()) { - if (isValidContianerName(container) && isValidObjectName(objName)) + if (isValidContainerName(container) && isValidObjectName(objName)) { GetMethod method = new GetMethod(storageURL+"/"+sanitizeForURI(container)+"/"+sanitizeForURI(objName)); method.getParams().setSoTimeout(connectionTimeOut); @@ -2206,7 +2216,7 @@ public InputStream getObjectAsStream (String container, String objName) throws I { if (this.isLoggedin()) { - if (isValidContianerName(container) && isValidObjectName(objName)) + if (isValidContainerName(container) && isValidObjectName(objName)) { if (objName.length() > FilesConstants.OBJECT_NAME_LENGTH) { @@ -2519,7 +2529,7 @@ public String getUserAgent() { return client.getParams().getParameter(HttpMethodParams.USER_AGENT).toString(); } - private boolean isValidContianerName(String name) { + private boolean isValidContainerName(String name) { if (name == null) return false; int length = name.length(); if (length == 0 || length > FilesConstants.CONTAINER_NAME_LENGTH) return false; @@ -2549,4 +2559,60 @@ public String getCdnManagementURL() { public void setHostConfiguration(HostConfiguration config) { client.setHostConfiguration(config); } + private HttpMethod doUpdateObjectMetadata(String container, + String object, Map metadata) + throws HttpException, IOException { + HttpClient httpClient; + PostMethod method; + + method = new PostMethod(storageURL + + "/"+FilesClient.sanitizeForURI(container)+ + "/"+FilesClient.sanitizeForURI(object)); + method.getParams().setSoTimeout(connectionTimeOut); + method.setRequestHeader(FilesConstants.X_AUTH_TOKEN, authToken); + if (!(metadata == null || metadata.isEmpty())) { + for(String key:metadata.keySet()) + method.setRequestHeader(FilesConstants.X_OBJECT_META+key, + FilesClient.sanitizeForURI(metadata.get(key))); + } + + httpClient = new HttpClient(); + httpClient.executeMethod(method); + + return method; + } + + public boolean updateObjectMetadata(String container, String object, + Map metadata) throws FilesAuthorizationException, + HttpException, IOException, FilesInvalidNameException { + HttpMethod method; + FilesResponse response; + + if (!isLoggedin) { + throw new FilesAuthorizationException("You must be logged in", + null, null); + } + + if (!isValidContainerName(container)) + throw new FilesInvalidNameException(container); + if (!isValidObjectName(object)) + throw new FilesInvalidNameException(object); + + method = null; + try { + method = doUpdateObjectMetadata(container, object, metadata); + response = new FilesResponse(method); + if (response.getStatusCode() == HttpStatus.SC_UNAUTHORIZED) { + method.releaseConnection(); + if(login()) { + method = doUpdateObjectMetadata(container, object, metadata); + } + } + + return true; + } finally { + if (method != null) + method.releaseConnection(); + } + } } diff --git a/src/main/java/com/rackspacecloud/client/cloudfiles/FilesConstants.java b/src/main/java/com/rackspacecloud/client/cloudfiles/FilesConstants.java index 05f43e8..c150f0d 100644 --- a/src/main/java/com/rackspacecloud/client/cloudfiles/FilesConstants.java +++ b/src/main/java/com/rackspacecloud/client/cloudfiles/FilesConstants.java @@ -12,7 +12,7 @@ public class FilesConstants { private static Logger logger = Logger.getLogger(FilesConstants.class); - public static final String USER_AGENT = "java-cloudfiles/1.3.2"; + public static final String USER_AGENT = "java-cloudfiles/1.4.0"; /** HTTP Header token that identifies the username to Cloud Files **/ public static final String X_STORAGE_USER = "x-auth-user"; @@ -37,6 +37,8 @@ public class FilesConstants /** HTTP header token that is returned by calls to the CDN Management API **/ public static final String X_CDN_TTL = "X-TTL"; /** HTTP header token that is returned by calls to the CDN Management API **/ + public static final String X_CDN_RETAIN_LOGS = "X-Log-Retention"; + /** HTTP header token that is returned by calls to the CDN Management API **/ public static final String X_CDN_ENABLED = "X-CDN-Enabled"; /** HTTP header token that is returned by calls to the CDN Management API **/ public static final String X_CDN_USER_AGENT_ACL = "X-User-Agent-ACL"; diff --git a/src/test/java/com/rackspacecloud/client/cloudfiles/FilesClientTestCase.java b/src/test/java/com/rackspacecloud/client/cloudfiles/FilesClientTestCase.java index 2b8c150..c157d50 100644 --- a/src/test/java/com/rackspacecloud/client/cloudfiles/FilesClientTestCase.java +++ b/src/test/java/com/rackspacecloud/client/cloudfiles/FilesClientTestCase.java @@ -1276,16 +1276,18 @@ public void testCDNApi() { String cdnUrl = info.getCdnURL(); assertNotNull(cdnUrl); - client.cdnUpdateContainer(containerName, 31415, false); + client.cdnUpdateContainer(containerName, 31415, false, true); info = client.getCDNContainerInfo(containerName); assertFalse(info.isEnabled()); + assertTrue(info.getRetainLogs()); assertEquals(31415, info.getTtl()); assertEquals(cdnUrl, info.getCdnURL()); //client.cdnUpdateContainer(containerName, 54321, true, "Referrer Test", "User Agent Acl Test"); - client.cdnUpdateContainer(containerName, 54321, true); + client.cdnUpdateContainer(containerName, 54321, true, false); info = client.getCDNContainerInfo(containerName); assertTrue(info.isEnabled()); + assertFalse(info.getRetainLogs()); assertEquals(54321, info.getTtl()); assertEquals(cdnUrl, info.getCdnURL()); // assertEquals("Referrer Test", info.getReferrerACL()); From fe4889d192fa6c2364ff2683f9d5177b42c2ab29 Mon Sep 17 00:00:00 2001 From: Lowell Vaughn Date: Mon, 10 Aug 2009 19:39:37 -0500 Subject: [PATCH 03/64] Fixing misspelling --- README | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/README b/README index 0470962..e78246e 100644 --- a/README +++ b/README @@ -8,5 +8,6 @@ In order to run unit tests 1) Edit the file src/test/resource/cloudfiles.properties, changing the username and password as needed 2) run "ant test" to run the unit tests -3) run "ant test-report" if you'd like to create a hand-dandy html report on the tests. +3) run "ant test-report" if you'd like to create a handy-dandy html report + on the tests. From cdd12851b4c050247f3456d0b689b7c56d54f8a4 Mon Sep 17 00:00:00 2001 From: Lowell Vaughn Date: Wed, 12 Aug 2009 09:00:09 -0500 Subject: [PATCH 04/64] Forgot to add build.xml --- build.xml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/build.xml b/build.xml index b40386d..98357a7 100644 --- a/build.xml +++ b/build.xml @@ -8,7 +8,7 @@ - + @@ -132,7 +132,7 @@ - + @@ -142,7 +142,7 @@ - + From 7af3e3649a4ee8020be84277f45f9dd56d390039 Mon Sep 17 00:00:00 2001 From: Lowell Vaughn Date: Wed, 12 Aug 2009 09:00:41 -0500 Subject: [PATCH 05/64] Commiting 1.4.0 changes to master --- .../client/cloudfiles/FilesAccountInfo.java | 48 - .../FilesAuthorizationException.java | 29 - .../client/cloudfiles/FilesCDNContainer.java | 116 - .../mosso/client/cloudfiles/FilesClient.java | 2552 ----------------- .../client/cloudfiles/FilesConstants.java | 83 - .../client/cloudfiles/FilesContainer.java | 197 -- .../FilesContainerExistsException.java | 30 - .../client/cloudfiles/FilesContainerInfo.java | 62 - .../FilesContainerNotEmptyException.java | 25 - .../client/cloudfiles/FilesException.java | 91 - .../cloudfiles/FilesInvalidNameException.java | 20 - .../cloudfiles/FilesNotFoundException.java | 30 - .../mosso/client/cloudfiles/FilesObject.java | 354 --- .../cloudfiles/FilesObjectMetaData.java | 177 -- .../client/cloudfiles/FilesResponse.java | 307 -- .../mosso/client/cloudfiles/FilesUtil.java | 113 - .../cloudfiles/IFilesTransferCallback.java | 13 - .../com/mosso/client/cloudfiles/MIME.types | 580 ---- .../client/cloudfiles/sample/FilesAuth.java | 33 - .../client/cloudfiles/sample/FilesCli.java | 401 --- .../client/cloudfiles/sample/FilesCopy.java | 456 --- .../client/cloudfiles/sample/FilesList.java | 247 -- .../cloudfiles/sample/FilesMakeContainer.java | 116 - .../client/cloudfiles/sample/FilesRemove.java | 180 -- .../wrapper/OutputStreamWrapper.java | 80 - .../wrapper/RequestEntityWrapper.java | 55 - .../cloudfiles/FilesClientTestCase.java | 1506 ---------- .../client/cloudfiles/LongRunningTest.java | 40 - 28 files changed, 7941 deletions(-) delete mode 100644 src/main/java/com/mosso/client/cloudfiles/FilesAccountInfo.java delete mode 100644 src/main/java/com/mosso/client/cloudfiles/FilesAuthorizationException.java delete mode 100644 src/main/java/com/mosso/client/cloudfiles/FilesCDNContainer.java delete mode 100644 src/main/java/com/mosso/client/cloudfiles/FilesClient.java delete mode 100644 src/main/java/com/mosso/client/cloudfiles/FilesConstants.java delete mode 100644 src/main/java/com/mosso/client/cloudfiles/FilesContainer.java delete mode 100644 src/main/java/com/mosso/client/cloudfiles/FilesContainerExistsException.java delete mode 100644 src/main/java/com/mosso/client/cloudfiles/FilesContainerInfo.java delete mode 100644 src/main/java/com/mosso/client/cloudfiles/FilesContainerNotEmptyException.java delete mode 100644 src/main/java/com/mosso/client/cloudfiles/FilesException.java delete mode 100644 src/main/java/com/mosso/client/cloudfiles/FilesInvalidNameException.java delete mode 100644 src/main/java/com/mosso/client/cloudfiles/FilesNotFoundException.java delete mode 100644 src/main/java/com/mosso/client/cloudfiles/FilesObject.java delete mode 100644 src/main/java/com/mosso/client/cloudfiles/FilesObjectMetaData.java delete mode 100644 src/main/java/com/mosso/client/cloudfiles/FilesResponse.java delete mode 100644 src/main/java/com/mosso/client/cloudfiles/FilesUtil.java delete mode 100644 src/main/java/com/mosso/client/cloudfiles/IFilesTransferCallback.java delete mode 100644 src/main/java/com/mosso/client/cloudfiles/MIME.types delete mode 100644 src/main/java/com/mosso/client/cloudfiles/sample/FilesAuth.java delete mode 100644 src/main/java/com/mosso/client/cloudfiles/sample/FilesCli.java delete mode 100644 src/main/java/com/mosso/client/cloudfiles/sample/FilesCopy.java delete mode 100644 src/main/java/com/mosso/client/cloudfiles/sample/FilesList.java delete mode 100644 src/main/java/com/mosso/client/cloudfiles/sample/FilesMakeContainer.java delete mode 100644 src/main/java/com/mosso/client/cloudfiles/sample/FilesRemove.java delete mode 100644 src/main/java/com/mosso/client/cloudfiles/wrapper/OutputStreamWrapper.java delete mode 100644 src/main/java/com/mosso/client/cloudfiles/wrapper/RequestEntityWrapper.java delete mode 100644 src/test/java/com/mosso/client/cloudfiles/FilesClientTestCase.java delete mode 100644 src/test/java/com/mosso/client/cloudfiles/LongRunningTest.java diff --git a/src/main/java/com/mosso/client/cloudfiles/FilesAccountInfo.java b/src/main/java/com/mosso/client/cloudfiles/FilesAccountInfo.java deleted file mode 100644 index 6d80c1b..0000000 --- a/src/main/java/com/mosso/client/cloudfiles/FilesAccountInfo.java +++ /dev/null @@ -1,48 +0,0 @@ -/** - * - */ -package com.mosso.client.cloudfiles; - -/** - * @author lvaughn - * - */ -public class FilesAccountInfo { - private long bytesUsed; - private int containerCount; - - public FilesAccountInfo(long bytes, int containers) { - bytesUsed = bytes; - containerCount = containers; - } - /** - * Returns the total number of bytes used by all objects in a given account. - * - * @return the bytesUsed - */ - public long getBytesUsed() { - return bytesUsed; - } - /** - * @param bytesUsed The number of bytes in the account - */ - public void setBytesUsed(long bytesUsed) { - this.bytesUsed = bytesUsed; - } - /** - * The number of containers in a given account. - * - * @return the containerCount - */ - public int getContainerCount() { - return containerCount; - } - /** - * @param containerCount the containerCount to set - */ - public void setContainerCount(int containerCount) { - this.containerCount = containerCount; - } - - -} diff --git a/src/main/java/com/mosso/client/cloudfiles/FilesAuthorizationException.java b/src/main/java/com/mosso/client/cloudfiles/FilesAuthorizationException.java deleted file mode 100644 index 9ce2935..0000000 --- a/src/main/java/com/mosso/client/cloudfiles/FilesAuthorizationException.java +++ /dev/null @@ -1,29 +0,0 @@ -/* - * See COPYING for license information. - */ - -package com.mosso.client.cloudfiles; - -import org.apache.commons.httpclient.Header; -import org.apache.commons.httpclient.StatusLine; - -public class FilesAuthorizationException extends FilesException -{ - /** - * - */ - private static final long serialVersionUID = -3142674319839157198L; - - /** - * An exception generated when a client tries to do something they aren't authorized to do. - * - * @param message The message - * @param httpHeaders The returned HTTP headers - * @param httpStatusLine The HTTP Status lined returned - */ - public FilesAuthorizationException(String message, Header [] httpHeaders, StatusLine httpStatusLine) - { - super (message, httpHeaders, httpStatusLine); - } - -} diff --git a/src/main/java/com/mosso/client/cloudfiles/FilesCDNContainer.java b/src/main/java/com/mosso/client/cloudfiles/FilesCDNContainer.java deleted file mode 100644 index a2eadcb..0000000 --- a/src/main/java/com/mosso/client/cloudfiles/FilesCDNContainer.java +++ /dev/null @@ -1,116 +0,0 @@ -/** - * - */ -package com.mosso.client.cloudfiles; - -/** - * @author lvaughn - * - */ -public class FilesCDNContainer { - private boolean enabled; -// private String userAgentACL; -// private String referrerACL; - private int ttl; - private String cdnURL; - private String name; - - public FilesCDNContainer() { - } - - public FilesCDNContainer(String cdnURL) { - this.cdnURL = cdnURL; - } - - public FilesCDNContainer(String name, boolean enabled, int ttl) { - this.enabled = enabled; - this.ttl = ttl; - this.name = name; - //this(enabled, ttl, null, null); - } - -// public FilesCDNContainer(boolean enabled, int ttl, String userAgentACL, String referrerACL) { -// this.enabled = enabled; -// this.ttl = ttl; -// this.userAgentACL = userAgentACL; -// this.referrerACL = referrerACL; -// } - - /** - * @return Is this container CDN enabled - */ - public boolean isEnabled() { - return enabled; - } - /** - * @param enabled the enabled to set - */ - public void setEnabled(boolean enabled) { - this.enabled = enabled; - } -// /** -// * @return the userAgentACL -// */ -// public String getUserAgentACL() { -// return userAgentACL; -// } -// /** -// * @param userAgentACL the userAgentACL to set -// */ -// public void setUserAgentACL(String userAgentACL) { -// this.userAgentACL = userAgentACL; -// } -// /** -// * @return the refererACL -// */ -// public String getReferrerACL() { -// return referrerACL; -// } -// /** -// * @param refererACL the refererACL to set -// */ -// public void setReferrerACL(String referrerACL) { -// this.referrerACL = referrerACL; -// } - /** - * @return the ttl - */ - public int getTtl() { - return ttl; - } - /** - * @param ttl the ttl to set - */ - public void setTtl(int ttl) { - this.ttl = ttl; - } - - /** - * @return the cdnURL - */ - public String getCdnURL() { - return cdnURL; - } - - /** - * @param cdnURL the cdnURL to set - */ - public void setCdnURL(String cdnURL) { - this.cdnURL = cdnURL; - } - /** - * @return the name - */ - public String getName() { - return name; - } - - /** - * @param name the name to set - */ - public void setName(String name) { - this.name = name; - } - - -} diff --git a/src/main/java/com/mosso/client/cloudfiles/FilesClient.java b/src/main/java/com/mosso/client/cloudfiles/FilesClient.java deleted file mode 100644 index 965c4ea..0000000 --- a/src/main/java/com/mosso/client/cloudfiles/FilesClient.java +++ /dev/null @@ -1,2552 +0,0 @@ -/* - * See COPYING for license information. - */ - -package com.mosso.client.cloudfiles; - -import org.apache.log4j.Logger; -import org.apache.commons.codec.DecoderException; -import org.apache.commons.codec.EncoderException; -import org.apache.commons.codec.net.URLCodec; -import org.apache.commons.httpclient.*; -import org.apache.commons.httpclient.methods.*; -import org.apache.commons.httpclient.params.HttpMethodParams; -import org.apache.commons.lang.text.StrTokenizer; -import org.w3c.dom.Document; -import org.w3c.dom.Node; -import org.w3c.dom.NodeList; -import org.xml.sax.SAXException; - -import com.mosso.client.cloudfiles.wrapper.RequestEntityWrapper; - -import java.io.IOException; -import java.util.LinkedList; -import java.util.List; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.Map; -import java.io.BufferedOutputStream; -import java.io.File; -import java.io.FileInputStream; -import java.io.FileNotFoundException; -import java.io.FileOutputStream; -import java.io.InputStream; -import java.io.InputStreamReader; -import java.math.BigInteger; -import java.security.MessageDigest; -import java.security.NoSuchAlgorithmException; - -import javax.xml.parsers.DocumentBuilder; -import javax.xml.parsers.DocumentBuilderFactory; -import javax.xml.parsers.ParserConfigurationException; - -/** - * - * A client for Cloud Files. Here follows a basic example of logging in, creating a container and an - * object, retrieving the object, and then deleting both the object and container. For more examples, - * see the code in com.mosso.client.cloudfiles.sample, which contains a series of examples. - * - *
- * 
- *  //  Create the client object for username "jdoe", password "johnsdogsname". 
- * 	FilesClient myClient = FilesClient("jdoe", "johnsdogsname");
- * 
- *  // Log in (login() will return false if the login was unsuccessful.
- *  assert(myClient.login());
- * 
- *  // Make sure there are no containers in the account
- *  assert(myClient.listContainers.length() == 0);
- *  
- *  // Create the container
- *  assert(myClient.createContainer("myContainer"));
- *  
- *  // Now we should have one
- *  assert(myClient.listContainers.length() == 1);
- *  
- *  // Upload the file "alpaca.jpg"
- *  assert(myClient.storeObject("myContainer", new File("alapca.jpg"), "image/jpeg"));
- *  
- *  // Download "alpaca.jpg"
- *  FilesObject obj = myClient.getObject("myContainer", "alpaca.jpg");
- *  byte data[] = obj.getObject();
- *  
- *  // Clean up after ourselves.
- *  // Note:  Order here is important, you can't delete non-empty containers.
- *  assert(myClient.deleteObject("myContainer", "alpaca.jpg"));
- *  assert(myClient.deleteContainer("myContainer");
- * 
- * - * @see com.mosso.client.cloudfiles.sample.FilesCli - * @see com.mosso.client.cloudfiles.sample.FilesAuth - * @see com.mosso.client.cloudfiles.sample.FilesCopy - * @see com.mosso.client.cloudfiles.sample.FilesList - * @see com.mosso.client.cloudfiles.sample.FilesRemove - * @see com.mosso.client.cloudfiles.sample.FilesMakeContainer - * - * @author lvaughn - */ -public class FilesClient -{ - public static final String VERSION = "v1"; - - private String username = null; - private String password = null; - private String account = null; - private String authenticationURL; - private int connectionTimeOut; - private String storageURL = null; - private String cdnManagementURL = null; - private String authToken = null; - private boolean isLoggedin = false; - private boolean useETag = true; - - private HttpClient client = new HttpClient(new MultiThreadedHttpConnectionManager()); - - private static Logger logger = Logger.getLogger(FilesClient.class); - - /** - * @param username The username to log in to - * @param password The password - * @param account The Cloud Files account to use - * @param connectionTimeOut The connection timeout, in ms. - */ - public FilesClient(String username, String password, String account, int connectionTimeOut) - { - this.username = username; - this.password = password; - this.account = account; - if (account != null && account.length() > 0) { - this.authenticationURL = FilesUtil.getProperty("auth_url")+VERSION+"/"+account+FilesUtil.getProperty("auth_url_post"); - } - else { - this.authenticationURL = FilesUtil.getProperty("auth_url"); - } - this.connectionTimeOut = connectionTimeOut; - - client.getParams().setParameter("http.socket.timeout", this.connectionTimeOut ); - setUserAgent(FilesConstants.USER_AGENT); - - if (logger.isDebugEnabled()) { - logger.debug("UserName: "+ this.username); - logger.debug("AuthenticationURL: "+ this.authenticationURL); - logger.debug("ConnectionTimeOut: "+ this.connectionTimeOut); - } - //logger.debug("LGV:" + client.getHttpConnectionManager()); - } - - /** - * This method uses the default connection time out of CONNECTON_TIMEOUT. If account - * is null, "Mosso Style" authentication is assumed, otherwise standard Cloud Files authentication is used. - * - * @param username - * @param password - * @param account - */ - public FilesClient(String username, String password, String account) - { - this (username, password, account, FilesUtil.getIntProperty("connection_timeout")); - } - - /** - * Mosso-style authentication (No accounts). - * - * @param username Your CloudFiles username - * @param apiAccessKey Your CloudFiles API Access Key - */ - public FilesClient(String username, String apiAccessKey) - { - this (username, apiAccessKey, null, FilesUtil.getIntProperty("connection_timeout")); - //lConnectionManagerogger.warn("LGV"); - //logger.debug("LGV:" + client.getHttpConnectionManager()); - } - - /** - * This method uses the default connection time out of CONNECTON_TIMEOUT and username, password, - * and account from FilesUtil - * - */ - public FilesClient() - { - this (FilesUtil.getProperty("username"), - FilesUtil.getProperty("password"), - FilesUtil.getProperty("account"), - FilesUtil.getIntProperty("connection_timeout")); - } - - /** - * Returns the Account associated with the URL - * - * @return The account name - */ - public String getAccount() - { - return account; - } - - /** - * Set the Account value and reassemble the Authentication URL. - * - * @param account - */ - public void setAccount(String account) - { - this.account = account; - if (account != null && account.length() > 0) { - this.authenticationURL = FilesUtil.getProperty("auth_url")+VERSION+"/"+account+FilesUtil.getProperty("auth_url_post"); - } - else { - this.authenticationURL = FilesUtil.getProperty("auth_url"); - } - } - - /** - * Log in to CloudFiles. This method performs the authentication and sets up the client's internal state. - * - * @return true if the login was successful, false otherwise. - * - * @throws IOException There was an IO error doing network communication - * @throws HttpException There was an error with the http protocol - */ - public boolean login() throws IOException, HttpException - { - GetMethod method = new GetMethod(authenticationURL); - method.getParams().setSoTimeout(connectionTimeOut); - - method.setRequestHeader(FilesConstants.X_STORAGE_USER, username); - method.setRequestHeader(FilesConstants.X_STORAGE_PASS, password); - - logger.debug ("Logging in user: "+username+" using URL: "+authenticationURL); - client.executeMethod(method); - - FilesResponse response = new FilesResponse(method); - - if (response.loginSuccess()) - { - isLoggedin = true; - storageURL = response.getStorageURL(); - cdnManagementURL = response.getCDNManagementURL(); - authToken = response.getAuthToken(); - logger.debug("storageURL: " + storageURL); - logger.debug("authToken: " + authToken); - logger.debug("cdnManagementURL:" + cdnManagementURL); - logger.debug("ConnectionManager:" + client.getHttpConnectionManager()); - } - method.releaseConnection(); - - return this.isLoggedin; - } - - /** - * List all of the containers available in an account, ordered by container name. - * - * @return null if the user is not logged in or the Account is not found. A List of FSContainers with all of the containers in the account. - * if there are no containers in the account, the list will be zero length. - * @throws IOException There was an IO error doing network communication - * @throws HttpException There was an error with the http protocol - * @throws FilesException There was another error in the request to the server. - * @throws FilesAuthorizationException The client's login was invalid. - */ - public List listContainersInfo() throws IOException, HttpException, FilesAuthorizationException, FilesException - { - return listContainersInfo(-1, null); - } - - /** - * List the containers available in an account, ordered by container name. - * - * @param limit The maximum number of containers to return. -1 returns an unlimited number. - * - * @return null if the user is not logged in or the Account is not found. A List of FSContainers with all of the containers in the account. - * if there are no containers in the account, the list will be zero length. - * @throws IOException There was an IO error doing network communication - * @throws HttpException There was an error with the http protocol - * @throws FilesException There was another error in the request to the server. - * @throws FilesAuthorizationException The client's login was invalid. - */ - public List listContainersInfo(int limit) throws IOException, HttpException, FilesAuthorizationException, FilesException - { - return listContainersInfo(limit, null); - } - - /** - * List the containers available in an account, ordered by container name. - * - * @param limit The maximum number of containers to return. -1 returns an unlimited number. - * @param marker Return containers that occur after this lexicographically. - * - * @return null if the user is not logged in or the Account is not found. A List of FSContainers with all of the containers in the account. - * if there are no containers in the account, the list will be zero length. - * @throws IOException There was an IO error doing network communication - * @throws HttpException There was an error with the http protocol - * @throws FilesException There was another error in the request to the server. - * @throws FilesAuthorizationException The client's login was invalid. - */ - public List listContainersInfo(int limit, String marker) throws IOException, HttpException, FilesAuthorizationException, FilesException - { - if (!this.isLoggedin()) { - throw new FilesAuthorizationException("You must be logged in", null, null); - } - GetMethod method = null; - try { - method = new GetMethod(storageURL); - method.getParams().setSoTimeout(connectionTimeOut); - method.setRequestHeader(FilesConstants.X_AUTH_TOKEN, authToken); - - LinkedList parameters = new LinkedList(); - if(limit > 0) { - parameters.add(new NameValuePair("limit", String.valueOf(limit))); - } - if(marker != null) { - parameters.add(new NameValuePair("marker", marker)); - } - parameters.add(new NameValuePair("format", "xml")); - method.setQueryString(parameters.toArray(new NameValuePair[parameters.size()])); - client.executeMethod(method); - FilesResponse response = new FilesResponse(method); - - if (response.getStatusCode() == HttpStatus.SC_UNAUTHORIZED) { - method.removeRequestHeader(FilesConstants.X_AUTH_TOKEN); - if(login()) { - method = new GetMethod(storageURL); - method.getParams().setSoTimeout(connectionTimeOut); - method.setRequestHeader(FilesConstants.X_AUTH_TOKEN, authToken); - method.setQueryString(parameters.toArray(new NameValuePair[parameters.size()])); - client.executeMethod(method); - response = new FilesResponse(method); - } - else { - throw new FilesAuthorizationException("Re-login failed", response.getResponseHeaders(), response.getStatusLine()); - } - } - - if (response.getStatusCode() == HttpStatus.SC_OK) - { - DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); - DocumentBuilder builder = factory.newDocumentBuilder(); - Document document = builder.parse(response.getResponseBodyAsStream()); - - NodeList nodes = document.getChildNodes(); - Node accountNode = nodes.item(0); - if (! "account".equals(accountNode.getNodeName())) { - logger.error("Got unexpected type of XML"); - return null; - } - ArrayList containerList = new ArrayList(); - NodeList containerNodes = accountNode.getChildNodes(); - for(int i=0; i < containerNodes.getLength(); ++i) { - Node containerNode = containerNodes.item(i); - if(!"container".equals(containerNode.getNodeName())) continue; - String name = null; - int count = -1; - long size = -1; - NodeList objectData = containerNode.getChildNodes(); - for(int j=0; j < objectData.getLength(); ++j) { - Node data = objectData.item(j); - if ("name".equals(data.getNodeName())) { - name = data.getTextContent(); - } - else if ("bytes".equals(data.getNodeName())) { - size = Long.parseLong(data.getTextContent()); - } - else if ("count".equals(data.getNodeName())) { - count = Integer.parseInt(data.getTextContent()); - } - else { - logger.warn("Unexpected container-info tag:" + data.getNodeName()); - } - } - if (name != null) { - FilesContainerInfo obj = new FilesContainerInfo(name, count, size); - containerList.add(obj); - } - } - return containerList; - } - else if (response.getStatusCode() == HttpStatus.SC_NO_CONTENT) - { - return new ArrayList(); - } - else if (response.getStatusCode() == HttpStatus.SC_NOT_FOUND) - { - throw new FilesNotFoundException("Account not Found", response.getResponseHeaders(), response.getStatusLine()); - } - else { - throw new FilesException("Unexpected Return Code", response.getResponseHeaders(), response.getStatusLine()); - } - } - catch (Exception ex) { - throw new FilesException("Unexpected problem, probably in parsing Server XML", ex); - } - finally { - if (method != null) - method.releaseConnection(); - } - } - - /** - * List the containers available in an account. - * - * @return null if the user is not logged in or the Account is not found. A List of FilesContainer with all of the containers in the account. - * if there are no containers in the account, the list will be zero length. - * @throws IOException There was an IO error doing network communication - * @throws HttpException There was an error with the http protocol - * @throws FilesException There was another error in the request to the server. - * @throws FilesAuthorizationException The client's login was invalid. - */ - public List listContainers() throws IOException, HttpException, FilesAuthorizationException, FilesException - { - return listContainers(-1, null); - } - /** - * List the containers available in an account. - * - * @param limit The maximum number of containers to return. -1 denotes no limit. - - * @return null if the user is not logged in or the Account is not found. A List of FilesContainer with all of the containers in the account. - * if there are no containers in the account, the list will be zero length. - * @throws IOException There was an IO error doing network communication - * @throws HttpException There was an error with the http protocol - * @throws FilesException There was another error in the request to the server. - * @throws FilesAuthorizationException The client's login was invalid. - */ - public List listContainers(int limit) throws IOException, HttpException, FilesAuthorizationException, FilesException - { - return listContainers(limit, null); - } - - /** - * List the containers available in an account. - * - * @param limit The maximum number of containers to return. -1 denotes no limit. - * @param marker Only return containers after this container. Null denotes starting at the beginning (lexicographically). - * - * @return A List of FilesContainer with all of the containers in the account. - * if there are no containers in the account, the list will be zero length. - * @throws IOException There was an IO error doing network communication - * @throws HttpException There was an error with the http protocol - * @throws FilesException There was another error in the request to the server. - * @throws FilesAuthorizationException The client's login was invalid. - */ - public List listContainers(int limit, String marker) throws IOException, HttpException, FilesException - { - if (!this.isLoggedin()) { - throw new FilesAuthorizationException("You must be logged in", null, null); - } - GetMethod method = null; - try { - method = new GetMethod(storageURL); - method.getParams().setSoTimeout(connectionTimeOut); - method.setRequestHeader(FilesConstants.X_AUTH_TOKEN, authToken); - LinkedList parameters = new LinkedList(); - - if(limit > 0) { - parameters.add(new NameValuePair("limit", String.valueOf(limit))); - } - if(marker != null) { - parameters.add(new NameValuePair("marker", marker)); - } - - if (parameters.size() > 0) { - method.setQueryString(parameters.toArray(new NameValuePair[parameters.size()])); - } - client.executeMethod(method); - FilesResponse response = new FilesResponse(method); - - if (response.getStatusCode() == HttpStatus.SC_UNAUTHORIZED) { - method.releaseConnection(); - if(login()) { - method = new GetMethod(storageURL); - method.getParams().setSoTimeout(connectionTimeOut); - method.setRequestHeader(FilesConstants.X_AUTH_TOKEN, authToken); - if (parameters.size() > 0) { - method.setQueryString(parameters.toArray(new NameValuePair[parameters.size()])); - } - client.executeMethod(method); - response = new FilesResponse(method); - } - else { - throw new FilesAuthorizationException("Re-login failed", response.getResponseHeaders(), response.getStatusLine()); - } - } - - if (response.getStatusCode() == HttpStatus.SC_OK) - { - // logger.warn(method.getResponseCharSet()); - StrTokenizer tokenize = new StrTokenizer(inputStreamToString(response.getResponseBodyAsStream(), method.getResponseCharSet())); - tokenize.setDelimiterString("\n"); - String [] containers = tokenize.getTokenArray(); - ArrayList containerList = new ArrayList(); - for(String container : containers) { - containerList.add(new FilesContainer(container, this)); - } - return containerList; - } - else if (response.getStatusCode() == HttpStatus.SC_NO_CONTENT) - { - return new ArrayList(); - } - else if (response.getStatusCode() == HttpStatus.SC_NOT_FOUND) - { - throw new FilesNotFoundException("Account was not found", response.getResponseHeaders(), response.getStatusLine()); - } - else { - throw new FilesException("Unexpected resposne from server", response.getResponseHeaders(), response.getStatusLine()); - } - } - catch (Exception ex) { - throw new FilesException("Unexpected error, probably parsing Server XML", ex); - } - finally { - if (method != null) method.releaseConnection(); - } - } - - /** - * List all of the objects in a container with the given starting string. - * - * @param container The container name - * @param startsWith The string to start with - * @param path Only look for objects in this path - * @param limit Return at most limit objects - * @param marker Returns objects lexicographically greater than marker. Used in conjunction with limit to paginate the list. - * - * @return A list of FilesObjects starting with the given string - * @throws IOException There was an IO error doing network communication - * @throws HttpException There was an error with the http protocol - * @throws FilesException There was another error in the request to the server. - * @throws FilesAuthorizationException The client's login was invalid. - */ - public List listObjectsStaringWith (String container, String startsWith, String path, int limit, String marker) throws IOException, HttpException, FilesException - { - if (!this.isLoggedin()) { - throw new FilesAuthorizationException("You must be logged in", null, null); - } - if (!isValidContianerName(container)) { - throw new FilesInvalidNameException(container); - } - GetMethod method = null; - try { - method = new GetMethod(storageURL+"/"+sanitizeForURI(container)); - method.getParams().setSoTimeout(connectionTimeOut); - method.setRequestHeader(FilesConstants.X_AUTH_TOKEN, authToken); - - LinkedList parameters = new LinkedList(); - parameters.add(new NameValuePair ("format", "xml")); - if (startsWith != null) { - parameters.add(new NameValuePair (FilesConstants.LIST_CONTAINER_NAME_QUERY, startsWith)); - } - if(path != null) { - parameters.add(new NameValuePair("path", path)); - } - if(limit > 0) { - parameters.add(new NameValuePair("limit", String.valueOf(limit))); - } - if(marker != null) { - parameters.add(new NameValuePair("marker", marker)); - } - - if (parameters.size() > 0) { - method.setQueryString(parameters.toArray(new NameValuePair[parameters.size()])); - } - client.executeMethod(method); - FilesResponse response = new FilesResponse(method); - - if (response.getStatusCode() == HttpStatus.SC_UNAUTHORIZED) { - method.removeRequestHeader(FilesConstants.X_AUTH_TOKEN); - if(login()) { - method = new GetMethod(storageURL+"/"+sanitizeForURI(container)); - method.getParams().setSoTimeout(connectionTimeOut); - method.setRequestHeader(FilesConstants.X_AUTH_TOKEN, authToken); - if (parameters.size() > 0) { - method.setQueryString(parameters.toArray(new NameValuePair[parameters.size()])); - } - client.executeMethod(method); - response = new FilesResponse(method); - } - else { - throw new FilesAuthorizationException("Re-login failed", response.getResponseHeaders(), response.getStatusLine()); - } - } - - if (response.getStatusCode() == HttpStatus.SC_OK) - { - DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); - DocumentBuilder builder = factory.newDocumentBuilder(); - Document document = builder.parse(response.getResponseBodyAsStream()); - - NodeList nodes = document.getChildNodes(); - Node containerList = nodes.item(0); - if (! "container".equals(containerList.getNodeName())) { - logger.error("Got unexpected type of XML"); - return null; - } - ArrayList objectList = new ArrayList(); - NodeList objectNodes = containerList.getChildNodes(); - for(int i=0; i < objectNodes.getLength(); ++i) { - Node objectNode = objectNodes.item(i); - if(!"object".equals(objectNode.getNodeName())) continue; - String name = null; - String eTag = null; - long size = -1; - String mimeType = null; - String lastModified = null; - NodeList objectData = objectNode.getChildNodes(); - for(int j=0; j < objectData.getLength(); ++j) { - Node data = objectData.item(j); - if ("name".equals(data.getNodeName())) { - name = data.getTextContent(); - } - else if ("content_type".equals(data.getNodeName())) { - mimeType = data.getTextContent(); - } - else if ("hash".equals(data.getNodeName())) { - eTag = data.getTextContent(); - } - else if ("bytes".equals(data.getNodeName())) { - size = Long.parseLong(data.getTextContent()); - } - else if ("last_modified".equals(data.getNodeName())) { - lastModified = data.getTextContent(); - } - else { - logger.warn("Unexpected tag:" + data.getNodeName()); - } - } - if (name != null) { - FilesObject obj = new FilesObject(name, container, this); - if (eTag != null) obj.setMd5sum(eTag); - if (mimeType != null) obj.setMimeType(mimeType); - if (size > 0) obj.setSize(size); - if (lastModified != null) obj.setLastModified(lastModified); - objectList.add(obj); - } - } - return objectList; - } - else if (response.getStatusCode() == HttpStatus.SC_NO_CONTENT) - { - logger.debug ("Container "+container+" has no Objects"); - return new ArrayList(); - } - else if (response.getStatusCode() == HttpStatus.SC_NOT_FOUND) - { - throw new FilesNotFoundException("Container was not found", response.getResponseHeaders(), response.getStatusLine()); - } - else { - throw new FilesException("Unexpected Server Result", response.getResponseHeaders(), response.getStatusLine()); - } - } - catch (Exception ex) { - logger.error("Error parsing xml", ex); - throw new FilesException("Error parsing server resposne", ex); - } - finally { - if (method != null) method.releaseConnection(); - } - } - - /** - * List the objects in a container in lexicographic order. - * - * @param container The container name - * - * @return A list of FilesObjects starting with the given string - * @throws IOException There was an IO error doing network communication - * @throws HttpException There was an error with the http protocol - * @throws FilesException There was another error in the request to the server. - * @throws FilesAuthorizationException The client's login was invalid. - */ - public List listObjects(String container) throws IOException, HttpException, FilesAuthorizationException, FilesException { - return listObjectsStaringWith(container, null, null, -1, null); - } - - /** - * List the objects in a container in lexicographic order. - * - * @param container The container name - * @param limit Return at most limit objects - * - * @return A list of FilesObjects starting with the given string - * @throws IOException There was an IO error doing network communication - * @throws HttpException There was an error with the http protocol - * @throws FilesException There was another error in the request to the server. - * @throws FilesAuthorizationException The client's login was invalid. - */ - public List listObjects(String container, int limit) throws IOException, HttpException, FilesAuthorizationException, FilesException { - return listObjectsStaringWith(container, null, null, limit, null); - } - - /** - * List the objects in a container in lexicographic order. - * - * @param container The container name - * @param path Only look for objects in this path - * - * @return A list of FilesObjects starting with the given string - * @throws IOException There was an IO error doing network communication - * @throws HttpException There was an error with the http protocol - * @throws FilesException There was another error in the request to the server. - */ - public List listObjects(String container, String path) throws IOException, HttpException, FilesAuthorizationException, FilesException { - return listObjectsStaringWith(container, null, path, -1, null); - } - - /** - * List the objects in a container in lexicographic order. - * - * @param container The container name - * @param path Only look for objects in this path - * @param limit Return at most limit objects - * @param marker Returns objects lexicographically greater than marker. Used in conjunction with limit to paginate the list. - * - * @return A list of FilesObjects starting with the given string - * @throws IOException There was an IO error doing network communication - * @throws HttpException There was an error with the http protocol - * @throws FilesException There was another error in the request to the server. - * @throws FilesAuthorizationException The client's login was invalid. - */ - public List listObjects(String container, String path, int limit) throws IOException, HttpException, FilesAuthorizationException, FilesException { - return listObjectsStaringWith(container, null, path, limit, null); - } - - /** - * List the objects in a container in lexicographic order. - * - * @param container The container name - * @param path Only look for objects in this path - * @param limit Return at most limit objects - * @param marker Returns objects lexicographically greater than marker. Used in conjunction with limit to paginate the list. - * - * @return A list of FilesObjects starting with the given string - * @throws IOException There was an IO error doing network communication - * @throws HttpException There was an error with the http protocol - * @throws FilesException There was another error in the request to the server. - */ - public List listObjects(String container, String path, int limit, String marker) throws IOException, HttpException, FilesAuthorizationException, FilesException { - return listObjectsStaringWith(container, null, path, limit, marker); - } - - /** - * List the objects in a container in lexicographic order. - * - * @param container The container name - * @param limit Return at most limit objects - * @param marker Returns objects lexicographically greater than marker. Used in conjunction with limit to paginate the list. - * - * @return A list of FilesObjects starting with the given string - * @throws IOException There was an IO error doing network communication - * @throws HttpException There was an error with the http protocol - * @throws FilesException There was another error in the request to the server. - * @throws FilesAuthorizationException The client's login was invalid. - */ - public List listObjects(String container, int limit, String marker) throws IOException, HttpException, FilesAuthorizationException, FilesException { - return listObjectsStaringWith(container, null, null, limit, marker); - } - - /** - * Convenience method to test for the existence of a container in Cloud Files. - * - * @param container - * @return true if the container exists. false otherwise. - * @throws IOException - * @throws IOException There was an IO error doing network communication - * @throws HttpException There was an error with the http protocol - */ - public boolean containerExists (String container) throws IOException, HttpException - { - try { - this.getContainerInfo(container); - return true; - } - catch(FilesException fnfe) { - return false; - } - } - - /** - * Gets information for the given account. - * - * @return The FilesAccountInfo with information about the number of containers and number of bytes used - * by the given account. - * @throws IOException There was an IO error doing network communication - * @throws HttpException There was an error with the http protocol - * @throws FilesException There was another error in the request to the server. - * @throws FilesAuthorizationException The client's login was invalid. - */ - public FilesAccountInfo getAccountInfo() throws IOException, HttpException, FilesAuthorizationException, FilesException - { - if (this.isLoggedin()) { - HeadMethod method = new HeadMethod(storageURL); - method.getParams().setSoTimeout(connectionTimeOut); - method.setRequestHeader(FilesConstants.X_AUTH_TOKEN, authToken); - client.executeMethod(method); - - FilesResponse response = new FilesResponse(method); - if (response.getStatusCode() == HttpStatus.SC_UNAUTHORIZED) { - method.removeRequestHeader(FilesConstants.X_AUTH_TOKEN); - if(login()) { - method = new HeadMethod(storageURL); - method.getParams().setSoTimeout(connectionTimeOut); - method.setRequestHeader(FilesConstants.X_AUTH_TOKEN, authToken); - client.executeMethod(method); - response = new FilesResponse(method); - } - else { - throw new FilesAuthorizationException("Re-login failed", response.getResponseHeaders(), response.getStatusLine()); - } - } - - if (response.getStatusCode() == HttpStatus.SC_NO_CONTENT) - { - int nContainers = response.getAccountContainerCount(); - long totalSize = response.getAccountBytesUsed(); - return new FilesAccountInfo(totalSize,nContainers); - } - else { - throw new FilesException("Unexpected return from server", response.getResponseHeaders(), response.getStatusLine()); - } - } - else { - throw new FilesAuthorizationException("You must be logged in", null, null); - } - } - - /** - * Get basic information on a container (number of items and the total size). - * - * @param container The container to get information for - * @return ContainerInfo object of the container is present or null if its not present - * @throws IOException There was a socket level exception while talking to CloudFiles - * @throws HttpException There was an protocol level exception while talking to Cloudfiles - * @throws FilesNotFoundException The container was not found - * @throws FilesAuthorizationException The client was not logged in or the log in expired. - */ - public FilesContainerInfo getContainerInfo (String container) throws IOException, HttpException, FilesException - { - if (this.isLoggedin()) - { - if (isValidContianerName(container)) - { - - HeadMethod method = null; - try { - method = new HeadMethod(storageURL+"/"+sanitizeForURI(container)); - method.getParams().setSoTimeout(connectionTimeOut); - method.setRequestHeader(FilesConstants.X_AUTH_TOKEN, authToken); - client.executeMethod(method); - - FilesResponse response = new FilesResponse(method); - - if (response.getStatusCode() == HttpStatus.SC_UNAUTHORIZED) { - method.removeRequestHeader(FilesConstants.X_AUTH_TOKEN); - if(login()) { - method = new HeadMethod(storageURL+"/"+sanitizeForURI(container)); - method.getParams().setSoTimeout(connectionTimeOut); - method.setRequestHeader(FilesConstants.X_AUTH_TOKEN, authToken); - client.executeMethod(method); - response = new FilesResponse(method); - } - else { - throw new FilesAuthorizationException("Re-login failed", response.getResponseHeaders(), response.getStatusLine()); - } - } - - if (response.getStatusCode() == HttpStatus.SC_NO_CONTENT) - { - int objCount = response.getContainerObjectCount(); - long objSize = response.getContainerBytesUsed(); - return new FilesContainerInfo(container, objCount,objSize); - } - else if (response.getStatusCode() == HttpStatus.SC_NOT_FOUND) - { - throw new FilesNotFoundException("Container not found: " + container, response.getResponseHeaders(), response.getStatusLine()); - } - else { - throw new FilesException("Unexpected result from server", response.getResponseHeaders(), response.getStatusLine()); - } - } - finally { - if (method != null) method.releaseConnection(); - } - } - else - { - throw new FilesInvalidNameException(container); - } - } - else - throw new FilesAuthorizationException("You must be logged in", null, null); - } - - - /** - * Creates a container - * - * @param name The name of the container to be created - * @throws IOException There was an IO error doing network communication - * @throws HttpException There was an error with the http protocol - * @throws FilesAuthorizationException The client was not property logged in - * @throws FilesInvalidNameException The container name was invalid - */ - public void createContainer(String name) throws IOException, HttpException, FilesAuthorizationException, FilesException - { - if (this.isLoggedin()) - { - if (isValidContianerName(name)) - { - // logger.warn(name + ":" + sanitizeForURI(name)); - PutMethod method = new PutMethod(storageURL+"/"+sanitizeForURI(name)); - method.getParams().setSoTimeout(connectionTimeOut); - method.setRequestHeader(FilesConstants.X_AUTH_TOKEN, authToken); - - try { - client.executeMethod(method); - - FilesResponse response = new FilesResponse(method); - - if (response.getStatusCode() == HttpStatus.SC_UNAUTHORIZED) { - method.releaseConnection(); - if(login()) { - method = new PutMethod(storageURL+"/"+sanitizeForURI(name)); - method.getParams().setSoTimeout(connectionTimeOut); - method.setRequestHeader(FilesConstants.X_AUTH_TOKEN, authToken); - client.executeMethod(method); - response = new FilesResponse(method); - } - else { - throw new FilesAuthorizationException("Re-login failed", response.getResponseHeaders(), response.getStatusLine()); - } - } - - if (response.getStatusCode() == HttpStatus.SC_CREATED) - { - return; - } - else if (response.getStatusCode() == HttpStatus.SC_ACCEPTED) - { - throw new FilesContainerExistsException(name, response.getResponseHeaders(), response.getStatusLine()); - } - else { - throw new FilesException("Unexpected Response", response.getResponseHeaders(), response.getStatusLine()); - } - } - finally { - method.releaseConnection(); - } - } - else - { - throw new FilesInvalidNameException(name); - } - } - else { - throw new FilesAuthorizationException("You must be logged in", null, null); - } - } - - /** - * Deletes a container - * - * @param name The name of the container - * @throws IOException There was an IO error doing network communication - * @throws HttpException There was an error with the http protocol - * @throws FilesAuthorizationException The user is not Logged in - * @throws FilesInvalidNameException The container name is invalid - * @throws FilesNotFoundException The container doesn't exist - * @throws FilesContainerNotEmptyException The container was not empty - */ - public boolean deleteContainer(String name) throws IOException, HttpException, FilesAuthorizationException, FilesInvalidNameException, FilesNotFoundException, FilesContainerNotEmptyException - { - if (this.isLoggedin()) - { - if (isValidContianerName(name)) - { - DeleteMethod method = new DeleteMethod(storageURL+"/"+sanitizeForURI(name)); - try { - method.getParams().setSoTimeout(connectionTimeOut); - method.setRequestHeader(FilesConstants.X_AUTH_TOKEN, authToken); - client.executeMethod(method); - FilesResponse response = new FilesResponse(method); - - if (response.getStatusCode() == HttpStatus.SC_UNAUTHORIZED) { - method.releaseConnection(); - if(login()) { - method = new DeleteMethod(storageURL+"/"+sanitizeForURI(name)); - method.getParams().setSoTimeout(connectionTimeOut); - method.setRequestHeader(FilesConstants.X_AUTH_TOKEN, authToken); - client.executeMethod(method); - response = new FilesResponse(method); - } - else { - throw new FilesAuthorizationException("Re-login failed", response.getResponseHeaders(), response.getStatusLine()); - } - } - - if (response.getStatusCode() == HttpStatus.SC_NO_CONTENT) - { - logger.debug ("Container Deleted : "+name); - return true; - } - else if (response.getStatusCode() == HttpStatus.SC_NOT_FOUND) - { - logger.debug ("Container does not exist !"); - throw new FilesNotFoundException("You can't delete an non-empty container", response.getResponseHeaders(), response.getStatusLine()); - } - else if (response.getStatusCode() == HttpStatus.SC_CONFLICT) - { - logger.debug ("Container is not empty, can not delete a none empty container !"); - throw new FilesContainerNotEmptyException("You can't delete an non-empty container", response.getResponseHeaders(), response.getStatusLine()); - } - } - finally { - method.releaseConnection(); - } - } - else - { - throw new FilesInvalidNameException(name); - } - } - else - { - throw new FilesAuthorizationException("You must be logged in", null, null); - } - return false; - } - - /** - * Enables access of files in this container via the Content Delivery Network. - * - * @param name The name of the container to enable - * @return The CDN Url of the container - * @throws IOException There was an IO error doing network communication - * @throws HttpException There was an error with the http protocol - * @throws FilesException There was an error talking to the CDN Server. - */ - public String cdnEnableContainer(String name) throws IOException, HttpException, FilesException - { - String returnValue = null; - if (this.isLoggedin()) - { - if (isValidContianerName(name)) - { - PutMethod method = null; - try { - method = new PutMethod(cdnManagementURL+"/"+sanitizeForURI(name)); - method.getParams().setSoTimeout(connectionTimeOut); - method.setRequestHeader(FilesConstants.X_AUTH_TOKEN, authToken); - client.executeMethod(method); - - FilesResponse response = new FilesResponse(method); - - if (response.getStatusCode() == HttpStatus.SC_UNAUTHORIZED) { - method.releaseConnection(); - if(login()) { - method = new PutMethod(cdnManagementURL+"/"+sanitizeForURI(name)); - method.getParams().setSoTimeout(connectionTimeOut); - method.setRequestHeader(FilesConstants.X_AUTH_TOKEN, authToken); - client.executeMethod(method); - response = new FilesResponse(method); - } - else { - throw new FilesAuthorizationException("Re-login failed", response.getResponseHeaders(), response.getStatusLine()); - } - } - - if (response.getStatusCode() == HttpStatus.SC_CREATED || response.getStatusCode() == HttpStatus.SC_ACCEPTED) - { - returnValue = response.getCdnUrl(); - } - else if (response.getStatusCode() == HttpStatus.SC_UNAUTHORIZED) { - logger.warn("Unauthorized access"); - throw new FilesAuthorizationException("User not Authorized!",response.getResponseHeaders(), response.getStatusLine()); - } - else { - throw new FilesException("Unexpected Server Response",response.getResponseHeaders(), response.getStatusLine()); - } - } - finally { - method.releaseConnection(); - } - } - else - { - throw new FilesInvalidNameException(name); - } - } - else - { - throw new FilesAuthorizationException("You must be logged in", null, null); - } - return returnValue; - } - - /** - * Enables access of files in this container via the Content Delivery Network. - * - * @param name The name of the container to enable - * @param ttl How long the CDN can use the content before checking for an update. A negative value will result in this not being changed. - * @param enabled True if this folder should be accessible, false otherwise - * @return The CDN Url of the container - * @throws IOException There was an IO error doing network communication - * @throws HttpException There was an error with the http protocol - * @throws FilesException There was an error talking to the CDN Service - */ - /* - * @param referrerAcl Unused for now - * @param userAgentACL Unused for now - */ -// private String cdnUpdateContainer(String name, int ttl, boolean enabled, String referrerAcl, String userAgentACL) - public String cdnUpdateContainer(String name, int ttl, boolean enabled) - throws IOException, HttpException, FilesException - { - String returnValue = null; - if (this.isLoggedin()) - { - if (isValidContianerName(name)) - { - PostMethod method = null; - try { - method = new PostMethod(cdnManagementURL+"/"+sanitizeForURI(name)); - - method.getParams().setSoTimeout(connectionTimeOut); - method.setRequestHeader(FilesConstants.X_AUTH_TOKEN, authToken); - // TTL - if (ttl > 0) { - method.setRequestHeader(FilesConstants.X_CDN_TTL, Integer.toString(ttl)); - } - // Enabled - method.setRequestHeader(FilesConstants.X_CDN_ENABLED, Boolean.toString(enabled)); - -// // Referrer ACL -// if(referrerAcl != null) { -// method.setRequestHeader(FilesConstants.X_CDN_REFERRER_ACL, referrerAcl); -// } - -// // User Agent ACL -// if(userAgentACL != null) { -// method.setRequestHeader(FilesConstants.X_CDN_USER_AGENT_ACL, userAgentACL); -// } - client.executeMethod(method); - - FilesResponse response = new FilesResponse(method); - - if (response.getStatusCode() == HttpStatus.SC_UNAUTHORIZED) { - method.releaseConnection(); - if(login()) { - new PostMethod(cdnManagementURL+"/"+sanitizeForURI(name)); - method.getParams().setSoTimeout(connectionTimeOut); - method.setRequestHeader(FilesConstants.X_AUTH_TOKEN, authToken); - // TTL - if (ttl > 0) { - method.setRequestHeader(FilesConstants.X_CDN_TTL, Integer.toString(ttl)); - } - // Enabled - method.setRequestHeader(FilesConstants.X_CDN_ENABLED, Boolean.toString(enabled)); - - client.executeMethod(method); - response = new FilesResponse(method); - } - else { - throw new FilesAuthorizationException("Re-login failed", response.getResponseHeaders(), response.getStatusLine()); - } - } - - if (response.getStatusCode() == HttpStatus.SC_ACCEPTED) - { - returnValue = response.getCdnUrl(); - } - else if (response.getStatusCode() == HttpStatus.SC_UNAUTHORIZED) { - logger.warn("Unauthorized access"); - throw new FilesAuthorizationException("User not Authorized!",response.getResponseHeaders(), response.getStatusLine()); - } - else { - throw new FilesException("Unexpected Server Response",response.getResponseHeaders(), response.getStatusLine()); - } - } finally { - if (method != null) { - method.releaseConnection(); - } - } - } - else - { - throw new FilesInvalidNameException(name); - } - } - else { - throw new FilesAuthorizationException("You must be logged in", null, null); - } - return returnValue; - } - - /* * - * Enables access of files in this container via the Content Delivery Network. - * - * @param name The name of the container to enable - * @param ttl How long the CDN can use the content before checking for an update. A negative value will result in this not being changed. - * @param enabled True if this folder should be accesible, false otherwise - * @return The CDN Url of the container - * @throws IOException There was an IO error doing network communication - * @throws HttpException There was an error with the http protocol - * @throws FilesAuthorizationException Authentication failed - */ -// public String cdnUpdateContainer(String name, int ttl, boolean enabled) throws IOException, HttpException, FilesAuthorizationException -// { -// return cdnUpdateContainer(name, ttl, enabled, (String) null, (String) null); -// } - - /** - * Gets current CDN sharing status of the container - * - * @param name The name of the container to enable - * @return Information on the container - * @throws IOException There was an IO error doing network communication - * @throws HttpException There was an error with the http protocol - * @throws FilesException There was an error talking to the CloudFiles Server - */ - public FilesCDNContainer getCDNContainerInfo(String container) throws IOException, HttpException, FilesException - { - if (isLoggedin()) { - if (isValidContianerName(container)) - { - HeadMethod method = null; - try { - method= new HeadMethod(cdnManagementURL+"/"+sanitizeForURI(container)); - method.getParams().setSoTimeout(connectionTimeOut); - method.setRequestHeader(FilesConstants.X_AUTH_TOKEN, authToken); - client.executeMethod(method); - - FilesResponse response = new FilesResponse(method); - - if (response.getStatusCode() == HttpStatus.SC_UNAUTHORIZED) { - method.releaseConnection(); - if(login()) { - method= new HeadMethod(cdnManagementURL+"/"+sanitizeForURI(container)); - method.getParams().setSoTimeout(connectionTimeOut); - method.setRequestHeader(FilesConstants.X_AUTH_TOKEN, authToken); - client.executeMethod(method); - response = new FilesResponse(method); - } - else { - throw new FilesAuthorizationException("Re-login failed", response.getResponseHeaders(), response.getStatusLine()); - } - } - - if (response.getStatusCode() == HttpStatus.SC_NO_CONTENT) - { - FilesCDNContainer result = new FilesCDNContainer(response.getCdnUrl()); - result.setName(container); - for (Header hdr : response.getResponseHeaders()) { - String name = hdr.getName().toLowerCase(); - if ("x-cdn-enabled".equals(name)) { - result.setEnabled(Boolean.valueOf(hdr.getValue())); - } - else if ("x-ttl".equals(name)) { - result.setTtl(Integer.parseInt(hdr.getValue())); - } - } - return result; - } - else if (response.getStatusCode() == HttpStatus.SC_UNAUTHORIZED) { - logger.warn("Unauthorized access"); - throw new FilesAuthorizationException("User not Authorized!",response.getResponseHeaders(), response.getStatusLine()); - } - else { - throw new FilesException("Unexpected result from server: ", response.getResponseHeaders(), response.getStatusLine()); - } - } - finally { - if (method != null) { - method.releaseConnection(); - } - } - } - else - { - throw new FilesInvalidNameException(container); - } - } - else { - throw new FilesAuthorizationException("You must be logged in", null, null); - } - } - - /* * - * Not currently used (but soon will be) - * @param container - */ - // public void purgeCDNContainer(String container) { -/// // Stub -// } - - /* * - * Not currently used (but soon will be) - * @param container - */ -// public void purgeCDNObject(String container, String object) { - // // Stub -// } - - /** - * Creates a path (but not any of the sub portions of the path) - * - * @param container The name of the container. - * @param path The name of the Path - * @throws HttpException There was an error at the protocol layer while talking to CloudFiles - * @throws IOException There was an error at the socket layer while talking to CloudFiles - * @throws FilesException There was another error while taking to the CloudFiles server - */ - public void createPath(String container, String path) throws HttpException, IOException, FilesException { - - if (!isValidContianerName(container)) - throw new FilesInvalidNameException(container); - if (!isValidObjectName(path)) - throw new FilesInvalidNameException(path); - storeObject(container, new byte[0], "application/directory", path, - new HashMap()); - } - - /** - * Create all of the path elements for the entire tree for a given path. Thus, createFullPath("myContainer", "foo/bar/baz") - * creates the paths "foo", "foo/bar" and "foo/bar/baz". - * - * @param container The name of the container - * @param path The full name of the path - * @throws HttpException There was an error at the protocol layer while talking to CloudFiles - * @throws IOException There was an error at the socket layer while talking to CloudFiles - * @throws FilesException There was another error while taking to the CloudFiles server - */ - public void createFullPath(String container, String path) throws HttpException, IOException, FilesException { - String parts[] = path.split("/"); - - for(int i=0; i < parts.length; ++i) { - StringBuilder sb = new StringBuilder(); - for (int j=0; j <= i; ++j) { - if (sb.length() != 0) - sb.append("/"); - sb.append(parts[j]); - } - createPath(container, sb.toString()); - } - - } - - /** - * Gets the names of all of the containers associated with this account. - * - * @param limit The maximum number of container names to return - * @return A list of container names - * - * @throws IOException There was an IO error doing network communication - * @throws HttpException There was an error with the http protocol - * @throws FilesException - */ - public List listCdnContainers(int limit) throws IOException, HttpException, FilesException - { - return listCdnContainers(limit, null); - } - - /** - * Gets the names of all of the containers associated with this account. - * - * @return A list of container names - * - * @throws IOException There was an IO error doing network communication - * @throws HttpException There was an error with the http protocol - * @throws FilesException - */ - public List listCdnContainers() throws IOException, HttpException, FilesException - { - return listCdnContainers(-1, null); - } - - - /** - * Gets the names of all of the containers associated with this account. - * - * @param limit The maximum number of container names to return - * @param marker All of the results will come after marker lexicographically. - * @return A list of container names - * - * @throws IOException There was an IO error doing network communication - * @throws HttpException There was an error with the http protocol - * @throws FilesException - */ - public List listCdnContainers(int limit, String marker) throws IOException, HttpException, FilesException - { - if (this.isLoggedin()) - { - GetMethod method = null; - try { - method = new GetMethod(cdnManagementURL); - method.getParams().setSoTimeout(connectionTimeOut); - method.setRequestHeader(FilesConstants.X_AUTH_TOKEN, authToken); - LinkedList params = new LinkedList(); - if (limit > 0) { - params.add(new NameValuePair("limit", String.valueOf(limit))); - } - if (marker != null) { - params.add(new NameValuePair("marker", marker)); - } - if (params.size() > 0) { - method.setQueryString(params.toArray(new NameValuePair[params.size()])); - } - client.executeMethod(method); - FilesResponse response = new FilesResponse(method); - - if (response.getStatusCode() == HttpStatus.SC_UNAUTHORIZED) { - method.releaseConnection(); - if(login()) { - method = new GetMethod(cdnManagementURL); - method.getParams().setSoTimeout(connectionTimeOut); - method.setRequestHeader(FilesConstants.X_AUTH_TOKEN, authToken); - if (params.size() > 0) { - method.setQueryString(params.toArray(new NameValuePair[params.size()])); - } - client.executeMethod(method); - response = new FilesResponse(method); - } - else { - throw new FilesAuthorizationException("Re-login failed", response.getResponseHeaders(), response.getStatusLine()); - } - } - - if (response.getStatusCode() == HttpStatus.SC_OK) - { - StrTokenizer tokenize = new StrTokenizer(inputStreamToString(response.getResponseBodyAsStream(), method.getResponseCharSet())); - tokenize.setDelimiterString("\n"); - String [] containers = tokenize.getTokenArray(); - List returnValue = new ArrayList(); - for (String containerName: containers) - { - returnValue.add(containerName); - } - return returnValue; - } - else if (response.getStatusCode() == HttpStatus.SC_UNAUTHORIZED) { - logger.warn("Unauthorized access"); - throw new FilesAuthorizationException("User not Authorized!",response.getResponseHeaders(), response.getStatusLine()); - } - else { - throw new FilesException("Unexpected server response",response.getResponseHeaders(), response.getStatusLine()); - } - } - finally { - if (method != null) method.releaseConnection(); - } - } - else { - throw new FilesAuthorizationException("You must be logged in", null, null); - } - } - - /** - * Gets list of all of the containers associated with this account. - * - * @return A list of containers - * - * @throws IOException There was an IO error doing network communication - * @throws HttpException There was an error with the http protocol - * @throws FilesException - */ - public List listCdnContainerInfo() throws IOException, HttpException, FilesException - { - return listCdnContainerInfo(-1, null); - } - /** - * Gets list of all of the containers associated with this account. - * - * @param limit The maximum number of container names to return - * @return A list of containers - * - * @throws IOException There was an IO error doing network communication - * @throws HttpException There was an error with the http protocol - * @throws FilesException - */ - public List listCdnContainerInfo(int limit) throws IOException, HttpException, FilesException - { - return listCdnContainerInfo(limit, null); - } - /** - * Gets list of all of the containers associated with this account. - * - * @param limit The maximum number of container names to return - * @param marker All of the names will come after marker lexicographically. - * @return A list of containers - * - * @throws IOException There was an IO error doing network communication - * @throws HttpException There was an error with the http protocol - * @throws FilesException - */ - public List listCdnContainerInfo(int limit, String marker) throws IOException, HttpException, FilesException - { - if (this.isLoggedin()) - { - GetMethod method = null; - try { - method = new GetMethod(cdnManagementURL); - method.getParams().setSoTimeout(connectionTimeOut); - method.setRequestHeader(FilesConstants.X_AUTH_TOKEN, authToken); - LinkedList params = new LinkedList(); - params.add(new NameValuePair("format", "xml")); - if (limit > 0) { - params.add(new NameValuePair("limit", String.valueOf(limit))); - } - if (marker != null) { - params.add(new NameValuePair("marker", marker)); - } - method.setQueryString(params.toArray(new NameValuePair[params.size()])); - - client.executeMethod(method); - FilesResponse response = new FilesResponse(method); - - if (response.getStatusCode() == HttpStatus.SC_UNAUTHORIZED) { - method.releaseConnection(); - if(login()) { - method = new GetMethod(cdnManagementURL); - method.getParams().setSoTimeout(connectionTimeOut); - method.setRequestHeader(FilesConstants.X_AUTH_TOKEN, authToken); - method.setQueryString(params.toArray(new NameValuePair[params.size()])); - - client.executeMethod(method); - response = new FilesResponse(method); - } - else { - throw new FilesAuthorizationException("Re-login failed", response.getResponseHeaders(), response.getStatusLine()); - } - } - - if (response.getStatusCode() == HttpStatus.SC_OK) - { - DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); - DocumentBuilder builder = factory.newDocumentBuilder(); - Document document = builder.parse(response.getResponseBodyAsStream()); - - NodeList nodes = document.getChildNodes(); - Node accountNode = nodes.item(0); - if (! "account".equals(accountNode.getNodeName())) { - logger.error("Got unexpected type of XML"); - return null; - } - ArrayList containerList = new ArrayList(); - NodeList containerNodes = accountNode.getChildNodes(); - for(int i=0; i < containerNodes.getLength(); ++i) { - Node containerNode = containerNodes.item(i); - if(!"container".equals(containerNode.getNodeName())) continue; - FilesCDNContainer container = new FilesCDNContainer(); - NodeList objectData = containerNode.getChildNodes(); - for(int j=0; j < objectData.getLength(); ++j) { - Node data = objectData.item(j); - if ("name".equals(data.getNodeName())) { - container.setName(data.getTextContent()); - } - else if ("cdn_url".equals(data.getNodeName())) { - container.setCdnURL(data.getTextContent()); - } - else if ("cdn_enabled".equals(data.getNodeName())) { - container.setEnabled(Boolean.parseBoolean(data.getTextContent())); - } - else if ("ttl".equals(data.getNodeName())) { - container.setTtl(Integer.parseInt(data.getTextContent())); - } - else { - //logger.warn("Unexpected container-info tag:" + data.getNodeName()); - } - } - if (container.getName() != null) { - containerList.add(container); - } - } - return containerList; - } - else if (response.getStatusCode() == HttpStatus.SC_UNAUTHORIZED) { - logger.warn("Unauthorized access"); - throw new FilesAuthorizationException("User not Authorized!",response.getResponseHeaders(), response.getStatusLine()); - } - else { - throw new FilesException("Unexpected server response",response.getResponseHeaders(), response.getStatusLine()); - } - } - catch (SAXException ex) { - // probably a problem parsing the XML - throw new FilesException("Problem parsing XML", ex); - } - catch (ParserConfigurationException ex) { - // probably a problem parsing the XML - throw new FilesException("Problem parsing XML", ex); - } - finally { - if (method != null) method.releaseConnection(); - } - } - else { - throw new FilesAuthorizationException("You must be logged in", null, null); - } - } - - /** - * Store a file on the server - * - * @param container The name of the container - * @param obj The File containing the file to copy over - * @param contentType The MIME type of the file - * @param name The name of the file on the server - * @throws IOException There was an IO error doing network communication - * @throws HttpException There was an error with the http protocol - * @throws FilesException - */ - public boolean storeObjectAs (String container, File obj, String contentType, String name) throws IOException, HttpException, FilesException - { - return storeObjectAs(container, obj, contentType, name, new HashMap(), null); - } - - /** - * Store a file on the server - * - * @param container The name of the container - * @param obj The File containing the file to copy over - * @param contentType The MIME type of the file - * @param name The name of the file on the server - * @throws IOException There was an IO error doing network communication - * @throws HttpException There was an error with the http protocol - * @throws FilesException - */ - public boolean storeObjectAs (String container, File obj, String contentType, String name, IFilesTransferCallback callback) throws IOException, HttpException, FilesException - { - return storeObjectAs(container, obj, contentType, name, new HashMap(), callback); - } - - /** - * Store a file on the server, including metadata - * - * @param container The name of the container - * @param obj The File containing the file to copy over - * @param contentType The MIME type of the file - * @param name The name of the file on the server - * @param metadata A map with the metadata as key names and values as the metadata values - * @throws IOException There was an IO error doing network communication - * @throws HttpException There was an error with the http protocol - * @throws FilesAuthorizationException - */ - public boolean storeObjectAs (String container, File obj, String contentType, String name, Map metadata) throws IOException, HttpException, FilesException - { - return storeObjectAs (container, obj, contentType, name, metadata, null); - } - - /** - * Store a file on the server, including metadata - * - * @param container The name of the container - * @param obj The File containing the file to copy over - * @param contentType The MIME type of the file - * @param name The name of the file on the server - * @param metadata A map with the metadata as key names and values as the metadata values - * @param metadata The callback object that will be called as the data is sent - * @throws IOException There was an IO error doing network communication - * @throws HttpException There was an error with the http protocol - * @throws FilesException - */ - public boolean storeObjectAs (String container, File obj, String contentType, String name, Map metadata, IFilesTransferCallback callback) throws IOException, HttpException, FilesException - { - if (this.isLoggedin()) - { - if (isValidContianerName(container) && isValidObjectName(name) ) - { - if (!obj.exists()) - { - throw new FileNotFoundException(name + " does not exist"); - } - - if (obj.isDirectory()) - { - throw new IOException("The alleged file was a directory"); - } - - PutMethod method = null; - try { - method = new PutMethod(storageURL+"/"+sanitizeForURI(container)+"/"+sanitizeForURI(name)); - method.getParams().setSoTimeout(connectionTimeOut); - method.setRequestHeader(FilesConstants.X_AUTH_TOKEN, authToken); - if (useETag) { - method.setRequestHeader(FilesConstants.E_TAG, md5Sum (obj)); - } - method.setRequestEntity( new RequestEntityWrapper(new FileRequestEntity (obj, contentType), callback)); - for(String key : metadata.keySet()) { - method.setRequestHeader(FilesConstants.X_OBJECT_META + key, sanitizeForURI(metadata.get(key))); - } - client.executeMethod(method); - FilesResponse response = new FilesResponse(method); - - if (response.getStatusCode() == HttpStatus.SC_UNAUTHORIZED) { - method.releaseConnection(); - if(login()) { - method = new PutMethod(storageURL+"/"+sanitizeForURI(container)+"/"+sanitizeForURI(name)); - method.getParams().setSoTimeout(connectionTimeOut); - method.setRequestHeader(FilesConstants.X_AUTH_TOKEN, authToken); - if (useETag) { - method.setRequestHeader(FilesConstants.E_TAG, md5Sum (obj)); - } - method.setRequestEntity( new RequestEntityWrapper(new FileRequestEntity (obj, contentType), callback)); - for(String key : metadata.keySet()) { - method.setRequestHeader(FilesConstants.X_OBJECT_META + key, sanitizeForURI(metadata.get(key))); - } - client.executeMethod(method); - response = new FilesResponse(method); - } - else { - throw new FilesAuthorizationException("Re-login failed", response.getResponseHeaders(), response.getStatusLine()); - } - } - if (response.getStatusCode() == HttpStatus.SC_CREATED) - { - return true; - } - else if (response.getStatusCode() == HttpStatus.SC_PRECONDITION_FAILED) - { - throw new FilesException("Etag missmatch", response.getResponseHeaders(), response.getStatusLine()); - } - else if (response.getStatusCode() == HttpStatus.SC_LENGTH_REQUIRED) - { - throw new FilesException("Length miss-match", response.getResponseHeaders(), response.getStatusLine()); - } - else - { - throw new FilesException("Unexpected Server Response", response.getResponseHeaders(), response.getStatusLine()); - } - } - finally { - if (method != null) method.releaseConnection(); - } - } - else - { - if (!isValidObjectName(name)) { - throw new FilesInvalidNameException(name); - } - else { - throw new FilesInvalidNameException(container); - } - } - } - else { - throw new FilesAuthorizationException("You must be logged in", null, null); - } - } - - - /** - * Copies the file to Cloud Files, keeping the original file name in Cloud Files. - * - * @param container The name of the container to place the file in - * @param obj The File to transfer - * @param contentType The file's MIME type - * @throws IOException There was an IO error doing network communication - * @throws HttpException There was an error with the http protocol - * @throws FilesException - */ - public boolean storeObject (String container, File obj, String contentType) throws IOException, HttpException, FilesException - { - return storeObjectAs(container, obj, contentType, obj.getName()); - } - - /** - * Store a file on the server, including metadata - * - * @param container The name of the container - * @param obj The File containing the file to copy over - * @param contentType The MIME type of the file - * @param name The name of the file on the server - * @param metadata A map with the metadata as key names and values as the metadata values - * @throws IOException There was an IO error doing network communication - * @throws HttpException There was an error with the http protocol - * @throws FilesException - */ - public boolean storeObject(String container, byte obj[], String contentType, String name, Map metadata) throws IOException, HttpException, FilesException - { - return storeObject(container, obj, contentType, name, metadata, null); - } - - /** - * Store a file on the server, including metadata - * - * @param container The name of the container - * @param obj The File containing the file to copy over - * @param contentType The MIME type of the file - * @param name The name of the file on the server - * @param metadata A map with the metadata as key names and values as the metadata values - * @param callback The object to which any callbacks will be sent (null if you don't want callbacks) - * @throws IOException There was an IO error doing network communication - * @throws HttpException There was an error with the http protocol - * @throws FilesException - */ - public boolean storeObject(String container, byte obj[], String contentType, String name, Map metadata, IFilesTransferCallback callback) throws IOException, HttpException, FilesException - { - if (this.isLoggedin()) - { - String objName = name; - if (isValidContianerName(container) && isValidObjectName(objName)) - { - - PutMethod method = null; - try { - method = new PutMethod(storageURL+"/"+sanitizeForURI(container)+"/"+sanitizeForURI(objName)); - method.getParams().setSoTimeout(connectionTimeOut); - method.setRequestHeader(FilesConstants.X_AUTH_TOKEN, authToken); - if (useETag) { - method.setRequestHeader(FilesConstants.E_TAG, md5Sum (obj)); - } - method.setRequestEntity(new RequestEntityWrapper(new ByteArrayRequestEntity (obj, contentType), callback)); - for(String key : metadata.keySet()) { - // logger.warn("Key:" + key + ":" + sanitizeForURI(metadata.get(key))); - method.setRequestHeader(FilesConstants.X_OBJECT_META + key, sanitizeForURI(metadata.get(key))); - } - client.executeMethod(method); - FilesResponse response = new FilesResponse(method); - - if (response.getStatusCode() == HttpStatus.SC_UNAUTHORIZED) { - method.releaseConnection(); - if(login()) { - method = new PutMethod(storageURL+"/"+sanitizeForURI(container)+"/"+sanitizeForURI(objName)); - method.getParams().setSoTimeout(connectionTimeOut); - method.setRequestHeader(FilesConstants.X_AUTH_TOKEN, authToken); - if (useETag) { - method.setRequestHeader(FilesConstants.E_TAG, md5Sum (obj)); - } - method.setRequestEntity(new RequestEntityWrapper(new ByteArrayRequestEntity (obj, contentType), callback)); - for(String key : metadata.keySet()) { - method.setRequestHeader(FilesConstants.X_OBJECT_META + key, sanitizeForURI(metadata.get(key))); - } - client.executeMethod(method); - response = new FilesResponse(method); - } - else { - throw new FilesAuthorizationException("Re-login failed", response.getResponseHeaders(), response.getStatusLine()); - } - } - - if (response.getStatusCode() == HttpStatus.SC_CREATED) - { - return true; - } - else if (response.getStatusCode() == HttpStatus.SC_PRECONDITION_FAILED) - { - throw new FilesException("Etag missmatch", response.getResponseHeaders(), response.getStatusLine()); - } - else if (response.getStatusCode() == HttpStatus.SC_LENGTH_REQUIRED) - { - throw new FilesException("Length miss-match", response.getResponseHeaders(), response.getStatusLine()); - } - else - { - throw new FilesException("Unexpected Server Response", response.getResponseHeaders(), response.getStatusLine()); - } - } - finally{ - if (method != null) method.releaseConnection(); - } - } - else - { - if (!isValidObjectName(objName)) { - throw new FilesInvalidNameException(objName); - } - else { - throw new FilesInvalidNameException(container); - } - } - } - else { - throw new FilesAuthorizationException("You must be logged in", null, null); - } - } - - /** - * Store a file on the server, including metadata, with the contents coming from an input stream. This allows you to - * not know the entire length of your content when you start to write it. Nor do you have to hold it entirely in memory - * at the same time. - * - * @param container The name of the container - * @param data Any object that implements InputStream - * @param contentType The MIME type of the file - * @param name The name of the file on the server - * @param metadata A map with the metadata as key names and values as the metadata values - * @param callback The object to which any callbacks will be sent (null if you don't want callbacks) - * @throws IOException There was an IO error doing network communication - * @throws HttpException There was an error with the http protocol - * @throws FilesException - */ - public boolean storeStreamedObject(String container, InputStream data, String contentType, String name, Map metadata) throws IOException, HttpException, FilesException - { - if (this.isLoggedin()) - { - String objName = name; - if (isValidContianerName(container) && isValidObjectName(objName)) - { - PutMethod method = new PutMethod(storageURL+"/"+sanitizeForURI(container)+"/"+sanitizeForURI(objName)); - method.setContentChunked(true); - method.getParams().setSoTimeout(connectionTimeOut); - method.setRequestHeader(FilesConstants.X_AUTH_TOKEN, authToken); - method.setRequestEntity(new InputStreamRequestEntity(data, contentType)); - for(String key : metadata.keySet()) { - // logger.warn("Key:" + key + ":" + sanitizeForURI(metadata.get(key))); - method.setRequestHeader(FilesConstants.X_OBJECT_META + key, sanitizeForURI(metadata.get(key))); - } - method.removeRequestHeader("Content-Length"); - - try { - client.executeMethod(method); - FilesResponse response = new FilesResponse(method); - - if (response.getStatusCode() == HttpStatus.SC_CREATED) - { - logger.debug ("Object stored : " + name); - return true; - } - else { - logger.error(response.getStatusLine()); - throw new FilesException("Unexpected result", response.getResponseHeaders(), response.getStatusLine()); - } - } - finally { - method.releaseConnection(); - } - } - else - { - if (!isValidObjectName(objName)) { - throw new FilesInvalidNameException(objName); - } - else { - throw new FilesInvalidNameException(container); - } - } - } - else { - throw new FilesAuthorizationException("You must be logged in", null, null); - } - } - - /** - * - * - * @param container The name of the container - * @param name The name of the object - * @param entity The name of the request entity (make sure to set the Content-Type - * @param metadata The metadata for the object - * @param md5sum The 32 character hex encoded MD5 sum of the data - * @return True of the save was successful - * @throws IOException There was a socket level exception talking to CloudFiles - * @throws HttpException There was a protocol level error talking to CloudFiles - * @throws FilesException There was an error talking to CloudFiles. - */ -public boolean storeObjectAs(String container, String name, RequestEntity entity, Map metadata, String md5sum) throws IOException, HttpException, FilesException - { - if (this.isLoggedin()) - { - String objName = name; - if (isValidContianerName(container) && isValidObjectName(objName)) - { - PutMethod method = new PutMethod(storageURL+"/"+sanitizeForURI(container)+"/"+sanitizeForURI(objName)); - method.getParams().setSoTimeout(connectionTimeOut); - method.setRequestHeader(FilesConstants.X_AUTH_TOKEN, authToken); - method.setRequestEntity(entity); - if (useETag && md5sum != null) { - method.setRequestHeader(FilesConstants.E_TAG, md5sum); - } - method.setRequestHeader("Content-Type", entity.getContentType()); - - for(String key : metadata.keySet()) { - method.setRequestHeader(FilesConstants.X_OBJECT_META + key, sanitizeForURI(metadata.get(key))); - } - - try { - client.executeMethod(method); - FilesResponse response = new FilesResponse(method); - if (response.getStatusCode() == HttpStatus.SC_UNAUTHORIZED) { - login(); - method = new PutMethod(storageURL+"/"+sanitizeForURI(container)+"/"+sanitizeForURI(objName)); - method.getParams().setSoTimeout(connectionTimeOut); - method.setRequestHeader(FilesConstants.X_AUTH_TOKEN, authToken); - method.setRequestEntity(entity); - method.setRequestHeader("Content-Type", entity.getContentType()); - for(String key : metadata.keySet()) { - method.setRequestHeader(FilesConstants.X_OBJECT_META + key, sanitizeForURI(metadata.get(key))); - } - client.executeMethod(method); - response = new FilesResponse(method); - } - - if (response.getStatusCode() == HttpStatus.SC_CREATED) - { - logger.debug ("Object stored : " + name); - return true; - } - else { - logger.debug(response.getStatusLine()); - throw new FilesException("Unexpected result", response.getResponseHeaders(), response.getStatusLine()); - } - } - finally { - method.releaseConnection(); - } - } - else - { - if (!isValidObjectName(objName)) { - throw new FilesInvalidNameException(objName); - } - else { - throw new FilesInvalidNameException(container); - } - } - } - else { - throw new FilesAuthorizationException("You must be logged in", null, null); - } - } - - /** - * Delete the given object from it's container. - * - * @param container The container name - * @param objName The object name - * @return FilesConstants.OBJECT_DELETED - * @throws IOException There was an IO error doing network communication - * @throws HttpException There was an error with the http protocol - * @throws FilesException - */ - public void deleteObject (String container, String objName) throws IOException, HttpException, FilesException - { - if (this.isLoggedin()) - { - if (isValidContianerName(container) && isValidObjectName(objName)) - { - DeleteMethod method = null; - try { - method = new DeleteMethod(storageURL+"/"+sanitizeForURI(container)+"/"+sanitizeForURI(objName)); - method.getParams().setSoTimeout(connectionTimeOut); - method.setRequestHeader(FilesConstants.X_AUTH_TOKEN, authToken); - client.executeMethod(method); - FilesResponse response = new FilesResponse(method); - - if (response.getStatusCode() == HttpStatus.SC_NO_CONTENT) - { - logger.debug ("Object Deleted : "+objName); - } - else if (response.getStatusCode() == HttpStatus.SC_NOT_FOUND) - { - throw new FilesNotFoundException("Object was not found " + objName, response.getResponseHeaders(), response.getStatusLine()); - } - else { - throw new FilesException("Unexpected status from server", response.getResponseHeaders(), response.getStatusLine()); - } - } - finally { - if (method != null) method.releaseConnection(); - } - } - else - { - if (!isValidObjectName(objName)) { - throw new FilesInvalidNameException(objName); - } - else { - throw new FilesInvalidNameException(container); - } - } - } - else { - throw new FilesAuthorizationException("You must be logged in", null, null); - } - } - - /** - * Get an object's metadata - * - * @param container The name of the container - * @param objName The name of the object - * @return The object's metadata - * @throws IOException There was an IO error doing network communication - * @throws HttpException There was an error with the http protocol - * @throws FilesAuthorizationException The Client's Login was invalid. - * @throws FilesInvalidNameException The container or object name was not valid - */ - public FilesObjectMetaData getObjectMetaData (String container, String objName) throws IOException, HttpException, FilesAuthorizationException, FilesInvalidNameException - { - FilesObjectMetaData metaData; - if (this.isLoggedin()) - { - if (isValidContianerName(container) && isValidObjectName(objName)) - { - HeadMethod method = new HeadMethod(storageURL+"/"+sanitizeForURI(container)+"/"+sanitizeForURI(objName)); - method.getParams().setSoTimeout(connectionTimeOut); - method.setRequestHeader(FilesConstants.X_AUTH_TOKEN, authToken); - - client.executeMethod(method); - - FilesResponse response = new FilesResponse(method); - - if (response.getStatusCode() == HttpStatus.SC_NO_CONTENT) - { - logger.debug ("Object metadata retreived : "+objName); - String mimeType = response.getContentType(); - String lastModified = response.getLastModified(); - String eTag = response.getETag(); - String contentLength = response.getContentLength(); - - metaData = new FilesObjectMetaData(mimeType, contentLength, eTag, lastModified); - - Header [] headers = response.getResponseHeaders(); - HashMap headerMap = new HashMap(); - - for (Header h: headers) - { - if ( h.getName().startsWith(FilesConstants.X_OBJECT_META) ) - { - headerMap.put(h.getName().substring(FilesConstants.X_OBJECT_META.length()), unencodeURI(h.getValue())); - } - } - if (headerMap.size() > 0) - metaData.setMetaData(headerMap); - - return metaData; - } - else if (response.getStatusCode() == HttpStatus.SC_NOT_FOUND) - { - logger.info ("Object " + objName + " was not found !"); - return null; - } - - method.releaseConnection(); - } - else - { - if (!isValidObjectName(objName)) { - throw new FilesInvalidNameException(objName); - } - else { - throw new FilesInvalidNameException(container); - } - } - } - else { - throw new FilesAuthorizationException("You must be logged in", null, null); - } - return null; - } - - - /** - * Get the content of the given object - * - * @param container The name of the container - * @param objName The name of the object - * @return The content of the object - * @throws IOException There was an IO error doing network communication - * @throws HttpException There was an error with the http protocol - * @throws FilesAuthorizationException - * @throws FilesInvalidNameException - * @throws FilesNotFoundException - */ - public byte[] getObject (String container, String objName) throws IOException, HttpException, FilesAuthorizationException, FilesInvalidNameException, FilesNotFoundException - { - if (this.isLoggedin()) - { - if (isValidContianerName(container) && isValidObjectName(objName)) - { - GetMethod method = new GetMethod(storageURL+"/"+sanitizeForURI(container)+"/"+sanitizeForURI(objName)); - method.getParams().setSoTimeout(connectionTimeOut); - method.setRequestHeader(FilesConstants.X_AUTH_TOKEN, authToken); - - client.executeMethod(method); - - FilesResponse response = new FilesResponse(method); - - if (response.getStatusCode() == HttpStatus.SC_OK) - { - logger.debug ("Object data retreived : "+objName); - return response.getResponseBody(); - } - else if (response.getStatusCode() == HttpStatus.SC_NOT_FOUND) - { - throw new FilesNotFoundException("Container: " + container + " did not have object " + objName, response.getResponseHeaders(), response.getStatusLine()); - } - - method.releaseConnection(); - } - else - { - if (!isValidObjectName(objName)) { - throw new FilesInvalidNameException(objName); - } - else { - throw new FilesInvalidNameException(container); - } - } - } - else { - throw new FilesAuthorizationException("You must be logged in", null, null); - } - return null; - } - - /** - * Get's the given object's content as a stream - * - * @param container The name of the container - * @param objName The name of the object - * @return An input stream that will give the objects content when read from. - * @throws IOException There was an IO error doing network communication - * @throws HttpException There was an error with the http protocol - * @throws FilesAuthorizationException - * @throws FilesInvalidNameException - */ - public InputStream getObjectAsStream (String container, String objName) throws IOException, HttpException, FilesAuthorizationException, FilesInvalidNameException - { - if (this.isLoggedin()) - { - if (isValidContianerName(container) && isValidObjectName(objName)) - { - if (objName.length() > FilesConstants.OBJECT_NAME_LENGTH) - { - logger.warn ("Object Name supplied was truncated to Max allowed of " + FilesConstants.OBJECT_NAME_LENGTH + " characters !"); - objName = objName.substring(0, FilesConstants.OBJECT_NAME_LENGTH); - logger.warn ("Truncated Object Name is: " + objName); - } - - GetMethod method = new GetMethod(storageURL+"/"+sanitizeForURI(container)+"/"+sanitizeForURI(objName)); - method.getParams().setSoTimeout(connectionTimeOut); - method.setRequestHeader(FilesConstants.X_AUTH_TOKEN, authToken); - - client.executeMethod(method); - - FilesResponse response = new FilesResponse(method); - - if (response.getStatusCode() == HttpStatus.SC_OK) - { - logger.info ("Object data retreived : "+objName); - return response.getResponseBodyAsStream(); - } - else if (response.getStatusCode() == HttpStatus.SC_NOT_FOUND) - { - logger.info ("Object " + objName + " was not found !"); - return null; - } - - method.releaseConnection(); - } - else - { - if (!isValidObjectName(objName)) { - throw new FilesInvalidNameException(objName); - } - else { - throw new FilesInvalidNameException(container); - } - } - } - else { - throw new FilesAuthorizationException("You must be logged in", null, null); - } - return null; - } - - /** - * Utility function to write an InputStream to a file - * - * @param is - * @param f - * @throws IOException - */ - static void writeInputStreamToFile (InputStream is, File f) throws IOException - { - BufferedOutputStream bf = new BufferedOutputStream (new FileOutputStream (f)); - byte[] buffer = new byte [1024]; - int read = 0; - - while ((read = is.read(buffer)) > 0) - { - bf.write(buffer, 0, read); - } - - is.close(); - bf.flush(); - bf.close(); - } - - /** - * Reads an input stream into a stream - * - * @param is The input stream - * @return The contents of the stream stored in a string. - * @throws IOException - */ - static String inputStreamToString(InputStream stream, String encoding) throws IOException { - char buffer[] = new char[4096]; - StringBuilder sb = new StringBuilder(); - InputStreamReader isr = new InputStreamReader(stream, "utf-8"); // For now, assume utf-8 to work around server bug - - int nRead = 0; - while((nRead = isr.read(buffer)) >= 0) { - sb.append(buffer, 0, nRead); - } - isr.close(); - - return sb.toString(); - } - - /** - * Calculates the MD5 checksum of a file, returned as a hex encoded string - * - * @param f The file - * @return The MD5 checksum, as a base 16 encoded string - * @throws IOException - */ - public static String md5Sum (File f) throws IOException - { - MessageDigest digest; - try { - digest = MessageDigest.getInstance("MD5"); - InputStream is = new FileInputStream(f); - byte[] buffer = new byte[1024]; - int read = 0; - - while( (read = is.read(buffer)) > 0) - { - digest.update(buffer, 0, read); - } - - is.close (); - - byte[] md5sum = digest.digest(); - BigInteger bigInt = new BigInteger(1, md5sum); - - // Front load any zeros cut off by BigInteger - String md5 = bigInt.toString(16); - while (md5.length() != 32) { - md5 = "0" + md5; - } - return md5; - } catch (NoSuchAlgorithmException e) { - logger.fatal("The JRE is misconfigured on this computer", e); - return null; - } - } - - /** - * Calculates the MD5 checksum of an array of data - * - * @param data The data to checksum - * @return The checksum, represented as a base 16 encoded string. - * @throws IOException - */ - public static String md5Sum (byte[] data) throws IOException - { - try { - MessageDigest digest = MessageDigest.getInstance("MD5"); - byte[] md5sum = digest.digest(data); - BigInteger bigInt = new BigInteger(1, md5sum); - - // Front load any zeros cut off by BigInteger - String md5 = bigInt.toString(16); - while (md5.length() != 32) { - md5 = "0" + md5; - } - return md5; - } - catch (NoSuchAlgorithmException nsae) { - logger.fatal("Major problems with your Java configuration", nsae); - return null; - } - - } - - /** - * Encode any unicode characters that will cause us problems. - * - * @param str - * @return The string encoded for a URI - */ - public static String sanitizeForURI(String str) { - URLCodec codec= new URLCodec(); - try { - return codec.encode(str).replaceAll("\\+", "%20").replaceAll("%2F", "/"); - } - catch (EncoderException ee) { - logger.warn("Error trying to encode string for URI", ee); - return str; - } - } - - public static String unencodeURI(String str) { - URLCodec codec= new URLCodec(); - try { - return codec.decode(str); - } - catch (DecoderException ee) { - logger.warn("Error trying to encode string for URI", ee); - return str; - } - - } - - /** - * @return The connection timeout used for communicating with the server (in milliseconds) - */ - public int getConnectionTimeOut() - { - return connectionTimeOut; - } - - /** - * The timeout we will use for communicating with the server (in milliseconds) - * - * @param connectionTimeOut The new timeout for this connection - */ - public void setConnectionTimeOut(int connectionTimeOut) - { - this.connectionTimeOut = connectionTimeOut; - } - - /** - * @return The storage URL on the other end of the ReST api - */ - public String getStorageURL() - { - return storageURL; - } - - /** - * @return Get's our storage token. - */ - public String getStorageToken() - { - return authToken; - } - - /** - * Has this instance of the client authenticated itself? - * - * @return True if we logged in, false otherwise. - */ - public boolean isLoggedin() - { - return isLoggedin; - } - - /** - * The username we are logged in with. - * - * @return The username - */ - public String getUserName() - { - return username; - } - - /** - * Set's the username for this client. Note, setting this after login has no real impact unless the login() - * method is called again. - * - * @param userName the username - */ - public void setUserName(String userName) - { - this.username = userName; - } - - /** - * The password the client will use for the login. - * - * @return The password - */ - public String getPassword() - { - return password; - } - - /** - * Set's the password for this client. Note, setting this after login has no real impact unless the login() - * method is called again. - * - * @param password The new password - */ - public void setPassword(String password) - { - this.password = password; - } - - /** - * The URL we will use for Authentication - * - * @return The URL (represented as a string) - */ - public String getAuthenticationURL() - { - return authenticationURL; - } - - /** - * Changes the URL of the authentication service. Note, if one is logged in, this doesn't have an effect unless one calls login again. - * - * @param authenticationURL The new authentication URL - */ - public void setAuthenticationURL(String authenticationURL) - { - this.authenticationURL = authenticationURL; - } - - /** - * @return the useETag - */ - public boolean getUseETag() { - return useETag; - } - - /** - * @param useETag the useETag to set - */ - public void setUseETag(boolean useETag) { - this.useETag = useETag; - } - - public void setUserAgent(String userAgent) { - client.getParams().setParameter(HttpMethodParams.USER_AGENT, userAgent); - } - - public String getUserAgent() { - return client.getParams().getParameter(HttpMethodParams.USER_AGENT).toString(); - } - - private boolean isValidContianerName(String name) { - if (name == null) return false; - int length = name.length(); - if (length == 0 || length > FilesConstants.CONTAINER_NAME_LENGTH) return false; - if (name.indexOf('/') != -1) return false; - //if (name.indexOf('?') != -1) return false; - return true; - } - private boolean isValidObjectName(String name) { - if (name == null) return false; - int length = name.length(); - if (length == 0 || length > FilesConstants.OBJECT_NAME_LENGTH) return false; - //if (name.indexOf('?') != -1) return false; - return true; - } - - /** - * @return the cdnManagementURL - */ - public String getCdnManagementURL() { - return cdnManagementURL; - } - - - /** - * @param config - */ - public void setHostConfiguration(HostConfiguration config) { - client.setHostConfiguration(config); - } -} diff --git a/src/main/java/com/mosso/client/cloudfiles/FilesConstants.java b/src/main/java/com/mosso/client/cloudfiles/FilesConstants.java deleted file mode 100644 index 9620a85..0000000 --- a/src/main/java/com/mosso/client/cloudfiles/FilesConstants.java +++ /dev/null @@ -1,83 +0,0 @@ -/* - * See COPYING for license information. - */ - -package com.mosso.client.cloudfiles; - -import java.util.Properties; -import java.io.IOException; -import org.apache.log4j.Logger; - -public class FilesConstants -{ - private static Logger logger = Logger.getLogger(FilesConstants.class); - - public static final String USER_AGENT = "java-cloudfiles/1.3.2"; - - /** HTTP Header token that identifies the username to Cloud Files **/ - public static final String X_STORAGE_USER = "x-auth-user"; - /** HTTP header token that identifies the password to Cloud Files **/ - public static final String X_STORAGE_PASS = "x-auth-key"; - /** HTTP header token that identifies the Storage URL after a successful user login to Cloud Files **/ - public static final String X_STORAGE_URL = "X-Storage-Url"; - /** HTTP header that identifies the CDN Management URL after a successful login to Cloud Files **/ - public static final String X_CDN_MANAGEMENT_URL = "X-CDN-Management-URL"; - /** HTTP header token that identifies the Storage Token after a successful user login to Cloud Files **/ - public static final String X_AUTH_TOKEN = "X-Auth-Token"; - /** HTTP header token that is returned on a HEAD request against a Container. The value of this header is the number of Objects in the Container **/ - public static final String X_CONTAINER_OBJECT_COUNT = "X-Container-Object-Count"; - /** HTTP header token that is returned on a HEAD request against a Container. The value of this header is the number of Objects in the Container **/ - public static final String X_CONTAINER_BYTES_USED = "X-Container-Bytes-Used"; - /** HTTP header token that is returned on a HEAD request against an Account. The value of this header is the number of Containers in the Account **/ - public static final String X_ACCOUNT_CONTAINER_COUNT = "X-Account-Container-Count"; - /** HTTP header token that is returned on a HEAD request against an Account. The value of this header is the total size of the Objects in the Account **/ - public static final String X_ACCOUNT_BYTES_USED = "X-Account-Bytes-Used"; - /** HTTP header token that is returned by calls to the CDN Management API **/ - public static final String X_CDN_URI = "X-CDN-URI"; - /** HTTP header token that is returned by calls to the CDN Management API **/ - public static final String X_CDN_TTL = "X-TTL"; - /** HTTP header token that is returned by calls to the CDN Management API **/ - public static final String X_CDN_ENABLED = "X-CDN-Enabled"; - /** HTTP header token that is returned by calls to the CDN Management API **/ - public static final String X_CDN_USER_AGENT_ACL = "X-User-Agent-ACL"; - /** HTTP header token that is returned by calls to the CDN Management API **/ - public static final String X_CDN_REFERRER_ACL = "X-Referrer-ACL "; - /** HTTP Header used by Cloud Files for the MD5Sum of the object being created in a Container **/ - public static final String E_TAG = "ETag"; - /** These constants are used for performing queries on the content of a container **/ - public static final String LIST_CONTAINER_NAME_QUERY = "prefix"; - public static final String LIST_CONTAINER_LIMIT_OBJ_COUNT_QUERY = "limit"; - public static final String LIST_CONTAINER_START_OFFSET_QUERY = "offset"; - - public static final int CONTAINER_NAME_LENGTH = 256; - public static final int OBJECT_NAME_LENGTH = 1024; - public static final int METADATA_NAME_LENGTH = 1024; - public static final int METADATA_VALUE_LENGTH = 1024; - - /** Prefix Cloud Files expects on all Meta data headers on Objects **/ - public static final String X_OBJECT_META = "X-Object-Meta-"; - - public static Properties MIMETYPES = new Properties (); - - static { - try - { - MIMETYPES.load (FilesConstants.class.getResourceAsStream("MIME.types")); - } - catch (IOException err) - { - logger.warn ("Could not load MIME.types all refrences to FilesConstants.MIMETYPES will return null.", err); - } - } - - /** - * Convenience method to get a MIME Type. If none is found it will return "application/octet-stream" - * - * @param fileExt - * @return The suggested MIME type for the file extention. - */ - public static String getMimetype (String fileExt) - { - return FilesConstants.MIMETYPES.getProperty(fileExt.toLowerCase(), "application/octet-stream"); - } -} diff --git a/src/main/java/com/mosso/client/cloudfiles/FilesContainer.java b/src/main/java/com/mosso/client/cloudfiles/FilesContainer.java deleted file mode 100644 index 0c652e7..0000000 --- a/src/main/java/com/mosso/client/cloudfiles/FilesContainer.java +++ /dev/null @@ -1,197 +0,0 @@ -/* - * See COPYING for license information. - */ - -package com.mosso.client.cloudfiles; - -import org.apache.commons.httpclient.HttpException; -import org.apache.log4j.Logger; - -import java.util.List; -import java.io.File; -import java.io.IOException; -import java.security.NoSuchAlgorithmException; - -public class FilesContainer -{ - private String name; - private List objects = null; - private FilesClient client = null; - private static Logger logger = Logger.getLogger(FilesContainer.class); - - /** - * Create a new container (Note, this does not actually create a container on the server) - * - * @param name The name of the container - * @param objs The objects in that container - * @param client The client we are currently using - */ - public FilesContainer(String name, List objs, FilesClient client) - { - this.name = name; - this.objects = objs; - this.client = client; - } - - /** - * @param name The name of the container - * @param client A logged in client - */ - public FilesContainer(String name, FilesClient client) - { - this.name = name; - this.client = client; - } - - /** - * Get the name of the container - * - * @return The name of this container - */ - public String getName() - { - return name; - } - - /** - * Set the name of the container - * - * @param name The new name - */ - public void setName(String name) - { - this.name = name; - } - - /** - * Returns the contents of this container - * - * @return A list of the contents - * @throws HttpException There was a problem communicating with the server - * @throws IOException There was a problem communicating with the server - * @throws FilesAuthorizationException - * @throws FilesInvalidNameException - */ - public List getObjects() throws HttpException, IOException, FilesAuthorizationException, FilesException - { - - if (client != null) - { - if(objects == null) { - objects = client.listObjects(this.name); - } - return objects; - } - else - { - logger.fatal("This Container has no FilesClient defined !"); - } - return null; - } - - /** - * Returns the contents of this container - * - * @param path Limit the results to files under the following path - * - * @return A list of the contents - * @throws HttpException There was a problem communicating with the server - * @throws IOException There was a problem communicating with the server - * @throws FilesAuthorizationException - * @throws FilesInvalidNameException - */ - public List getObjects(String path) throws HttpException, IOException, FilesAuthorizationException, FilesException - { - - if (client != null) - { - if(objects == null) { - objects = client.listObjects(this.name, path); - } - return objects; - } - else - { - logger.fatal("This Container has no FilesClient defined !"); - } - return null; - } - - /** - * Get useful information on this container - * - * @return The container info - * @throws HttpException There was a problem communicating with the server - * @throws IOException There was a problem communicating with the server - * @throws FilesException - */ - public FilesContainerInfo getInfo() throws HttpException, IOException, FilesException - { - if (client != null) - { - return client.getContainerInfo(this.name); - } - else - { - logger.fatal("This container does not have a valid client !"); - } - return null; - } - - /** - * Returns the instance of the client we're using - * - * @return The FilesClient - */ - public FilesClient getClient() - { - return this.client; - } - - /** - * Adds a new object to the container - * - * @param f The file for this object - * @param mimeType It's MIME type - * @return The return code from the server - * @throws NoSuchAlgorithmException The MD5 implementation is not installed in the client - * @throws IOException - * @throws FilesAuthorizationException - * @throws FilesInvalidNameException - */ - public boolean addObject (File f, String mimeType) throws NoSuchAlgorithmException, IOException, FilesAuthorizationException, FilesException - { - FilesObject obj = new FilesObject(f, mimeType, this); - - if (objects != null) - objects.add(obj); - else - { - objects = getObjects(); - if (objects != null) - return objects.add (obj); - } - logger.fatal("Could not add Object, it seems something is wrong with this Container or FilesClient"); - return false; - } - - /** - * Creates the container represented by this instance on the server - * - * @return Either FilesConstants.CONTAINER_CREATED or FilesConstants.CONTAINER_EXISTED or -1 if the client has not been set - * @throws HttpException - * @throws IOException - * @throws FilesAuthorizationException - * @throws FilesInvalidNameException - */ - public void createContainer () throws HttpException, IOException, FilesAuthorizationException, FilesException - { - if (client != null) - { - client.createContainer(this.name); - } - else - logger.fatal("This Container has no FilesClient defined !"); - - } -} diff --git a/src/main/java/com/mosso/client/cloudfiles/FilesContainerExistsException.java b/src/main/java/com/mosso/client/cloudfiles/FilesContainerExistsException.java deleted file mode 100644 index 246e8ed..0000000 --- a/src/main/java/com/mosso/client/cloudfiles/FilesContainerExistsException.java +++ /dev/null @@ -1,30 +0,0 @@ -/** - * - */ -package com.mosso.client.cloudfiles; - -import org.apache.commons.httpclient.Header; -import org.apache.commons.httpclient.StatusLine; - -/** - * @author lvaughn - * - */ -public class FilesContainerExistsException extends FilesException { - - /** - * - */ - private static final long serialVersionUID = 7282149064519490145L; - - /** - * @param message - * @param httpHeaders - * @param httpStatusLine - */ - public FilesContainerExistsException(String message, Header[] httpHeaders, - StatusLine httpStatusLine) { - super(message, httpHeaders, httpStatusLine); - } - -} diff --git a/src/main/java/com/mosso/client/cloudfiles/FilesContainerInfo.java b/src/main/java/com/mosso/client/cloudfiles/FilesContainerInfo.java deleted file mode 100644 index 3e16f5d..0000000 --- a/src/main/java/com/mosso/client/cloudfiles/FilesContainerInfo.java +++ /dev/null @@ -1,62 +0,0 @@ -/* - * See COPYING for license information. - */ - -package com.mosso.client.cloudfiles; - -/** - * Contains basic information about the container - * - * @author lvaughn - * - */ -public class FilesContainerInfo -{ - private int objectCount; - private long totalSize; - private String name; - - /** - * @return the name - */ - public String getName() { - return name; - } - - /** - * @param name the name to set - */ - public void setName(String name) { - this.name = name; - } - - /** - * @param containerCount The number of objects in the container - * @param totalSize The total size of the container (in bytes) - */ - FilesContainerInfo(String name, int containerCount, long totalSize) - { - this.name = name; - this.objectCount = containerCount; - this.totalSize = totalSize; - } - - /** - * Returns the number of objects in the container - * - * @return The number of objects - */ - public int getObjectCount() - { - return objectCount; - } - - /** - * @return The total size of the objects in the container (in bytes) - */ - public long getTotalSize() - { - return totalSize; - } - -} diff --git a/src/main/java/com/mosso/client/cloudfiles/FilesContainerNotEmptyException.java b/src/main/java/com/mosso/client/cloudfiles/FilesContainerNotEmptyException.java deleted file mode 100644 index ff50426..0000000 --- a/src/main/java/com/mosso/client/cloudfiles/FilesContainerNotEmptyException.java +++ /dev/null @@ -1,25 +0,0 @@ -/** - * - */ -package com.mosso.client.cloudfiles; - -import org.apache.commons.httpclient.Header; -import org.apache.commons.httpclient.StatusLine; - -/** - * @author lvaughn - * - */ -@SuppressWarnings("serial") -public class FilesContainerNotEmptyException extends FilesException { - /** - * @param message - * @param httpHeaders - * @param httpStatusLine - */ - public FilesContainerNotEmptyException(String message, - Header[] httpHeaders, StatusLine httpStatusLine) { - super(message, httpHeaders, httpStatusLine); - } - -} diff --git a/src/main/java/com/mosso/client/cloudfiles/FilesException.java b/src/main/java/com/mosso/client/cloudfiles/FilesException.java deleted file mode 100644 index 19add00..0000000 --- a/src/main/java/com/mosso/client/cloudfiles/FilesException.java +++ /dev/null @@ -1,91 +0,0 @@ -/** - * - */ -package com.mosso.client.cloudfiles; - -import org.apache.commons.httpclient.Header; -import org.apache.commons.httpclient.StatusLine; -import org.apache.commons.httpclient.HttpException; - -/** - * @author lvaughn - * - */ -@SuppressWarnings("serial") -public class FilesException extends HttpException { - private Header [] httpHeaders; - private StatusLine httpStatusLine; - - /** - * An exception generated when a client tries to do something they aren't authorized to do. - * - * @param message The message - * @param httpHeaders The returned HTTP headers - * @param httpStatusLine The HTTP Status lined returned - */ - public FilesException(String message, Header [] httpHeaders, StatusLine httpStatusLine) - { - super (message); - this.httpHeaders = httpHeaders; - this.httpStatusLine = httpStatusLine; - } - - public FilesException(String message, Throwable cause) { - super(message, cause); - } - - /** - * @return The HTTP headers returned by the server - */ - public Header[] getHttpHeaders () - { - return httpHeaders; - } - - /** - * @return The HTTP Headers returned by the server in a human-readable string. - */ - public String getHttpHeadersAsString () - { - if (httpHeaders == null) return ""; - - StringBuffer httpHeaderString = new StringBuffer(); - for (Header h: httpHeaders) - httpHeaderString.append(h.toExternalForm()); - - return httpHeaderString.toString(); - } - - /** - * @return The HTTP status line from the server - */ - public StatusLine getHttpStatusLine () - { - return httpStatusLine; - } - - /** - * @return The numeric HTTP status code from the server - */ - public int getHttpStatusCode () - { - return httpStatusLine == null? -1 : httpStatusLine.getStatusCode(); - } - - /** - * @return The HTTP status message from the server - */ - public String getHttpStatusMessage () - { - return httpStatusLine == null ? null : httpStatusLine.getReasonPhrase(); - } - - /** - * @return The version of HTTP used. - */ - public String getHttpVersion () - { - return httpStatusLine == null ? null : httpStatusLine.getHttpVersion(); - } - -} diff --git a/src/main/java/com/mosso/client/cloudfiles/FilesInvalidNameException.java b/src/main/java/com/mosso/client/cloudfiles/FilesInvalidNameException.java deleted file mode 100644 index 2402956..0000000 --- a/src/main/java/com/mosso/client/cloudfiles/FilesInvalidNameException.java +++ /dev/null @@ -1,20 +0,0 @@ -/** - * - */ -package com.mosso.client.cloudfiles; - -/** - * @author lvaughn - * - */ -public class FilesInvalidNameException extends FilesException { - /** - * - */ - private static final long serialVersionUID = -9043382616400647532L; - - public FilesInvalidNameException(String name) { - super("Invalid name: " + name, null, null); - } - -} diff --git a/src/main/java/com/mosso/client/cloudfiles/FilesNotFoundException.java b/src/main/java/com/mosso/client/cloudfiles/FilesNotFoundException.java deleted file mode 100644 index 7a9c2c7..0000000 --- a/src/main/java/com/mosso/client/cloudfiles/FilesNotFoundException.java +++ /dev/null @@ -1,30 +0,0 @@ -/** - * - */ -package com.mosso.client.cloudfiles; - -import org.apache.commons.httpclient.Header; -import org.apache.commons.httpclient.StatusLine; - -/** - * @author lvaughn - * - */ -public class FilesNotFoundException extends FilesException { - - /** - * - */ - private static final long serialVersionUID = 111718445621236026L; - - /** - * @param message - * @param httpHeaders - * @param httpStatusLine - */ - public FilesNotFoundException(String message, Header[] httpHeaders, - StatusLine httpStatusLine) { - super(message, httpHeaders, httpStatusLine); - } - -} diff --git a/src/main/java/com/mosso/client/cloudfiles/FilesObject.java b/src/main/java/com/mosso/client/cloudfiles/FilesObject.java deleted file mode 100644 index 9870514..0000000 --- a/src/main/java/com/mosso/client/cloudfiles/FilesObject.java +++ /dev/null @@ -1,354 +0,0 @@ -/* - * See COPYING for license information. - */ - -package com.mosso.client.cloudfiles; - -import org.apache.log4j.Logger; -import org.apache.commons.httpclient.HttpException; - -import java.io.*; -import java.security.NoSuchAlgorithmException; - -public class FilesObject -{ - private String container; - private String name; - private String md5sum = null; - private long size = -1; - private String mimeType = null; - private String lastModified = null; - private FilesClient client = null; - - private static Logger logger = Logger.getLogger(FilesObject.class); - - /** - * Constructs a new FilesObject (from the file system) - * - * @param obj A file representing the object - * @param mimeType Its MIME type - * @param container The container it lives in - * @throws NullPointerException A null parameter was passed in - * @throws NoSuchAlgorithmException MD5 was not installed on the client. - * @throws IOException There was an I/O error talking to the server - */ - FilesObject (File obj, String mimeType, FilesContainer container) throws NullPointerException, NoSuchAlgorithmException, IOException - { - if (obj != null) - { - if (obj.exists()) - { - if (!obj.isDirectory()) - { - setName (obj.getName()); - setMd5sum(FilesClient.md5Sum(obj)); - setSize(obj.length()); - setMimeType(mimeType); - setClient(container.getClient ()); - setContainer(container.getName()); - } - else - { - logger.fatal("Can not create Directories as FSObjects create a FilesContainer for this object"); - throw new NullPointerException("File Object was a directory !"); - } - } - else - { - logger.fatal("File object must exist so we can create an MD5SUM for it !"); - throw new NullPointerException ("The file object provided does not exist."); - } - } - else - { - logger.fatal("Not possible to create a FilesObject from a null File."); - throw new NullPointerException ("File Object passed was null !"); - } - } - - /** - * Creates a new FilesObject with data from the server - * - * @param name The name of the object - * @param container The name of it's container - * @param client The client it can be accessed through. - */ - FilesObject(String name, String container, FilesClient client ) - { - this.name = name; - this.container = container; - this.client = client; - } - - /** - * @return The object's name on the server - */ - public String getName() - { - return name; - } - - /** - * Set's the objects name (up to a maximum of 128 characters) - * - * @param name The new name - */ - public void setName(String name) - { - if (name.length() > FilesConstants.OBJECT_NAME_LENGTH) - { - logger.warn("Object name larger than " + FilesConstants.OBJECT_NAME_LENGTH + " characters truncating from: "+name); - this.name = name.substring(0, FilesConstants.OBJECT_NAME_LENGTH); - logger.warn("Object name truncated to : "+name); - } - this.name = name; - } - - /** - * @return The MIME type of the object, pulled from the server - * @throws HttpException - * @throws IOException - * @throws FilesAuthorizationException - * @throws FilesInvalidNameException - */ - public String getMimeType() throws HttpException, IOException, FilesAuthorizationException, FilesInvalidNameException - { - if (mimeType == null) { - getMetaData(); - } - return mimeType; - } - - /** - * @param mimeType The new MIME type for this object - */ - public void setMimeType(String mimeType) - { - this.mimeType = mimeType; - } - - /** - * Get's the MD5 Checksum for this object - * - * @return The MD5 checksum, returned as a base 16 encoded string - * @throws HttpException - * @throws IOException - * @throws FilesAuthorizationException - * @throws FilesInvalidNameException - */ - public String getMd5sum() throws HttpException, IOException, FilesAuthorizationException, FilesInvalidNameException - { - if (md5sum == null) { - getMetaData(); - } - return md5sum; - } - - /** - * - * @param md5sum The MD5 sum of the file (as a hex-encoded string) - */ - public void setMd5sum(String md5sum) - { - this.md5sum = md5sum; - } - - /** - * Returns the size of the object, in bytes - * - * @return The size of the object in bytes - * @throws HttpException - * @throws IOException - * @throws FilesAuthorizationException - * @throws FilesInvalidNameException - */ - public long getSize() throws HttpException, IOException, FilesAuthorizationException, FilesInvalidNameException - { - if (size == -1) { - getMetaData(); - } - return size; - } - - /** - * Set the size of the object - * - * @param size The size, in bytes - */ - public void setSize(long size) - { - this.size = size; - } - - /** - * Download the object and write it to a local file - * - * @param localFile The file - * @return The number of bytes written - * @throws FileNotFoundException Could not find the local file (does the path to it exist?) - * @throws HttpException There was an error communicating with the server - * @throws IOException There was an I/O exception communicating with the server or writing the file. - * @throws FilesAuthorizationException - * @throws FilesInvalidNameException - */ - public long writeObjectToFile (File localFile) throws FileNotFoundException, HttpException, IOException, FilesAuthorizationException, FilesInvalidNameException - { - long bytesWritten = 0; - FileOutputStream out = new FileOutputStream(localFile); - InputStream in = getObjectAsStream(); - byte[] data = new byte[1024]; - - int ret = in.read (data, 0, data.length); - if (ret == -1) - { - out.write(data, 0, data.length); - return data.length; - } - - while (ret != -1) - { - bytesWritten += ret; - out.write(data, 0, ret); - ret = in.read (data, 0, data.length); - } - out.flush(); - out.close(); - in.close (); - - return bytesWritten; - } - - /** - * Returns an inputStream with the contents of the object - * - * @return An inputStream that will return the contents of the object - * @throws HttpException There was an error communicating with the server - * @throws IOException There was an I/O exception communicating with the server or writing the file. - * @throws FilesAuthorizationException - * @throws FilesInvalidNameException - */ - public InputStream getObjectAsStream() throws HttpException, IOException, FilesAuthorizationException, FilesInvalidNameException - { - return client.getObjectAsStream(container, name); - } - - /** - * Download the contents of the object - * - * @return The content of the object - * @throws HttpException There was an error communicating with the server - * @throws IOException There was an I/O exception communicating with the server or writing the file. - * @throws FilesAuthorizationException - * @throws FilesInvalidNameException - * @throws FilesNotFoundException - */ - public byte[] getObject() throws HttpException, IOException, FilesAuthorizationException, FilesInvalidNameException, FilesNotFoundException - { - return client.getObject(container, name); - } - - /** - * Return any metadata associated with this object - * - * @return The metadata - * @throws HttpException There was an error communicating with the server - * @throws IOException There was an I/O exception communicating with the server or writing the file. - * @throws FilesAuthorizationException - * @throws FilesInvalidNameException - */ - public FilesObjectMetaData getMetaData() throws HttpException, IOException, FilesAuthorizationException, FilesInvalidNameException - { - FilesObjectMetaData metaData = client.getObjectMetaData(container, name); - if (metaData != null) - { - setMd5sum(metaData.getETag()); - setSize(Long.parseLong (metaData.getContentLength())); - setMimeType(metaData.getMimeType()); - setLastModified(metaData.getLastModified()); - } - return metaData; - } - - /** - * @param client The new client for this object - */ - void setClient(FilesClient client) - { - this.client = client; - } - - /** - * @param container The new container - */ - void setContainer (String container) - { - this.container = container; - } - - public static FilesObject uploadObject(File obj, String mimeType, FilesContainer container) throws IOException, FilesException { - return uploadObject(obj, mimeType, container, null); - } - - public static FilesObject uploadObject(File obj, String mimeType, FilesContainer container, IFilesTransferCallback callback) throws IOException, FilesException { - FilesObject result = null; - try { - result = new FilesObject(obj, mimeType, container); - FilesClient client = container.getClient(); - client.storeObjectAs(container.getName(), obj, mimeType, obj.getName(), callback); - } - catch (NoSuchAlgorithmException nsae) { - // This should never happen - logger.fatal("Install doesn't have MD5, can't upload files", nsae); - } - - return result; - } - - /** - * Returns the size as a human readable string, rounding to the nearest KB/MB/GB - * - * @return The size of the object as a human readable string. - * @throws HttpException There was an error communicating with the server - * @throws IOException There was an I/O exception communicating with the server or writing the file. - * @throws FilesAuthorizationException - * @throws FilesInvalidNameException - */ - public String getSizeString () throws HttpException, IOException, FilesAuthorizationException, FilesInvalidNameException - { - long kb = 1024; - long mb = kb*1024; - long gb = mb*1024; - - //Make sure the size is correct. - getMetaData(); - - //KB - if (size > gb) - return (size/gb) + " GB"; - else if (size > mb) - return (size/mb)+" MB"; - else if (size > kb) - return (size/kb) +" KB"; - else - return getSize ()+" Bytes"; - - } - - /** - * @return the lastModified - */ - public String getLastModified() throws HttpException, IOException, FilesAuthorizationException, FilesInvalidNameException - { - if (lastModified == null) { - getMetaData(); - } - return lastModified; - } - - /** - * @param lastModified the lastModified to set - */ - public void setLastModified(String lastModified) { - this.lastModified = lastModified; - } -} diff --git a/src/main/java/com/mosso/client/cloudfiles/FilesObjectMetaData.java b/src/main/java/com/mosso/client/cloudfiles/FilesObjectMetaData.java deleted file mode 100644 index e0ca523..0000000 --- a/src/main/java/com/mosso/client/cloudfiles/FilesObjectMetaData.java +++ /dev/null @@ -1,177 +0,0 @@ -/* - * See COPYING for license information. - */ - -package com.mosso.client.cloudfiles; - -import java.util.HashMap; -import java.util.Map; - -public class FilesObjectMetaData -{ - private String mimeType; - private String contentLength; - private String eTag; - private String lastModified; - private Map metaData = new HashMap(); - - /** - * An object storing the metadata for an FS Cloud object - * - * @param mimeType The MIME type for the object - * @param contentLength The content-length (e.g., size) of the object - * @param eTag The MD5 check-sum of the object's contents - * @param lastModified The last time the object was modified. - */ - public FilesObjectMetaData(String mimeType, String contentLength, String eTag, String lastModified) - { - this.mimeType = mimeType; - this.contentLength = contentLength; - this.eTag = eTag; - this.lastModified = lastModified; - } - - /** - * An object storing the metadata for an FS Cloud object - * - * @param mimeType The MIME type for the object - * @param contentLength The content-length (e.g., size) of the object - * @param lastModified The last time the object was modified. - */ - public FilesObjectMetaData(String mimeType, String contentLength, String lastModified) - { - this.mimeType = mimeType; - this.contentLength = contentLength; - this.lastModified = lastModified; - } - - /** - * The last time the object was modified - * - * @return The last modification date - */ - public String getLastModified() - { - return lastModified; - } - - /** - * Set the last time the object was modified - */ - void setLastModified(String lastModified) - { - this.lastModified = lastModified; - } - - /** - * The MIME type of the object - * - * @return The MIME type of the object - */ - public String getMimeType() - { - return mimeType; - } - - /** - * Set's the MIME type of the object - * - * @param mimeType - */ - void setMimeType(String mimeType) - { - this.mimeType = mimeType; - } - - /** - * The size of the object, in bytes - * - * @return The size of the object - */ - public String getContentLength() - { - return contentLength; - } - - /** - * Set the size of the object - * - * @param contentLength The new content length - */ - void setContentLength(String contentLength) - { - this.contentLength = contentLength; - } - - /** - * The MD5 checksum represented in a hex-encoded string - * - * @return The eTag - */ - public String getETag() - { - return eTag; - } - - /** - * Set the MD5 checksum for this object - * - * @param eTag The new eTag - */ - void setETag(String eTag) - { - this.eTag = eTag; - } - - /** - * The metadata associated with this object. - * - * @return The object's metadata - */ - public Map getMetaData() - { - return metaData; - } - - /** - * Set new metatdata for this object. Warning, this metadata clears out all old metadata. To add new fields, use - * setMetaData instead. - * - * @param metaData The new metadata - */ - public void setMetaData(Map metaData) - { - this.metaData = metaData; - } - - /** - * Add a new meta-data entry (or overwrite an old one) - * - * @param key The key for this key-value pair - * @param value The value for this key-value pair - */ - public void addMetaData (String key, String value) - { - metaData.put(FilesConstants.X_OBJECT_META.concat(key), value); - } - - /** Constructs a new header for a given metadata key - * @param key The key - * @return The name of a header for this key - */ - public String getMetaKey (String key) - { - return metaData.get(FilesConstants.X_OBJECT_META.concat(key)); - } - - /** - * Tests to see if a given metadata key is present for this object - * - * @param key The key to check for - * @return True if it's present, false otherwise. - */ - public boolean containesKey (String key) - { - return metaData.containsKey(FilesConstants.X_OBJECT_META.concat(key)); - } -} diff --git a/src/main/java/com/mosso/client/cloudfiles/FilesResponse.java b/src/main/java/com/mosso/client/cloudfiles/FilesResponse.java deleted file mode 100644 index eee7a5c..0000000 --- a/src/main/java/com/mosso/client/cloudfiles/FilesResponse.java +++ /dev/null @@ -1,307 +0,0 @@ -/* - * See COPYING for license information. - */ - -package com.mosso.client.cloudfiles; - -import org.apache.commons.httpclient.Header; -import org.apache.commons.httpclient.StatusLine; -import org.apache.commons.httpclient.HttpMethod; -import org.apache.commons.httpclient.HttpStatus; -import org.apache.log4j.Logger; - -import java.io.IOException; -import java.io.InputStream; - -public class FilesResponse -{ - private HttpMethod httpmethod = null; - - private static Logger logger = Logger.getLogger(FilesResponse.class); - - /** - * @param method The HttpMethod that generated this response - */ - public FilesResponse (HttpMethod method) - { - httpmethod = method; - - if (logger.isDebugEnabled()) - { - logger.debug ("Request Method: "+method.getName()); - logger.debug ("Request Path: " + method.getPath()); - logger.debug ("Status Line: " + getStatusLine()); - Header[] reqHeaders = method.getRequestHeaders(); - for (Header rH: reqHeaders) - logger.debug(rH.toExternalForm()); - - Header [] responseHeaders = getResponseHeaders(); - for (int i=0; i < responseHeaders.length;i++) - logger.debug(responseHeaders[i]); - } - } - - /** - * Checks to see if the user managed to login with their credentials. - * - * @return true is login succeeded false otherwise - */ - public boolean loginSuccess () - { - if (getStatusCode() == HttpStatus.SC_UNAUTHORIZED ) - return false; - - if (getStatusCode() == HttpStatus.SC_NO_CONTENT) - return true; - - return false; - } - - /** - * This method makes no assumptions about the user having been logged in. It simply looks for the Storage Token header - * as defined by FilesConstants.X_STORAGE_TOKEN and if this exists it returns its value otherwise the value returned will be null. - * - * @return null if the user is not logged into Cloud FS or the Storage token - */ - public String getAuthToken () - { - return getResponseHeader(FilesUtil.getProperty("auth_token_name", FilesConstants.X_AUTH_TOKEN)).getValue(); - } - - /** - * This method makes no assumptions about the user having been logged in. It simply looks for the Storage URL header - * as defined by FilesConstants.X_STORAGE_URL and if this exists it returns its value otherwise the value returned will be null. - * - * @return null if the user is not logged into Cloud FS or the Storage URL - */ - public String getStorageURL () - { - return getResponseHeader(FilesConstants.X_STORAGE_URL).getValue(); - } - - /** - * This method makes no assumptions about the user having been logged in. It simply looks for the CDN Management URL header - * as defined by FilesConstants.X_CDN_MANAGEMENT_URL and if this exists it returns its value otherwise the value returned will be null. - * - * @return null if the user is not logged into Cloud FS or the Storage URL - */ - public String getCDNManagementURL () - { - Header header = getResponseHeader(FilesConstants.X_CDN_MANAGEMENT_URL); - return header == null ? null : header.getValue(); - } - - /** - * Get the content type - * - * @return The content type (e.g., MIME type) of the response - */ - public String getContentType () - { - return getResponseHeader("Content-Type").getValue(); - } - - /** - * Get the content length of the response (as reported in the header) - * - * @return the length of the content - */ - public String getContentLength () - { - Header hdr = getResponseHeader("Content-Length"); - if (hdr == null) return "0"; - return hdr.getValue(); - } - - /** - * The Etag is the same as the objects MD5SUM - * - * @return The ETAG - */ - public String getETag () - { - Header hdr = getResponseHeader(FilesConstants.E_TAG); - if (hdr == null) return null; - return hdr.getValue(); - } - - /** - * The last modified header - * - * @return The last modified header - */ - public String getLastModified () - { - return getResponseHeader("Last-Modified").getValue(); - } - - /** - * The HTTP headers from the response - * - * @return The headers - */ - public Header[] getResponseHeaders() - { - return httpmethod.getResponseHeaders(); - } - - /** - * The HTTP Status line (both the status code and the status message). - * - * @return The status line - */ - public StatusLine getStatusLine() - { - return httpmethod.getStatusLine(); - } - - /** - * Get the HTTP status code - * - * @return The status code - */ - public int getStatusCode () - { - return httpmethod.getStatusCode(); - } - - /** - * Get the HTTP status message - * - * @return The message portion of the status line - */ - public String getStatusMessage () - { - return httpmethod.getStatusText(); - } - - /** - * The HTTP Method (put, get, etc) of the request that generated this response - * - * @return The method name - */ - public String getMethodName () - { - return httpmethod.getName(); - } - - /** - * Returns the response body as text - * - * @return The response body - * @throws IOException - */ - public String getResponseBodyAsString () throws IOException - { - return httpmethod.getResponseBodyAsString(); - } - - /** - * Get the response body as a Stream - * - * @return An input stream that will return the response body when read - * @throws IOException - */ - public InputStream getResponseBodyAsStream () throws IOException - { - return httpmethod.getResponseBodyAsStream(); - } - - /** - * Get the body of the response as a byte array - * - * @return The body of the response. - * @throws IOException - */ - public byte[] getResponseBody () throws IOException - { - return httpmethod.getResponseBody(); - } - - /** - * Returns the specified response header. Note that header-name matching is case insensitive. - * - * @param headerName - The name of the header to be returned. - * @return The specified response header. If the response contained multiple instances of the header, its values will be combined using the ',' separator as specified by RFC2616. - */ - public Header getResponseHeader(String headerName) - { - return httpmethod.getResponseHeader(headerName); - } - - /** - * Get the number of objects in the header - * - * @return -1 if the header is not present or the correct value as defined by the header - */ - public int getContainerObjectCount () - { - Header contCountHeader = getResponseHeader (FilesConstants.X_CONTAINER_OBJECT_COUNT); - if (contCountHeader != null ) - return Integer.parseInt(contCountHeader.getValue()); - return -1; - } - - /** - * Get the number of bytes used by the container - * - * @return -1 if the header is not present or the correct value as defined by the header - */ - public long getContainerBytesUsed () - { - Header contBytesUsedHeader = getResponseHeader (FilesConstants.X_CONTAINER_BYTES_USED); - if (contBytesUsedHeader != null ) - return Long.parseLong(contBytesUsedHeader.getValue()); - return -1; - } - - /** - * Get the number of objects in the header - * - * @return -1 if the header is not present or the correct value as defined by the header - */ - public int getAccountContainerCount () - { - Header contCountHeader = getResponseHeader (FilesConstants.X_ACCOUNT_CONTAINER_COUNT); - if (contCountHeader != null ) - return Integer.parseInt(contCountHeader.getValue()); - return -1; - } - - /** - * Get the number of bytes used by the container - * - * @return -1 if the header is not present or the correct value as defined by the header - */ - public long getAccountBytesUsed () - { - Header accountBytesUsedHeader = getResponseHeader (FilesConstants.X_ACCOUNT_BYTES_USED); - if (accountBytesUsedHeader != null ) - return Long.parseLong(accountBytesUsedHeader.getValue()); - return -1; - } - - /** - * Get the URL For a shared container - * - * @return null if the header is not present or the correct value as defined by the header - */ - public String getCdnUrl () - { - Header cdnHeader = getResponseHeader (FilesConstants.X_CDN_URI); - if (cdnHeader != null ) - return cdnHeader.getValue(); - return null; - } - - /** - * Returns the response headers with the given name. Note that header-name matching is case insensitive. - * - * @param headerName - the name of the headers to be returned. - * @return An array of zero or more headers - */ - public Header[] getResponseHeaders(String headerName) - { - return httpmethod.getResponseHeaders(headerName); - } -} diff --git a/src/main/java/com/mosso/client/cloudfiles/FilesUtil.java b/src/main/java/com/mosso/client/cloudfiles/FilesUtil.java deleted file mode 100644 index 079d299..0000000 --- a/src/main/java/com/mosso/client/cloudfiles/FilesUtil.java +++ /dev/null @@ -1,113 +0,0 @@ -/* - * See COPYING for license information. - */ - -package com.mosso.client.cloudfiles; - -import java.io.FileNotFoundException; -import java.io.InputStream; -import java.io.IOException; -import java.util.Properties; - -import org.apache.log4j.Logger; - -/** - * Cloud Files utilities - */ -public class FilesUtil { - private static Logger logger = Logger.getLogger(FilesUtil.class); - /** - * The name of the properties file we're looking for - */ - private final static String file = "cloudfiles.properties"; - - /** - * A cache of the properties - */ - private static Properties props = null; - - /** - * Find the properties file in the class path and load it. - * - * @throws IOException - */ - private static void loadPropertiesFromClasspath() throws IOException { - props = new Properties(); - InputStream inputStream = FilesUtil.class.getClassLoader() - .getResourceAsStream(file); - - if (inputStream == null) { - throw new FileNotFoundException("Property file '" + file - + "' not found in the classpath"); - } - props.load(inputStream); - } - - /** - * Look up a property from the properties file. - * - * @param key The name of the property to be found - * @return The value of the property - */ - public static String getProperty(String key) - { - if (props == null) - { - try - { - loadPropertiesFromClasspath(); - } - catch (Exception IOException) - { - logger.warn("Unable to load properties file."); - return null; - } - } - return props.getProperty(key); - } - - /** - * Look up a property from the properties file. - * - * @param key The name of the property to be found - * @return The value of the property - */ - public static String getProperty(String key, String defaultValue) - { - if (props == null) - { - try - { - loadPropertiesFromClasspath(); - } - catch (Exception IOException) - { - logger.warn("Unable to load properties file."); - return null; - } - } - return props.getProperty(key, defaultValue); - } - - /** - * Looks up the value of a key from the properties file and converts it to an integer. - * - * @param key - * @return The value of that key - */ - public static int getIntProperty(String key) { - String property = getProperty(key); - - if (property == null) { - logger.warn("Could not load integer property " + key); - return -1; - } - try { - return Integer.parseInt(property); - } - catch (NumberFormatException nfe) { - logger.warn("Invalid format for a number in properties file: " + property, nfe); - return -1; - } - } -} diff --git a/src/main/java/com/mosso/client/cloudfiles/IFilesTransferCallback.java b/src/main/java/com/mosso/client/cloudfiles/IFilesTransferCallback.java deleted file mode 100644 index 0d49298..0000000 --- a/src/main/java/com/mosso/client/cloudfiles/IFilesTransferCallback.java +++ /dev/null @@ -1,13 +0,0 @@ -/** - * - */ -package com.mosso.client.cloudfiles; - -/** - * @author lvaughn - * - */ -public interface IFilesTransferCallback { - public void progress(long n); - -} diff --git a/src/main/java/com/mosso/client/cloudfiles/MIME.types b/src/main/java/com/mosso/client/cloudfiles/MIME.types deleted file mode 100644 index 9f91f79..0000000 --- a/src/main/java/com/mosso/client/cloudfiles/MIME.types +++ /dev/null @@ -1,580 +0,0 @@ -3dm x-world/x-3dmf -3dmf x-world/x-3dmf -a application/octet-stream -aab application/x-authorware-bin -aam application/x-authorware-map -aas application/x-authorware-seg -abc text/vnd.abc -acgi text/html -afl video/animaflex -ai application/postscript -aif audio/aiff -#aif audio/x-aiff -aifc audio/aiff -#aifc audio/x-aiff -aiff audio/aiff -#aiff audio/x-aiff -aim application/x-aim -aip text/x-audiosoft-intra -ani application/x-navi-animation -aos application/x-nokia-9000-communicator-add-on-software -aps application/mime -arc application/octet-stream -arj application/arj -#arj application/octet-stream -art image/x-jg -asf video/x-ms-asf -asm text/x-asm -asp text/asp -asx application/x-mplayer2 -#asx video/x-ms-asf -#asx video/x-ms-asf-plugin -au audio/basic -#au audio/x-au -avi application/x-troff-msvideo -#avi video/avi -#avi video/msvideo -#avi video/x-msvideo -avs video/avs-video -bcpio application/x-bcpio -#bin application/mac-binary -#bin application/macbinary -#bin application/octet-stream -bin application/x-binary -#bin application/x-macbinary -bm image/bmp -bmp image/bmp -#bmp image/x-windows-bmp -boo application/book -book application/book -boz application/x-bzip2 -bsh application/x-bsh -bz application/x-bzip -bz2 application/x-bzip2 -c text/plain -#c text/x-c -c++ text/plain -cat application/vnd.ms-pki.seccat -cc text/plain -#cc text/x-c -ccad application/clariscad -cco application/x-cocoa -cdf application/cdf -#cdf application/x-cdf -#cdf application/x-netcdf -cer application/pkix-cert -#cer application/x-x509-ca-cert -cha application/x-chat -chat application/x-chat -class application/java -#class application/java-byte-code -#class application/x-java-class -com application/octet-stream -#com text/plain -conf text/plain -cpio application/x-cpio -cpp text/x-c -cpt application/mac-compactpro -#cpt application/x-compactpro -#cpt application/x-cpt -crl application/pkcs-crl -#crl application/pkix-crl -crt application/pkix-cert -#crt application/x-x509-ca-cert -#crt application/x-x509-user-cert -csh application/x-csh -#csh text/x-script.csh -css application/x-pointplus -#css text/css -cxx text/plain -dcr application/x-director -deepv application/x-deepv -def text/plain -der application/x-x509-ca-cert -dif video/x-dv -dir application/x-director -dl video/dl -#dl video/x-dl -doc application/msword -dot application/msword -dp application/commonground -drw application/drafting -dump application/octet-stream -dv video/x-dv -dvi application/x-dvi -#dwf drawing/x-dwf (old) -dwf model/vnd.dwf -dwg application/acad -#dwg image/vnd.dwg -#dwg image/x-dwg -dxf application/dxf -#dxf image/vnd.dwg -#dxf image/x-dwg -dxr application/x-director -el text/x-script.elisp -elc application/x-bytecode.elisp (compiled elisp) -#elc application/x-elc -env application/x-envoy -eps application/postscript -es application/x-esrehber -etx text/x-setext -evy application/envoy -#evy application/x-envoy -exe application/octet-stream -f text/plain -#f text/x-fortran -f77 text/x-fortran -f90 text/plain -#f90 text/x-fortran -fdf application/vnd.fdf -fif application/fractals -#fif image/fif -fli video/fli -#fli video/x-fli -flo image/florian -flx text/vnd.fmi.flexstor -fmf video/x-atomic3d-feature -for text/plain -#for text/x-fortran -fpx image/vnd.fpx -#fpx image/vnd.net-fpx -frl application/freeloader -funk audio/make -g text/plain -g3 image/g3fax -gif image/gif -gl video/gl -#gl video/x-gl -gsd audio/x-gsm -gsm audio/x-gsm -gsp application/x-gsp -gss application/x-gss -gtar application/x-gtar -gz application/x-compressed -#gz application/x-gzip -gzip application/x-gzip -#gzip multipart/x-gzip -h text/plain -#h text/x-h -hdf application/x-hdf -help application/x-helpfile -hgl application/vnd.hp-hpgl -hh text/plain -#hh text/x-h -#hlb text/x-script -hlp application/hlp -#hlp application/x-helpfile -#hlp application/x-winhelp -hpg application/vnd.hp-hpgl -hpgl application/vnd.hp-hpgl -hqx application/binhex -#hqx application/binhex4 -#hqx application/mac-binhex -#hqx application/mac-binhex40 -#hqx application/x-binhex40 -#hqx application/x-mac-binhex40 -hta application/hta -htc text/x-component -htm text/html -html text/html -htmls text/html -htt text/webviewhtml -htx text/html -ice x-conference/x-cooltalk -ico image/x-icon -idc text/plain -ief image/ief -iefs image/ief -iges application/iges -#iges model/iges -igs application/iges -igs model/iges -ima application/x-ima -imap application/x-httpd-imap -inf application/inf -ins application/x-internett-signup -ip application/x-ip2 -isu video/x-isvideo -it audio/it -iv application/x-inventor -ivr i-world/i-vrml -ivy application/x-livescreen -jam audio/x-jam -java text/plain -#java text/x-java-source -jcm application/x-java-commerce -jfif image/jpeg -#jfif image/pjpeg -#jpe image/jpeg -#jpe image/pjpeg -jpeg image/jpeg -#jpeg image/pjpeg -jpg image/jpeg -#jpg image/pjpeg -jps image/x-jps -js application/x-javascript -jut image/jutvision -kar audio/midi -#kar music/x-karaoke -#ksh application/x-ksh -ksh text/x-script.ksh -la audio/nspaudio -#la audio/x-nspaudio -lam audio/x-liveaudio -latex application/x-latex -#lha application/lha -lha application/octet-stream -#lha application/x-lha -lhx application/octet-stream -list text/plain -lma audio/nspaudio -#lma audio/x-nspaudio -log text/plain -#lsp application/x-lisp -#lsp text/x-script.lisp -lst text/plain -lsx text/x-la-asf -ltx application/x-latex -lzh application/octet-stream -#lzh application/x-lzh -#lzx application/lzx -lzx application/octet-stream -#lzx application/x-lzx -m text/plain -# -m1v video/mpeg -#m2a audio/mpeg -m2v video/mpeg -#m3u audio/x-mpequrl -man application/x-troff-man -mht message/rfc822 -#mhtml message/rfc822 -#mid application/x-midi -#midi audio/midi -mif application/x-frame -#mjf audio/x-vnd.audioexplosion.mjuicemediafile -mjpg video/x-motion-jpeg -mod audio/mod -mov video/quicktime -movie video/x-sgi-movie -mp2 audio/mpeg -mp3 audio/mpeg3 -mpa audio/mpeg -#mpa video/mpeg -mpc application/x-project -#mpeg video/mpeg -mpg audio/mpeg -#mpg video/mpeg -#mpga audio/mpeg -p text/x-pascal -p10 application/pkcs10 -#p10 application/x-pkcs10 -p12 application/pkcs-12 -p12 application/x-pkcs12 -p7a application/x-pkcs7-signature -#p7c application/pkcs7-mime -p7c application/x-pkcs7-mime -p7m application/pkcs7-mime -#p7m application/x-pkcs7-mime -p7r application/x-pkcs7-certreqresp -p7s application/pkcs7-signature -part application/pro_eng -pas text/pascal -pbm image/x-portable-bitmap -#.pcl application/vnd.hp-pcl -pcl application/x-pcl -pct image/x-pict -pcx image/x-pcx -pdb chemical/x-pdb -pdf application/pdf -pfunk audio/make -#pfunk audio/make.my.funk -pgm image/x-portable-graymap -pgm image/x-portable-greymap -pic image/pict -pict image/pict -pkg application/x-newton-compatible-pkg -pko application/vnd.ms-pki.pko -pl text/plain -pl text/x-script.perl -plx application/x-pixclscript -pm image/x-xpixmap -#pm text/x-script.perl-module -pm4 application/x-pagemaker -pm5 application/x-pagemaker -png image/png -pnm application/x-portable-anymap -pnm image/x-portable-anymap -pot application/mspowerpoint -pot application/vnd.ms-powerpoint -pov model/x-pov -ppa application/vnd.ms-powerpoint -ppm image/x-portable-pixmap -pps application/mspowerpoint -pps application/vnd.ms-powerpoint -ppt application/mspowerpoint -#ppt application/powerpoint -#ppt application/vnd.ms-powerpoint -#ppt application/x-mspowerpoint -ppz application/mspowerpoint -pre application/x-freelance -prt application/pro_eng -ps application/postscript -psd application/octet-stream -pvu paleovu/x-pv -pwz application/vnd.ms-powerpoint -py text/x-script.phyton -pyc applicaiton/x-bytecode.python -qcp audio/vnd.qcelp -qd3 x-world/x-3dmf -#qd3d x-world/x-3dmf -qif image/x-quicktime -qt video/quicktime -qtc video/x-qtc -qti image/x-quicktime -qtif image/x-quicktime -ra audio/x-pn-realaudio -#ra audio/x-pn-realaudio-plugin -#ra audio/x-realaudio -ram audio/x-pn-realaudio -ras application/x-cmu-raster -#ras image/cmu-raster -#ras image/x-cmu-raster -#rast image/cmu-raster -#rexx text/x-script.rexx -#rf image/vnd.rn-realflash -rgb image/x-rgb -rm application/vnd.rn-realmedia -#rm audio/x-pn-realaudio -rmi audio/mid -rmm audio/x-pn-realaudio -rmp audio/x-pn-realaudio -#rmp audio/x-pn-realaudio-plugin -rng application/ringing-tones -#rng application/vnd.nokia.ringing-tone -rnx application/vnd.rn-realplayer -roff application/x-troff -rp image/vnd.rn-realpix -rpm audio/x-pn-realaudio-plugin -rt text/richtext -#rt text/vnd.rn-realtext -rtf application/rtf -#rtf application/x-rtf -#rtf text/richtext -#rtx application/rtf -#rtx text/richtext -rv video/vnd.rn-realvideo -s text/x-asm -s3m audio/s3m -#saveme application/octet-stream -sbk application/x-tbook -scm application/x-lotusscreencam -#scm text/x-script.guile -#scm text/x-script.scheme -#scm video/x-scm -sdml text/plain -sdp application/sdp -#sdp application/x-sdp -sdr application/sounder -sea application/sea -#sea application/x-sea -set application/set -sgm text/sgml -#sgm text/x-sgml -sgml text/sgml -#sgml text/x-sgml -sh application/x-bsh -#sh application/x-sh -#sh application/x-shar -#sh text/x-script.sh -shar application/x-bsh -#shar application/x-shar -shtml text/html -#shtml text/x-server-parsed-html -sid audio/x-psid -#sit application/x-sit -sit application/x-stuffit -skd application/x-koan -skm application/x-koan -skp application/x-koan -skt application/x-koan -sl application/x-seelogo -smi application/smil -smil application/smil -#snd audio/basic -snd audio/x-adpcm -sol application/solids -#spc application/x-pkcs7-certificates -spc text/x-speech -spl application/futuresplash -spr application/x-sprite -sprite application/x-sprite -src application/x-wais-source -ssi text/x-server-parsed-html -ssm application/streamingmedia -sst application/vnd.ms-pki.certstore -step application/step -stl application/sla -#stl application/vnd.ms-pki.stl -#stl application/x-navistyle -stp application/step -sv4cpio application/x-sv4cpio -sv4crc application/x-sv4crc -svf image/vnd.dwg -#svf image/x-dwg -svr application/x-world -#svr x-world/x-svr -swf application/x-shockwave-flash -t application/x-troff -talk text/x-speech -tar application/x-tar -tbk application/toolbook -#tbk application/x-tbook -tcl application/x-tcl -#tcl text/x-script.tcl -tcsh text/x-script.tcsh -tex application/x-tex -texi application/x-texinfo -texinfo application/x-texinfo -#text application/plain -text text/plain -#tgz application/gnutar -tgz application/x-compressed -tif image/tiff -#tif image/x-tiff -tiff image/tiff -#tiff image/x-tiff -tr application/x-troff -tsi audio/tsp-audio -tsp application/dsptype -#tsp audio/tsplayer -tsv text/tab-separated-values -turbot image/florian -txt text/plain -uil text/x-uil -uni text/uri-list -unis text/uri-list -unv application/i-deas -uri text/uri-list -uris text/uri-list -ustar application/x-ustar -#ustar multipart/x-ustar -uu application/octet-stream -#uu text/x-uuencode -uue text/x-uuencode -vcd application/x-cdlink -vcs text/x-vcalendar -vda application/vda -vdo video/vdo -vew application/groupwise -viv video/vivo -#viv video/vnd.vivo -vivo video/vivo -#vivo video/vnd.vivo -vmd application/vocaltec-media-desc -vmf application/vocaltec-media-file -voc audio/voc -#voc audio/x-voc -vos video/vosaic -vox audio/voxware -vqe audio/x-twinvq-plugin -vqf audio/x-twinvq -vql audio/x-twinvq-plugin -vrml application/x-vrml -#vrml model/vrml -#vrml x-world/x-vrml -vrt x-world/x-vrt -vsd application/x-visio -vst application/x-visio -vsw application/x-visio -w60 application/wordperfect6.0 -w61 application/wordperfect6.1 -w6w application/msword -wav audio/wav -#wav audio/x-wav -wb1 application/x-qpro -wbmp image/vnd.wap.wbmp -web application/vnd.xara -wiz application/msword -wk1 application/x-123 -wmf windows/metafile -wml text/vnd.wap.wml -wmlc application/vnd.wap.wmlc -wmls text/vnd.wap.wmlscript -wmlsc application/vnd.wap.wmlscriptc -word application/msword -wp application/wordperfect -wp5 application/wordperfect -#wp5 application/wordperfect6.0 -wp6 application/wordperfect -wpd application/wordperfect -#wpd application/x-wpwin -wq1 application/x-lotus -wri application/mswrite -#wri application/x-wri -#wrl application/x-world -wrl model/vrml -#wrl x-world/x-vrml -#wrz model/vrml -#wrz x-world/x-vrml -#wsc text/scriplet -wsrc application/x-wais-source -wtk application/x-wintalk -xbm image/x-xbitmap -#xbm image/x-xbm -xbm image/xbm -xdr video/x-amt-demorun -xgz xgl/drawing -xif image/vnd.xiff -xl application/excel -xla application/excel -#xla application/x-excel -#xla application/x-msexcel -xlb application/excel -#xlb application/vnd.ms-excel -xlb application/x-excel -#xlc application/excel -#xlc application/vnd.ms-excel -#xlc application/x-excel -xld application/excel -#xld application/x-excel -#xlk application/excel -xlk application/x-excel -#xll application/excel -#xll application/vnd.ms-excel -xll application/x-excel -#xlm application/excel -#xlm application/vnd.ms-excel -xlm application/x-excel -#xls application/excel -#xls application/vnd.ms-excel -#xls application/x-excel -xls application/x-msexcel -#xlt application/excel -xlt application/x-excel -#xlv application/excel -xlv application/x-excel -#xlw application/excel -#xlw application/vnd.ms-excel -#xlw application/x-excel -xlw application/x-msexcel -xm audio/xm -#xml application/xml -xml text/xml -xmz xgl/movie -xpix application/x-vnd.ls-xpix -#xpm image/x-xpixmap -xpm image/xpm -x-png image/png -xsr video/x-amt-showrun -#xwd image/x-xwd -xwd image/x-xwindowdump -xyz chemical/x-pdb -#z application/x-compress -z application/x-compressed -zip application/x-compressed -#zip application/x-zip-compressed -#zip application/zip -#zip multipart/x-zip -zoo application/octet-stream -zsh text/x-script.zsh \ No newline at end of file diff --git a/src/main/java/com/mosso/client/cloudfiles/sample/FilesAuth.java b/src/main/java/com/mosso/client/cloudfiles/sample/FilesAuth.java deleted file mode 100644 index 6916bb1..0000000 --- a/src/main/java/com/mosso/client/cloudfiles/sample/FilesAuth.java +++ /dev/null @@ -1,33 +0,0 @@ -/* - * See COPYING for license information. - */ - -package com.mosso.client.cloudfiles.sample; - -import com.mosso.client.cloudfiles.*; - -public class FilesAuth -{ - public static void main(String[] args) - { - try - { - FilesClient client = new FilesClient(); - boolean success = client.login(); - if (success) - { - System.out.println("username: "+client.getUserName()); - System.out.println("url: "+client.getStorageURL()); - System.out.println("token: "+client.getStorageToken()); - } - else - { - System.out.println("login failed."); - } - } - catch (Exception e) - { - System.err.println(e.toString()); - } - } -} diff --git a/src/main/java/com/mosso/client/cloudfiles/sample/FilesCli.java b/src/main/java/com/mosso/client/cloudfiles/sample/FilesCli.java deleted file mode 100644 index 568a8c6..0000000 --- a/src/main/java/com/mosso/client/cloudfiles/sample/FilesCli.java +++ /dev/null @@ -1,401 +0,0 @@ -/* - * See COPYING for license information. - */ - -package com.mosso.client.cloudfiles.sample; - -import java.io.BufferedReader; -import java.io.File; -import java.io.FileOutputStream; -import java.io.IOException; -import java.io.InputStream; -import java.io.InputStreamReader; -import java.text.DecimalFormat; -import java.util.List; -import java.util.Map; - -import com.mosso.client.cloudfiles.FilesAccountInfo; -import com.mosso.client.cloudfiles.FilesClient; -import com.mosso.client.cloudfiles.FilesConstants; -import com.mosso.client.cloudfiles.FilesContainer; -import com.mosso.client.cloudfiles.FilesContainerExistsException; -import com.mosso.client.cloudfiles.FilesContainerInfo; -import com.mosso.client.cloudfiles.FilesContainerNotEmptyException; -import com.mosso.client.cloudfiles.FilesInvalidNameException; -import com.mosso.client.cloudfiles.FilesNotFoundException; -import com.mosso.client.cloudfiles.FilesObject; -import com.mosso.client.cloudfiles.FilesObjectMetaData; - -/** - * @author lvaughn - * - */ -public class FilesCli { - FilesClient client = null; - BufferedReader console = new BufferedReader(new InputStreamReader(System.in)); - - private boolean doLogin() { - - try { - System.out.print("Username: "); - String username = console.readLine().trim(); - - System.out.print("Password: "); - String password = console.readLine().trim(); - - System.out.print("Account (return if using Mosso directly): "); - String account = console.readLine().trim(); - - if (account.length() == 0) { - account = null; - } - - client = new FilesClient(username, password, account); - boolean result = client.login(); - - if (result) { - System.out.println("Logged in!"); - } - else { - System.out.println("Login failed"); - } - - return result; - } catch (IOException e) { - System.out.println("Error logging in!"); - e.printStackTrace(); - return false; - } - - - } - - private static final String HELP_STRING = - "Commands:\n" + - " get List the containers for this account\n" + - " get container List the contents of the given container\n" + - " get container/object destination Download the given object and store it at the destination\n" + - " head Get information about this account\n" + - " head container Get the container's information\n" + - " head container/object Get the objects's information and metadata\n" + - " put container Create the given container\n" + - " put container localfile Upload the local file to the container\n" + - " delete container Delete the container\n" + - " delete container/object Delete the given object\n" + - " help Print this help message\n" + - " exit Exit the program\n"; - - private boolean evaluateCommand(String cmd) { - cmd = cmd.trim(); - - String components[] = cmd.split("\\s+"); - if (cmd.length() == 0 || "help".equals(components[0].toLowerCase())) { - System.out.println(HELP_STRING); - return true; - } - - String command = components[0].toLowerCase(); - - // Exit - if("exit".equals(command) || "quit".equals(command)) { - System.out.println("Exiting"); - return false; - } - - //-- "get" - lists containers - //-- "get " - list contents of specified container - // --"get " - downloads object - if("get".equals(command)) { - if(components.length == 1) { - try { - // List containers - List containers = client.listContainers(); - int nContainers = containers.size(); - System.out.println("The account has " + nContainers + ((nContainers == 1) ? " container" : " containers")); - for(FilesContainer container : containers) { - System.out.println(" " + container.getName()); - } - return true; - } - catch (Exception ex) { - System.out.println("Problem listing containers"); - ex.printStackTrace(); - return true; - } - } - else { - String name = components[1]; - int slashLocation = name.indexOf('/'); - if (slashLocation == -1) { - // It's a container - try { - List objects = client.listObjects(name); - if (objects.size() == 0) { - System.out.println("Container " + name + " was empty"); - return true; - } - - System.out.println("Contents of " + name + ":"); - for(FilesObject obj : objects) { - System.out.println(" " + obj.getName() + " " + obj.getSizeString()); - } - System.out.println(); - } catch (Exception e) { - System.out.println("Error trying to list container contents"); - e.printStackTrace(); - return true; - } - } - else { - // It's an object - if (components.length != 3) { - System.out.println("usage: get container/filename.ext destination.ext"); - return true; - } - - String container = name.substring(0, slashLocation); - String object = name.substring(slashLocation + 1); - String destination = components[2]; - - try { - InputStream is = client.getObjectAsStream(container, object); - FileOutputStream fos = new FileOutputStream(destination); - byte buffer[] = new byte[4096]; - int read = -1; - while ((read = is.read(buffer)) > 0) { - fos.write(buffer, 0, read); - } - fos.close(); - is.close(); - System.out.println(name + " downlaoded to " + destination); - } - catch (Exception ex) { - System.out.println("Problem getting " + name); - ex.printStackTrace(); - return true; - } - } - } - return true; - } - - // -- "head " - show container info - // -- "head " - shown object info, incl meta data - if ("head".equals(command)) { - if (components.length == 1) { - try { - FilesAccountInfo info = client.getAccountInfo(); - System.out.println("Account information:"); - System.out.println(" Number of Containers: " + info.getContainerCount()); - System.out.println(" Total Account Size: " + info.getBytesUsed()); - System.out.println(); - } - catch (Exception e) { - System.err.println("Error getting container info"); - e.printStackTrace(); - return true; - } - } - DecimalFormat format = new DecimalFormat(); - for(int i=1; i < components.length; i++) { - String name = components[i]; - int slashLocation = name.indexOf('/'); - if (slashLocation == -1) { - // assume it's a container - try { - FilesContainerInfo containerInfo = client.getContainerInfo(name); - System.out.println("Information for " + name); - System.out.println(" Object Count: " + containerInfo.getObjectCount()); - System.out.println(" Total Size: " + format.format(containerInfo.getTotalSize()) + " bytes"); - System.out.println(); - } catch (Exception e) { - System.err.println("Error getting container info"); - e.printStackTrace(); - return true; - } - } - else { - String container = name.substring(0, slashLocation); - String object = name.substring(slashLocation + 1); - try { - FilesObjectMetaData metadata = client.getObjectMetaData(container, object); - if (metadata == null) { - System.out.println("Could not get metadata for " + name); - } - else { - System.out.println("LGV: " + container + ":" + object + ":" + metadata); - System.out.println("Information for " + name); - System.out.println(" Total Size: " + metadata.getContentLength() + " bytes"); - System.out.println(" MIME type: " + metadata.getMimeType()); - Map md = metadata.getMetaData(); - if (md.size() == 0) { - System.out.println(" Contains no metadata"); - } - else { - System.out.println(" Metadata:"); - for(String key : md.keySet()) { - System.out.println(" " + key + " => " + md.get(key)); - } - } - System.out.println(); - } - } - catch (Exception e) { - System.err.println("Error getting object info"); - e.printStackTrace(); - return true; - } - } - } - return true; - } - - // --"put " - create new container - // --"put " - upload object - if("put".equals(command)) { - if (components.length == 2) { - String newContainerName = components[1]; - if(newContainerName.indexOf('/') != -1) { - System.out.println("Container names may not contain slashes"); - return true; - } - try { - client.createContainer(newContainerName); - } - catch (FilesContainerExistsException fcee) { - System.out.println(newContainerName + " already existed"); - } catch (Exception e) { - System.out.println("Error creating container"); - e.printStackTrace(); - return true; - } - return true; - } - else if(components.length == 3) { - String containerName = components[1]; - String filename = components[2]; - - File file = new File(filename); - if (!file.exists()) { - System.out.println("Could not find file " + file.getAbsolutePath()); - return true; - } - String name = file.getName(); - String extention = ""; - int dotLocation = name.lastIndexOf('.'); - if (dotLocation > 0) { - extention = name.substring(dotLocation + 1); - } - String mimeType = FilesConstants.getMimetype(extention); - - try { - if (!client.containerExists(containerName)) { - System.out.println("Container " + containerName + " does not exist"); - return true; - } - if (client.storeObject(containerName, file, mimeType)) { - System.out.println("Object " + file.getName() + " was created"); - } - return true; - } - catch (Exception e) { - System.out.println("Problem uploading file"); - e.printStackTrace(); - return true; - } - } - else { - System.out.println("Usage:\n put container\n put container file"); - } - return true; - } - - //--"delete " - delete the specified object - // --"delete " - delete the specified container - if("delete".equals(command)) { - for(int i=1; i < components.length; i++) { - String name = components[i]; - int slashLocation = name.indexOf('/'); - if (slashLocation == -1) { - // assume it's a container - boolean returnCode = false; - try { - returnCode = client.deleteContainer(name); - } catch (FilesInvalidNameException fine) { - System.out.println(name + " is not a valid container name"); - } catch (FilesNotFoundException fine) { - System.out.println(name + " could not be found"); - } catch (FilesContainerNotEmptyException fine) { - System.out.println(name + " was not empty. Please delete the contents and try again"); - } - catch (Exception e) { - System.out.println("Error deleting container"); - e.printStackTrace(); - return true; - } - if (returnCode) { - System.out.println ("Container \"" + name + "\" deleted"); - } - else { - System.out.println("Unexpected result deleting container "); - } - } - else { - // object - String container = name.substring(0, slashLocation); - String object = name.substring(slashLocation + 1); - try { - client.deleteObject(container, object); - System.out.println ("Object \"" + name + "\" deleted"); - } - catch (FilesNotFoundException fnfe) { - System.out.println(name + " could not be found"); - } - catch (Exception e) { - System.out.println("Error deleting object"); - e.printStackTrace(); - return true; - } - } - } - return true; - } - - // We should never get here - System.out.println("Unrecognized command " + cmd); - System.out.println(HELP_STRING); - return true; - } - - - /** - * @param args - */ - public static void main(String[] args) { - - FilesCli commandLine = new FilesCli(); - - if (commandLine.doLogin()) { - System.out.println("Type 'help' for assistance"); - String cmd = ""; - do { - String account = commandLine.client.getAccount(); - account = (account == null) ? commandLine.client.getUserName() : account; - System.out.print(account + ": "); - try { - cmd = commandLine.console.readLine(); - } - catch (IOException e) { - cmd = ""; - } - - } while(commandLine.evaluateCommand(cmd)); - - System.exit(0); - } - else { - System.err.println("Login failed"); - System.exit(-1); - } - } -} diff --git a/src/main/java/com/mosso/client/cloudfiles/sample/FilesCopy.java b/src/main/java/com/mosso/client/cloudfiles/sample/FilesCopy.java deleted file mode 100644 index 38f40c5..0000000 --- a/src/main/java/com/mosso/client/cloudfiles/sample/FilesCopy.java +++ /dev/null @@ -1,456 +0,0 @@ -/* - * See COPYING for license information. - */ - -package com.mosso.client.cloudfiles.sample; - -import org.apache.commons.cli.*; -import org.apache.commons.lang.SystemUtils; -import org.apache.commons.lang.StringUtils; -import org.apache.commons.io.FilenameUtils; -import org.apache.commons.httpclient.HttpException; - -import org.apache.log4j.Logger; - -import com.mosso.client.cloudfiles.FilesAuthorizationException; -import com.mosso.client.cloudfiles.FilesClient; -import com.mosso.client.cloudfiles.FilesConstants; -import com.mosso.client.cloudfiles.FilesException; -import com.mosso.client.cloudfiles.FilesObject; - -import java.io.*; -import java.util.zip.*; -import java.util.*; -import java.security.NoSuchAlgorithmException; - -public class FilesCopy -{ - private static final Logger logger = Logger.getLogger(FilesCopy.class); - - private static final String ZIPEXTENSION = ".zip"; - - private static File SYSTEM_TMP = SystemUtils.getJavaIoTmpDir(); - - public static void main (String args[]) throws NoSuchAlgorithmException, FilesException - { - //Build the command line options - Options options = addCommandLineOptions (); - - if (args.length <= 0) - printHelp (options); - - CommandLineParser parser = new GnuParser(); - try - { - // parse the command line arguments - CommandLine line = parser.parse( options, args ); - - if (line.hasOption("help")) - printHelp (options); - - if (line.hasOption("file") && line.hasOption("folder")) - { - System.err.println ("Can not use both -file and -folder on the command line at the same time."); - System.exit(-1); - }//if (line.hasOption("file") && line.hasOption("folder")) - - if (line.hasOption("download")) - { - if (line.hasOption("folder") ) - { - String localFolder = FilenameUtils.normalize( line.getOptionValue("folder") ); - String containerName = null; - if (StringUtils.isNotBlank(localFolder)) - { - File localFolderObj = new File (localFolder); - if (localFolderObj.exists() && localFolderObj.isDirectory()) - { - if (line.hasOption("container")) - { - containerName = line.getOptionValue("container"); - if (!StringUtils.isNotBlank(containerName)) - { - System.err.println ("You must provide a valid value for the Container to upload to !"); - System.exit (-1); - }//if (!StringUtils.isNotBlank(ontainerName)) - } - else - { - System.err.println ("You must provide the -container for a copy operation to work as expected."); - System.exit (-1); - } - - System.out.println ("Downloading all objects from: "+containerName+ " to local folder: "+ localFolder); - - getContainerObjects (localFolderObj, containerName); - - } - else - { - if ( !localFolderObj.exists() ) - { - System.err.println ("The local folder: "+ localFolder + " does not exist. Create it first and then run this command."); - } - - if ( !localFolderObj.isDirectory() ) - { - System.err.println ("The local folder name supplied : "+ localFolder + " is not a folder !"); - } - - System.exit (-1); - } - } - } - System.exit (0); - }//if (line.hasOption("download")) - - - if (line.hasOption("folder")) - { - String containerName = null; - String folderPath = null; - - if (line.hasOption("container")) - { - containerName = line.getOptionValue("container"); - if (!StringUtils.isNotBlank(containerName)) - { - System.err.println ("You must provide a valid value for the Container to upload to !"); - System.exit (-1); - }//if (!StringUtils.isNotBlank(containerName)) - - } - else - { - System.err.println ("You must provide the -container for a copy operation to work as expected."); - System.exit (-1); - } - - folderPath = line.getOptionValue("folder"); - if (StringUtils.isNotBlank(folderPath)) - { - File folder = new File ( FilenameUtils.normalize (folderPath) ); - if (folder.isDirectory()) - { - if (line.hasOption("z")) - { - System.out.println ("Zipping: "+folderPath); - System.out.println ("Nested folders are ignored !"); - - File zipedFolder = zipFolder(folder); - String mimeType = FilesConstants.getMimetype(ZIPEXTENSION); - copyToCreateContainerIfNeeded (zipedFolder, mimeType, containerName); - } - else - { - File [] files = folder.listFiles(); - for (File f: files) - { - String mimeType = FilesConstants.getMimetype(FilenameUtils.getExtension(f.getName())); - System.out.println ("Uploading :"+f.getName()+" to "+folder.getName()); - copyToCreateContainerIfNeeded (f, mimeType, containerName); - System.out.println ("Upload :"+f.getName()+" to "+folder.getName()+" completed."); - } - } - } - else - { - System.err.println ("You must provide a valid folder value for the -folder option !"); - System.err.println ("The value provided is: "+FilenameUtils.normalize (folderPath)); - System.exit (-1); - } - - } - }//if (line.hasOption("folder")) - - if (line.hasOption("file")) - { - String containerName = null; - String fileNamePath = null; - - if (line.hasOption("container")) - { - containerName = line.getOptionValue("container"); - if (!StringUtils.isNotBlank(containerName) || containerName.indexOf('/') != -1) - { - System.err.println ("You must provide a valid value for the Container to upload to !"); - System.exit (-1); - }//if (!StringUtils.isNotBlank(containerName)) - } - else - { - System.err.println ("You must provide the -container for a copy operation to work as expected."); - System.exit (-1); - } - - fileNamePath = line.getOptionValue("file"); - if (StringUtils.isNotBlank(fileNamePath)) - { - String fileName = FilenameUtils.normalize (fileNamePath); - String fileExt = FilenameUtils.getExtension(fileNamePath); - String mimeType = FilesConstants.getMimetype(fileExt); - File file = new File (fileName); - - if (line.hasOption("z")) - { - logger.info("Zipping "+fileName); - if (!file.isDirectory()) - { - File zippedFile = zipFile(file); - mimeType = FilesConstants.getMimetype(ZIPEXTENSION); - copyTo (zippedFile, mimeType, containerName); - zippedFile.delete(); - } - - }//if (line.hasOption("z")) - else - { - - logger.info("Uploading "+fileName+ "."); - if (!file.isDirectory()) - copyTo (file, mimeType, containerName); - else - { - System.err.println ("The path you provided is a folder. For uploading folders use the -folder option."); - System.exit (-1); - } - } - }//if (StringUtils.isNotBlank(file)) - else - { - System.err.println ("You must provide a valid value for the file to upload !"); - System.exit (-1); - } - }//if (line.hasOption("file")) - }//end try - catch( ParseException err ) - { - System.err.println( "Please see the logs for more details. Error Message: "+err.getMessage() ); - err.printStackTrace(System.err); - }//catch( ParseException err ) - catch (FilesAuthorizationException err) - { - logger.fatal("FilesAuthorizationException : Failed to login to your account !"+ err); - System.err.println( "Please see the logs for more details. Error Message: "+err.getMessage() ); - }//catch (FilesAuthorizationException err) - - catch ( IOException err) - { - logger.fatal("IOException : "+ err); - System.err.println( "Please see the logs for more details. Error Message: "+err.getMessage() ); - }//catch ( IOException err) - } - - public static void getContainerObjects (File localFolder, String containerName) throws IOException, HttpException, FilesAuthorizationException, NoSuchAlgorithmException, FilesException - { - FilesClient client = new FilesClient(); - if ( client.login() ) - { - if (client.containerExists(containerName)) - { - List objects = client.listObjects(containerName); - for (FilesObject obj: objects) - { - System.out.println ("\t"+StringUtils.rightPad(obj.getName (), 35)+ obj.getSizeString()); - File localFile = new File ( FilenameUtils.concat(localFolder.getAbsolutePath(), obj.getName()) ); - obj.writeObjectToFile (localFile); - }//for (Object obj: objects) - } - else - { - logger.fatal("The container: "+containerName+" does not exist."); - System.out.println ("The container: "+containerName+" does not exist!"); - System.exit (0); - } - }//if ( client.login() ) - } - - /** - * - * @param file - * @param mimeType - * @param containerName - * @throws IOException - * @throws HttpException - * @throws NoSuchAlgorithmException - * @throws FilesException - */ - private static void copyToCreateContainerIfNeeded (File file, String mimeType,String containerName) throws IOException, HttpException, NoSuchAlgorithmException, FilesException - { - FilesClient client = new FilesClient(); - if ( client.login() ) - { - if (client.containerExists(containerName)) - { - logger.info ("Copying files to "+containerName); - copyTo (file, mimeType, containerName); - } - else - { - logger.warn("The container: "+containerName+" does not exist. Creating it first before placing objects into it."); - System.out.println ("The container: "+containerName+" does not exist. Creating it first before placing objects into it."); - client.createContainer(containerName); - copyTo (file, mimeType, containerName); - } - - } - } - - /** - * - * @param file - * @param mimeType - * @param containerName - * @throws IOException - * @throws HttpException - * @throws NoSuchAlgorithmException - * @throws FilesException - */ - private static void copyTo (File file, String mimeType,String containerName) throws IOException, HttpException, NoSuchAlgorithmException, FilesException - { - FilesClient client = new FilesClient(); - if ( client.login() ) - { - if (client.containerExists(containerName)) - client.storeObject(containerName, file, mimeType); - else - { - logger.info("The container: "+containerName+" does not exist. Create it first before placing objects into it."); - System.out.println ("The container: "+containerName+" does not exist. Create it first before placing objects into it."); - System.exit (0); - } - - }//if ( client.login() ) - } - - /** - * - * @param folder - * @return null if the input is not a folder otherwise a zip file containing all the files in the folder with nested folders skipped. - * @throws IOException - */ - public static File zipFolder (File folder) throws IOException - { - byte[] buf = new byte[1024]; - int len; - - // Create the ZIP file - String filenameWithZipExt = folder.getName()+ZIPEXTENSION; - File zippedFile = new File (FilenameUtils.concat( SYSTEM_TMP.getAbsolutePath(), filenameWithZipExt )); - - ZipOutputStream out = new ZipOutputStream(new FileOutputStream(zippedFile)); - - if (folder.isDirectory()) - { - File [] files = folder.listFiles(); - - for (File f: files) - { - if (!f.isDirectory()) - { - FileInputStream in = new FileInputStream(f); - - // Add ZIP entry to output stream. - out.putNextEntry(new ZipEntry(f.getName())); - - // Transfer bytes from the file to the ZIP file - while ((len = in.read(buf)) > 0) - { - out.write(buf, 0, len); - } - - // Complete the entry - out.closeEntry(); - in.close(); - } - else - logger.warn ("Skipping nested folder: "+f.getAbsoluteFile()); - } - - out.flush(); - out.close(); - } - else - { - logger.warn ("The folder name supplied is not a folder!"); - System.err.println("The folder name supplied is not a folder!"); - return null; - } - - return zippedFile; - } - - public static File zipFile (File f) throws IOException - { - byte[] buf = new byte[1024]; - int len; - - // Create the ZIP file - String filenameWithZipExt = f.getName()+ZIPEXTENSION; - File zippedFile = new File (FilenameUtils.concat( SYSTEM_TMP.getAbsolutePath(), filenameWithZipExt )); - - ZipOutputStream out = new ZipOutputStream(new FileOutputStream(zippedFile)); - FileInputStream in = new FileInputStream(f); - - // Add ZIP entry to output stream. - out.putNextEntry(new ZipEntry(f.getName())); - - // Transfer bytes from the file to the ZIP file - while ((len = in.read(buf)) > 0) - { - out.write(buf, 0, len); - } - - // Complete the entry - out.closeEntry(); - out.flush(); - - in.close(); - out.close(); - - return zippedFile; - } - - private static void printHelp (Options options) - { - HelpFormatter formatter = new HelpFormatter(); - formatter.printHelp( "List -file filename -container ContainerName [-z]", options ); - }//private static void printHelp () - - @SuppressWarnings("static-access") - private static Options addCommandLineOptions () - { - Option help = new Option( "help", "print this message" ); - - Option folder = OptionBuilder.withArgName("folder") - .hasArg (true) - .withDescription ("Name of folder to upload. Only top level objects that are not folders will be uploaded.") - .create ("folder"); - - Option file = OptionBuilder.withArgName("file") - .hasArg (true) - .withDescription ("Name of file to upload to .") - .create ("file"); - - Option container = OptionBuilder.withArgName("container") - .hasArg (true) - .withDescription ("Name of container to place objects into.") - .create ("container"); - - Option zip = new Option ("z","zip", false, "Compress the object being placed into . This option can be used with other options e.g. -tar"); -// Option tar = new Option ("t","tar", false, "Create a tar of the folder. Using this option without a -folder has no effect !"); - Option download = new Option ("d","download", false, "Copy files from to the local system. Must be used in conjunction to -folder -file -container"); - - Options options = new Options(); - - options.addOption(folder); - options.addOption(file); - options.addOption(zip); - options.addOption(help); - options.addOption(container); - //options.addOption(tar); - options.addOption(download); - - return options; - } -} diff --git a/src/main/java/com/mosso/client/cloudfiles/sample/FilesList.java b/src/main/java/com/mosso/client/cloudfiles/sample/FilesList.java deleted file mode 100644 index a5e04e6..0000000 --- a/src/main/java/com/mosso/client/cloudfiles/sample/FilesList.java +++ /dev/null @@ -1,247 +0,0 @@ -/* - * See COPYING for license information. - */ - -package com.mosso.client.cloudfiles.sample; - -import java.io.IOException; - -import org.apache.commons.cli.Option; -import org.apache.commons.cli.OptionBuilder; -import org.apache.commons.cli.Options; -import org.apache.commons.cli.HelpFormatter; -import org.apache.commons.cli.CommandLine; -import org.apache.commons.cli.CommandLineParser; -import org.apache.commons.cli.GnuParser; -import org.apache.commons.cli.ParseException; -import org.apache.commons.lang.StringUtils; - -// import org.apache.log4j.Logger; -import org.apache.commons.httpclient.HttpException; - -import com.mosso.client.cloudfiles.*; - -import java.util.*; - -/* - * TODO: Add List Metadata for all objects as a switch on the all - * TODO: Add list Metadata for one object as a switch on a specific object of a container - * TODO: Add list specific Objects of a container - */ - -public class FilesList -{ - // private static Logger logger = Logger.getLogger(List.class); - - public static void main (String args[]) - { - //Build the command line options - Options options = addCommandLineOptions (); - - if (args.length <= 0) - printHelp (options); - - CommandLineParser parser = new GnuParser(); - try - { - // parse the command line arguments - CommandLine line = parser.parse( options, args ); - - if (line.hasOption("help")) - printHelp (options); - - if (line.hasOption("containersOnly")) - { - if (line.hasOption("H")) - printContainers (true); - else - printContainers (false); - } - else if (line.hasOption("all")) - { - if (line.hasOption("H")) - printContainersAll (true); - else - printContainersAll (false); - }//if (line.hasOption("all")) - else if (line.hasOption("container")) - { - String containerName = line.getOptionValue("container"); - if (StringUtils.isNotBlank(containerName)) - { - if (line.hasOption("H")) - printContainer (containerName, true); - else - printContainer (containerName, false); - } - }//if (line.hasOption("container")) - else if (line.hasOption("H")) - { - System.out.println ("This option needs to be used in conjunction with another option that lists objects or container."); - } - } - catch( ParseException err ) - { - System.err.println( "Please see the logs for more details. Error Message: "+err.getMessage() ); - err.printStackTrace(System.err); - }//catch( ParseException err ) - catch (FilesException err) - { - System.err.println( "Please see the logs for more details. Error Message: "+err.getMessage() ); - }//catch (FilesAuthorizationException err) - - catch ( IOException err) - { - System.err.println( "Please see the logs for more details. Error Message: "+err.getMessage() ); - }//catch ( IOException err) - } - - private static void printContainer (String containerName, boolean humanReadable) throws IOException, HttpException, FilesException - { - boolean notFound = true; - FilesClient client = new FilesClient(); - if ( client.login() ) - { - List containers = client.listContainers(); - System.out.println (client.getAccount() + " containers: "); - for (FilesContainer value: containers ) - { - if (value.getName().equalsIgnoreCase(containerName)) - { - notFound = false; - - FilesContainerInfo info = value.getInfo(); - System.out.println ("\t"+value.getName ()+" - "+info.getObjectCount()+" objects:"); - - List objects = value.getObjects(); - for (FilesObject obj: objects) - { - if (humanReadable) - System.out.println ("\t\t"+StringUtils.rightPad(obj.getName (), 35) + obj.getSizeString()); - else - System.out.println ("\t\t"+StringUtils.rightPad(obj.getName (), 35) + obj.getSize()+" Bytes"); - } - - if (humanReadable) - { - System.out.println ("\tTotal Size: "+info.getTotalSize()/1024+"KB\n"); - } - else - System.out.println ("\tTotal Size: "+info.getTotalSize()+"Bytes\n"); - }//if (value.getName().equalsIgnoreCase(containerName)) - else - notFound = true; - }//end for - - if (notFound) - System.out.println ("Container: "+containerName +" was not found !"); - } - }//end private static void printContainersAndContent () throws IOException, HttpException, FilesAuthorizationException - - private static void printContainersAll (boolean humanReadable) throws IOException, HttpException, FilesException - { - FilesClient client = new FilesClient(); - if ( client.login() ) - { - List containers = client.listContainers(); - System.out.println (client.getAccount() + " containers: "); - for (FilesContainer value: containers ) - { - FilesContainerInfo info = value.getInfo(); - System.out.println ("\t"+value.getName ()+" - "+info.getObjectCount()+" objects:"); - - List objects = value.getObjects(); - for (FilesObject obj: objects) - { - if (humanReadable) - System.out.println ("\t\t"+StringUtils.rightPad(obj.getName (), 35) + obj.getSizeString()); - else - System.out.println ("\t\t"+StringUtils.rightPad(obj.getName (), 35) + obj.getSize()+"Bytes"); - } - - if (humanReadable) - { - System.out.println ("\tTotal Size: "+info.getTotalSize()/1024+"KB\n"); - } - else - System.out.println ("\tTotal Size: "+info.getTotalSize()+"Bytes\n"); - } - } - }//end private static void printContainersAndContent () throws IOException, HttpException, FilesAuthorizationException - - private static void printContainers (boolean humanReadable) throws IOException, HttpException, FilesException - { - FilesClient client = new FilesClient(); - if ( client.login() ) - { - List containers = client.listContainers(); - System.out.println (client.getAccount() + " containers: "); - for (FilesContainer value: containers ) - { - FilesContainerInfo info = value.getInfo(); - System.out.println ("\t"+value.getName ()+" - "+info.getObjectCount()+" objects:"); - - if (humanReadable) - { - System.out.println ("\tTotal Size: "+ getSizeString (info.getTotalSize())+"\n"); - } - else - System.out.println ("\tTotal Size: "+info.getTotalSize()+"Bytes\n"); - } - } - }//end private static void printContainers () - - private static void printHelp (Options options) - { - HelpFormatter formatter = new HelpFormatter(); - formatter.printHelp( "FilesList", options ); - }//private static void printHelp () - - @SuppressWarnings("static-access") - private static Options addCommandLineOptions () - { - Option help = new Option( "help", "print this message" ); - - Option containersOnly = OptionBuilder.hasArg (false) - .withDescription ("Show ONLY Containers in account. No Object information is provided.") - .create ("containersOnly"); - - Option containers = OptionBuilder.hasArg (false) - .withDescription ("Show Containers and their objects in this account") - .create ("all"); - - Option container = OptionBuilder.withArgName("container") - .hasArg (true) - .withDescription ("Show Containers and their objects in this account") - .create ("container"); - - Option kb = new Option ("H","humanReadable", false, "Show size of objects in human readable form. On its own this has no meaning and needs to be used in conjuction to a command that provides size of objects and containers"); - - Options options = new Options(); - - options.addOption(containersOnly); - options.addOption(containers); - options.addOption(container); - options.addOption(kb); - options.addOption(help); - - return options; - } - - public static String getSizeString (long size) - { - long kb = 1024; - long mb = 1024*1024; - long gb = 1024*1024*1024; - - //KB - if (size > gb) - return (size/gb) + "GB"; - else if (size > mb) - return (size/mb)+"MB"; - else if (size > kb) - return (size/kb) +"KB"; - else - return size+"Bytes"; - } -} diff --git a/src/main/java/com/mosso/client/cloudfiles/sample/FilesMakeContainer.java b/src/main/java/com/mosso/client/cloudfiles/sample/FilesMakeContainer.java deleted file mode 100644 index 9e6a0ce..0000000 --- a/src/main/java/com/mosso/client/cloudfiles/sample/FilesMakeContainer.java +++ /dev/null @@ -1,116 +0,0 @@ -/* - * See COPYING for license information. - */ - -package com.mosso.client.cloudfiles.sample; - -//import org.apache.log4j.Logger; -import org.apache.commons.lang.StringUtils; -import org.apache.commons.cli.*; -import org.apache.commons.httpclient.HttpException; - -import java.io.IOException; -import java.security.NoSuchAlgorithmException; - -import com.mosso.client.cloudfiles.*; - -public class FilesMakeContainer -{ - //private static final Logger logger = Logger.getLogger(FilesMakeContainer.class); - - public static void main (String args[]) throws NoSuchAlgorithmException, FilesException - { - //Build the command line options - Options options = addCommandLineOptions (); - - if (args.length <= 0) - printHelp (options); - - CommandLineParser parser = new GnuParser(); - try - { - // parse the command line arguments - CommandLine line = parser.parse( options, args ); - - if (line.hasOption("help")) - printHelp (options); - - String containerName = null; - if (line.hasOption("container")) - { - containerName = line.getOptionValue("container"); - createContaier (containerName); - }//end if (line.hasOption("container")) - else if (args.length > 0) - { - //If we got this far there are command line arguments but none of what we expected treat the first one as the Container name - containerName = args[0]; - createContaier (containerName); - } - else - { - System.err.println ("You must provide the -container with a valid value for this to work !"); - System.exit (-1); - } - - }//end try - catch( ParseException err ) - { - System.err.println( "Please see the logs for more details. Error Message: "+err.getMessage() ); - err.printStackTrace(System.err); - }//catch( ParseException err ) - - catch ( IOException err) - { - System.err.println( "Please see the logs for more details. Error Message: "+err.getMessage() ); - }//catch ( IOException err) - - }//end main - - private static void createContaier (String containerName) throws HttpException, IOException, FilesException - { - if (!StringUtils.isNotBlank(containerName) || containerName.indexOf('/') != -1) - { - System.err.println ("You must provide a valid value for the Container name !"); - System.exit (-1); - }//if (!StringUtils.isNotBlank(containerName)) - - //Check to see if a Container with this name already exists - - FilesClient client = new FilesClient(); - if ( client.login() ) - { - client.createContainer(containerName); - } - else - System.out.println ("Failed to login to Cloud Files!"); - - System.exit(0); - - } - - private static void printHelp (Options options) - { - HelpFormatter formatter = new HelpFormatter(); - formatter.printHelp( "MkDir [-container] ContainerName", options ); - }//private static void printHelp () - - @SuppressWarnings("static-access") - private static Options addCommandLineOptions () - { - Option help = new Option( "help", "print this message" ); - - Option container = OptionBuilder.withArgName("container") - .hasArg (true) - .withDescription ("Name of container to create.") - .create ("container"); - - Options options = new Options(); - - options.addOption(help); - options.addOption(container); - - return options; - } - -} diff --git a/src/main/java/com/mosso/client/cloudfiles/sample/FilesRemove.java b/src/main/java/com/mosso/client/cloudfiles/sample/FilesRemove.java deleted file mode 100644 index 443edd3..0000000 --- a/src/main/java/com/mosso/client/cloudfiles/sample/FilesRemove.java +++ /dev/null @@ -1,180 +0,0 @@ -/* - * See COPYING for license information. - */ - -package com.mosso.client.cloudfiles.sample; - -import org.apache.log4j.Logger; -import org.apache.commons.lang.StringUtils; -import org.apache.commons.cli.*; -import org.apache.commons.httpclient.HttpException; - -import java.io.*; -import java.security.NoSuchAlgorithmException; -import java.util.*; - -import com.mosso.client.cloudfiles.*; - -public class FilesRemove -{ - private static final Logger logger = Logger.getLogger(FilesRemove.class); - - public static void main (String args[]) throws NoSuchAlgorithmException, FilesException - { - //Build the command line options - Options options = addCommandLineOptions (); - - if (args.length <= 0) - printHelp (options); - - CommandLineParser parser = new GnuParser(); - try - { - // parse the command line arguments - CommandLine line = parser.parse( options, args ); - - if (line.hasOption("help")) { - printHelp (options); - System.exit(0); - } - - if (line.hasOption("container")) - { - String containerName = null; - containerName = line.getOptionValue("container"); - removeContainer (containerName, line.hasOption('r')); - }//if (line.hasOption("container")) - - if (line.hasOption("object")) - { - String ObjectNameWithPath = null; - ObjectNameWithPath = line.getOptionValue("object"); - removeObject (ObjectNameWithPath); - }//if (line.hasOption("container")) - - - }//end try - catch( ParseException err ) - { - logger.fatal("Parsing exception on the command line: "+ err); - System.err.println( "Please see the logs for more details. Error Message: "+err.getMessage() ); - err.printStackTrace(System.err); - }//catch( ParseException err ) - catch ( IOException err) - { - logger.fatal("IOException : "+ err); - System.err.println( "Please see the logs for more details. Error Message: "+err.getMessage() ); - }//catch ( IOException err) - }//end main - - private static void removeObject (String objectNameWithPath) throws HttpException, IOException, FilesException - { - if (!StringUtils.isNotBlank(objectNameWithPath)) - { - System.err.println ("You must provide a valid value for the Object name and path !"); - System.exit (0); - }//if (!StringUtils.isNotBlank(ObjectNameWithPath)) - - int firstSlashLocation = objectNameWithPath.indexOf('/'); - if (firstSlashLocation > -1) - { - String container = objectNameWithPath.substring(0, firstSlashLocation - 1); - String object = objectNameWithPath.substring(firstSlashLocation + 1); - FilesClient client = new FilesClient(); - if ( client.login() ) { - client.deleteObject(container, object); - } - else { - System.err.println("Failed to log in to Cloud FS"); - System.exit(-1); - } - } - else - { - System.err.println("Please specify the object path in the form containerName/objectName"); - System.exit(-1); - } - } - - private static void removeContainer (String containerName, boolean recurse) throws HttpException, IOException, FilesAuthorizationException, FilesException - { - if (!StringUtils.isNotBlank(containerName)) - { - System.out.println ("You must provide a valid value for the Container name !"); - logger.fatal("You must provide a valid value for the Container name !"); - System.exit (0); - }//if (!StringUtils.isNotBlank(containerName)) - - //Check to see if a Container with this name already exists - - FilesClient client = new FilesClient(); - if ( client.login() ) - { - if(recurse) { - List objects = client.listObjects(containerName); - for (FilesObject obj : objects) { - client.deleteObject(containerName, obj.getName()); - } - } - - try { - if (client.deleteContainer(containerName)) { - System.out.println(containerName+" deleted"); - System.exit (0); - } - else{ - System.out.println(containerName+" was not deleted"); - System.exit (-1); - } - } - catch (FilesNotFoundException fnfe) { - System.out.println(containerName+" not found !"); - System.exit (0); - } - catch (FilesContainerNotEmptyException fcnee) { - System.out.println(containerName+" is not empty use -r !"); - System.exit (0); - } - } - else - System.out.println ("Failed to login to !"); - - System.exit(0); - - } - - private static void printHelp (Options options) - { - HelpFormatter formatter = new HelpFormatter(); - formatter.printHelp( "Remove [-container] ContainerName [-rf]", options ); - }//private static void printHelp () - - - @SuppressWarnings("static-access") - private static Options addCommandLineOptions () - { - Option help = new Option( "help", "print this message" ); - Option recurse = new Option( "r", "Recursively go through the folders and files" ); - - Option container = OptionBuilder.withArgName("container") - .hasArg (true) - .withDescription ("Name of container to remove.") - .create ("container"); - - Option object = OptionBuilder.withArgName("object") - .hasArg (true) - .withDescription ("Name and path of object to remove.") - .create ("object"); - - Options options = new Options(); - - options.addOption(help); - options.addOption(recurse); - - options.addOption(container); - options.addOption(object); - - return options; - } - -} diff --git a/src/main/java/com/mosso/client/cloudfiles/wrapper/OutputStreamWrapper.java b/src/main/java/com/mosso/client/cloudfiles/wrapper/OutputStreamWrapper.java deleted file mode 100644 index b0e94b0..0000000 --- a/src/main/java/com/mosso/client/cloudfiles/wrapper/OutputStreamWrapper.java +++ /dev/null @@ -1,80 +0,0 @@ -/** - * - */ -package com.mosso.client.cloudfiles.wrapper; - -import java.io.IOException; -import java.io.OutputStream; - -import com.mosso.client.cloudfiles.IFilesTransferCallback; - -/** - * @author lvaughn - * - */ -public class OutputStreamWrapper extends OutputStream { - private OutputStream stream; - private IFilesTransferCallback callback = null; - private final static int callbackInterval = 1024 * 8; - private long lastCallback = 0; - private long bytesTransfered = 0; - - public OutputStreamWrapper(OutputStream os, IFilesTransferCallback callback) { - this.stream = os; - this.callback = callback; - } - - /* (non-Javadoc) - * @see java.io.OutputStream#write(int) - */ - @Override - public void write(int b) throws IOException { - stream.write(b); - ++bytesTransfered; - checkCallback(false); - } - - public void write(byte[] b, int off, int len) throws IOException { - // Short circuit this if we don't have a callback. - if (callback == null) { - stream.write(b, off, len); - return; - } - - // Otherwise, dole this out on chunks - while(len > 0) { - int toWrite = Math.min(len, callbackInterval); - stream.write(b, off, toWrite); - bytesTransfered += toWrite; - off += toWrite; - len -= toWrite; - checkCallback(false); - } - checkCallback(true); - } - - public void write(byte[] b) throws IOException { - write(b, 0, b.length); - } - - public void close() throws IOException { - stream.close(); - checkCallback(true); - } - - public void flush() throws IOException { - stream.flush(); - checkCallback(true); - } - - private void checkCallback(boolean force) { - if (callback != null) { - if ((bytesTransfered - lastCallback >= callbackInterval) || - (force && bytesTransfered != lastCallback)) { - callback.progress(bytesTransfered); - lastCallback = bytesTransfered; - } - } - } - -} diff --git a/src/main/java/com/mosso/client/cloudfiles/wrapper/RequestEntityWrapper.java b/src/main/java/com/mosso/client/cloudfiles/wrapper/RequestEntityWrapper.java deleted file mode 100644 index 7b4d7f4..0000000 --- a/src/main/java/com/mosso/client/cloudfiles/wrapper/RequestEntityWrapper.java +++ /dev/null @@ -1,55 +0,0 @@ -/** - * - */ -package com.mosso.client.cloudfiles.wrapper; - -import java.io.IOException; -import java.io.OutputStream; - -import org.apache.commons.httpclient.methods.RequestEntity; - -import com.mosso.client.cloudfiles.IFilesTransferCallback; - -/** - * @author lvaughn - * - */ -public class RequestEntityWrapper implements RequestEntity { - private RequestEntity entity; - private IFilesTransferCallback callback = null; - - public RequestEntityWrapper(RequestEntity entity, IFilesTransferCallback callback) { - this.entity = entity; - this.callback = callback; - } - - /* (non-Javadoc) - * @see org.apache.commons.httpclient.methods.RequestEntity#getContentLength() - */ - public long getContentLength() { - return entity.getContentLength(); - } - - /* (non-Javadoc) - * @see org.apache.commons.httpclient.methods.RequestEntity#getContentType() - */ - public String getContentType() { - return entity.getContentType(); - } - - /* (non-Javadoc) - * @see org.apache.commons.httpclient.methods.RequestEntity#isRepeatable() - */ - public boolean isRepeatable() { - return entity.isRepeatable(); - } - - /* (non-Javadoc) - * @see org.apache.commons.httpclient.methods.RequestEntity#writeRequest(java.io.OutputStream) - */ - public void writeRequest(OutputStream stream) throws IOException { - entity.writeRequest(new OutputStreamWrapper(stream, callback)); - - } - -} diff --git a/src/test/java/com/mosso/client/cloudfiles/FilesClientTestCase.java b/src/test/java/com/mosso/client/cloudfiles/FilesClientTestCase.java deleted file mode 100644 index 7ef6184..0000000 --- a/src/test/java/com/mosso/client/cloudfiles/FilesClientTestCase.java +++ /dev/null @@ -1,1506 +0,0 @@ -package com.mosso.client.cloudfiles; - -import java.io.ByteArrayInputStream; -import java.io.File; -import java.io.FileOutputStream; -import java.io.IOException; -import java.io.InputStream; -import java.math.BigInteger; -import java.security.MessageDigest; -import java.security.NoSuchAlgorithmException; -import java.text.SimpleDateFormat; -import java.util.Date; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.Random; - -import org.apache.commons.httpclient.methods.ByteArrayRequestEntity; -import org.apache.commons.io.FilenameUtils; -import org.apache.commons.lang.SystemUtils; -import org.apache.log4j.Logger; - -import com.mosso.client.cloudfiles.FilesAccountInfo; -import com.mosso.client.cloudfiles.FilesClient; -import com.mosso.client.cloudfiles.FilesConstants; -import com.mosso.client.cloudfiles.FilesObject; -import com.mosso.client.cloudfiles.FilesObjectMetaData; -import com.mosso.client.cloudfiles.FilesUtil; - - -import junit.framework.TestCase; - -public class FilesClientTestCase extends TestCase { - private static Logger logger = Logger.getLogger(FilesClientTestCase.class); - private static File SYSTEM_TMP = SystemUtils.getJavaIoTmpDir(); - private static int NUMBER_RANDOM_BYTES = 513; - - public void testConstructor() { - FilesClient client = new FilesClient("foo", "bar", "baz"); - - assertNotNull(client); - assertEquals("foo", client.getUserName()); - assertEquals("bar", client.getPassword()); - assertEquals("baz", client.getAccount()); - - } - - public void testNoArgConstructor() { - FilesClient client = new FilesClient(); - - assertNotNull(client); - assertEquals(FilesUtil.getProperty("username"), client.getUserName()); - assertEquals(FilesUtil.getProperty("password"), client.getPassword()); - assertEquals(FilesUtil.getProperty("account"), client.getAccount()); - } - - public void testLogin() { - FilesClient client = new FilesClient(); - - try { - assertTrue(client.login()); - } catch (Exception e) { - fail(e.getMessage()); - } - - // Now try a failed login - client = new FilesClient(FilesUtil.getProperty("username"), - FilesUtil.getProperty("password") + " this is a bogus password", - FilesUtil.getProperty("account")); - try { - assertFalse(client.login()); - } catch (Exception e) { - fail(e.getMessage()); - } - } - - public void testAccountInfo() { - String containerName = createTempContainerName("byte-array"); - String filename = makeFileName("accountinfo"); - FilesClient client = new FilesClient(); - try { - assertTrue(client.login()); - - // Make sure it's not there - assertFalse(client.containerExists(containerName)); - - // Add it - client.createContainer(containerName); - - // See that it's there - assertTrue(client.containerExists(containerName)); - assertNotNull(client.getContainerInfo(containerName)); - - // Add some data - byte randomData[] = makeRandomBytes(); - assertTrue(client.storeObject(containerName, randomData, "application/octet-stream", filename, new HashMap())); - - // Do the test if we have an account - if (FilesUtil.getProperty("account") != null) { - FilesAccountInfo info = client.getAccountInfo(); - assertTrue(info.getContainerCount() > 0); - assertTrue(info.getBytesUsed() >= randomData.length); - } - - // Clean up - client.deleteObject(containerName, filename); - assertTrue(client.deleteContainer(containerName)); - } catch (Exception e) { - e.printStackTrace(); - fail(e.getMessage()); - } - } - - public void testContainerCreation() { - FilesClient client = new FilesClient(); - try { - assertTrue(client.login()); - String containerName = createTempContainerName(""); - - // Make sure it's not there - assertFalse(client.containerExists(containerName)); - - // Add it - client.createContainer(containerName); - - // See that it's there - assertTrue(client.containerExists(containerName)); - assertNotNull(client.getContainerInfo(containerName)); - - // Try Adding it again - try { - client.createContainer(containerName); - fail("Allowed duplicate container creation"); - } - catch (FilesContainerExistsException fcee) { - // Hooray! - } - - // See that it's still there - assertTrue(client.containerExists(containerName)); - - // Delete it - assertTrue(client.deleteContainer(containerName)); - - // Make sure it's gone - assertFalse(client.containerExists(containerName)); - - - } catch (Exception e) { - fail(e.getMessage()); - } - } - - public void testContainerNotThereDeletion() { - FilesClient client = new FilesClient(); - try { - assertTrue(client.login()); - String containerName = createTempContainerName("I'mNotHere!"); - - // Make sure it's not there - assertFalse(client.containerExists(containerName)); - - boolean exceptionThrown = false; - try { - client.deleteContainer(containerName); - fail("Exception not thrown"); - } - catch (FilesNotFoundException fnfe) { - exceptionThrown = true; - } - assertTrue (exceptionThrown); - - // Make still not there - assertFalse(client.containerExists(containerName)); - - - } catch (Exception e) { - fail(e.getMessage()); - } - } - - public void testContainerCreationWithSpaces() { - FilesClient client = new FilesClient(); - try { - assertTrue(client.login()); - String containerName = createTempContainerName("with space+and+plus"); - - // Make sure it's not there - assertFalse(client.containerExists(containerName)); - - // Add it - client.createContainer(containerName); - - // See that it's there - assertTrue(client.containerExists(containerName)); - assertNotNull(client.getContainerInfo(containerName)); - - // Try Adding it again - try { - client.createContainer(containerName); - fail("Allowed duplicate container creation"); - } - catch (FilesContainerExistsException fcee) { - // Pass this case - } - - // See that it's still there - assertTrue(client.containerExists(containerName)); - - boolean found = false; - List containers = client.listContainers(); - for (FilesContainer cont : containers) { - // logger.warn(cont.getName()); - if(containerName.equals(cont.getName())) found = true; - } - assertTrue(found); - - - // Delete it - assertTrue(client.deleteContainer(containerName)); - - // Make sure it's gone - assertFalse(client.containerExists(containerName)); - - - } catch (Exception e) { - fail(e.getMessage()); - } - } - - public void testContainerInfoListing() { - FilesClient client = new FilesClient(); - try { - assertTrue(client.login()); - String containerName = createTempContainerName(""); - - // Make sure it's not there - assertFalse(client.containerExists(containerName)); - - // Add it - client.createContainer(containerName); - - // See that it's there - assertTrue(client.containerExists(containerName)); - assertNotNull(client.getContainerInfo(containerName)); - - // Try Adding it again - try { - client.createContainer(containerName); - fail("Allowed duplicate container creation"); - } - catch (FilesContainerExistsException fcee) { - // Hooray! - } - - // See that it's still there - assertTrue(client.containerExists(containerName)); - - boolean found = false; - List containers = client.listContainersInfo(); - for (FilesContainerInfo info : containers) { - if(containerName.equals(info.getName())) { - found = true; - assertEquals(0, info.getTotalSize()); - assertEquals(0, info.getObjectCount()); - } - } - assertTrue(found); - - - // Delete it - assertTrue(client.deleteContainer(containerName)); - - // Make sure it's gone - assertFalse(client.containerExists(containerName)); - - - } catch (Exception e) { - e.printStackTrace(); - fail(e.getMessage()); - } - } - - public void testUserAgent() { - FilesClient client = new FilesClient(); - assertEquals(FilesConstants.USER_AGENT, client.getUserAgent()); - client.setUserAgent("Java-Test-User-Agent"); - assertEquals("Java-Test-User-Agent", client.getUserAgent()); - try { - assertTrue(client.login()); - String containerName = createTempContainerName("user-agent"); - - // Make sure it's not there - assertFalse(client.containerExists(containerName)); - - // Add it - client.createContainer(containerName); - - // See that it's there - assertTrue(client.containerExists(containerName)); - assertNotNull(client.getContainerInfo(containerName)); - - // Delete it - assertTrue(client.deleteContainer(containerName)); - - // Make sure it's gone - assertFalse(client.containerExists(containerName)); - - - } catch (Exception e) { - fail(e.getMessage()); - } - } - - public void testContainerNameNoSlashes() { - FilesClient client = new FilesClient(); - try { - assertTrue(client.login()); - String containerName = createTempContainerName("/"); - - // Make sure they're not there - assertFalse(client.containerExists(containerName)); - - // Try to add it - boolean exceptionThrown = false; - try { - client.createContainer(containerName); - fail("Should not have been able to create container: " + containerName); - } - catch (FilesInvalidNameException fine) { - exceptionThrown = true; - } - assertTrue(exceptionThrown); - } catch (Exception e) { - fail(e.getMessage()); - } - } - - public void testFileSaving() { - String containerName = createTempContainerName("file-test"); - String filename = makeFileName("random"); - String fullPath = FilenameUtils.concat(SYSTEM_TMP.getAbsolutePath(), filename); - logger.info("Test File Location: " + fullPath); - try { - byte randomData[] = makeRandomFile(fullPath); - FilesClient client = new FilesClient(); - assertTrue(client.login()); - - // Set up - client.createContainer(containerName); - - // Store it - logger.info("About to save: " + filename); - assertTrue(client.storeObjectAs(containerName, new File(fullPath), "application/octet-stream", filename)); - - // Make sure it's there - List objects = client.listObjects(containerName); - assertEquals(1, objects.size()); - FilesObject obj = objects.get(0); - assertEquals(filename, obj.getName()); - assertEquals("application/octet-stream", obj.getMimeType()); - - // Make sure the data is correct - assertArrayEquals(randomData, client.getObject(containerName, filename)); - - // Make sure the data is correct as a stream - InputStream is = client.getObjectAsStream(containerName, filename); - byte otherData[] = new byte[NUMBER_RANDOM_BYTES]; - is.read(otherData); - assertArrayEquals(randomData, otherData); - assertEquals(-1, is.read()); // Could hang if there's a bug on the other end - - // Clean up - client.deleteObject(containerName, filename); - assertTrue(client.deleteContainer(containerName)); - - } - catch (Exception e) { - fail(e.getMessage()); - } - finally { - File f = new File(fullPath); - f.delete(); - } - - } - public void testSaveAs() { - String containerName = createTempContainerName("file-test"); - String filename = makeFileName("random"); - String fullPath = FilenameUtils.concat(SYSTEM_TMP.getAbsolutePath(), filename); - String otherFileName = "Bob"; - logger.info("Test File Location: " + fullPath); - try { - byte randomData[] = makeRandomFile(fullPath); - FilesClient client = new FilesClient(); - assertTrue(client.login()); - - // Set up - client.createContainer(containerName); - - // Store it - logger.info("About to save: " + filename); - assertTrue(client.storeObjectAs(containerName, new File(fullPath), "application/octet-stream", otherFileName)); - - // Make sure it's there - List objects = client.listObjects(containerName); - assertEquals(1, objects.size()); - FilesObject obj = objects.get(0); - assertEquals("Bob", obj.getName()); - assertEquals("application/octet-stream", obj.getMimeType()); - - // Make sure the data is correct - assertArrayEquals(randomData, client.getObject(containerName, otherFileName)); - - // Make sure the data is correct as a stream - InputStream is = client.getObjectAsStream(containerName, otherFileName); - byte otherData[] = new byte[NUMBER_RANDOM_BYTES]; - is.read(otherData); - assertArrayEquals(randomData, otherData); - assertEquals(-1, is.read()); // Could hang if there's a bug on the other end - - // Clean up - client.deleteObject(containerName, otherFileName); - assertTrue(client.deleteContainer(containerName)); - - } - catch (Exception e) { - fail(e.getMessage()); - } - finally { - File f = new File(fullPath); - f.delete(); - } - - } - public void testFileSavingWithCallback() { - String containerName = createTempContainerName("file-test"); - String filename = makeFileName("random"); - String fullPath = FilenameUtils.concat(SYSTEM_TMP.getAbsolutePath(), filename); - logger.info("Test File Location: " + fullPath); - try { - byte randomData[] = makeRandomFile(fullPath); - FilesClient client = new FilesClient(); - assertTrue(client.login()); - - // Set up - client.createContainer(containerName); - - // Store it - logger.info("About to save: " + filename); - TesterCallback callback = new TesterCallback(); - assertTrue(client.storeObjectAs(containerName, new File(fullPath), "application/octet-stream", filename, callback)); - - // Make sure the callback was called - assertEquals(randomData.length, callback.bytesSent); - assertEquals(1, callback.nCalls); - - // Make sure it's there - List objects = client.listObjects(containerName); - assertEquals(1, objects.size()); - FilesObject obj = objects.get(0); - assertEquals(filename, obj.getName()); - assertEquals("application/octet-stream", obj.getMimeType()); - - // Make sure the data is correct - assertArrayEquals(randomData, client.getObject(containerName, filename)); - - // Make sure the data is correct as a stream - InputStream is = client.getObjectAsStream(containerName, filename); - byte otherData[] = new byte[NUMBER_RANDOM_BYTES]; - is.read(otherData); - assertArrayEquals(randomData, otherData); - assertEquals(-1, is.read()); // Could hang if there's a bug on the other end - - // Clean up - client.deleteObject(containerName, filename); - assertTrue(client.deleteContainer(containerName)); - - } - catch (Exception e) { - e.printStackTrace(); - if (e.getCause() != null) e.getCause().printStackTrace(); - fail(e.getMessage()); - } - finally { - File f = new File(fullPath); - f.delete(); - } - - } - public void testFileSavingWithMetadata() { - String containerName = createTempContainerName("meta-data-test"); - String filename = makeFileName("random-with-meta"); - String fullPath = FilenameUtils.concat(SYSTEM_TMP.getAbsolutePath(), filename); - logger.info("Test File Location: " + fullPath); - try { - byte randomData[] = makeRandomFile(fullPath); - FilesClient client = new FilesClient(); - assertTrue(client.login()); - - // Set up - client.createContainer(containerName); - - // Store it - HashMap meta = new HashMap(); - meta.put("Foo", "bar"); - meta.put("Uni", "\u0169\u00f1\u00efcode-test"); - meta.put("Width", "336"); - meta.put("Height", "183"); - assertTrue(client.storeObjectAs(containerName, new File(fullPath), "application/octet-stream", filename, meta)); - - // Make sure it's there - List objects = client.listObjects(containerName); - assertEquals(1, objects.size()); - FilesObject obj = objects.get(0); - assertEquals(filename, obj.getName()); - assertEquals("application/octet-stream", obj.getMimeType()); - - // Make sure the data is correct - assertArrayEquals(randomData, client.getObject(containerName, filename)); - - // Make sure the data is correct as a stream - InputStream is = client.getObjectAsStream(containerName, filename); - byte otherData[] = new byte[NUMBER_RANDOM_BYTES]; - is.read(otherData); - assertArrayEquals(randomData, otherData); - assertEquals(-1, is.read()); // Could hang if there's a bug on the other end - - // Make sure the metadata is correct - FilesObjectMetaData metadata = client.getObjectMetaData(containerName, filename); - Map serverMetadata = metadata.getMetaData(); - assertEquals(meta.size(), serverMetadata.size()); - for(String key : meta.keySet()) { - assertTrue(serverMetadata.containsKey(key)); - assertEquals(meta.get(key), serverMetadata.get(key)); - } - - // Clean up - client.deleteObject(containerName, filename); - assertTrue(client.deleteContainer(containerName)); - - } - catch (Exception e) { - fail(e.getMessage()); - } - finally { - File f = new File(fullPath); - f.delete(); - } - - } - - public void testFileSavingNoETag() { - String containerName = createTempContainerName("etagless"); - String filename = makeFileName("etagless"); - String fullPath = FilenameUtils.concat(SYSTEM_TMP.getAbsolutePath(), filename); - logger.info("Test File Location: " + fullPath); - try { - byte randomData[] = makeRandomFile(fullPath); - FilesClient client = new FilesClient(); - assertTrue(client.getUseETag()); - client.setUseETag(false); - assertFalse(client.getUseETag()); - - assertTrue(client.login()); - - // Set up - client.createContainer(containerName); - - // Store it - assertTrue(client.storeObjectAs(containerName, new File(fullPath), "application/octet-stream", filename)); - - // Make sure it's there - List objects = client.listObjects(containerName); - assertEquals(1, objects.size()); - FilesObject obj = objects.get(0); - assertEquals(filename, obj.getName()); - assertEquals("application/octet-stream", obj.getMimeType()); - - // Make sure the data is correct - assertArrayEquals(randomData, client.getObject(containerName, filename)); - - // Make sure the data is correct as a stream - InputStream is = client.getObjectAsStream(containerName, filename); - byte otherData[] = new byte[NUMBER_RANDOM_BYTES]; - is.read(otherData); - assertArrayEquals(randomData, otherData); - assertEquals(-1, is.read()); // Could hang if there's a bug on the other end - - // Clean up - client.deleteObject(containerName, filename); - assertTrue(client.deleteContainer(containerName)); - - } - catch (Exception e) { - fail(e.getMessage()); - } - finally { - File f = new File(fullPath); - f.delete(); - } - - } - - public void testContainerListing() { - String containerName = createTempContainerName(""); - String filename = makeFileName(""); - String fullPath = FilenameUtils.concat(SYSTEM_TMP.getAbsolutePath(), filename); - logger.info("Test File Location: " + fullPath); - try { - byte randomData[] = makeRandomFile(fullPath); - FilesClient client = new FilesClient(); - assertTrue(client.login()); - - // Set up - client.createContainer(containerName); - - // Store it - logger.info("About to save: " + filename); - assertTrue(client.storeObjectAs(containerName, new File(fullPath), "application/octet-stream", filename)); - - // Make sure it's there - List objects = client.listObjects(containerName); - assertEquals(1, objects.size()); - FilesObject obj = objects.get(0); - assertEquals(filename, obj.getName()); - assertEquals("application/octet-stream", obj.getMimeType()); - assertEquals(NUMBER_RANDOM_BYTES, obj.getSize()); - assertEquals(md5Sum(randomData), obj.getMd5sum()); - - // Make sure the data is correct - assertArrayEquals(randomData, client.getObject(containerName, filename)); - - // Make sure the data is correct as a stream - InputStream is = client.getObjectAsStream(containerName, filename); - byte otherData[] = new byte[NUMBER_RANDOM_BYTES]; - is.read(otherData); - assertArrayEquals(randomData, otherData); - assertEquals(-1, is.read()); // Could hang if there's a bug on the other end - - // Clean up - client.deleteObject(containerName, filename); - assertTrue(client.deleteContainer(containerName)); - - } - catch (Exception e) { - fail(e.getMessage()); - } - finally { - File f = new File(fullPath); - f.delete(); - } - - } - - public void testContainerListingWithXML() { - String containerName = createTempContainerName(""); - String filename = makeFileName(""); - try { - byte randomData[] = makeRandomBytes(); - FilesClient client = new FilesClient(); - assertTrue(client.login()); - - // Set up - client.createContainer(containerName); - - // Store it - logger.info("About to save: " + filename); - assertTrue(client.storeObject(containerName, randomData, "application/octet-stream", filename, new HashMap())); - - // Make sure it's there - List objects = client.listObjects(containerName); - assertEquals(1, objects.size()); - FilesObject obj = objects.get(0); - assertEquals(filename, obj.getName()); - assertEquals("application/octet-stream", obj.getMimeType()); - assertEquals(NUMBER_RANDOM_BYTES, obj.getSize()); - assertEquals(md5Sum(randomData), obj.getMd5sum()); - - // Make sure the data is correct - assertArrayEquals(randomData, client.getObject(containerName, filename)); - - // Make sure the data is correct as a stream - InputStream is = client.getObjectAsStream(containerName, filename); - byte otherData[] = new byte[NUMBER_RANDOM_BYTES]; - is.read(otherData); - assertArrayEquals(randomData, otherData); - assertEquals(-1, is.read()); // Could hang if there's a bug on the other end - - // Clean up - client.deleteObject(containerName, filename); - assertTrue(client.deleteContainer(containerName)); - - } - catch (Exception e) { - fail(e.getMessage()); - } - - } - - public void testByteArraySaving() { - String containerName = createTempContainerName("byte-array"); - String filename = makeFileName("bytearray"); - try { - byte randomData[] = makeRandomBytes(); - FilesClient client = new FilesClient(); - // client.setUseETag(false); - assertTrue(client.login()); - - // Set up - client.createContainer(containerName); - - // Store it - assertTrue(client.storeObject(containerName, randomData, "application/octet-stream", filename, new HashMap())); - - // Make sure it's there - List objects = client.listObjects(containerName); - assertEquals(1, objects.size()); - FilesObject obj = objects.get(0); - assertEquals(filename, obj.getName()); - assertEquals("application/octet-stream", obj.getMimeType()); - - // Make sure the data is correct - assertArrayEquals(randomData, client.getObject(containerName, filename)); - - // Make sure the data is correct as a stream - InputStream is = client.getObjectAsStream(containerName, filename); - byte otherData[] = new byte[NUMBER_RANDOM_BYTES]; - is.read(otherData); - assertArrayEquals(randomData, otherData); - assertEquals(-1, is.read()); // Could hang if there's a bug on the other end - - // Clean up - client.deleteObject(containerName, filename); - assertTrue(client.deleteContainer(containerName)); - - } - catch (Exception e) { - e.printStackTrace(); - fail(e.getMessage()); - } - } - - public void testLineNoiseSaving() { - String containerName = createTempContainerName("[]<>{}!@#$%^&*()_-+=|,.?"); - String filename = makeFileName("/[]<>{}!@#$%^&*()_-+=|,.?/"); - try { - byte randomData[] = makeRandomBytes(); - FilesClient client = new FilesClient(); - // client.setUseETag(false); - assertTrue(client.login()); - - // Set up - client.createContainer(containerName); - - // Store it - assertTrue(client.storeObject(containerName, randomData, "application/octet-stream", filename, new HashMap())); - - // Make sure it's there - List objects = client.listObjects(containerName); - assertEquals(1, objects.size()); - FilesObject obj = objects.get(0); - assertEquals(filename, obj.getName()); - assertEquals("application/octet-stream", obj.getMimeType()); - - // Make sure the data is correct - assertArrayEquals(randomData, client.getObject(containerName, filename)); - - // Make sure the data is correct as a stream - InputStream is = client.getObjectAsStream(containerName, filename); - byte otherData[] = new byte[NUMBER_RANDOM_BYTES]; - is.read(otherData); - assertArrayEquals(randomData, otherData); - assertEquals(-1, is.read()); // Could hang if there's a bug on the other end - - // Clean up - client.deleteObject(containerName, filename); - assertTrue(client.deleteContainer(containerName)); - - } - catch (Exception e) { - e.printStackTrace(); - fail(e.getMessage()); - } - } - - public void testRequestEntitySaving() { - String containerName = createTempContainerName("requst-entity"); - String filename = makeFileName("req-entity"); - try { - byte randomData[] = makeRandomBytes(); - FilesClient client = new FilesClient(); - assertTrue(client.login()); - - // Set up - client.createContainer(containerName); - - // Store it - ByteArrayRequestEntity entity = new ByteArrayRequestEntity(randomData, "test/content_type"); - assertTrue(client.storeObjectAs(containerName, filename, entity, new HashMap(), FilesClient.md5Sum(randomData))); - - // Make sure it's there - List objects = client.listObjects(containerName); - assertEquals(1, objects.size()); - FilesObject obj = objects.get(0); - assertEquals(filename, obj.getName()); - assertEquals("test/content_type", obj.getMimeType()); - - // Make sure the data is correct - assertArrayEquals(randomData, client.getObject(containerName, filename)); - - // Make sure the data is correct as a stream - InputStream is = client.getObjectAsStream(containerName, filename); - byte otherData[] = new byte[NUMBER_RANDOM_BYTES]; - is.read(otherData); - assertArrayEquals(randomData, otherData); - assertEquals(-1, is.read()); // Could hang if there's a bug on the other end - - // Clean up - client.deleteObject(containerName, filename); - assertTrue(client.deleteContainer(containerName)); - - } - catch (Exception e) { - e.printStackTrace(); - fail(e.getMessage()); - } - } - - public void testObjectListing() { - String containerName = createTempContainerName("object-listing-marker"); - try { - byte randomData[] = makeRandomBytes(); - FilesClient client = new FilesClient(); - // client.setUseETag(false); - assertTrue(client.login()); - - // Set up - client.createContainer(containerName); - - // Store it - for (int i=0; i < 10; i++) { - assertTrue(client.storeObject(containerName, randomData, "application/octet-stream", "testfile" + i + ".bogus", new HashMap())); - } - - // Make sure it's there - List objects = client.listObjects(containerName); - assertEquals(10, objects.size()); - for (int i=0; i < 10; i++) { - FilesObject obj = objects.get(i); - assertEquals("testfile" + i + ".bogus", obj.getName()); - assertEquals("application/octet-stream", obj.getMimeType()); - } - - // Now do a limit - objects = client.listObjects(containerName, 3); - assertEquals(3, objects.size()); - for (int i=0; i < 3; i++) { - FilesObject obj = objects.get(i); - assertEquals("testfile" + i + ".bogus", obj.getName()); - assertEquals("application/octet-stream", obj.getMimeType()); - } - - // Now check out a marker - objects = client.listObjects(containerName, 4, "testfile3.bogus"); - assertEquals(4, objects.size()); - for (int i=0; i < 4; i++) { - FilesObject obj = objects.get(i); - assertEquals("testfile" + (i + 4) + ".bogus", obj.getName()); - assertEquals("application/octet-stream", obj.getMimeType()); - } - - // Clean up - for (int i=0; i < 10; i++) { - client.deleteObject(containerName, "testfile" + i + ".bogus"); - } - assertTrue(client.deleteContainer(containerName)); - - } - catch (Exception e) { - e.printStackTrace(); - fail(e.getMessage()); - } - } - - public void testContainerListingWithLimitMarker() { - try { - FilesClient client = new FilesClient(); - assertTrue(client.login()); - - // Populate our account - for (int i=0; i < 20; i++) { - client.createContainer("test_container_" + i); - } - - // Make sure it's there - List originalContainers = client.listContainers(); - assertTrue(20 <=originalContainers.size()); - - // Now do a limit - List containers = client.listContainers(5); - assertEquals(5, containers.size()); - for (int i=0; i < 5; i++) { - FilesContainer container = containers.get(i); - assertEquals(originalContainers.get(i).getName(), container.getName()); - } - - // Now check out a marker - containers = client.listContainers(10, originalContainers.get(originalContainers.size() - 5).getName()); - assertEquals(4, containers.size()); - for (int i=0; i < 2; i++) { - FilesContainer container = containers.get(i); - assertEquals(originalContainers.get(originalContainers.size() - 4 + i).getName(), container.getName()); - } - - // Clean up - for (int i=0; i < 20; i++) { - assertTrue(client.deleteContainer("test_container_" + i)); - } - } - catch (Exception e) { - e.printStackTrace(); - fail(e.getMessage()); - } - } - - public void testByteArraySavingWithCallback() { - String containerName = createTempContainerName("byte-array"); - String filename = makeFileName("bytearray"); - try { - byte randomData[] = makeRandomBytes(1024 * 100); // 100 K to make sure we do more with the callback - FilesClient client = new FilesClient(); - // client.setUseETag(false); - assertTrue(client.login()); - - // Set up - client.createContainer(containerName); - - // Store it - TesterCallback callback = new TesterCallback(); - assertTrue(client.storeObject(containerName, randomData, "application/octet-stream", filename, new HashMap(), callback)); - - // Make sure it all got written - assertEquals(randomData.length, callback.bytesSent); - assertEquals(randomData.length/8192 + 1, callback.nCalls); - - // Make sure it's there - List objects = client.listObjects(containerName); - assertEquals(1, objects.size()); - FilesObject obj = objects.get(0); - assertEquals(filename, obj.getName()); - assertEquals("application/octet-stream", obj.getMimeType()); - - // Make sure the data is correct - assertArrayEquals(randomData, client.getObject(containerName, filename)); - - // Make sure the data is correct as a stream - InputStream is = client.getObjectAsStream(containerName, filename); - byte otherData[] = new byte[randomData.length]; - int loc = 0; - int bytesRead = 0; - while ((bytesRead = is.read(otherData, loc, otherData.length - loc)) > 0) { - loc += bytesRead; - } - assertArrayEquals(randomData, otherData); - assertEquals(-1, is.read()); // Could hang if there's a bug on the other end - - // Clean up - client.deleteObject(containerName, filename); - assertTrue(client.deleteContainer(containerName)); - - } - catch (Exception e) { - e.printStackTrace(); - fail(e.getMessage()); - } - } - - public void testStreamedSaving() { - String containerName = createTempContainerName("streamed"); - String filename = makeFileName("streamed"); - try { - byte randomData[] = makeRandomBytes(1024 * 100); // 100 K to make sure it's interesting - FilesClient client = new FilesClient(); - assertTrue(client.login()); - - // Set up - client.createContainer(containerName); - - // Store it - assertTrue(client.storeStreamedObject(containerName, new ByteArrayInputStream(randomData), "application/octet-stream", filename, new HashMap())); - - // Make sure it's there - List objects = client.listObjects(containerName); - assertEquals(1, objects.size()); - FilesObject obj = objects.get(0); - assertEquals(filename, obj.getName()); - assertEquals("application/octet-stream", obj.getMimeType()); - - // Make sure the data is correct - assertArrayEquals(randomData, client.getObject(containerName, filename)); - - // Make sure the data is correct as a stream - InputStream is = client.getObjectAsStream(containerName, filename); - byte otherData[] = new byte[randomData.length]; - int loc = 0; - int bytesRead = 0; - while ((bytesRead = is.read(otherData, loc, otherData.length - loc)) > 0) { - loc += bytesRead; - } - assertArrayEquals(randomData, otherData); - assertEquals(-1, is.read()); // Could hang if there's a bug on the other end - - // Clean up - client.deleteObject(containerName, filename); - assertTrue(client.deleteContainer(containerName)); - - } - catch (Exception e) { - e.printStackTrace(); - fail(e.getMessage()); - } - } - - public void testMD5IssueSaving() { - String containerName = createTempContainerName("byte-array"); - String filename = makeFileName("bytearray"); - try { - byte randomData[] = makeRandomBytes(); - - while(zeroStripMd5Sum(randomData).length() ==32) { - randomData = makeRandomBytes(); - } - FilesClient client = new FilesClient(); - // client.setUseETag(false); - assertTrue(client.login()); - - // Set up - client.createContainer(containerName); - - // Store it - assertTrue(client.storeObject(containerName, randomData, "application/octet-stream", filename, new HashMap())); - - // Make sure it's there - List objects = client.listObjects(containerName); - assertEquals(1, objects.size()); - FilesObject obj = objects.get(0); - assertEquals(filename, obj.getName()); - assertEquals("application/octet-stream", obj.getMimeType()); - - // Make sure the data is correct - assertArrayEquals(randomData, client.getObject(containerName, filename)); - - // Make sure the data is correct as a stream - InputStream is = client.getObjectAsStream(containerName, filename); - byte otherData[] = new byte[NUMBER_RANDOM_BYTES]; - is.read(otherData); - assertArrayEquals(randomData, otherData); - assertEquals(-1, is.read()); // Could hang if there's a bug on the other end - - // Clean up - client.deleteObject(containerName, filename); - assertTrue(client.deleteContainer(containerName)); - - } - catch (Exception e) { - e.printStackTrace(); - fail(e.getMessage()); - } - } - - private static String zeroStripMd5Sum (byte[] data) throws IOException, NoSuchAlgorithmException - { - MessageDigest digest = MessageDigest.getInstance("MD5"); - - byte[] md5sum = digest.digest(data); - BigInteger bigInt = new BigInteger(1, md5sum); - - return bigInt.toString(16); - } - - private static String md5Sum (byte[] data) throws IOException, NoSuchAlgorithmException - { - MessageDigest digest = MessageDigest.getInstance("MD5"); - - byte[] md5sum = digest.digest(data); - BigInteger bigInt = new BigInteger(1, md5sum); - - String result = bigInt.toString(16); - - while(result.length() < 32) { - result = "0" + result; - } - - return result; - } - - public void testUnicodeContainer() { - String containerName = createTempContainerName("\u0169\u00f1\u00efcode-test-\u03de"); - try { - FilesClient client = new FilesClient(FilesUtil.getProperty("username"), FilesUtil.getProperty("password"), FilesUtil.getProperty("account")); - assertTrue(client.login()); - - // Set up - client.createContainer(containerName); - - - // Make sure it's there - assertTrue(client.containerExists(containerName)); - - // Make sure we can get the container info - assertNotNull(client.getContainerInfo(containerName)); - - // Clean up - assertTrue(client.deleteContainer(containerName)); - - } - catch (Exception e) { - e.printStackTrace(); - fail(e.getMessage()); - } - } - - public void testUnicode() { - String containerName = createTempContainerName("\u0169\u00f1\u00efcode-test-\u03de"); - String filename = makeFileName("unicode_\u03DA_\u2042"); - filename = makeFileName("\u00f1\u00efcode-test-\u03de"); - String fullPath = FilenameUtils.concat(SYSTEM_TMP.getAbsolutePath(), filename); - logger.info("Test File Location: " + fullPath); - try { - byte randomData[] = makeRandomFile(fullPath); - FilesClient client = new FilesClient(FilesUtil.getProperty("username"), FilesUtil.getProperty("password"), FilesUtil.getProperty("account")); - assertTrue(client.login()); - - // Set up - client.createContainer(containerName); - - // Store it - assertTrue(client.storeObjectAs(containerName, new File(fullPath), "application/octet-stream", filename)); - - // Make sure it's there - List objects = client.listObjects(containerName); - assertEquals(1, objects.size()); - FilesObject obj = objects.get(0); - assertEquals(filename, obj.getName()); - assertEquals("application/octet-stream", obj.getMimeType()); - - assertNotNull(obj.getMetaData()); - - // Make sure the data is correct - assertArrayEquals(randomData, client.getObject(containerName, filename)); - - // Make sure the data is correct as a stream - InputStream is = client.getObjectAsStream(containerName, filename); - byte otherData[] = new byte[NUMBER_RANDOM_BYTES]; - is.read(otherData); - assertArrayEquals(randomData, otherData); - assertEquals(-1, is.read()); // Could hang if there's a bug on the other end - - // Make sure we can get the container info - assertNotNull(client.getContainerInfo(containerName)); - - // Clean up - client.deleteObject(containerName, filename); - assertTrue(client.deleteContainer(containerName)); - - } - catch (Exception e) { - e.printStackTrace(); - fail(e.getMessage()); - } - finally { - File f = new File(fullPath); - f.delete(); - } - - } - - public void testCDNContainerList() { - FilesClient client = new FilesClient(); - try { - assertTrue(client.login()); - - List containers = client.listCdnContainers(); - assertTrue(containers.size() > 0); - } catch (Exception e) { - fail(e.getMessage()); - } - } - - public void testCDNContainerListLimitMarker() { - FilesClient client = new FilesClient(); - try { - assertTrue(client.login()); - - List originalContainers = client.listCdnContainers(); - assertTrue(originalContainers.size() > 0); - - // Now do a limit - List containers = client.listCdnContainers(5); - assertEquals(5, containers.size()); - for (int i=0; i < 5; i++) { - assertEquals(originalContainers.get(i), containers.get(i)); - } - - // Now check out a marker - containers = client.listCdnContainers(10, originalContainers.get(originalContainers.size() - 5)); - assertEquals(4, containers.size()); - for (int i=0; i < 2; i++) { - assertEquals(originalContainers.get(originalContainers.size() - 4 + i), containers.get(i)); - } - } catch (Exception e) { - fail(e.getMessage()); - } - } - public void testCDNContainerFullListing() { - FilesClient client = new FilesClient(); - try { - assertTrue(client.login()); - - List originalContainers = client.listCdnContainers(); - assertTrue(originalContainers.size() > 0); - - // Now do a limit - List containers = client.listCdnContainerInfo(5); - assertEquals(5, containers.size()); - for (int i=0; i < 5; i++) { - assertEquals(originalContainers.get(i), containers.get(i).getName()); - } - - // Now check out a marker - containers = client.listCdnContainerInfo(10, originalContainers.get(originalContainers.size() - 5)); - assertEquals(4, containers.size()); - for (int i=0; i < 2; i++) { - assertEquals(originalContainers.get(originalContainers.size() - 4 + i), containers.get(i).getName()); - } - } catch (Exception e) { - fail(e.getMessage()); - } - } - - public void testCDNApi() { - String containerName = createTempContainerName("java api Test\u03DA_\u2042\u03de#<>\u2043\u2042\u2044\u2045"); - //containerName = createTempContainerName("java Api Test no uniocde"); - //logger.warn("Container:" + containerName.length() + ":" + containerName); - FilesClient client = new FilesClient(); - try { - assertTrue(client.login()); - - List containers = client.listCdnContainers(); - int originalContainerListSize = containers.size(); - - String url = client.cdnEnableContainer(containerName); - assertNotNull(url); - containers = client.listCdnContainers(); - assertEquals(originalContainerListSize + 1, containers.size()); - - boolean found = false; - for(String container : containers) { - // logger.warn(container); - if (containerName.equals(container)) found = true; - } - assertTrue(found); - - FilesCDNContainer info = client.getCDNContainerInfo(containerName); - assertTrue(info.isEnabled()); -// assertEquals("", info.getUserAgentACL()); -// assertEquals("", info.getReferrerACL()); - String cdnUrl = info.getCdnURL(); - assertNotNull(cdnUrl); - - client.cdnUpdateContainer(containerName, 31415, false); - info = client.getCDNContainerInfo(containerName); - assertFalse(info.isEnabled()); - assertEquals(31415, info.getTtl()); - assertEquals(cdnUrl, info.getCdnURL()); - - //client.cdnUpdateContainer(containerName, 54321, true, "Referrer Test", "User Agent Acl Test"); - client.cdnUpdateContainer(containerName, 54321, true); - info = client.getCDNContainerInfo(containerName); - assertTrue(info.isEnabled()); - assertEquals(54321, info.getTtl()); - assertEquals(cdnUrl, info.getCdnURL()); -// assertEquals("Referrer Test", info.getReferrerACL()); -// assertEquals("User Agent Acl Test", info.getUserAgentACL()); - - - } catch (Exception e) { - fail(e.getMessage()); - } - } - - // Test container name limits - public void testContainerNameLimits() { - FilesClient fc = new FilesClient(); - try { - assertTrue(fc.login()); - StringBuilder nameBuilder = new StringBuilder(createTempContainerName("long")); - while(nameBuilder.length() <= FilesConstants.CONTAINER_NAME_LENGTH) { - nameBuilder.append("a"); - } - try { - fc.createContainer(nameBuilder.toString()); - // Note, we shouldn't get here, but want to clean up if we do - fc.deleteContainer(nameBuilder.toString()); - fail("No exception thrown"); - } - catch (FilesInvalidNameException fine) { - // Hooray! - } - } - catch (Exception ex) { - fail(ex.getMessage()); - } - } - - public void testPathCreationAndListing() { - FilesClient client = new FilesClient(); - try { - assertTrue(client.login()); - String containerName = createTempContainerName("pathTest"); - - // Make sure it's not there - assertFalse(client.containerExists(containerName)); - - // Add it - client.createContainer(containerName); - - // See that it's there - assertTrue(client.containerExists(containerName)); - - // Add a path and two files - byte randomData[] = makeRandomBytes(); - client.createPath(containerName, "foo"); - client.storeObject(containerName, randomData, "application/octet-stream", "notInContainer.dat", new HashMap()); - client.storeObject(containerName, randomData, "application/octet-stream", "foo/inContainer.dat", new HashMap()); - - List allObjects = client.listObjects(containerName); - List pathObjects = client.listObjects(containerName, "foo"); - - assertEquals(3, allObjects.size()); - assertEquals(1, pathObjects.size()); - assertEquals("foo/inContainer.dat", pathObjects.get(0).getName()); - - // Delete it - client.deleteObject(containerName, "notInContainer.dat"); - client.deleteObject(containerName, "foo/inContainer.dat"); - client.deleteObject(containerName, "foo"); - assertTrue(client.deleteContainer(containerName)); - - // Make sure it's gone - assertFalse(client.containerExists(containerName)); - - } catch (Exception e) { - e.printStackTrace(); - fail(e.getMessage()); - } - } - - public void testPathCreation() { - FilesClient client = new FilesClient(); - try { - assertTrue(client.login()); - String containerName = createTempContainerName("pathTest"); - - // Make sure it's not there - assertFalse(client.containerExists(containerName)); - - // Add it - client.createContainer(containerName); - - // See that it's there - assertTrue(client.containerExists(containerName)); - - // Add a path and two files - client.createFullPath(containerName, "foo/bar/baz"); - - List allObjects = client.listObjects(containerName); - - assertEquals(3, allObjects.size()); - - // If we don't throw an exception, we should be OK - client.getObject(containerName, "foo"); - client.getObject(containerName, "foo/bar"); - client.getObject(containerName, "foo/bar/baz"); - - // Delete it - client.deleteObject(containerName, "foo/bar/baz"); - client.deleteObject(containerName, "foo/bar"); - client.deleteObject(containerName, "foo"); - assertTrue(client.deleteContainer(containerName)); - - // Make sure it's gone - assertFalse(client.containerExists(containerName)); - - } catch (Exception e) { - e.printStackTrace(); - fail(e.getMessage()); - } - } - - public void testFilesObjectPath() { - FilesClient client = new FilesClient(); - try { - assertTrue(client.login()); - String containerName = createTempContainerName("FOpathTest"); - - // Make sure it's not there - assertFalse(client.containerExists(containerName)); - - // Add it - client.createContainer(containerName); - - // See that it's there - assertTrue(client.containerExists(containerName)); - - // Add a path and two files - client.createPath(containerName, "test"); - - List allObjects = client.listObjects(containerName); - - assertEquals(1, allObjects.size()); - - FilesObject obj = allObjects.get(0); - assertEquals(0, obj.getSize()); - assertEquals("application/directory", obj.getMimeType()); - - // If we don't throw an exception, we should be OK - client.getObject(containerName, "test"); - - // Delete it - client.deleteObject(containerName, "test"); - assertTrue(client.deleteContainer(containerName)); - - // Make sure it's gone - assertFalse(client.containerExists(containerName)); - - } catch (Exception e) { - e.printStackTrace(); - fail(e.getMessage()); - } - } - - public void testURLs() { - // Test to make sure these are getting set and are visible to the outside world (needed for Cyberduck's SSL). - FilesClient client = new FilesClient(); - try { - assertTrue(client.login()); - assertNotNull(client.getCdnManagementURL()); - assertNotNull(client.getStorageURL()); - - } catch (Exception e) { - fail(e.getMessage()); - } - } - - // Fun utilities - private String createTempContainerName(String addition) { - SimpleDateFormat sdf = new SimpleDateFormat("yyyy_MM_dd_HH_mm_ss_SSSS"); - return "test-container-" + addition + "-" + sdf.format(new Date(System.currentTimeMillis())); - } - - private String makeFileName(String addition) { - SimpleDateFormat sdf = new SimpleDateFormat("yyyy_MM_dd_HH_mm_ss_SSSS"); - return "test-file-" + addition + "-" + sdf.format(new Date(System.currentTimeMillis())); - } - - private byte[] makeRandomFile(String name) throws IOException { - - File file = new File(name); - FileOutputStream fos = new FileOutputStream(file); - byte randomData[] = makeRandomBytes(); - fos.write(randomData); - fos.close(); - - return randomData; - } - - private byte[] makeRandomBytes() { - return makeRandomBytes(NUMBER_RANDOM_BYTES); - } - private byte[] makeRandomBytes(int nBytes) { - byte results[] = new byte[nBytes]; - Random gen = new Random(); - gen.nextBytes(results); - - // Uncomment to get some not so random data - // for(int i=0; i < results.length; ++i) results[i] = (byte) (i % Byte.MAX_VALUE); - - return results; - } - - private void assertArrayEquals(byte a[], byte b[]) { - assertEquals(a.length, b.length); - for(int i=0; i < a.length; ++i) assertEquals(a[i], b[i]); - } - - private class TesterCallback implements IFilesTransferCallback { - public long bytesSent = 0; - public int nCalls = 0; - public void progress(long n) { - bytesSent = n; - ++nCalls; - } - } -} \ No newline at end of file diff --git a/src/test/java/com/mosso/client/cloudfiles/LongRunningTest.java b/src/test/java/com/mosso/client/cloudfiles/LongRunningTest.java deleted file mode 100644 index 20ec59c..0000000 --- a/src/test/java/com/mosso/client/cloudfiles/LongRunningTest.java +++ /dev/null @@ -1,40 +0,0 @@ -/** - * - */ -package com.mosso.client.cloudfiles; - -/** - * @author lvaughn - * - */ -public class LongRunningTest { - - /** - * @param args - */ - public static void main(String[] args) { - try { - FilesClient client = new FilesClient(); - - client.login(); - - for(int i=0; i < 120; ++i) { - byte data[] = client.getObject("test_html", "test.html"); - assert (data != null); - System.out.println("Got object " + i); - try { - Thread.sleep(1000 * 60); - } - catch (InterruptedException ie) { - // No Op - } - } - - - } - catch (Exception ex) { - ex.printStackTrace(); - } - } - -} From 51e638b939a46a6be12ded89699b42c2dab03b46 Mon Sep 17 00:00:00 2001 From: Lowell Vaughn Date: Wed, 12 Aug 2009 09:03:44 -0500 Subject: [PATCH 06/64] Adding to 1.4.0 build --- src/test/resources/cloudfiles.properties | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/test/resources/cloudfiles.properties b/src/test/resources/cloudfiles.properties index 0af675c..07234ca 100644 --- a/src/test/resources/cloudfiles.properties +++ b/src/test/resources/cloudfiles.properties @@ -1,6 +1,6 @@ # user properties -username=lvaughn -password=9927bd8ae6ec22f6af44a408bf74ef25 +username=your-username-here +password=your-password-here auth_url=https://api.mosso.com/auth # cloudfs properties From db47ab8e43ed0b291c4384b351e1edb8cbb394c8 Mon Sep 17 00:00:00 2001 From: Lowell Vaughn Date: Wed, 19 Aug 2009 15:08:53 -0500 Subject: [PATCH 07/64] Fixing MIME.types handling of CSS --- .../java/com/rackspacecloud/client/cloudfiles/MIME.types | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/main/java/com/rackspacecloud/client/cloudfiles/MIME.types b/src/main/java/com/rackspacecloud/client/cloudfiles/MIME.types index 9f91f79..459b540 100644 --- a/src/main/java/com/rackspacecloud/client/cloudfiles/MIME.types +++ b/src/main/java/com/rackspacecloud/client/cloudfiles/MIME.types @@ -84,8 +84,8 @@ crt application/pkix-cert #crt application/x-x509-user-cert csh application/x-csh #csh text/x-script.csh -css application/x-pointplus -#css text/css +#css application/x-pointplus +css text/css cxx text/plain dcr application/x-director deepv application/x-deepv @@ -577,4 +577,4 @@ zip application/x-compressed #zip application/zip #zip multipart/x-zip zoo application/octet-stream -zsh text/x-script.zsh \ No newline at end of file +zsh text/x-script.zsh From 9a289e331c6f726d70cb99eadaa25a928d7b472f Mon Sep 17 00:00:00 2001 From: Lowell Vaughn Date: Wed, 30 Sep 2009 13:29:06 -0500 Subject: [PATCH 08/64] Fixing bug with an unrleased connection --- .../client/cloudfiles/FilesClient.java | 148 ++++++++++-------- 1 file changed, 82 insertions(+), 66 deletions(-) diff --git a/src/main/java/com/rackspacecloud/client/cloudfiles/FilesClient.java b/src/main/java/com/rackspacecloud/client/cloudfiles/FilesClient.java index 09af900..8cd9d7d 100644 --- a/src/main/java/com/rackspacecloud/client/cloudfiles/FilesClient.java +++ b/src/main/java/com/rackspacecloud/client/cloudfiles/FilesClient.java @@ -776,35 +776,43 @@ public boolean containerExists (String container) throws IOException, HttpExcept public FilesAccountInfo getAccountInfo() throws IOException, HttpException, FilesAuthorizationException, FilesException { if (this.isLoggedin()) { - HeadMethod method = new HeadMethod(storageURL); - method.getParams().setSoTimeout(connectionTimeOut); - method.setRequestHeader(FilesConstants.X_AUTH_TOKEN, authToken); - client.executeMethod(method); + HeadMethod method = null; - FilesResponse response = new FilesResponse(method); - if (response.getStatusCode() == HttpStatus.SC_UNAUTHORIZED) { - method.removeRequestHeader(FilesConstants.X_AUTH_TOKEN); - if(login()) { - method = new HeadMethod(storageURL); - method.getParams().setSoTimeout(connectionTimeOut); - method.setRequestHeader(FilesConstants.X_AUTH_TOKEN, authToken); - client.executeMethod(method); - response = new FilesResponse(method); + try { + method = new HeadMethod(storageURL); + method.getParams().setSoTimeout(connectionTimeOut); + method.setRequestHeader(FilesConstants.X_AUTH_TOKEN, authToken); + client.executeMethod(method); + + FilesResponse response = new FilesResponse(method); + if (response.getStatusCode() == HttpStatus.SC_UNAUTHORIZED) { + method.removeRequestHeader(FilesConstants.X_AUTH_TOKEN); + if(login()) { + method.releaseConnection(); + method = new HeadMethod(storageURL); + method.getParams().setSoTimeout(connectionTimeOut); + method.setRequestHeader(FilesConstants.X_AUTH_TOKEN, authToken); + client.executeMethod(method); + response = new FilesResponse(method); + } + else { + throw new FilesAuthorizationException("Re-login failed", response.getResponseHeaders(), response.getStatusLine()); + } + } + + if (response.getStatusCode() == HttpStatus.SC_NO_CONTENT) + { + int nContainers = response.getAccountContainerCount(); + long totalSize = response.getAccountBytesUsed(); + return new FilesAccountInfo(totalSize,nContainers); } else { - throw new FilesAuthorizationException("Re-login failed", response.getResponseHeaders(), response.getStatusLine()); + throw new FilesException("Unexpected return from server", response.getResponseHeaders(), response.getStatusLine()); } } - - if (response.getStatusCode() == HttpStatus.SC_NO_CONTENT) - { - int nContainers = response.getAccountContainerCount(); - long totalSize = response.getAccountBytesUsed(); - return new FilesAccountInfo(totalSize,nContainers); - } - else { - throw new FilesException("Unexpected return from server", response.getResponseHeaders(), response.getStatusLine()); - } + finally { + if (method != null) method.releaseConnection(); + } } else { throw new FilesAuthorizationException("You must be logged in", null, null); @@ -894,7 +902,6 @@ public void createContainer(String name) throws IOException, HttpException, File { if (isValidContainerName(name)) { - // logger.warn(name + ":" + sanitizeForURI(name)); PutMethod method = new PutMethod(storageURL+"/"+sanitizeForURI(name)); method.getParams().setSoTimeout(connectionTimeOut); method.setRequestHeader(FilesConstants.X_AUTH_TOKEN, authToken); @@ -1528,6 +1535,7 @@ public List listCdnContainerInfo(int limit, String marker) th { DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); DocumentBuilder builder = factory.newDocumentBuilder(); + //logger.error("CDN LGV:\n" + response.getResponseBodyAsString()); Document document = builder.parse(response.getResponseBodyAsStream()); NodeList nodes = document.getChildNodes(); @@ -2090,45 +2098,49 @@ public FilesObjectMetaData getObjectMetaData (String container, String objName) if (isValidContainerName(container) && isValidObjectName(objName)) { HeadMethod method = new HeadMethod(storageURL+"/"+sanitizeForURI(container)+"/"+sanitizeForURI(objName)); - method.getParams().setSoTimeout(connectionTimeOut); - method.setRequestHeader(FilesConstants.X_AUTH_TOKEN, authToken); + try { + method.getParams().setSoTimeout(connectionTimeOut); - client.executeMethod(method); + method.setRequestHeader(FilesConstants.X_AUTH_TOKEN, authToken); - FilesResponse response = new FilesResponse(method); + client.executeMethod(method); - if (response.getStatusCode() == HttpStatus.SC_NO_CONTENT) - { - logger.debug ("Object metadata retreived : "+objName); - String mimeType = response.getContentType(); - String lastModified = response.getLastModified(); - String eTag = response.getETag(); - String contentLength = response.getContentLength(); + FilesResponse response = new FilesResponse(method); - metaData = new FilesObjectMetaData(mimeType, contentLength, eTag, lastModified); + if (response.getStatusCode() == HttpStatus.SC_NO_CONTENT) + { + logger.debug ("Object metadata retreived : "+objName); + String mimeType = response.getContentType(); + String lastModified = response.getLastModified(); + String eTag = response.getETag(); + String contentLength = response.getContentLength(); - Header [] headers = response.getResponseHeaders(); - HashMap headerMap = new HashMap(); + metaData = new FilesObjectMetaData(mimeType, contentLength, eTag, lastModified); - for (Header h: headers) - { - if ( h.getName().startsWith(FilesConstants.X_OBJECT_META) ) + Header [] headers = response.getResponseHeaders(); + HashMap headerMap = new HashMap(); + + for (Header h: headers) { - headerMap.put(h.getName().substring(FilesConstants.X_OBJECT_META.length()), unencodeURI(h.getValue())); + if ( h.getName().startsWith(FilesConstants.X_OBJECT_META) ) + { + headerMap.put(h.getName().substring(FilesConstants.X_OBJECT_META.length()), unencodeURI(h.getValue())); + } } - } - if (headerMap.size() > 0) - metaData.setMetaData(headerMap); + if (headerMap.size() > 0) + metaData.setMetaData(headerMap); - return metaData; + return metaData; + } + else if (response.getStatusCode() == HttpStatus.SC_NOT_FOUND) + { + logger.info ("Object " + objName + " was not found !"); + return null; + } } - else if (response.getStatusCode() == HttpStatus.SC_NOT_FOUND) - { - logger.info ("Object " + objName + " was not found !"); - return null; + finally { + method.releaseConnection(); } - - method.releaseConnection(); } else { @@ -2169,21 +2181,25 @@ public byte[] getObject (String container, String objName) throws IOException, H method.getParams().setSoTimeout(connectionTimeOut); method.setRequestHeader(FilesConstants.X_AUTH_TOKEN, authToken); - client.executeMethod(method); + try { + client.executeMethod(method); + - FilesResponse response = new FilesResponse(method); + FilesResponse response = new FilesResponse(method); - if (response.getStatusCode() == HttpStatus.SC_OK) - { - logger.debug ("Object data retreived : "+objName); - return response.getResponseBody(); + if (response.getStatusCode() == HttpStatus.SC_OK) + { + logger.debug ("Object data retreived : "+objName); + return response.getResponseBody(); + } + else if (response.getStatusCode() == HttpStatus.SC_NOT_FOUND) + { + throw new FilesNotFoundException("Container: " + container + " did not have object " + objName, response.getResponseHeaders(), response.getStatusLine()); + } } - else if (response.getStatusCode() == HttpStatus.SC_NOT_FOUND) - { - throw new FilesNotFoundException("Container: " + container + " did not have object " + objName, response.getResponseHeaders(), response.getStatusLine()); + finally { + method.releaseConnection(); } - - method.releaseConnection(); } else { @@ -2236,15 +2252,15 @@ public InputStream getObjectAsStream (String container, String objName) throws I if (response.getStatusCode() == HttpStatus.SC_OK) { logger.info ("Object data retreived : "+objName); + // DO NOT RELEASE THIS CONNECTION return response.getResponseBodyAsStream(); } else if (response.getStatusCode() == HttpStatus.SC_NOT_FOUND) { + method.releaseConnection(); logger.info ("Object " + objName + " was not found !"); return null; } - - method.releaseConnection(); } else { From b66f55ea5155b559ac800835145f57f014932b14 Mon Sep 17 00:00:00 2001 From: Lowell Vaughn Date: Wed, 30 Sep 2009 13:29:28 -0500 Subject: [PATCH 09/64] Fixing bug with an unrleased connection --- .../cloudfiles/FilesClientTestCase.java | 60 ++++++++++++++++++- 1 file changed, 58 insertions(+), 2 deletions(-) diff --git a/src/test/java/com/rackspacecloud/client/cloudfiles/FilesClientTestCase.java b/src/test/java/com/rackspacecloud/client/cloudfiles/FilesClientTestCase.java index c157d50..5bda5dd 100644 --- a/src/test/java/com/rackspacecloud/client/cloudfiles/FilesClientTestCase.java +++ b/src/test/java/com/rackspacecloud/client/cloudfiles/FilesClientTestCase.java @@ -117,6 +117,46 @@ public void testAccountInfo() { fail(e.getMessage()); } } + + public void testMultipleFilesNotThere() { + FilesClient client = new FilesClient(); + String filename = makeFileName("random"); + String fullPath = FilenameUtils.concat(SYSTEM_TMP.getAbsolutePath(), filename); + try { + byte[] content = makeRandomFile(fullPath); + assertTrue(client.login()); + String containerName = createTempContainerName("file-not-there"); + client.createContainer(containerName); + + String[] names = new String[10]; + for(int i=0; i < 10; ++i) names[i] = "File" + (i + 1) + ".txt"; + for(int i=0; i < 5; ++i) + assertTrue(client.storeObjectAs(containerName, new File(fullPath), "application/octet-stream", names[i])); + + for (int i = 0; i < 10; i++) { + String fileName = names[i]; + + byte[] retrievedContent = null; + try { + retrievedContent = client.getObject(containerName, fileName); + assertArrayEquals(content, retrievedContent); + } catch(FilesNotFoundException ex) { + assertTrue(i >= 5); + } + } + // Cleanup + for(int i=0; i < 5; ++i) + client.deleteObject(containerName, names[i]); + client.deleteContainer(containerName); + + } catch (Exception e) { + fail(e.getMessage()); + } + finally { + File f = new File(fullPath); + f.delete(); + } + } public void testContainerCreation() { FilesClient client = new FilesClient(); @@ -239,7 +279,7 @@ public void testContainerInfoListing() { FilesClient client = new FilesClient(); try { assertTrue(client.login()); - String containerName = createTempContainerName(""); + String containerName = createTempContainerName(""); // Make sure it's not there assertFalse(client.containerExists(containerName)); @@ -383,6 +423,7 @@ public void testFileSaving() { } catch (Exception e) { + e.printStackTrace(); fail(e.getMessage()); } finally { @@ -1199,7 +1240,7 @@ public void testCDNContainerListLimitMarker() { FilesClient client = new FilesClient(); try { assertTrue(client.login()); - + List originalContainers = client.listCdnContainers(); assertTrue(originalContainers.size() > 0); @@ -1246,6 +1287,21 @@ public void testCDNContainerFullListing() { } } + + public void testCDNContainerFullListingAll() { + FilesClient client = new FilesClient(); + try { + assertTrue(client.login()); + String container = createTempContainerName("aaa_\u1422_aaa"); + client.cdnEnableContainer(container); + // Now do a limit + client.listCdnContainerInfo(); + } catch (Exception e) { + fail(e.getMessage()); + } + } + + public void testCDNApi() { String containerName = createTempContainerName("java api Test\u03DA_\u2042\u03de#<>\u2043\u2042\u2044\u2045"); //containerName = createTempContainerName("java Api Test no uniocde"); From 0e7767db49212c62372513d785f6c3e2032101df Mon Sep 17 00:00:00 2001 From: Lowell Vaughn Date: Wed, 30 Sep 2009 13:36:45 -0500 Subject: [PATCH 10/64] Fixing but with open connections --- .../com/rackspacecloud/client/cloudfiles/FilesClient.java | 3 ++- .../com/rackspacecloud/client/cloudfiles/FilesConstants.java | 2 +- .../rackspacecloud/client/cloudfiles/FilesClientTestCase.java | 1 + src/test/resources/cloudfiles.properties | 4 ++-- 4 files changed, 6 insertions(+), 4 deletions(-) diff --git a/src/main/java/com/rackspacecloud/client/cloudfiles/FilesClient.java b/src/main/java/com/rackspacecloud/client/cloudfiles/FilesClient.java index 8cd9d7d..560c2eb 100644 --- a/src/main/java/com/rackspacecloud/client/cloudfiles/FilesClient.java +++ b/src/main/java/com/rackspacecloud/client/cloudfiles/FilesClient.java @@ -2194,7 +2194,8 @@ public byte[] getObject (String container, String objName) throws IOException, H } else if (response.getStatusCode() == HttpStatus.SC_NOT_FOUND) { - throw new FilesNotFoundException("Container: " + container + " did not have object " + objName, response.getResponseHeaders(), response.getStatusLine()); + throw new FilesNotFoundException("Container: " + container + " did not have object " + objName, + response.getResponseHeaders(), response.getStatusLine()); } } finally { diff --git a/src/main/java/com/rackspacecloud/client/cloudfiles/FilesConstants.java b/src/main/java/com/rackspacecloud/client/cloudfiles/FilesConstants.java index c150f0d..1acb4bd 100644 --- a/src/main/java/com/rackspacecloud/client/cloudfiles/FilesConstants.java +++ b/src/main/java/com/rackspacecloud/client/cloudfiles/FilesConstants.java @@ -12,7 +12,7 @@ public class FilesConstants { private static Logger logger = Logger.getLogger(FilesConstants.class); - public static final String USER_AGENT = "java-cloudfiles/1.4.0"; + public static final String USER_AGENT = "java-cloudfiles/1.4.1"; /** HTTP Header token that identifies the username to Cloud Files **/ public static final String X_STORAGE_USER = "x-auth-user"; diff --git a/src/test/java/com/rackspacecloud/client/cloudfiles/FilesClientTestCase.java b/src/test/java/com/rackspacecloud/client/cloudfiles/FilesClientTestCase.java index 5bda5dd..bfb09ae 100644 --- a/src/test/java/com/rackspacecloud/client/cloudfiles/FilesClientTestCase.java +++ b/src/test/java/com/rackspacecloud/client/cloudfiles/FilesClientTestCase.java @@ -119,6 +119,7 @@ public void testAccountInfo() { } public void testMultipleFilesNotThere() { + // Tests to make sure we're releasing connections with 404's FilesClient client = new FilesClient(); String filename = makeFileName("random"); String fullPath = FilenameUtils.concat(SYSTEM_TMP.getAbsolutePath(), filename); diff --git a/src/test/resources/cloudfiles.properties b/src/test/resources/cloudfiles.properties index 07234ca..39f188e 100644 --- a/src/test/resources/cloudfiles.properties +++ b/src/test/resources/cloudfiles.properties @@ -1,6 +1,6 @@ # user properties -username=your-username-here -password=your-password-here +username=user-name-here +password=api-key-here auth_url=https://api.mosso.com/auth # cloudfs properties From 793acf89c8c6d7be166f005a8802e13c89d5812d Mon Sep 17 00:00:00 2001 From: Lowell Vaughn Date: Fri, 23 Oct 2009 11:37:40 -0500 Subject: [PATCH 11/64] Factor out auth strings, add retry to the remaining methods that should have it but don't --- cloudfiles.properties | 6 ++- .../client/cloudfiles/FilesClient.java | 50 +++++++++++++++---- .../client/cloudfiles/FilesConstants.java | 8 +-- src/test/resources/cloudfiles.properties | 5 ++ 4 files changed, 54 insertions(+), 15 deletions(-) diff --git a/cloudfiles.properties b/cloudfiles.properties index 2199a22..e432032 100644 --- a/cloudfiles.properties +++ b/cloudfiles.properties @@ -1,5 +1,9 @@ version=v1 -auth_url=https://api.mosso.com/auth connection_timeout=5000 + +# Auth info +auth_url=https://api.mosso.com/auth auth_token_name=X-Auth-Token +#auth_user_header=X-Storage-User +#auth_pass_header=X-Storage-Pass diff --git a/src/main/java/com/rackspacecloud/client/cloudfiles/FilesClient.java b/src/main/java/com/rackspacecloud/client/cloudfiles/FilesClient.java index 560c2eb..3d3028b 100644 --- a/src/main/java/com/rackspacecloud/client/cloudfiles/FilesClient.java +++ b/src/main/java/com/rackspacecloud/client/cloudfiles/FilesClient.java @@ -212,8 +212,10 @@ public boolean login() throws IOException, HttpException GetMethod method = new GetMethod(authenticationURL); method.getParams().setSoTimeout(connectionTimeOut); - method.setRequestHeader(FilesConstants.X_STORAGE_USER, username); - method.setRequestHeader(FilesConstants.X_STORAGE_PASS, password); + method.setRequestHeader(FilesUtil.getProperty("auth_user_header", FilesConstants.X_STORAGE_USER_DEFAULT), + username); + method.setRequestHeader(FilesUtil.getProperty("auth_pass_header", FilesConstants.X_STORAGE_PASS_DEFAULT), + password); logger.debug ("Logging in user: "+username+" using URL: "+authenticationURL); client.executeMethod(method); @@ -1535,7 +1537,6 @@ public List listCdnContainerInfo(int limit, String marker) th { DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); DocumentBuilder builder = factory.newDocumentBuilder(); - //logger.error("CDN LGV:\n" + response.getResponseBodyAsString()); Document document = builder.parse(response.getResponseBodyAsStream()); NodeList nodes = document.getChildNodes(); @@ -1982,6 +1983,7 @@ public boolean storeObjectAs(String container, String name, RequestEntity entity client.executeMethod(method); FilesResponse response = new FilesResponse(method); if (response.getStatusCode() == HttpStatus.SC_UNAUTHORIZED) { + method.releaseConnection(); login(); method = new PutMethod(storageURL+"/"+sanitizeForURI(container)+"/"+sanitizeForURI(objName)); method.getParams().setSoTimeout(connectionTimeOut); @@ -2047,6 +2049,18 @@ public void deleteObject (String container, String objName) throws IOException, method.setRequestHeader(FilesConstants.X_AUTH_TOKEN, authToken); client.executeMethod(method); FilesResponse response = new FilesResponse(method); + + if (response.getStatusCode() == HttpStatus.SC_UNAUTHORIZED) { + method.releaseConnection(); + login(); + method = new DeleteMethod(storageURL+"/"+sanitizeForURI(container)+"/"+sanitizeForURI(objName)); + method.getParams().setSoTimeout(connectionTimeOut); + method.getParams().setSoTimeout(connectionTimeOut); + method.setRequestHeader(FilesConstants.X_AUTH_TOKEN, authToken); + client.executeMethod(method); + response = new FilesResponse(method); + } + if (response.getStatusCode() == HttpStatus.SC_NO_CONTENT) { @@ -2100,14 +2114,21 @@ public FilesObjectMetaData getObjectMetaData (String container, String objName) HeadMethod method = new HeadMethod(storageURL+"/"+sanitizeForURI(container)+"/"+sanitizeForURI(objName)); try { method.getParams().setSoTimeout(connectionTimeOut); - method.setRequestHeader(FilesConstants.X_AUTH_TOKEN, authToken); - client.executeMethod(method); FilesResponse response = new FilesResponse(method); + + if (response.getStatusCode() == HttpStatus.SC_UNAUTHORIZED) { + method.releaseConnection(); + login(); + method.getParams().setSoTimeout(connectionTimeOut); + method.setRequestHeader(FilesConstants.X_AUTH_TOKEN, authToken); + client.executeMethod(method); + response = new FilesResponse(method); + } - if (response.getStatusCode() == HttpStatus.SC_NO_CONTENT) + if (response.getStatusCode() == HttpStatus.SC_NO_CONTENT) { logger.debug ("Object metadata retreived : "+objName); String mimeType = response.getContentType(); @@ -2245,12 +2266,20 @@ public InputStream getObjectAsStream (String container, String objName) throws I GetMethod method = new GetMethod(storageURL+"/"+sanitizeForURI(container)+"/"+sanitizeForURI(objName)); method.getParams().setSoTimeout(connectionTimeOut); method.setRequestHeader(FilesConstants.X_AUTH_TOKEN, authToken); - client.executeMethod(method); - FilesResponse response = new FilesResponse(method); - if (response.getStatusCode() == HttpStatus.SC_OK) + if (response.getStatusCode() == HttpStatus.SC_UNAUTHORIZED) { + method.releaseConnection(); + login(); + method = new GetMethod(storageURL+"/"+sanitizeForURI(container)+"/"+sanitizeForURI(objName)); + method.getParams().setSoTimeout(connectionTimeOut); + method.setRequestHeader(FilesConstants.X_AUTH_TOKEN, authToken); + client.executeMethod(method); + response = new FilesResponse(method); + } + + if (response.getStatusCode() == HttpStatus.SC_OK) { logger.info ("Object data retreived : "+objName); // DO NOT RELEASE THIS CONNECTION @@ -2453,7 +2482,8 @@ public String getStorageToken() } /** - * Has this instance of the client authenticated itself? + * Has this instance of the client authenticated itself? Note, this does not mean that a call + * right now will work, if the auth token has timed out, you will need to re-auth. * * @return True if we logged in, false otherwise. */ diff --git a/src/main/java/com/rackspacecloud/client/cloudfiles/FilesConstants.java b/src/main/java/com/rackspacecloud/client/cloudfiles/FilesConstants.java index 1acb4bd..4719780 100644 --- a/src/main/java/com/rackspacecloud/client/cloudfiles/FilesConstants.java +++ b/src/main/java/com/rackspacecloud/client/cloudfiles/FilesConstants.java @@ -12,12 +12,12 @@ public class FilesConstants { private static Logger logger = Logger.getLogger(FilesConstants.class); - public static final String USER_AGENT = "java-cloudfiles/1.4.1"; + public static final String USER_AGENT = "java-cloudfiles/1.4.2"; /** HTTP Header token that identifies the username to Cloud Files **/ - public static final String X_STORAGE_USER = "x-auth-user"; + public static final String X_STORAGE_USER_DEFAULT = "x-auth-user"; /** HTTP header token that identifies the password to Cloud Files **/ - public static final String X_STORAGE_PASS = "x-auth-key"; + public static final String X_STORAGE_PASS_DEFAULT = "x-auth-key"; /** HTTP header token that identifies the Storage URL after a successful user login to Cloud Files **/ public static final String X_STORAGE_URL = "X-Storage-Url"; /** HTTP header that identifies the CDN Management URL after a successful login to Cloud Files **/ @@ -60,7 +60,7 @@ public class FilesConstants public static final String X_OBJECT_META = "X-Object-Meta-"; public static Properties MIMETYPES = new Properties (); - + static { try { diff --git a/src/test/resources/cloudfiles.properties b/src/test/resources/cloudfiles.properties index 39f188e..3e8c586 100644 --- a/src/test/resources/cloudfiles.properties +++ b/src/test/resources/cloudfiles.properties @@ -1,9 +1,14 @@ # user properties username=user-name-here password=api-key-here + +# Auth Info, including two headers that can change for different auth services auth_url=https://api.mosso.com/auth +#auth_user_header=X-Storage-User +#auth_pass_header=X-Storage-Pass # cloudfs properties version=v1 connection_timeout=15000 + From 7668a2fd2432076ca6c15f16009d1621d8c752b9 Mon Sep 17 00:00:00 2001 From: Lowell Vaughn Date: Fri, 13 Nov 2009 09:04:40 -0600 Subject: [PATCH 12/64] ACL csuport --- .../client/cloudfiles/FilesCDNContainer.java | 52 ++++++++--------- .../client/cloudfiles/FilesClient.java | 58 ++++++++++--------- .../client/cloudfiles/FilesConstants.java | 2 +- src/test/resources/cloudfiles.properties | 4 +- 4 files changed, 59 insertions(+), 57 deletions(-) diff --git a/src/main/java/com/rackspacecloud/client/cloudfiles/FilesCDNContainer.java b/src/main/java/com/rackspacecloud/client/cloudfiles/FilesCDNContainer.java index a21bb49..25c2118 100644 --- a/src/main/java/com/rackspacecloud/client/cloudfiles/FilesCDNContainer.java +++ b/src/main/java/com/rackspacecloud/client/cloudfiles/FilesCDNContainer.java @@ -9,8 +9,8 @@ */ public class FilesCDNContainer { private boolean enabled; -// private String userAgentACL; -// private String referrerACL; + private String userAgentACL; + private String referrerACL; private int ttl; private String cdnURL; private String name; @@ -58,30 +58,30 @@ public boolean isEnabled() { public void setEnabled(boolean enabled) { this.enabled = enabled; } -// /** -// * @return the userAgentACL -// */ -// public String getUserAgentACL() { -// return userAgentACL; -// } -// /** -// * @param userAgentACL the userAgentACL to set -// */ -// public void setUserAgentACL(String userAgentACL) { -// this.userAgentACL = userAgentACL; -// } -// /** -// * @return the refererACL -// */ -// public String getReferrerACL() { -// return referrerACL; -// } -// /** -// * @param refererACL the refererACL to set -// */ -// public void setReferrerACL(String referrerACL) { -// this.referrerACL = referrerACL; -// } + /** + * @return the userAgentACL + */ + public String getUserAgentACL() { + return userAgentACL; + } + /** + * @param userAgentACL the userAgentACL to set + */ + public void setUserAgentACL(String userAgentACL) { + this.userAgentACL = "".equals(userAgentACL) ? null : userAgentACL; + } + /** + * @return the refererACL + */ + public String getReferrerACL() { + return referrerACL; + } + /** + * @param refererACL the refererACL to set + */ + public void setReferrerACL(String referrerACL) { + this.referrerACL = "".equals(referrerACL) ? null : referrerACL; + } /** * @return the ttl */ diff --git a/src/main/java/com/rackspacecloud/client/cloudfiles/FilesClient.java b/src/main/java/com/rackspacecloud/client/cloudfiles/FilesClient.java index 3d3028b..47d37d3 100644 --- a/src/main/java/com/rackspacecloud/client/cloudfiles/FilesClient.java +++ b/src/main/java/com/rackspacecloud/client/cloudfiles/FilesClient.java @@ -1090,6 +1090,12 @@ else if (response.getStatusCode() == HttpStatus.SC_UNAUTHORIZED) { return returnValue; } + public String cdnUpdateContainer(String name, int ttl, boolean enabled, boolean retainLogs) + throws IOException, HttpException, FilesException + { + return cdnUpdateContainer(name, ttl, enabled, null, null, retainLogs); + } + /** * Enables access of files in this container via the Content Delivery Network. * @@ -1106,8 +1112,7 @@ else if (response.getStatusCode() == HttpStatus.SC_UNAUTHORIZED) { * @param referrerAcl Unused for now * @param userAgentACL Unused for now */ -// private String cdnUpdateContainer(String name, int ttl, boolean enabled, String referrerAcl, String userAgentACL) - public String cdnUpdateContainer(String name, int ttl, boolean enabled, boolean retainLogs) + private String cdnUpdateContainer(String name, int ttl, boolean enabled, String referrerAcl, String userAgentACL, boolean retainLogs) throws IOException, HttpException, FilesException { String returnValue = null; @@ -1127,19 +1132,19 @@ public String cdnUpdateContainer(String name, int ttl, boolean enabled, boolean } // Enabled method.setRequestHeader(FilesConstants.X_CDN_ENABLED, Boolean.toString(enabled)); - - // Log Retention + + // Log Retention method.setRequestHeader(FilesConstants.X_CDN_RETAIN_LOGS, Boolean.toString(retainLogs)); -// // Referrer ACL -// if(referrerAcl != null) { -// method.setRequestHeader(FilesConstants.X_CDN_REFERRER_ACL, referrerAcl); -// } + // Referrer ACL + if(referrerAcl != null) { + method.setRequestHeader(FilesConstants.X_CDN_REFERRER_ACL, referrerAcl); + } -// // User Agent ACL -// if(userAgentACL != null) { -// method.setRequestHeader(FilesConstants.X_CDN_USER_AGENT_ACL, userAgentACL); -// } + // User Agent ACL + if(userAgentACL != null) { + method.setRequestHeader(FilesConstants.X_CDN_USER_AGENT_ACL, userAgentACL); + } client.executeMethod(method); FilesResponse response = new FilesResponse(method); @@ -1192,22 +1197,7 @@ else if (response.getStatusCode() == HttpStatus.SC_UNAUTHORIZED) { } return returnValue; } - - /* * - * Enables access of files in this container via the Content Delivery Network. - * - * @param name The name of the container to enable - * @param ttl How long the CDN can use the content before checking for an update. A negative value will result in this not being changed. - * @param enabled True if this folder should be accesible, false otherwise - * @return The CDN Url of the container - * @throws IOException There was an IO error doing network communication - * @throws HttpException There was an error with the http protocol - * @throws FilesAuthorizationException Authentication failed - */ -// public String cdnUpdateContainer(String name, int ttl, boolean enabled) throws IOException, HttpException, FilesAuthorizationException -// { -// return cdnUpdateContainer(name, ttl, enabled, (String) null, (String) null); -// } + /** * Gets current CDN sharing status of the container @@ -1261,6 +1251,12 @@ else if ("x-log-retention".equals(name)) { else if ("x-ttl".equals(name)) { result.setTtl(Integer.parseInt(hdr.getValue())); } + else if ("x-referrer-acl".equals(name)) { + result.setReferrerACL(hdr.getValue()); + } + else if ("x-user-agent-acl".equals(name)) { + result.setUserAgentACL(hdr.getValue()); + } } return result; } @@ -1569,6 +1565,12 @@ else if ("log_retention".equals(data.getNodeName())) { else if ("ttl".equals(data.getNodeName())) { container.setTtl(Integer.parseInt(data.getTextContent())); } + else if ("referrer_acl".equals(data.getNodeName())) { + container.setReferrerACL(data.getTextContent()); + } + else if ("useragent_acl".equals(data.getNodeName())) { + container.setUserAgentACL(data.getTextContent()); + } else { //logger.warn("Unexpected container-info tag:" + data.getNodeName()); } diff --git a/src/main/java/com/rackspacecloud/client/cloudfiles/FilesConstants.java b/src/main/java/com/rackspacecloud/client/cloudfiles/FilesConstants.java index 4719780..9642382 100644 --- a/src/main/java/com/rackspacecloud/client/cloudfiles/FilesConstants.java +++ b/src/main/java/com/rackspacecloud/client/cloudfiles/FilesConstants.java @@ -12,7 +12,7 @@ public class FilesConstants { private static Logger logger = Logger.getLogger(FilesConstants.class); - public static final String USER_AGENT = "java-cloudfiles/1.4.2"; + public static final String USER_AGENT = "java-cloudfiles/1.5.0"; /** HTTP Header token that identifies the username to Cloud Files **/ public static final String X_STORAGE_USER_DEFAULT = "x-auth-user"; diff --git a/src/test/resources/cloudfiles.properties b/src/test/resources/cloudfiles.properties index 3e8c586..af29fdd 100644 --- a/src/test/resources/cloudfiles.properties +++ b/src/test/resources/cloudfiles.properties @@ -1,6 +1,6 @@ # user properties -username=user-name-here -password=api-key-here +username=username-here +password=password-here # Auth Info, including two headers that can change for different auth services auth_url=https://api.mosso.com/auth From 435a944645fba615de3bac20c57a2b4034cc05d8 Mon Sep 17 00:00:00 2001 From: Chmouel Boudjnah Date: Mon, 18 Jan 2010 17:15:03 +0000 Subject: [PATCH 13/64] Fix path to run the sample properly. --- run_cli.sh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/run_cli.sh b/run_cli.sh index 6084f85..3625e5b 100755 --- a/run_cli.sh +++ b/run_cli.sh @@ -1,5 +1,5 @@ #!/bin/sh -export CLASSPATH=lib/commons-cli-1.1.jar:lib/commons-httpclient-3.1.jar:lib/commons-lang-2.4.jar:lib/junit.jar:lib/commons-codec-1.3.jar:lib/commons-io-1.4.jar:lib/commons-logging-1.1.1.jar:lib/log4j-1.2.15.jar:dist/cloud_files.jar:. +export CLASSPATH=lib/commons-cli-1.1.jar:lib/commons-httpclient-3.1.jar:lib/commons-lang-2.4.jar:lib/junit.jar:lib/commons-codec-1.3.jar:lib/commons-io-1.4.jar:lib/commons-logging-1.1.1.jar:lib/log4j-1.2.15.jar:dist/java-cloudfiles.jar:. -java com.mosso.client.cloudfiles.sample.FilesCli +java com.rackspacecloud.client.cloudfiles.sample.FilesCli From 220ccadc96e829a44d01d6f50d118af4cf2486ff Mon Sep 17 00:00:00 2001 From: Lowell Vaughn Date: Tue, 26 Jan 2010 16:25:31 -0600 Subject: [PATCH 14/64] Changes to the handling of 404's --- .../rackspacecloud/client/cloudfiles/FilesClient.java | 10 +++++----- .../client/cloudfiles/FilesConstants.java | 2 +- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/main/java/com/rackspacecloud/client/cloudfiles/FilesClient.java b/src/main/java/com/rackspacecloud/client/cloudfiles/FilesClient.java index 47d37d3..230d7b7 100644 --- a/src/main/java/com/rackspacecloud/client/cloudfiles/FilesClient.java +++ b/src/main/java/com/rackspacecloud/client/cloudfiles/FilesClient.java @@ -2038,7 +2038,7 @@ public boolean storeObjectAs(String container, String name, RequestEntity entity * @throws HttpException There was an error with the http protocol * @throws FilesException */ - public void deleteObject (String container, String objName) throws IOException, HttpException, FilesException + public void deleteObject (String container, String objName) throws IOException, FilesNotFoundException, HttpException, FilesException { if (this.isLoggedin()) { @@ -2157,8 +2157,8 @@ public FilesObjectMetaData getObjectMetaData (String container, String objName) } else if (response.getStatusCode() == HttpStatus.SC_NOT_FOUND) { - logger.info ("Object " + objName + " was not found !"); - return null; + throw new FilesNotFoundException("Container: " + container + " did not have object " + objName, + response.getResponseHeaders(), response.getStatusLine()); } } finally { @@ -2290,8 +2290,8 @@ public InputStream getObjectAsStream (String container, String objName) throws I else if (response.getStatusCode() == HttpStatus.SC_NOT_FOUND) { method.releaseConnection(); - logger.info ("Object " + objName + " was not found !"); - return null; + throw new FilesNotFoundException("Container: " + container + " did not have object " + objName, + response.getResponseHeaders(), response.getStatusLine()); } } else diff --git a/src/main/java/com/rackspacecloud/client/cloudfiles/FilesConstants.java b/src/main/java/com/rackspacecloud/client/cloudfiles/FilesConstants.java index 9642382..f7bb0df 100644 --- a/src/main/java/com/rackspacecloud/client/cloudfiles/FilesConstants.java +++ b/src/main/java/com/rackspacecloud/client/cloudfiles/FilesConstants.java @@ -12,7 +12,7 @@ public class FilesConstants { private static Logger logger = Logger.getLogger(FilesConstants.class); - public static final String USER_AGENT = "java-cloudfiles/1.5.0"; + public static final String USER_AGENT = "java-cloudfiles/1.5.1"; /** HTTP Header token that identifies the username to Cloud Files **/ public static final String X_STORAGE_USER_DEFAULT = "x-auth-user"; From 4521ab51ffa007d3b6688d9a2de9293c7dda78c9 Mon Sep 17 00:00:00 2001 From: Lowell Vaughn Date: Tue, 26 Jan 2010 16:26:06 -0600 Subject: [PATCH 15/64] Changes to the handling of 404's --- .../java/com/rackspacecloud/client/cloudfiles/FilesClient.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/main/java/com/rackspacecloud/client/cloudfiles/FilesClient.java b/src/main/java/com/rackspacecloud/client/cloudfiles/FilesClient.java index 230d7b7..0fcce11 100644 --- a/src/main/java/com/rackspacecloud/client/cloudfiles/FilesClient.java +++ b/src/main/java/com/rackspacecloud/client/cloudfiles/FilesClient.java @@ -217,11 +217,10 @@ public boolean login() throws IOException, HttpException method.setRequestHeader(FilesUtil.getProperty("auth_pass_header", FilesConstants.X_STORAGE_PASS_DEFAULT), password); - logger.debug ("Logging in user: "+username+" using URL: "+authenticationURL); client.executeMethod(method); FilesResponse response = new FilesResponse(method); - + if (response.loginSuccess()) { isLoggedin = true; From 1feeacbb09b68b1c7f2bd273fefce3e0554a9474 Mon Sep 17 00:00:00 2001 From: Lowell Vaughn Date: Fri, 29 Jan 2010 11:03:45 -0600 Subject: [PATCH 16/64] Cleaning up some "throws" in signatures, fixing the auth server URL --- cloudfiles.properties | 2 +- .../client/cloudfiles/FilesClient.java | 13 ++++++++++--- .../client/cloudfiles/FilesConstants.java | 2 +- src/test/resources/cloudfiles.properties | 4 ++-- 4 files changed, 14 insertions(+), 7 deletions(-) diff --git a/cloudfiles.properties b/cloudfiles.properties index e432032..ff04326 100644 --- a/cloudfiles.properties +++ b/cloudfiles.properties @@ -2,7 +2,7 @@ version=v1 connection_timeout=5000 # Auth info -auth_url=https://api.mosso.com/auth +auth_url=https://auth.api.rackspacecloud.com/v1.0 auth_token_name=X-Auth-Token #auth_user_header=X-Storage-User #auth_pass_header=X-Storage-Pass diff --git a/src/main/java/com/rackspacecloud/client/cloudfiles/FilesClient.java b/src/main/java/com/rackspacecloud/client/cloudfiles/FilesClient.java index 0fcce11..1dbf73e 100644 --- a/src/main/java/com/rackspacecloud/client/cloudfiles/FilesClient.java +++ b/src/main/java/com/rackspacecloud/client/cloudfiles/FilesClient.java @@ -1206,8 +1206,9 @@ else if (response.getStatusCode() == HttpStatus.SC_UNAUTHORIZED) { * @throws IOException There was an IO error doing network communication * @throws HttpException There was an error with the http protocol * @throws FilesException There was an error talking to the CloudFiles Server + * @throws FilesNotFoundException The Container has never been CDN enabled */ - public FilesCDNContainer getCDNContainerInfo(String container) throws IOException, HttpException, FilesException + public FilesCDNContainer getCDNContainerInfo(String container) throws IOException, FilesNotFoundException, HttpException, FilesException { if (isLoggedin()) { if (isValidContainerName(container)) @@ -1263,6 +1264,10 @@ else if (response.getStatusCode() == HttpStatus.SC_UNAUTHORIZED) { logger.warn("Unauthorized access"); throw new FilesAuthorizationException("User not Authorized!",response.getResponseHeaders(), response.getStatusLine()); } + else if (response.getStatusCode() == HttpStatus.SC_NOT_FOUND) { + throw new FilesNotFoundException("Container is not CDN enabled",response.getResponseHeaders(), response.getStatusLine()); + } + else { throw new FilesException("Unexpected result from server: ", response.getResponseHeaders(), response.getStatusLine()); } @@ -2104,8 +2109,9 @@ else if (response.getStatusCode() == HttpStatus.SC_NOT_FOUND) * @throws HttpException There was an error with the http protocol * @throws FilesAuthorizationException The Client's Login was invalid. * @throws FilesInvalidNameException The container or object name was not valid + * @throws FilesNotFoundException The file was not found */ - public FilesObjectMetaData getObjectMetaData (String container, String objName) throws IOException, HttpException, FilesAuthorizationException, FilesInvalidNameException + public FilesObjectMetaData getObjectMetaData (String container, String objName) throws IOException, FilesNotFoundException, HttpException, FilesAuthorizationException, FilesInvalidNameException { FilesObjectMetaData metaData; if (this.isLoggedin()) @@ -2249,9 +2255,10 @@ else if (response.getStatusCode() == HttpStatus.SC_NOT_FOUND) * @throws IOException There was an IO error doing network communication * @throws HttpException There was an error with the http protocol * @throws FilesAuthorizationException + * @throws FilesNotFoundException The container does not exist * @throws FilesInvalidNameException */ - public InputStream getObjectAsStream (String container, String objName) throws IOException, HttpException, FilesAuthorizationException, FilesInvalidNameException + public InputStream getObjectAsStream (String container, String objName) throws IOException, HttpException, FilesAuthorizationException, FilesInvalidNameException, FilesNotFoundException { if (this.isLoggedin()) { diff --git a/src/main/java/com/rackspacecloud/client/cloudfiles/FilesConstants.java b/src/main/java/com/rackspacecloud/client/cloudfiles/FilesConstants.java index f7bb0df..f42632a 100644 --- a/src/main/java/com/rackspacecloud/client/cloudfiles/FilesConstants.java +++ b/src/main/java/com/rackspacecloud/client/cloudfiles/FilesConstants.java @@ -12,7 +12,7 @@ public class FilesConstants { private static Logger logger = Logger.getLogger(FilesConstants.class); - public static final String USER_AGENT = "java-cloudfiles/1.5.1"; + public static final String USER_AGENT = "java-cloudfiles/1.5.2"; /** HTTP Header token that identifies the username to Cloud Files **/ public static final String X_STORAGE_USER_DEFAULT = "x-auth-user"; diff --git a/src/test/resources/cloudfiles.properties b/src/test/resources/cloudfiles.properties index af29fdd..9d3ac7a 100644 --- a/src/test/resources/cloudfiles.properties +++ b/src/test/resources/cloudfiles.properties @@ -1,9 +1,9 @@ # user properties -username=username-here +username=username-here password=password-here # Auth Info, including two headers that can change for different auth services -auth_url=https://api.mosso.com/auth +auth_url=https://auth.api.rackspacecloud.com/v1.0 #auth_user_header=X-Storage-User #auth_pass_header=X-Storage-Pass From f56bbba1ac013f2773d3b9eb83a1b3dea7b2bafc Mon Sep 17 00:00:00 2001 From: Lowell Vaughn Date: Mon, 8 Feb 2010 17:45:40 -0600 Subject: [PATCH 17/64] Adding new method for checking CDN Status and improving standards compliance --- .../client/cloudfiles/FilesClient.java | 90 +++++++++++++++++-- .../client/cloudfiles/FilesConstants.java | 2 +- src/test/resources/cloudfiles.properties | 2 +- 3 files changed, 87 insertions(+), 7 deletions(-) diff --git a/src/main/java/com/rackspacecloud/client/cloudfiles/FilesClient.java b/src/main/java/com/rackspacecloud/client/cloudfiles/FilesClient.java index 1dbf73e..ab7b63c 100644 --- a/src/main/java/com/rackspacecloud/client/cloudfiles/FilesClient.java +++ b/src/main/java/com/rackspacecloud/client/cloudfiles/FilesClient.java @@ -353,7 +353,7 @@ else if ("count".equals(data.getNodeName())) { count = Integer.parseInt(data.getTextContent()); } else { - logger.warn("Unexpected container-info tag:" + data.getNodeName()); + logger.debug("Unexpected container-info tag:" + data.getNodeName()); } } if (name != null) { @@ -617,7 +617,7 @@ else if ("last_modified".equals(data.getNodeName())) { FilesObject obj = new FilesObject(name, container, this); if (eTag != null) obj.setMd5sum(eTag); if (mimeType != null) obj.setMimeType(mimeType); - if (size > 0) obj.setSize(size); + if (size >= 0) obj.setSize(size); if (lastModified != null) obj.setLastModified(lastModified); objectList.add(obj); } @@ -1288,7 +1288,83 @@ else if (response.getStatusCode() == HttpStatus.SC_NOT_FOUND) { } } - /* * + /** + * Gets current CDN sharing status of the container + * + * @param name The name of the container to enable + * @return Information on the container + * @throws IOException There was an IO error doing network communication + * @throws HttpException There was an error with the http protocol + * @throws FilesException There was an error talking to the CloudFiles Server + * @throws FilesNotFoundException The Container has never been CDN enabled + */ + public boolean isCDNEnabled(String container) throws IOException, HttpException, FilesException + { + if (isLoggedin()) { + if (isValidContainerName(container)) + { + HeadMethod method = null; + try { + method= new HeadMethod(cdnManagementURL+"/"+sanitizeForURI(container)); + method.getParams().setSoTimeout(connectionTimeOut); + method.setRequestHeader(FilesConstants.X_AUTH_TOKEN, authToken); + client.executeMethod(method); + + FilesResponse response = new FilesResponse(method); + + if (response.getStatusCode() == HttpStatus.SC_UNAUTHORIZED) { + method.releaseConnection(); + if(login()) { + method= new HeadMethod(cdnManagementURL+"/"+sanitizeForURI(container)); + method.getParams().setSoTimeout(connectionTimeOut); + method.setRequestHeader(FilesConstants.X_AUTH_TOKEN, authToken); + client.executeMethod(method); + response = new FilesResponse(method); + } + else { + throw new FilesAuthorizationException("Re-login failed", response.getResponseHeaders(), response.getStatusLine()); + } + } + + if (response.getStatusCode() == HttpStatus.SC_NO_CONTENT) + { + for (Header hdr : response.getResponseHeaders()) { + String name = hdr.getName().toLowerCase(); + if ("x-cdn-enabled".equals(name)) { + return Boolean.valueOf(hdr.getValue()); + } + } + throw new FilesException("Server did not return X-CDN-Enabled header: ", response.getResponseHeaders(), response.getStatusLine()); + } + else if (response.getStatusCode() == HttpStatus.SC_UNAUTHORIZED) { + logger.warn("Unauthorized access"); + throw new FilesAuthorizationException("User not Authorized!",response.getResponseHeaders(), response.getStatusLine()); + } + else if (response.getStatusCode() == HttpStatus.SC_NOT_FOUND) { + return false; + } + + else { + throw new FilesException("Unexpected result from server: ", response.getResponseHeaders(), response.getStatusLine()); + } + } + finally { + if (method != null) { + method.releaseConnection(); + } + } + } + else + { + throw new FilesInvalidNameException(container); + } + } + else { + throw new FilesAuthorizationException("You must be logged in", null, null); + } + } + + /* * * Not currently used (but soon will be) * @param container */ @@ -2135,7 +2211,8 @@ public FilesObjectMetaData getObjectMetaData (String container, String objName) response = new FilesResponse(method); } - if (response.getStatusCode() == HttpStatus.SC_NO_CONTENT) + if (response.getStatusCode() == HttpStatus.SC_NO_CONTENT || + response.getStatusCode() == HttpStatus.SC_OK) { logger.debug ("Object metadata retreived : "+objName); String mimeType = response.getContentType(); @@ -2165,6 +2242,10 @@ else if (response.getStatusCode() == HttpStatus.SC_NOT_FOUND) throw new FilesNotFoundException("Container: " + container + " did not have object " + objName, response.getResponseHeaders(), response.getStatusLine()); } + else { + throw new FilesException("Unexpected Return Code from Server", + response.getResponseHeaders(), response.getStatusLine()); + } } finally { method.releaseConnection(); @@ -2183,7 +2264,6 @@ else if (response.getStatusCode() == HttpStatus.SC_NOT_FOUND) else { throw new FilesAuthorizationException("You must be logged in", null, null); } - return null; } diff --git a/src/main/java/com/rackspacecloud/client/cloudfiles/FilesConstants.java b/src/main/java/com/rackspacecloud/client/cloudfiles/FilesConstants.java index f42632a..7b1a19c 100644 --- a/src/main/java/com/rackspacecloud/client/cloudfiles/FilesConstants.java +++ b/src/main/java/com/rackspacecloud/client/cloudfiles/FilesConstants.java @@ -12,7 +12,7 @@ public class FilesConstants { private static Logger logger = Logger.getLogger(FilesConstants.class); - public static final String USER_AGENT = "java-cloudfiles/1.5.2"; + public static final String USER_AGENT = "java-cloudfiles/1.5.3"; /** HTTP Header token that identifies the username to Cloud Files **/ public static final String X_STORAGE_USER_DEFAULT = "x-auth-user"; diff --git a/src/test/resources/cloudfiles.properties b/src/test/resources/cloudfiles.properties index 9d3ac7a..3b689af 100644 --- a/src/test/resources/cloudfiles.properties +++ b/src/test/resources/cloudfiles.properties @@ -1,6 +1,6 @@ # user properties username=username-here -password=password-here +password=api-key-here # Auth Info, including two headers that can change for different auth services auth_url=https://auth.api.rackspacecloud.com/v1.0 From 0ce9377099c81e8dbfd8006bc985032a1f15916d Mon Sep 17 00:00:00 2001 From: Lowell Vaughn Date: Mon, 8 Feb 2010 17:46:42 -0600 Subject: [PATCH 18/64] Adding new method for checking CDN Status and improving standards compliance --- .../client/cloudfiles/FilesClientTestCase.java | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/src/test/java/com/rackspacecloud/client/cloudfiles/FilesClientTestCase.java b/src/test/java/com/rackspacecloud/client/cloudfiles/FilesClientTestCase.java index bfb09ae..b21186a 100644 --- a/src/test/java/com/rackspacecloud/client/cloudfiles/FilesClientTestCase.java +++ b/src/test/java/com/rackspacecloud/client/cloudfiles/FilesClientTestCase.java @@ -577,6 +577,7 @@ public void testFileSavingWithMetadata() { // Make sure the metadata is correct FilesObjectMetaData metadata = client.getObjectMetaData(containerName, filename); + assertNotNull(metadata); Map serverMetadata = metadata.getMetaData(); assertEquals(meta.size(), serverMetadata.size()); for(String key : meta.keySet()) { @@ -589,7 +590,12 @@ public void testFileSavingWithMetadata() { assertTrue(client.deleteContainer(containerName)); } + catch (FilesException e) { + e.printStackTrace(); + fail(e.getHttpStatusMessage() + ":" + e.getMessage()); + } catch (Exception e) { + e.printStackTrace(); fail(e.getMessage()); } finally { @@ -1313,9 +1319,12 @@ public void testCDNApi() { List containers = client.listCdnContainers(); int originalContainerListSize = containers.size(); + + assertFalse(client.isCDNEnabled(containerName)); String url = client.cdnEnableContainer(containerName); assertNotNull(url); + assertTrue(client.isCDNEnabled(containerName)); containers = client.listCdnContainers(); assertEquals(originalContainerListSize + 1, containers.size()); @@ -1334,6 +1343,7 @@ public void testCDNApi() { assertNotNull(cdnUrl); client.cdnUpdateContainer(containerName, 31415, false, true); + assertFalse(client.isCDNEnabled(containerName)); info = client.getCDNContainerInfo(containerName); assertFalse(info.isEnabled()); assertTrue(info.getRetainLogs()); @@ -1342,6 +1352,7 @@ public void testCDNApi() { //client.cdnUpdateContainer(containerName, 54321, true, "Referrer Test", "User Agent Acl Test"); client.cdnUpdateContainer(containerName, 54321, true, false); + assertTrue(client.isCDNEnabled(containerName)); info = client.getCDNContainerInfo(containerName); assertTrue(info.isEnabled()); assertFalse(info.getRetainLogs()); From 957a3c9a3a788b0ae420243a7f6e36a23d26ed67 Mon Sep 17 00:00:00 2001 From: Conrad Date: Wed, 7 Apr 2010 23:30:38 -0500 Subject: [PATCH 19/64] Added useSnet and usingSnet Methods. This can be used to access cloud files over its snet interface rather then its public one. --- .../client/cloudfiles/FilesClient.java | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/rackspacecloud/client/cloudfiles/FilesClient.java b/src/main/java/com/rackspacecloud/client/cloudfiles/FilesClient.java index ab7b63c..1b299a4 100644 --- a/src/main/java/com/rackspacecloud/client/cloudfiles/FilesClient.java +++ b/src/main/java/com/rackspacecloud/client/cloudfiles/FilesClient.java @@ -99,6 +99,8 @@ public class FilesClient private String authToken = null; private boolean isLoggedin = false; private boolean useETag = true; + private boolean snet = false; + private String snetAddr = "snet-"; private HttpClient client = new HttpClient(new MultiThreadedHttpConnectionManager()); @@ -224,7 +226,12 @@ public boolean login() throws IOException, HttpException if (response.loginSuccess()) { isLoggedin = true; - storageURL = response.getStorageURL(); + if(usingSnet()){ + storageURL = snetAddr + response.getStorageURL(); + } + else{ + storageURL = response.getStorageURL(); + } cdnManagementURL = response.getCDNManagementURL(); authToken = response.getAuthToken(); logger.debug("storageURL: " + storageURL); @@ -2749,5 +2756,12 @@ public boolean updateObjectMetadata(String container, String object, if (method != null) method.releaseConnection(); } + + } + public void useSnet(){ + snet = true; + } + public boolean usingSnet(){ + return snet; } } From 874bb2946ea8a768ee58167720f81179aed51ae0 Mon Sep 17 00:00:00 2001 From: Conrad Weidenkeller Date: Thu, 8 Apr 2010 03:03:19 -0500 Subject: [PATCH 20/64] Snet Addr was being set incorrectly Fixed. --- .../com/rackspacecloud/client/cloudfiles/FilesClient.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/rackspacecloud/client/cloudfiles/FilesClient.java b/src/main/java/com/rackspacecloud/client/cloudfiles/FilesClient.java index 1b299a4..7773ede 100644 --- a/src/main/java/com/rackspacecloud/client/cloudfiles/FilesClient.java +++ b/src/main/java/com/rackspacecloud/client/cloudfiles/FilesClient.java @@ -100,7 +100,7 @@ public class FilesClient private boolean isLoggedin = false; private boolean useETag = true; private boolean snet = false; - private String snetAddr = "snet-"; + private String snetAddr = "https://snet-"; private HttpClient client = new HttpClient(new MultiThreadedHttpConnectionManager()); @@ -227,7 +227,7 @@ public boolean login() throws IOException, HttpException { isLoggedin = true; if(usingSnet()){ - storageURL = snetAddr + response.getStorageURL(); + storageURL = snetAddr + response.getStorageURL().substring(8); } else{ storageURL = response.getStorageURL(); From 6a77f882b5003edc1a828df8f0669449d61f356c Mon Sep 17 00:00:00 2001 From: Conrad Date: Thu, 8 Apr 2010 10:16:24 -0500 Subject: [PATCH 21/64] Added Unit Tests and environment variable functionality as well as post login snet toggling --- .../client/cloudfiles/FilesClient.java | 14 +- .../cloudfiles/SnetFilesClientTestCase.java | 1695 +++++++++++++++++ 2 files changed, 1708 insertions(+), 1 deletion(-) create mode 100644 src/test/java/com/rackspacecloud/client/cloudfiles/SnetFilesClientTestCase.java diff --git a/src/main/java/com/rackspacecloud/client/cloudfiles/FilesClient.java b/src/main/java/com/rackspacecloud/client/cloudfiles/FilesClient.java index 7773ede..d015449 100644 --- a/src/main/java/com/rackspacecloud/client/cloudfiles/FilesClient.java +++ b/src/main/java/com/rackspacecloud/client/cloudfiles/FilesClient.java @@ -226,7 +226,7 @@ public boolean login() throws IOException, HttpException if (response.loginSuccess()) { isLoggedin = true; - if(usingSnet()){ + if(usingSnet() || envSnet()){ storageURL = snetAddr + response.getStorageURL().substring(8); } else{ @@ -2760,8 +2760,20 @@ public boolean updateObjectMetadata(String container, String object, } public void useSnet(){ snet = true; + if(storageURL != null){ + storageURL = snetAddr + storageURL.substring(8); + } } public boolean usingSnet(){ return snet; } + private boolean envSnet(){ + if (System.getenv("snet") == null) { + return false; + } + else{ + snet = true; + return true; + } + } } diff --git a/src/test/java/com/rackspacecloud/client/cloudfiles/SnetFilesClientTestCase.java b/src/test/java/com/rackspacecloud/client/cloudfiles/SnetFilesClientTestCase.java new file mode 100644 index 0000000..b27c9b2 --- /dev/null +++ b/src/test/java/com/rackspacecloud/client/cloudfiles/SnetFilesClientTestCase.java @@ -0,0 +1,1695 @@ +package com.rackspacecloud.client.cloudfiles; + +import java.io.ByteArrayInputStream; +import java.io.File; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.InputStream; +import java.math.BigInteger; +import java.security.MessageDigest; +import java.security.NoSuchAlgorithmException; +import java.text.SimpleDateFormat; +import java.util.Date; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Random; + +import org.apache.commons.httpclient.methods.ByteArrayRequestEntity; +import org.apache.commons.io.FilenameUtils; +import org.apache.commons.lang.SystemUtils; +import org.apache.log4j.Logger; + +import com.rackspacecloud.client.cloudfiles.FilesAccountInfo; +import com.rackspacecloud.client.cloudfiles.FilesCDNContainer; +import com.rackspacecloud.client.cloudfiles.FilesClient; +import com.rackspacecloud.client.cloudfiles.FilesConstants; +import com.rackspacecloud.client.cloudfiles.FilesContainer; +import com.rackspacecloud.client.cloudfiles.FilesContainerExistsException; +import com.rackspacecloud.client.cloudfiles.FilesContainerInfo; +import com.rackspacecloud.client.cloudfiles.FilesInvalidNameException; +import com.rackspacecloud.client.cloudfiles.FilesNotFoundException; +import com.rackspacecloud.client.cloudfiles.FilesObject; +import com.rackspacecloud.client.cloudfiles.FilesObjectMetaData; +import com.rackspacecloud.client.cloudfiles.FilesUtil; +import com.rackspacecloud.client.cloudfiles.IFilesTransferCallback; + + +import junit.framework.TestCase; + +public class SnetFilesClientTestCase extends TestCase { + private static Logger logger = Logger.getLogger(FilesClientTestCase.class); + private static File SYSTEM_TMP = SystemUtils.getJavaIoTmpDir(); + private static int NUMBER_RANDOM_BYTES = 513; + + public void testConstructor() { + FilesClient client = new FilesClient("foo", "bar", "baz"); + + assertNotNull(client); + assertEquals("foo", client.getUserName()); + assertEquals("bar", client.getPassword()); + assertEquals("baz", client.getAccount()); + + } + + public void testNoArgConstructor() { + FilesClient client = new FilesClient(); + + assertNotNull(client); + assertEquals(FilesUtil.getProperty("username"), client.getUserName()); + assertEquals(FilesUtil.getProperty("password"), client.getPassword()); + assertEquals(FilesUtil.getProperty("account"), client.getAccount()); + } + + public void testLogin() { + FilesClient client = new FilesClient(); + + try { + client.useSnet(); + assertTrue(client.usingSnet()); + assertTrue(client.login()); + } catch (Exception e) { + fail(e.getMessage()); + } + + // Now try a failed login + client = new FilesClient(FilesUtil.getProperty("username"), + FilesUtil.getProperty("password") + " this is a bogus password", + FilesUtil.getProperty("account")); + try { + + assertFalse(client.login()); + } catch (Exception e) { + fail(e.getMessage()); + } + } + + public void testAccountInfo() { + String containerName = createTempContainerName("byte-array"); + String filename = makeFileName("accountinfo"); + FilesClient client = new FilesClient(); + try { + client.useSnet(); + assertTrue(client.usingSnet()); + assertTrue(client.login()); + + // Make sure it's not there + assertFalse(client.containerExists(containerName)); + + // Add it + client.createContainer(containerName); + + // See that it's there + assertTrue(client.containerExists(containerName)); + assertNotNull(client.getContainerInfo(containerName)); + + // Add some data + byte randomData[] = makeRandomBytes(); + assertTrue(client.storeObject(containerName, randomData, "application/octet-stream", filename, new HashMap())); + + // Do the test if we have an account + if (FilesUtil.getProperty("account") != null) { + FilesAccountInfo info = client.getAccountInfo(); + assertTrue(info.getContainerCount() > 0); + assertTrue(info.getBytesUsed() >= randomData.length); + } + + // Clean up + client.deleteObject(containerName, filename); + assertTrue(client.deleteContainer(containerName)); + } catch (Exception e) { + e.printStackTrace(); + fail(e.getMessage()); + } + } + + public void testMultipleFilesNotThere() { + // Tests to make sure we're releasing connections with 404's + FilesClient client = new FilesClient(); + String filename = makeFileName("random"); + String fullPath = FilenameUtils.concat(SYSTEM_TMP.getAbsolutePath(), filename); + try { + byte[] content = makeRandomFile(fullPath); + client.useSnet(); + assertTrue(client.usingSnet()); + assertTrue(client.login()); + String containerName = createTempContainerName("file-not-there"); + client.createContainer(containerName); + + String[] names = new String[10]; + for(int i=0; i < 10; ++i) names[i] = "File" + (i + 1) + ".txt"; + for(int i=0; i < 5; ++i) + assertTrue(client.storeObjectAs(containerName, new File(fullPath), "application/octet-stream", names[i])); + + for (int i = 0; i < 10; i++) { + String fileName = names[i]; + + byte[] retrievedContent = null; + try { + retrievedContent = client.getObject(containerName, fileName); + assertArrayEquals(content, retrievedContent); + } catch(FilesNotFoundException ex) { + assertTrue(i >= 5); + } + } + // Cleanup + for(int i=0; i < 5; ++i) + client.deleteObject(containerName, names[i]); + client.deleteContainer(containerName); + + } catch (Exception e) { + fail(e.getMessage()); + } + finally { + File f = new File(fullPath); + f.delete(); + } + } + + public void testContainerCreation() { + FilesClient client = new FilesClient(); + try { + client.useSnet(); + assertTrue(client.usingSnet()); + assertTrue(client.login()); + String containerName = createTempContainerName(""); + + // Make sure it's not there + assertFalse(client.containerExists(containerName)); + + // Add it + client.createContainer(containerName); + + // See that it's there + assertTrue(client.containerExists(containerName)); + assertNotNull(client.getContainerInfo(containerName)); + + // Try Adding it again + try { + client.createContainer(containerName); + fail("Allowed duplicate container creation"); + } + catch (FilesContainerExistsException fcee) { + // Hooray! + } + + // See that it's still there + assertTrue(client.containerExists(containerName)); + + // Delete it + assertTrue(client.deleteContainer(containerName)); + + // Make sure it's gone + assertFalse(client.containerExists(containerName)); + + + } catch (Exception e) { + fail(e.getMessage()); + } + } + public void testSnetToggle() { + FilesClient client = new FilesClient(); + try { + assertTrue(client.login()); + client.useSnet(); + assertTrue(client.usingSnet()); + String containerName = createTempContainerName(""); + + // Make sure it's not there + assertFalse(client.containerExists(containerName)); + + // Add it + client.createContainer(containerName); + + // See that it's there + assertTrue(client.containerExists(containerName)); + assertNotNull(client.getContainerInfo(containerName)); + + // Try Adding it again + try { + client.createContainer(containerName); + fail("Allowed duplicate container creation"); + } + catch (FilesContainerExistsException fcee) { + // Hooray! + } + + // See that it's still there + assertTrue(client.containerExists(containerName)); + + // Delete it + assertTrue(client.deleteContainer(containerName)); + + // Make sure it's gone + assertFalse(client.containerExists(containerName)); + + + } catch (Exception e) { + fail(e.getMessage()); + } + } + public void testContainerNotThereDeletion() { + FilesClient client = new FilesClient(); + try { + client.useSnet(); + assertTrue(client.usingSnet()); + assertTrue(client.login()); + String containerName = createTempContainerName("I'mNotHere!"); + + // Make sure it's not there + assertFalse(client.containerExists(containerName)); + + boolean exceptionThrown = false; + try { + client.deleteContainer(containerName); + fail("Exception not thrown"); + } + catch (FilesNotFoundException fnfe) { + exceptionThrown = true; + } + assertTrue (exceptionThrown); + + // Make still not there + assertFalse(client.containerExists(containerName)); + + + } catch (Exception e) { + fail(e.getMessage()); + } + } + + public void testContainerCreationWithSpaces() { + FilesClient client = new FilesClient(); + try { + client.useSnet(); + assertTrue(client.usingSnet()); + assertTrue(client.login()); + String containerName = createTempContainerName("with space+and+plus"); + + // Make sure it's not there + assertFalse(client.containerExists(containerName)); + + // Add it + client.createContainer(containerName); + + // See that it's there + assertTrue(client.containerExists(containerName)); + assertNotNull(client.getContainerInfo(containerName)); + + // Try Adding it again + try { + client.createContainer(containerName); + fail("Allowed duplicate container creation"); + } + catch (FilesContainerExistsException fcee) { + // Pass this case + } + + // See that it's still there + assertTrue(client.containerExists(containerName)); + + boolean found = false; + List containers = client.listContainers(); + for (FilesContainer cont : containers) { + // logger.warn(cont.getName()); + if(containerName.equals(cont.getName())) found = true; + } + assertTrue(found); + + + // Delete it + assertTrue(client.deleteContainer(containerName)); + + // Make sure it's gone + assertFalse(client.containerExists(containerName)); + + + } catch (Exception e) { + fail(e.getMessage()); + } + } + + public void testContainerInfoListing() { + FilesClient client = new FilesClient(); + try { + client.useSnet(); + assertTrue(client.usingSnet()); + assertTrue(client.login()); + String containerName = createTempContainerName(""); + + // Make sure it's not there + assertFalse(client.containerExists(containerName)); + + // Add it + client.createContainer(containerName); + + // See that it's there + assertTrue(client.containerExists(containerName)); + assertNotNull(client.getContainerInfo(containerName)); + + // Try Adding it again + try { + client.createContainer(containerName); + fail("Allowed duplicate container creation"); + } + catch (FilesContainerExistsException fcee) { + // Hooray! + } + + // See that it's still there + assertTrue(client.containerExists(containerName)); + + boolean found = false; + List containers = client.listContainersInfo(); + for (FilesContainerInfo info : containers) { + if(containerName.equals(info.getName())) { + found = true; + assertEquals(0, info.getTotalSize()); + assertEquals(0, info.getObjectCount()); + } + } + assertTrue(found); + + + // Delete it + assertTrue(client.deleteContainer(containerName)); + + // Make sure it's gone + assertFalse(client.containerExists(containerName)); + + + } catch (Exception e) { + e.printStackTrace(); + fail(e.getMessage()); + } + } + + public void testUserAgent() { + FilesClient client = new FilesClient(); + assertEquals(FilesConstants.USER_AGENT, client.getUserAgent()); + client.setUserAgent("Java-Test-User-Agent"); + assertEquals("Java-Test-User-Agent", client.getUserAgent()); + try { + client.useSnet(); + assertTrue(client.usingSnet()); + assertTrue(client.login()); + String containerName = createTempContainerName("user-agent"); + + // Make sure it's not there + assertFalse(client.containerExists(containerName)); + + // Add it + client.createContainer(containerName); + + // See that it's there + assertTrue(client.containerExists(containerName)); + assertNotNull(client.getContainerInfo(containerName)); + + // Delete it + assertTrue(client.deleteContainer(containerName)); + + // Make sure it's gone + assertFalse(client.containerExists(containerName)); + + + } catch (Exception e) { + fail(e.getMessage()); + } + } + + public void testContainerNameNoSlashes() { + FilesClient client = new FilesClient(); + try { + client.useSnet(); + assertTrue(client.usingSnet()); + assertTrue(client.login()); + String containerName = createTempContainerName("/"); + + // Make sure they're not there + assertFalse(client.containerExists(containerName)); + + // Try to add it + boolean exceptionThrown = false; + try { + client.createContainer(containerName); + fail("Should not have been able to create container: " + containerName); + } + catch (FilesInvalidNameException fine) { + exceptionThrown = true; + } + assertTrue(exceptionThrown); + } catch (Exception e) { + fail(e.getMessage()); + } + } + + public void testFileSaving() { + String containerName = createTempContainerName("file-test"); + String filename = makeFileName("random"); + String fullPath = FilenameUtils.concat(SYSTEM_TMP.getAbsolutePath(), filename); + logger.info("Test File Location: " + fullPath); + try { + byte randomData[] = makeRandomFile(fullPath); + FilesClient client = new FilesClient(); + client.useSnet(); + assertTrue(client.usingSnet()); + assertTrue(client.login()); + + // Set up + client.createContainer(containerName); + + // Store it + logger.info("About to save: " + filename); + assertTrue(client.storeObjectAs(containerName, new File(fullPath), "application/octet-stream", filename)); + + // Make sure it's there + List objects = client.listObjects(containerName); + assertEquals(1, objects.size()); + FilesObject obj = objects.get(0); + assertEquals(filename, obj.getName()); + assertEquals("application/octet-stream", obj.getMimeType()); + + // Make sure the data is correct + assertArrayEquals(randomData, client.getObject(containerName, filename)); + + // Make sure the data is correct as a stream + InputStream is = client.getObjectAsStream(containerName, filename); + byte otherData[] = new byte[NUMBER_RANDOM_BYTES]; + is.read(otherData); + assertArrayEquals(randomData, otherData); + assertEquals(-1, is.read()); // Could hang if there's a bug on the other end + + // Clean up + client.deleteObject(containerName, filename); + assertTrue(client.deleteContainer(containerName)); + + } + catch (Exception e) { + e.printStackTrace(); + fail(e.getMessage()); + } + finally { + File f = new File(fullPath); + f.delete(); + } + + } + public void testSaveAs() { + String containerName = createTempContainerName("file-test"); + String filename = makeFileName("random"); + String fullPath = FilenameUtils.concat(SYSTEM_TMP.getAbsolutePath(), filename); + String otherFileName = "Bob"; + logger.info("Test File Location: " + fullPath); + try { + byte randomData[] = makeRandomFile(fullPath); + FilesClient client = new FilesClient(); + client.useSnet(); + assertTrue(client.usingSnet()); + assertTrue(client.login()); + + // Set up + client.createContainer(containerName); + + // Store it + logger.info("About to save: " + filename); + assertTrue(client.storeObjectAs(containerName, new File(fullPath), "application/octet-stream", otherFileName)); + + // Make sure it's there + List objects = client.listObjects(containerName); + assertEquals(1, objects.size()); + FilesObject obj = objects.get(0); + assertEquals("Bob", obj.getName()); + assertEquals("application/octet-stream", obj.getMimeType()); + + // Make sure the data is correct + assertArrayEquals(randomData, client.getObject(containerName, otherFileName)); + + // Make sure the data is correct as a stream + InputStream is = client.getObjectAsStream(containerName, otherFileName); + byte otherData[] = new byte[NUMBER_RANDOM_BYTES]; + is.read(otherData); + assertArrayEquals(randomData, otherData); + assertEquals(-1, is.read()); // Could hang if there's a bug on the other end + + // Clean up + client.deleteObject(containerName, otherFileName); + assertTrue(client.deleteContainer(containerName)); + + } + catch (Exception e) { + fail(e.getMessage()); + } + finally { + File f = new File(fullPath); + f.delete(); + } + + } + public void testFileSavingWithCallback() { + String containerName = createTempContainerName("file-test"); + String filename = makeFileName("random"); + String fullPath = FilenameUtils.concat(SYSTEM_TMP.getAbsolutePath(), filename); + logger.info("Test File Location: " + fullPath); + try { + byte randomData[] = makeRandomFile(fullPath); + FilesClient client = new FilesClient(); + client.useSnet(); + assertTrue(client.usingSnet()); + assertTrue(client.login()); + + // Set up + client.createContainer(containerName); + + // Store it + logger.info("About to save: " + filename); + TesterCallback callback = new TesterCallback(); + assertTrue(client.storeObjectAs(containerName, new File(fullPath), "application/octet-stream", filename, callback)); + + // Make sure the callback was called + assertEquals(randomData.length, callback.bytesSent); + assertEquals(1, callback.nCalls); + + // Make sure it's there + List objects = client.listObjects(containerName); + assertEquals(1, objects.size()); + FilesObject obj = objects.get(0); + assertEquals(filename, obj.getName()); + assertEquals("application/octet-stream", obj.getMimeType()); + + // Make sure the data is correct + assertArrayEquals(randomData, client.getObject(containerName, filename)); + + // Make sure the data is correct as a stream + InputStream is = client.getObjectAsStream(containerName, filename); + byte otherData[] = new byte[NUMBER_RANDOM_BYTES]; + is.read(otherData); + assertArrayEquals(randomData, otherData); + assertEquals(-1, is.read()); // Could hang if there's a bug on the other end + + // Clean up + client.deleteObject(containerName, filename); + assertTrue(client.deleteContainer(containerName)); + + } + catch (Exception e) { + e.printStackTrace(); + if (e.getCause() != null) e.getCause().printStackTrace(); + fail(e.getMessage()); + } + finally { + File f = new File(fullPath); + f.delete(); + } + + } + public void testFileSavingWithMetadata() { + String containerName = createTempContainerName("meta-data-test"); + String filename = makeFileName("random-with-meta"); + String fullPath = FilenameUtils.concat(SYSTEM_TMP.getAbsolutePath(), filename); + logger.info("Test File Location: " + fullPath); + try { + byte randomData[] = makeRandomFile(fullPath); + FilesClient client = new FilesClient(); + client.useSnet(); + assertTrue(client.usingSnet()); + assertTrue(client.login()); + + // Set up + client.createContainer(containerName); + + // Store it + HashMap meta = new HashMap(); + meta.put("Foo", "bar"); + meta.put("Uni", "\u0169\u00f1\u00efcode-test"); + meta.put("Width", "336"); + meta.put("Height", "183"); + assertTrue(client.storeObjectAs(containerName, new File(fullPath), "application/octet-stream", filename, meta)); + + // Make sure it's there + List objects = client.listObjects(containerName); + assertEquals(1, objects.size()); + FilesObject obj = objects.get(0); + assertEquals(filename, obj.getName()); + assertEquals("application/octet-stream", obj.getMimeType()); + + // Make sure the data is correct + assertArrayEquals(randomData, client.getObject(containerName, filename)); + + // Make sure the data is correct as a stream + InputStream is = client.getObjectAsStream(containerName, filename); + byte otherData[] = new byte[NUMBER_RANDOM_BYTES]; + is.read(otherData); + assertArrayEquals(randomData, otherData); + assertEquals(-1, is.read()); // Could hang if there's a bug on the other end + + // Make sure the metadata is correct + FilesObjectMetaData metadata = client.getObjectMetaData(containerName, filename); + assertNotNull(metadata); + Map serverMetadata = metadata.getMetaData(); + assertEquals(meta.size(), serverMetadata.size()); + for(String key : meta.keySet()) { + assertTrue(serverMetadata.containsKey(key)); + assertEquals(meta.get(key), serverMetadata.get(key)); + } + + // Clean up + client.deleteObject(containerName, filename); + assertTrue(client.deleteContainer(containerName)); + + } + catch (FilesException e) { + e.printStackTrace(); + fail(e.getHttpStatusMessage() + ":" + e.getMessage()); + } + catch (Exception e) { + e.printStackTrace(); + fail(e.getMessage()); + } + finally { + File f = new File(fullPath); + f.delete(); + } + + } + + public void testFileSavingNoETag() { + String containerName = createTempContainerName("etagless"); + String filename = makeFileName("etagless"); + String fullPath = FilenameUtils.concat(SYSTEM_TMP.getAbsolutePath(), filename); + logger.info("Test File Location: " + fullPath); + try { + byte randomData[] = makeRandomFile(fullPath); + FilesClient client = new FilesClient(); + assertTrue(client.getUseETag()); + client.setUseETag(false); + assertFalse(client.getUseETag()); + client.useSnet(); + assertTrue(client.usingSnet()); + assertTrue(client.login()); + + // Set up + client.createContainer(containerName); + + // Store it + assertTrue(client.storeObjectAs(containerName, new File(fullPath), "application/octet-stream", filename)); + + // Make sure it's there + List objects = client.listObjects(containerName); + assertEquals(1, objects.size()); + FilesObject obj = objects.get(0); + assertEquals(filename, obj.getName()); + assertEquals("application/octet-stream", obj.getMimeType()); + + // Make sure the data is correct + assertArrayEquals(randomData, client.getObject(containerName, filename)); + + // Make sure the data is correct as a stream + InputStream is = client.getObjectAsStream(containerName, filename); + byte otherData[] = new byte[NUMBER_RANDOM_BYTES]; + is.read(otherData); + assertArrayEquals(randomData, otherData); + assertEquals(-1, is.read()); // Could hang if there's a bug on the other end + + // Clean up + client.deleteObject(containerName, filename); + assertTrue(client.deleteContainer(containerName)); + + } + catch (Exception e) { + fail(e.getMessage()); + } + finally { + File f = new File(fullPath); + f.delete(); + } + + } + + public void testContainerListing() { + String containerName = createTempContainerName(""); + String filename = makeFileName(""); + String fullPath = FilenameUtils.concat(SYSTEM_TMP.getAbsolutePath(), filename); + logger.info("Test File Location: " + fullPath); + try { + byte randomData[] = makeRandomFile(fullPath); + FilesClient client = new FilesClient(); + client.useSnet(); + assertTrue(client.usingSnet()); + assertTrue(client.login()); + + // Set up + client.createContainer(containerName); + + // Store it + logger.info("About to save: " + filename); + assertTrue(client.storeObjectAs(containerName, new File(fullPath), "application/octet-stream", filename)); + + // Make sure it's there + List objects = client.listObjects(containerName); + assertEquals(1, objects.size()); + FilesObject obj = objects.get(0); + assertEquals(filename, obj.getName()); + assertEquals("application/octet-stream", obj.getMimeType()); + assertEquals(NUMBER_RANDOM_BYTES, obj.getSize()); + assertEquals(md5Sum(randomData), obj.getMd5sum()); + + // Make sure the data is correct + assertArrayEquals(randomData, client.getObject(containerName, filename)); + + // Make sure the data is correct as a stream + InputStream is = client.getObjectAsStream(containerName, filename); + byte otherData[] = new byte[NUMBER_RANDOM_BYTES]; + is.read(otherData); + assertArrayEquals(randomData, otherData); + assertEquals(-1, is.read()); // Could hang if there's a bug on the other end + + // Clean up + client.deleteObject(containerName, filename); + assertTrue(client.deleteContainer(containerName)); + + } + catch (Exception e) { + fail(e.getMessage()); + } + finally { + File f = new File(fullPath); + f.delete(); + } + + } + + public void testContainerListingWithXML() { + String containerName = createTempContainerName(""); + String filename = makeFileName(""); + try { + byte randomData[] = makeRandomBytes(); + FilesClient client = new FilesClient(); + client.useSnet(); + assertTrue(client.usingSnet()); + assertTrue(client.login()); + + // Set up + client.createContainer(containerName); + + // Store it + logger.info("About to save: " + filename); + assertTrue(client.storeObject(containerName, randomData, "application/octet-stream", filename, new HashMap())); + + // Make sure it's there + List objects = client.listObjects(containerName); + assertEquals(1, objects.size()); + FilesObject obj = objects.get(0); + assertEquals(filename, obj.getName()); + assertEquals("application/octet-stream", obj.getMimeType()); + assertEquals(NUMBER_RANDOM_BYTES, obj.getSize()); + assertEquals(md5Sum(randomData), obj.getMd5sum()); + + // Make sure the data is correct + assertArrayEquals(randomData, client.getObject(containerName, filename)); + + // Make sure the data is correct as a stream + InputStream is = client.getObjectAsStream(containerName, filename); + byte otherData[] = new byte[NUMBER_RANDOM_BYTES]; + is.read(otherData); + assertArrayEquals(randomData, otherData); + assertEquals(-1, is.read()); // Could hang if there's a bug on the other end + + // Clean up + client.deleteObject(containerName, filename); + assertTrue(client.deleteContainer(containerName)); + + } + catch (Exception e) { + fail(e.getMessage()); + } + + } + + public void testByteArraySaving() { + String containerName = createTempContainerName("byte-array"); + String filename = makeFileName("bytearray"); + try { + byte randomData[] = makeRandomBytes(); + FilesClient client = new FilesClient(); + // client.setUseETag(false); + client.useSnet(); + assertTrue(client.usingSnet()); + assertTrue(client.login()); + + // Set up + client.createContainer(containerName); + + // Store it + assertTrue(client.storeObject(containerName, randomData, "application/octet-stream", filename, new HashMap())); + + // Make sure it's there + List objects = client.listObjects(containerName); + assertEquals(1, objects.size()); + FilesObject obj = objects.get(0); + assertEquals(filename, obj.getName()); + assertEquals("application/octet-stream", obj.getMimeType()); + + // Make sure the data is correct + assertArrayEquals(randomData, client.getObject(containerName, filename)); + + // Make sure the data is correct as a stream + InputStream is = client.getObjectAsStream(containerName, filename); + byte otherData[] = new byte[NUMBER_RANDOM_BYTES]; + is.read(otherData); + assertArrayEquals(randomData, otherData); + assertEquals(-1, is.read()); // Could hang if there's a bug on the other end + + // Clean up + client.deleteObject(containerName, filename); + assertTrue(client.deleteContainer(containerName)); + + } + catch (Exception e) { + e.printStackTrace(); + fail(e.getMessage()); + } + } + + public void testLineNoiseSaving() { + String containerName = createTempContainerName("[]<>{}!@#$%^&*()_-+=|,.?"); + String filename = makeFileName("/[]<>{}!@#$%^&*()_-+=|,.?/"); + try { + byte randomData[] = makeRandomBytes(); + FilesClient client = new FilesClient(); + // client.setUseETag(false); + client.useSnet(); + assertTrue(client.usingSnet()); + assertTrue(client.login()); + + // Set up + client.createContainer(containerName); + + // Store it + assertTrue(client.storeObject(containerName, randomData, "application/octet-stream", filename, new HashMap())); + + // Make sure it's there + List objects = client.listObjects(containerName); + assertEquals(1, objects.size()); + FilesObject obj = objects.get(0); + assertEquals(filename, obj.getName()); + assertEquals("application/octet-stream", obj.getMimeType()); + + // Make sure the data is correct + assertArrayEquals(randomData, client.getObject(containerName, filename)); + + // Make sure the data is correct as a stream + InputStream is = client.getObjectAsStream(containerName, filename); + byte otherData[] = new byte[NUMBER_RANDOM_BYTES]; + is.read(otherData); + assertArrayEquals(randomData, otherData); + assertEquals(-1, is.read()); // Could hang if there's a bug on the other end + + // Clean up + client.deleteObject(containerName, filename); + assertTrue(client.deleteContainer(containerName)); + + } + catch (Exception e) { + e.printStackTrace(); + fail(e.getMessage()); + } + } + + public void testRequestEntitySaving() { + String containerName = createTempContainerName("requst-entity"); + String filename = makeFileName("req-entity"); + try { + byte randomData[] = makeRandomBytes(); + FilesClient client = new FilesClient(); + client.useSnet(); + assertTrue(client.usingSnet()); + assertTrue(client.login()); + + // Set up + client.createContainer(containerName); + + // Store it + ByteArrayRequestEntity entity = new ByteArrayRequestEntity(randomData, "test/content_type"); + assertTrue(client.storeObjectAs(containerName, filename, entity, new HashMap(), FilesClient.md5Sum(randomData))); + + // Make sure it's there + List objects = client.listObjects(containerName); + assertEquals(1, objects.size()); + FilesObject obj = objects.get(0); + assertEquals(filename, obj.getName()); + assertEquals("test/content_type", obj.getMimeType()); + + // Make sure the data is correct + assertArrayEquals(randomData, client.getObject(containerName, filename)); + + // Make sure the data is correct as a stream + InputStream is = client.getObjectAsStream(containerName, filename); + byte otherData[] = new byte[NUMBER_RANDOM_BYTES]; + is.read(otherData); + assertArrayEquals(randomData, otherData); + assertEquals(-1, is.read()); // Could hang if there's a bug on the other end + + // Clean up + client.deleteObject(containerName, filename); + assertTrue(client.deleteContainer(containerName)); + + } + catch (Exception e) { + e.printStackTrace(); + fail(e.getMessage()); + } + } + + public void testObjectListing() { + String containerName = createTempContainerName("object-listing-marker"); + try { + byte randomData[] = makeRandomBytes(); + FilesClient client = new FilesClient(); + // client.setUseETag(false); + client.useSnet(); + assertTrue(client.usingSnet()); + assertTrue(client.login()); + + // Set up + client.createContainer(containerName); + + // Store it + for (int i=0; i < 10; i++) { + assertTrue(client.storeObject(containerName, randomData, "application/octet-stream", "testfile" + i + ".bogus", new HashMap())); + } + + // Make sure it's there + List objects = client.listObjects(containerName); + assertEquals(10, objects.size()); + for (int i=0; i < 10; i++) { + FilesObject obj = objects.get(i); + assertEquals("testfile" + i + ".bogus", obj.getName()); + assertEquals("application/octet-stream", obj.getMimeType()); + } + + // Now do a limit + objects = client.listObjects(containerName, 3); + assertEquals(3, objects.size()); + for (int i=0; i < 3; i++) { + FilesObject obj = objects.get(i); + assertEquals("testfile" + i + ".bogus", obj.getName()); + assertEquals("application/octet-stream", obj.getMimeType()); + } + + // Now check out a marker + objects = client.listObjects(containerName, 4, "testfile3.bogus"); + assertEquals(4, objects.size()); + for (int i=0; i < 4; i++) { + FilesObject obj = objects.get(i); + assertEquals("testfile" + (i + 4) + ".bogus", obj.getName()); + assertEquals("application/octet-stream", obj.getMimeType()); + } + + // Clean up + for (int i=0; i < 10; i++) { + client.deleteObject(containerName, "testfile" + i + ".bogus"); + } + assertTrue(client.deleteContainer(containerName)); + + } + catch (Exception e) { + e.printStackTrace(); + fail(e.getMessage()); + } + } + + public void testContainerListingWithLimitMarker() { + try { + FilesClient client = new FilesClient(); + client.useSnet(); + assertTrue(client.usingSnet()); + assertTrue(client.login()); + + // Populate our account + for (int i=0; i < 20; i++) { + client.createContainer("test_container_" + i); + } + + // Make sure it's there + List originalContainers = client.listContainers(); + assertTrue(20 <=originalContainers.size()); + + // Now do a limit + List containers = client.listContainers(5); + assertEquals(5, containers.size()); + for (int i=0; i < 5; i++) { + FilesContainer container = containers.get(i); + assertEquals(originalContainers.get(i).getName(), container.getName()); + } + + // Now check out a marker + containers = client.listContainers(10, originalContainers.get(originalContainers.size() - 5).getName()); + assertEquals(4, containers.size()); + for (int i=0; i < 2; i++) { + FilesContainer container = containers.get(i); + assertEquals(originalContainers.get(originalContainers.size() - 4 + i).getName(), container.getName()); + } + + // Clean up + for (int i=0; i < 20; i++) { + assertTrue(client.deleteContainer("test_container_" + i)); + } + } + catch (Exception e) { + e.printStackTrace(); + fail(e.getMessage()); + } + } + + public void testByteArraySavingWithCallback() { + String containerName = createTempContainerName("byte-array"); + String filename = makeFileName("bytearray"); + try { + byte randomData[] = makeRandomBytes(1024 * 100); // 100 K to make sure we do more with the callback + FilesClient client = new FilesClient(); + // client.setUseETag(false); + client.useSnet(); + assertTrue(client.usingSnet()); + assertTrue(client.login()); + + // Set up + client.createContainer(containerName); + + // Store it + TesterCallback callback = new TesterCallback(); + assertTrue(client.storeObject(containerName, randomData, "application/octet-stream", filename, new HashMap(), callback)); + + // Make sure it all got written + assertEquals(randomData.length, callback.bytesSent); + assertEquals(randomData.length/8192 + 1, callback.nCalls); + + // Make sure it's there + List objects = client.listObjects(containerName); + assertEquals(1, objects.size()); + FilesObject obj = objects.get(0); + assertEquals(filename, obj.getName()); + assertEquals("application/octet-stream", obj.getMimeType()); + + // Make sure the data is correct + assertArrayEquals(randomData, client.getObject(containerName, filename)); + + // Make sure the data is correct as a stream + InputStream is = client.getObjectAsStream(containerName, filename); + byte otherData[] = new byte[randomData.length]; + int loc = 0; + int bytesRead = 0; + while ((bytesRead = is.read(otherData, loc, otherData.length - loc)) > 0) { + loc += bytesRead; + } + assertArrayEquals(randomData, otherData); + assertEquals(-1, is.read()); // Could hang if there's a bug on the other end + + // Clean up + client.deleteObject(containerName, filename); + assertTrue(client.deleteContainer(containerName)); + + } + catch (Exception e) { + e.printStackTrace(); + fail(e.getMessage()); + } + } + + public void testStreamedSaving() { + String containerName = createTempContainerName("streamed"); + String filename = makeFileName("streamed"); + try { + byte randomData[] = makeRandomBytes(1024 * 100); // 100 K to make sure it's interesting + FilesClient client = new FilesClient(); + client.useSnet(); + assertTrue(client.usingSnet()); + assertTrue(client.login()); + + // Set up + client.createContainer(containerName); + + // Store it + assertTrue(client.storeStreamedObject(containerName, new ByteArrayInputStream(randomData), "application/octet-stream", filename, new HashMap())); + + // Make sure it's there + List objects = client.listObjects(containerName); + assertEquals(1, objects.size()); + FilesObject obj = objects.get(0); + assertEquals(filename, obj.getName()); + assertEquals("application/octet-stream", obj.getMimeType()); + + // Make sure the data is correct + assertArrayEquals(randomData, client.getObject(containerName, filename)); + + // Make sure the data is correct as a stream + InputStream is = client.getObjectAsStream(containerName, filename); + byte otherData[] = new byte[randomData.length]; + int loc = 0; + int bytesRead = 0; + while ((bytesRead = is.read(otherData, loc, otherData.length - loc)) > 0) { + loc += bytesRead; + } + assertArrayEquals(randomData, otherData); + assertEquals(-1, is.read()); // Could hang if there's a bug on the other end + + // Clean up + client.deleteObject(containerName, filename); + assertTrue(client.deleteContainer(containerName)); + + } + catch (Exception e) { + e.printStackTrace(); + fail(e.getMessage()); + } + } + + public void testMD5IssueSaving() { + String containerName = createTempContainerName("byte-array"); + String filename = makeFileName("bytearray"); + try { + byte randomData[] = makeRandomBytes(); + + while(zeroStripMd5Sum(randomData).length() ==32) { + randomData = makeRandomBytes(); + } + FilesClient client = new FilesClient(); + // client.setUseETag(false); + client.useSnet(); + assertTrue(client.usingSnet()); + assertTrue(client.login()); + + // Set up + client.createContainer(containerName); + + // Store it + assertTrue(client.storeObject(containerName, randomData, "application/octet-stream", filename, new HashMap())); + + // Make sure it's there + List objects = client.listObjects(containerName); + assertEquals(1, objects.size()); + FilesObject obj = objects.get(0); + assertEquals(filename, obj.getName()); + assertEquals("application/octet-stream", obj.getMimeType()); + + // Make sure the data is correct + assertArrayEquals(randomData, client.getObject(containerName, filename)); + + // Make sure the data is correct as a stream + InputStream is = client.getObjectAsStream(containerName, filename); + byte otherData[] = new byte[NUMBER_RANDOM_BYTES]; + is.read(otherData); + assertArrayEquals(randomData, otherData); + assertEquals(-1, is.read()); // Could hang if there's a bug on the other end + + // Clean up + client.deleteObject(containerName, filename); + assertTrue(client.deleteContainer(containerName)); + + } + catch (Exception e) { + e.printStackTrace(); + fail(e.getMessage()); + } + } + + private static String zeroStripMd5Sum (byte[] data) throws IOException, NoSuchAlgorithmException + { + MessageDigest digest = MessageDigest.getInstance("MD5"); + + byte[] md5sum = digest.digest(data); + BigInteger bigInt = new BigInteger(1, md5sum); + + return bigInt.toString(16); + } + + private static String md5Sum (byte[] data) throws IOException, NoSuchAlgorithmException + { + MessageDigest digest = MessageDigest.getInstance("MD5"); + + byte[] md5sum = digest.digest(data); + BigInteger bigInt = new BigInteger(1, md5sum); + + String result = bigInt.toString(16); + + while(result.length() < 32) { + result = "0" + result; + } + + return result; + } + + public void testUnicodeContainer() { + String containerName = createTempContainerName("\u0169\u00f1\u00efcode-test-\u03de"); + try { + FilesClient client = new FilesClient(FilesUtil.getProperty("username"), FilesUtil.getProperty("password"), FilesUtil.getProperty("account")); + client.useSnet(); + assertTrue(client.usingSnet()); + assertTrue(client.login()); + + // Set up + client.createContainer(containerName); + + + // Make sure it's there + assertTrue(client.containerExists(containerName)); + + // Make sure we can get the container info + assertNotNull(client.getContainerInfo(containerName)); + + // Clean up + assertTrue(client.deleteContainer(containerName)); + + } + catch (Exception e) { + e.printStackTrace(); + fail(e.getMessage()); + } + } + + public void testUnicode() { + String containerName = createTempContainerName("\u0169\u00f1\u00efcode-test-\u03de"); + String filename = makeFileName("unicode_\u03DA_\u2042"); + filename = makeFileName("\u00f1\u00efcode-test-\u03de"); + String fullPath = FilenameUtils.concat(SYSTEM_TMP.getAbsolutePath(), filename); + logger.info("Test File Location: " + fullPath); + try { + byte randomData[] = makeRandomFile(fullPath); + FilesClient client = new FilesClient(FilesUtil.getProperty("username"), FilesUtil.getProperty("password"), FilesUtil.getProperty("account")); + client.useSnet(); + assertTrue(client.usingSnet()); + assertTrue(client.login()); + + // Set up + client.createContainer(containerName); + + // Store it + assertTrue(client.storeObjectAs(containerName, new File(fullPath), "application/octet-stream", filename)); + + // Make sure it's there + List objects = client.listObjects(containerName); + assertEquals(1, objects.size()); + FilesObject obj = objects.get(0); + assertEquals(filename, obj.getName()); + assertEquals("application/octet-stream", obj.getMimeType()); + + assertNotNull(obj.getMetaData()); + + // Make sure the data is correct + assertArrayEquals(randomData, client.getObject(containerName, filename)); + + // Make sure the data is correct as a stream + InputStream is = client.getObjectAsStream(containerName, filename); + byte otherData[] = new byte[NUMBER_RANDOM_BYTES]; + is.read(otherData); + assertArrayEquals(randomData, otherData); + assertEquals(-1, is.read()); // Could hang if there's a bug on the other end + + // Make sure we can get the container info + assertNotNull(client.getContainerInfo(containerName)); + + // Clean up + client.deleteObject(containerName, filename); + assertTrue(client.deleteContainer(containerName)); + + } + catch (Exception e) { + e.printStackTrace(); + fail(e.getMessage()); + } + finally { + File f = new File(fullPath); + f.delete(); + } + + } + + public void testCDNContainerList() { + FilesClient client = new FilesClient(); + try { + client.useSnet(); + assertTrue(client.usingSnet()); + assertTrue(client.login()); + + List containers = client.listCdnContainers(); + assertTrue(containers.size() > 0); + } catch (Exception e) { + fail(e.getMessage()); + } + } + + public void testCDNContainerListLimitMarker() { + FilesClient client = new FilesClient(); + try { + client.useSnet(); + assertTrue(client.usingSnet()); + assertTrue(client.login()); + + List originalContainers = client.listCdnContainers(); + assertTrue(originalContainers.size() > 0); + + // Now do a limit + List containers = client.listCdnContainers(5); + assertEquals(5, containers.size()); + for (int i=0; i < 5; i++) { + assertEquals(originalContainers.get(i), containers.get(i)); + } + + // Now check out a marker + containers = client.listCdnContainers(10, originalContainers.get(originalContainers.size() - 5)); + assertEquals(4, containers.size()); + for (int i=0; i < 2; i++) { + assertEquals(originalContainers.get(originalContainers.size() - 4 + i), containers.get(i)); + } + } catch (Exception e) { + fail(e.getMessage()); + } + } + public void testCDNContainerFullListing() { + FilesClient client = new FilesClient(); + try { + client.useSnet(); + assertTrue(client.usingSnet()); + assertTrue(client.login()); + + List originalContainers = client.listCdnContainers(); + assertTrue(originalContainers.size() > 0); + + // Now do a limit + List containers = client.listCdnContainerInfo(5); + assertEquals(5, containers.size()); + for (int i=0; i < 5; i++) { + assertEquals(originalContainers.get(i), containers.get(i).getName()); + } + + // Now check out a marker + containers = client.listCdnContainerInfo(10, originalContainers.get(originalContainers.size() - 5)); + assertEquals(4, containers.size()); + for (int i=0; i < 2; i++) { + assertEquals(originalContainers.get(originalContainers.size() - 4 + i), containers.get(i).getName()); + } + } catch (Exception e) { + fail(e.getMessage()); + } + } + + + public void testCDNContainerFullListingAll() { + FilesClient client = new FilesClient(); + try { + client.useSnet(); + assertTrue(client.usingSnet()); + assertTrue(client.login()); + String container = createTempContainerName("aaa_\u1422_aaa"); + client.cdnEnableContainer(container); + // Now do a limit + client.listCdnContainerInfo(); + } catch (Exception e) { + fail(e.getMessage()); + } + } + + + public void testCDNApi() { + String containerName = createTempContainerName("java api Test\u03DA_\u2042\u03de#<>\u2043\u2042\u2044\u2045"); + //containerName = createTempContainerName("java Api Test no uniocde"); + //logger.warn("Container:" + containerName.length() + ":" + containerName); + FilesClient client = new FilesClient(); + try { + client.useSnet(); + assertTrue(client.usingSnet()); + assertTrue(client.login()); + + List containers = client.listCdnContainers(); + int originalContainerListSize = containers.size(); + + assertFalse(client.isCDNEnabled(containerName)); + + String url = client.cdnEnableContainer(containerName); + assertNotNull(url); + assertTrue(client.isCDNEnabled(containerName)); + containers = client.listCdnContainers(); + assertEquals(originalContainerListSize + 1, containers.size()); + + boolean found = false; + for(String container : containers) { + // logger.warn(container); + if (containerName.equals(container)) found = true; + } + assertTrue(found); + + FilesCDNContainer info = client.getCDNContainerInfo(containerName); + assertTrue(info.isEnabled()); +// assertEquals("", info.getUserAgentACL()); +// assertEquals("", info.getReferrerACL()); + String cdnUrl = info.getCdnURL(); + assertNotNull(cdnUrl); + + client.cdnUpdateContainer(containerName, 31415, false, true); + assertFalse(client.isCDNEnabled(containerName)); + info = client.getCDNContainerInfo(containerName); + assertFalse(info.isEnabled()); + assertTrue(info.getRetainLogs()); + assertEquals(31415, info.getTtl()); + assertEquals(cdnUrl, info.getCdnURL()); + + //client.cdnUpdateContainer(containerName, 54321, true, "Referrer Test", "User Agent Acl Test"); + client.cdnUpdateContainer(containerName, 54321, true, false); + assertTrue(client.isCDNEnabled(containerName)); + info = client.getCDNContainerInfo(containerName); + assertTrue(info.isEnabled()); + assertFalse(info.getRetainLogs()); + assertEquals(54321, info.getTtl()); + assertEquals(cdnUrl, info.getCdnURL()); +// assertEquals("Referrer Test", info.getReferrerACL()); +// assertEquals("User Agent Acl Test", info.getUserAgentACL()); + + + } catch (Exception e) { + fail(e.getMessage()); + } + } + + // Test container name limits + public void testContainerNameLimits() { + FilesClient client = new FilesClient(); + try { + client.useSnet(); + assertTrue(client.usingSnet()); + assertTrue(client.login()); + StringBuilder nameBuilder = new StringBuilder(createTempContainerName("long")); + while(nameBuilder.length() <= FilesConstants.CONTAINER_NAME_LENGTH) { + nameBuilder.append("a"); + } + try { + client.createContainer(nameBuilder.toString()); + // Note, we shouldn't get here, but want to clean up if we do + client.deleteContainer(nameBuilder.toString()); + fail("No exception thrown"); + } + catch (FilesInvalidNameException fine) { + // Hooray! + } + } + catch (Exception ex) { + fail(ex.getMessage()); + } + } + + public void testPathCreationAndListing() { + FilesClient client = new FilesClient(); + try { + client.useSnet(); + assertTrue(client.usingSnet()); + assertTrue(client.login()); + String containerName = createTempContainerName("pathTest"); + + // Make sure it's not there + assertFalse(client.containerExists(containerName)); + + // Add it + client.createContainer(containerName); + + // See that it's there + assertTrue(client.containerExists(containerName)); + + // Add a path and two files + byte randomData[] = makeRandomBytes(); + client.createPath(containerName, "foo"); + client.storeObject(containerName, randomData, "application/octet-stream", "notInContainer.dat", new HashMap()); + client.storeObject(containerName, randomData, "application/octet-stream", "foo/inContainer.dat", new HashMap()); + + List allObjects = client.listObjects(containerName); + List pathObjects = client.listObjects(containerName, "foo"); + + assertEquals(3, allObjects.size()); + assertEquals(1, pathObjects.size()); + assertEquals("foo/inContainer.dat", pathObjects.get(0).getName()); + + // Delete it + client.deleteObject(containerName, "notInContainer.dat"); + client.deleteObject(containerName, "foo/inContainer.dat"); + client.deleteObject(containerName, "foo"); + assertTrue(client.deleteContainer(containerName)); + + // Make sure it's gone + assertFalse(client.containerExists(containerName)); + + } catch (Exception e) { + e.printStackTrace(); + fail(e.getMessage()); + } + } + + public void testPathCreation() { + FilesClient client = new FilesClient(); + try { + client.useSnet(); + assertTrue(client.usingSnet()); + assertTrue(client.login()); + String containerName = createTempContainerName("pathTest"); + + // Make sure it's not there + assertFalse(client.containerExists(containerName)); + + // Add it + client.createContainer(containerName); + + // See that it's there + assertTrue(client.containerExists(containerName)); + + // Add a path and two files + client.createFullPath(containerName, "foo/bar/baz"); + + List allObjects = client.listObjects(containerName); + + assertEquals(3, allObjects.size()); + + // If we don't throw an exception, we should be OK + client.getObject(containerName, "foo"); + client.getObject(containerName, "foo/bar"); + client.getObject(containerName, "foo/bar/baz"); + + // Delete it + client.deleteObject(containerName, "foo/bar/baz"); + client.deleteObject(containerName, "foo/bar"); + client.deleteObject(containerName, "foo"); + assertTrue(client.deleteContainer(containerName)); + + // Make sure it's gone + assertFalse(client.containerExists(containerName)); + + } catch (Exception e) { + e.printStackTrace(); + fail(e.getMessage()); + } + } + + public void testFilesObjectPath() { + FilesClient client = new FilesClient(); + try { + client.useSnet(); + assertTrue(client.usingSnet()); + assertTrue(client.login()); + String containerName = createTempContainerName("FOpathTest"); + + // Make sure it's not there + assertFalse(client.containerExists(containerName)); + + // Add it + client.createContainer(containerName); + + // See that it's there + assertTrue(client.containerExists(containerName)); + + // Add a path and two files + client.createPath(containerName, "test"); + + List allObjects = client.listObjects(containerName); + + assertEquals(1, allObjects.size()); + + FilesObject obj = allObjects.get(0); + assertEquals(0, obj.getSize()); + assertEquals("application/directory", obj.getMimeType()); + + // If we don't throw an exception, we should be OK + client.getObject(containerName, "test"); + + // Delete it + client.deleteObject(containerName, "test"); + assertTrue(client.deleteContainer(containerName)); + + // Make sure it's gone + assertFalse(client.containerExists(containerName)); + + } catch (Exception e) { + e.printStackTrace(); + fail(e.getMessage()); + } + } + + public void testURLs() { + // Test to make sure these are getting set and are visible to the outside world (needed for Cyberduck's SSL). + FilesClient client = new FilesClient(); + try { + client.useSnet(); + assertTrue(client.usingSnet()); + assertTrue(client.login()); + assertNotNull(client.getCdnManagementURL()); + assertNotNull(client.getStorageURL()); + + } catch (Exception e) { + fail(e.getMessage()); + } + } + + // Fun utilities + private String createTempContainerName(String addition) { + SimpleDateFormat sdf = new SimpleDateFormat("yyyy_MM_dd_HH_mm_ss_SSSS"); + return "test-container-" + addition + "-" + sdf.format(new Date(System.currentTimeMillis())); + } + + private String makeFileName(String addition) { + SimpleDateFormat sdf = new SimpleDateFormat("yyyy_MM_dd_HH_mm_ss_SSSS"); + return "test-file-" + addition + "-" + sdf.format(new Date(System.currentTimeMillis())); + } + + private byte[] makeRandomFile(String name) throws IOException { + + File file = new File(name); + FileOutputStream fos = new FileOutputStream(file); + byte randomData[] = makeRandomBytes(); + fos.write(randomData); + fos.close(); + + return randomData; + } + + private byte[] makeRandomBytes() { + return makeRandomBytes(NUMBER_RANDOM_BYTES); + } + private byte[] makeRandomBytes(int nBytes) { + byte results[] = new byte[nBytes]; + Random gen = new Random(); + gen.nextBytes(results); + + // Uncomment to get some not so random data + // for(int i=0; i < results.length; ++i) results[i] = (byte) (i % Byte.MAX_VALUE); + + return results; + } + + private void assertArrayEquals(byte a[], byte b[]) { + assertEquals(a.length, b.length); + for(int i=0; i < a.length; ++i) assertEquals(a[i], b[i]); + } + + private class TesterCallback implements IFilesTransferCallback { + public long bytesSent = 0; + public int nCalls = 0; + public void progress(long n) { + bytesSent = n; + ++nCalls; + } + } +} \ No newline at end of file From 17ff8ef7f7d77347b421d3e7957066aaa80d07f2 Mon Sep 17 00:00:00 2001 From: Conrad Date: Thu, 8 Apr 2010 10:25:21 -0500 Subject: [PATCH 22/64] Updated Env Var to match other API's --- .../java/com/rackspacecloud/client/cloudfiles/FilesClient.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/rackspacecloud/client/cloudfiles/FilesClient.java b/src/main/java/com/rackspacecloud/client/cloudfiles/FilesClient.java index d015449..b5fe099 100644 --- a/src/main/java/com/rackspacecloud/client/cloudfiles/FilesClient.java +++ b/src/main/java/com/rackspacecloud/client/cloudfiles/FilesClient.java @@ -2768,7 +2768,7 @@ public boolean usingSnet(){ return snet; } private boolean envSnet(){ - if (System.getenv("snet") == null) { + if (System.getenv("RACKSPACE_SERVICENET") == null) { return false; } else{ From ac1026fe566d99f88e8cbca93f188fb5c5d1978f Mon Sep 17 00:00:00 2001 From: Conrad Date: Thu, 8 Apr 2010 10:41:21 -0500 Subject: [PATCH 23/64] Added Support for toggling off Snet Support on the Fly and added a unit test to ensure it works also fixed a small bug that would allow for a user to call useSnet() more then once and mess up the storage url --- .../client/cloudfiles/FilesClient.java | 14 ++++++++++++++ .../client/cloudfiles/SnetFilesClientTestCase.java | 3 ++- 2 files changed, 16 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/rackspacecloud/client/cloudfiles/FilesClient.java b/src/main/java/com/rackspacecloud/client/cloudfiles/FilesClient.java index b5fe099..753a79e 100644 --- a/src/main/java/com/rackspacecloud/client/cloudfiles/FilesClient.java +++ b/src/main/java/com/rackspacecloud/client/cloudfiles/FilesClient.java @@ -2759,9 +2759,23 @@ public boolean updateObjectMetadata(String container, String object, } public void useSnet(){ + if(snet){ + } + else{ snet = true; if(storageURL != null){ storageURL = snetAddr + storageURL.substring(8); + } + } + } + public void usePublic(){ + if(!snet){ + } + else{ + snet = false; + if(storageURL != null){ + storageURL = "https://" + storageURL.substring(snetAddr.length()); + } } } public boolean usingSnet(){ diff --git a/src/test/java/com/rackspacecloud/client/cloudfiles/SnetFilesClientTestCase.java b/src/test/java/com/rackspacecloud/client/cloudfiles/SnetFilesClientTestCase.java index b27c9b2..07b3974 100644 --- a/src/test/java/com/rackspacecloud/client/cloudfiles/SnetFilesClientTestCase.java +++ b/src/test/java/com/rackspacecloud/client/cloudfiles/SnetFilesClientTestCase.java @@ -220,7 +220,8 @@ public void testSnetToggle() { // Add it client.createContainer(containerName); - + client.usePublic(); + assertFalse(client.usingSnet()); // See that it's there assertTrue(client.containerExists(containerName)); assertNotNull(client.getContainerInfo(containerName)); From 23cac5aa20e75f99d8bd250f53dbe697d622c774 Mon Sep 17 00:00:00 2001 From: Conrad Date: Thu, 8 Apr 2010 11:17:23 -0500 Subject: [PATCH 24/64] Iterated the version number --- .../com/rackspacecloud/client/cloudfiles/FilesConstants.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/rackspacecloud/client/cloudfiles/FilesConstants.java b/src/main/java/com/rackspacecloud/client/cloudfiles/FilesConstants.java index 7b1a19c..ac0d979 100644 --- a/src/main/java/com/rackspacecloud/client/cloudfiles/FilesConstants.java +++ b/src/main/java/com/rackspacecloud/client/cloudfiles/FilesConstants.java @@ -12,7 +12,7 @@ public class FilesConstants { private static Logger logger = Logger.getLogger(FilesConstants.class); - public static final String USER_AGENT = "java-cloudfiles/1.5.3"; + public static final String USER_AGENT = "java-cloudfiles/1.5.4"; /** HTTP Header token that identifies the username to Cloud Files **/ public static final String X_STORAGE_USER_DEFAULT = "x-auth-user"; From 041a5f24c62a3703599bd195cb09286f8e3327d2 Mon Sep 17 00:00:00 2001 From: cweidenkeller Date: Thu, 6 May 2010 17:00:27 -0500 Subject: [PATCH 25/64] Fixed a Problem With Mime Types being set wrong for .zip --- src/main/java/com/rackspacecloud/client/cloudfiles/MIME.types | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/rackspacecloud/client/cloudfiles/MIME.types b/src/main/java/com/rackspacecloud/client/cloudfiles/MIME.types index 459b540..2c005a1 100644 --- a/src/main/java/com/rackspacecloud/client/cloudfiles/MIME.types +++ b/src/main/java/com/rackspacecloud/client/cloudfiles/MIME.types @@ -572,9 +572,9 @@ xwd image/x-xwindowdump xyz chemical/x-pdb #z application/x-compress z application/x-compressed -zip application/x-compressed +#zip application/x-compressed #zip application/x-zip-compressed -#zip application/zip +zip application/zip #zip multipart/x-zip zoo application/octet-stream zsh text/x-script.zsh From fd9e405e33658ba829a4237a2701d2e827d675cb Mon Sep 17 00:00:00 2001 From: cweidenkeller Date: Thu, 13 May 2010 06:53:35 -0500 Subject: [PATCH 26/64] Added more support for other types of file extensions --- .../client/cloudfiles/MIME.types | 101 +++--------------- 1 file changed, 13 insertions(+), 88 deletions(-) diff --git a/src/main/java/com/rackspacecloud/client/cloudfiles/MIME.types b/src/main/java/com/rackspacecloud/client/cloudfiles/MIME.types index 2c005a1..6123f71 100644 --- a/src/main/java/com/rackspacecloud/client/cloudfiles/MIME.types +++ b/src/main/java/com/rackspacecloud/client/cloudfiles/MIME.types @@ -21,7 +21,6 @@ aos application/x-nokia-9000-communicator-add-on-software aps application/mime arc application/octet-stream arj application/arj -#arj application/octet-stream art image/x-jg asf video/x-ms-asf asm text/x-asm @@ -44,7 +43,6 @@ bin application/x-binary #bin application/x-macbinary bm image/bmp bmp image/bmp -#bmp image/x-windows-bmp boo application/book book application/book boz application/x-bzip2 @@ -52,39 +50,24 @@ bsh application/x-bsh bz application/x-bzip bz2 application/x-bzip2 c text/plain -#c text/x-c c++ text/plain cat application/vnd.ms-pki.seccat cc text/plain -#cc text/x-c ccad application/clariscad cco application/x-cocoa cdf application/cdf -#cdf application/x-cdf -#cdf application/x-netcdf cer application/pkix-cert -#cer application/x-x509-ca-cert cha application/x-chat chat application/x-chat class application/java -#class application/java-byte-code -#class application/x-java-class com application/octet-stream -#com text/plain conf text/plain cpio application/x-cpio cpp text/x-c cpt application/mac-compactpro -#cpt application/x-compactpro -#cpt application/x-cpt crl application/pkcs-crl -#crl application/pkix-crl crt application/pkix-cert -#crt application/x-x509-ca-cert -#crt application/x-x509-user-cert csh application/x-csh -#csh text/x-script.csh -#css application/x-pointplus css text/css cxx text/plain dcr application/x-director @@ -94,7 +77,6 @@ der application/x-x509-ca-cert dif video/x-dv dir application/x-director dl video/dl -#dl video/x-dl doc application/msword dot application/msword dp application/commonground @@ -102,77 +84,51 @@ drw application/drafting dump application/octet-stream dv video/x-dv dvi application/x-dvi -#dwf drawing/x-dwf (old) dwf model/vnd.dwf dwg application/acad -#dwg image/vnd.dwg -#dwg image/x-dwg dxf application/dxf -#dxf image/vnd.dwg -#dxf image/x-dwg dxr application/x-director el text/x-script.elisp elc application/x-bytecode.elisp (compiled elisp) -#elc application/x-elc env application/x-envoy eps application/postscript es application/x-esrehber etx text/x-setext evy application/envoy -#evy application/x-envoy exe application/octet-stream f text/plain -#f text/x-fortran f77 text/x-fortran f90 text/plain -#f90 text/x-fortran fdf application/vnd.fdf fif application/fractals -#fif image/fif fli video/fli -#fli video/x-fli flo image/florian flx text/vnd.fmi.flexstor fmf video/x-atomic3d-feature for text/plain -#for text/x-fortran fpx image/vnd.fpx -#fpx image/vnd.net-fpx frl application/freeloader funk audio/make g text/plain g3 image/g3fax gif image/gif gl video/gl -#gl video/x-gl gsd audio/x-gsm gsm audio/x-gsm gsp application/x-gsp gss application/x-gss gtar application/x-gtar -gz application/x-compressed -#gz application/x-gzip +gz application/x-gzip gzip application/x-gzip -#gzip multipart/x-gzip h text/plain -#h text/x-h hdf application/x-hdf help application/x-helpfile hgl application/vnd.hp-hpgl hh text/plain -#hh text/x-h -#hlb text/x-script hlp application/hlp -#hlp application/x-helpfile -#hlp application/x-winhelp hpg application/vnd.hp-hpgl hpgl application/vnd.hp-hpgl hqx application/binhex -#hqx application/binhex4 -#hqx application/mac-binhex -#hqx application/mac-binhex40 -#hqx application/x-binhex40 -#hqx application/x-mac-binhex40 hta application/hta htc text/x-component htm text/html @@ -186,9 +142,7 @@ idc text/plain ief image/ief iefs image/ief iges application/iges -#iges model/iges igs application/iges -igs model/iges ima application/x-ima imap application/x-httpd-imap inf application/inf @@ -201,58 +155,40 @@ ivr i-world/i-vrml ivy application/x-livescreen jam audio/x-jam java text/plain -#java text/x-java-source jcm application/x-java-commerce jfif image/jpeg -#jfif image/pjpeg -#jpe image/jpeg -#jpe image/pjpeg jpeg image/jpeg -#jpeg image/pjpeg jpg image/jpeg -#jpg image/pjpeg jps image/x-jps js application/x-javascript jut image/jutvision kar audio/midi -#kar music/x-karaoke -#ksh application/x-ksh ksh text/x-script.ksh la audio/nspaudio -#la audio/x-nspaudio lam audio/x-liveaudio latex application/x-latex -#lha application/lha lha application/octet-stream -#lha application/x-lha lhx application/octet-stream list text/plain lma audio/nspaudio -#lma audio/x-nspaudio log text/plain -#lsp application/x-lisp -#lsp text/x-script.lisp lst text/plain lsx text/x-la-asf ltx application/x-latex lzh application/octet-stream -#lzh application/x-lzh -#lzx application/lzx lzx application/octet-stream -#lzx application/x-lzx m text/plain -# m1v video/mpeg -#m2a audio/mpeg +m2a audio/mpeg m2v video/mpeg -#m3u audio/x-mpequrl +m3u audio/x-mpequrl +m4v video/x-m4v man application/x-troff-man mht message/rfc822 -#mhtml message/rfc822 -#mid application/x-midi -#midi audio/midi +mhtml message/rfc822 +midi audio/midi mif application/x-frame -#mjf audio/x-vnd.audioexplosion.mjuicemediafile +mjf audio/x-vnd.audioexplosion.mjuicemediafile mjpg video/x-motion-jpeg mod audio/mod mov video/quicktime @@ -260,58 +196,47 @@ movie video/x-sgi-movie mp2 audio/mpeg mp3 audio/mpeg3 mpa audio/mpeg -#mpa video/mpeg +mpa video/mpeg mpc application/x-project -#mpeg video/mpeg -mpg audio/mpeg -#mpg video/mpeg -#mpga audio/mpeg +mpeg video/mpeg +mpg video/mpeg +mpga audio/mpeg +ogg video/ogg +ogv video/ogg p text/x-pascal p10 application/pkcs10 -#p10 application/x-pkcs10 p12 application/pkcs-12 p12 application/x-pkcs12 p7a application/x-pkcs7-signature -#p7c application/pkcs7-mime p7c application/x-pkcs7-mime p7m application/pkcs7-mime -#p7m application/x-pkcs7-mime p7r application/x-pkcs7-certreqresp p7s application/pkcs7-signature part application/pro_eng pas text/pascal pbm image/x-portable-bitmap -#.pcl application/vnd.hp-pcl pcl application/x-pcl pct image/x-pict pcx image/x-pcx pdb chemical/x-pdb pdf application/pdf pfunk audio/make -#pfunk audio/make.my.funk pgm image/x-portable-graymap -pgm image/x-portable-greymap pic image/pict pict image/pict pkg application/x-newton-compatible-pkg pko application/vnd.ms-pki.pko pl text/plain -pl text/x-script.perl plx application/x-pixclscript pm image/x-xpixmap -#pm text/x-script.perl-module pm4 application/x-pagemaker pm5 application/x-pagemaker png image/png -pnm application/x-portable-anymap pnm image/x-portable-anymap pot application/mspowerpoint -pot application/vnd.ms-powerpoint -pov model/x-pov ppa application/vnd.ms-powerpoint ppm image/x-portable-pixmap pps application/mspowerpoint -pps application/vnd.ms-powerpoint ppt application/mspowerpoint #ppt application/powerpoint #ppt application/vnd.ms-powerpoint From 44f74e0a5e251050c37234992aed2f219d9890b9 Mon Sep 17 00:00:00 2001 From: cweidenkeller Date: Thu, 13 May 2010 06:54:49 -0500 Subject: [PATCH 27/64] Added more support for other types of file extensions --- src/main/java/com/rackspacecloud/client/cloudfiles/MIME.types | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/main/java/com/rackspacecloud/client/cloudfiles/MIME.types b/src/main/java/com/rackspacecloud/client/cloudfiles/MIME.types index 6123f71..4a790b1 100644 --- a/src/main/java/com/rackspacecloud/client/cloudfiles/MIME.types +++ b/src/main/java/com/rackspacecloud/client/cloudfiles/MIME.types @@ -30,10 +30,9 @@ asx application/x-mplayer2 #asx video/x-ms-asf-plugin au audio/basic #au audio/x-au -avi application/x-troff-msvideo #avi video/avi #avi video/msvideo -#avi video/x-msvideo +avi video/x-msvideo avs video/avs-video bcpio application/x-bcpio #bin application/mac-binary From b46d95b2faa25709bb32e51cf1553630daa18c31 Mon Sep 17 00:00:00 2001 From: Lowell Vaughn Date: Fri, 10 Dec 2010 16:46:43 -0600 Subject: [PATCH 28/64] Moving to httpclient 4.x --- lib/httpclient-4.0.3.jar | Bin 0 -> 292893 bytes lib/httpcore-4.1.jar | Bin 0 -> 181041 bytes .../FilesAuthorizationException.java | 4 +- .../client/cloudfiles/FilesClient.java | 772 +++++++++--------- .../client/cloudfiles/FilesContainer.java | 4 +- .../FilesContainerExistsException.java | 5 +- .../FilesContainerNotEmptyException.java | 4 +- .../client/cloudfiles/FilesException.java | 10 +- .../cloudfiles/FilesNotFoundException.java | 4 +- .../client/cloudfiles/FilesObject.java | 5 +- .../client/cloudfiles/FilesResponse.java | 53 +- .../client/cloudfiles/sample/FilesCli.java | 2 +- .../client/cloudfiles/sample/FilesCopy.java | 4 +- .../client/cloudfiles/sample/FilesList.java | 9 +- .../cloudfiles/sample/FilesMakeContainer.java | 4 +- .../client/cloudfiles/sample/FilesRemove.java | 6 +- .../wrapper/RequestEntityWrapper.java | 61 +- .../cloudfiles/FilesClientTestCase.java | 22 +- 18 files changed, 505 insertions(+), 464 deletions(-) create mode 100644 lib/httpclient-4.0.3.jar create mode 100644 lib/httpcore-4.1.jar diff --git a/lib/httpclient-4.0.3.jar b/lib/httpclient-4.0.3.jar new file mode 100644 index 0000000000000000000000000000000000000000..fd0d37745cb62ae14c5630cded409798413a6e09 GIT binary patch literal 292893 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 z

s`^WDKLFM>2V{tSKu=paJ=H6$btNw@J`hwzqV&&3?1>}!ucFcJ(K8g46xVV+@Ro9nF!5aca4m%BKH4B0c&k- zZff`+w~gq31w%=Hrzg!P8!1kUmMexT_z_h?nAexrqp%`W9bck4?bb@Hd8R$8qqN_he*IQYfF{ZD!r`4@fNMW{n8(SPR29#CQ+u9M>0C6 zj7yHD&s3*hopx6~-RBQICU#RHZ;x}NQL@vx*EoF}ki)M-*fzcTHsj2*>d z-wk$wt_j6bZW(;+vSw~2Y=4@jagmz)n(Djblws*Eqc06)0u)QBvQ zz&|m);8rNieJBSwYNak}Wv*h+;mjp%qg^5Y=Rl#{PL=5C>t;^&wG96ET9Mzv;$P+B zzg=ZKqcs1ztP58{J7l#%p)3I*{V-Dl4(-F2n?}VjkIQSy7;;p@!Kd~SCP4b3M6B=* z7#BMXyZ9%C3OfzS3DP~lvnR@ikBt}yQ6xaWC!|N0(y+=Sky8a@og=X+%`=TFiJfkM z@zxBbf;evlWx%Mc76aO{6H_}$_W*i51|_h*ApN@7%Oj&Y94he~vD1ps7x}uw&+dBM z=N9#jSPX@#0zjt{^qP5A2Aj%Y69QG&SQ$^~MtUOgUpo4T1y7)NOTCh;J5_Gt* zLBnrl_vO{tgaR-+k{=JBfvZH5i6-R{BtjOq9Lit;?d**w*-NFm%`qFG?n@u40m7(3 zI;pw0yCrP%09O70wyt1|`wlc~(E2LDCi0St_=6VH_ zZekCq(m9E2M69fWKqc(Z0Up?1rer6E*!bk)8QwjAx|RgLQQGoITJN|~Pck3m7zNLy z=EscMOLq6n*ZalI&JVaPFuYQXfpTIV6?&h3Vg@KHDz%v0eFCjMTu@NZ%p#1QP$<+= zsEZO8Xey{s%7v;5UBP~K_Kre5kW5PQ;wHLoeWbT!znZS7OCCGw-gRbBhW)}9d+l1s z!ixHFvIf(qm4ai|wRIBTZo|>)H$OhE)KxSwlwOKn!%=!Fe)~ZS>tjw9n&TStqlbo# zhP|gL@+a*Gp~@7IsfM@qdu!O*ea(tq5M)H}{&Fyp+*r;~@h8|(7c=p_AKKSGdP-RHk?Uo``F715*A|x>QfC4^ST)ks z1&Rf7T|3285LfWgD(SKJOvHJqR zOYm$dJbS6uq+(9>#b=P&*49E38;-h-IG#*gprlZ`@>$&%G6kK;AWrHzd?Ne}LmNFo z!6~BKR#>5IM<0nu!6l>|vwYI?u&${sgm=be7>>#%0l@wRrR6#c3^n!^Ng}aLHRrPO zk#47UuOHx730m-ZY930BQjG}hT zcxXGBwr1M+2P^QFtDRO>x8ah1KD-K>KQ zj|qu>-=&`ft?iIY=A0LaiQLv2L~sSyS+{oBcCLSRJ5}Wwnai8~W1=C7*GFv7i@z-` zQ=AN`6Oe_5->vJ2KQbxi6?8qGC}&>#%EsvK^JPGsUfn(t6;Z^r_Ja?wVD5mm4P(4u zqUj0})Ah}WJZcr3qmj~!E?RAhFw}r*5>U!05}!!h;uVQJ(>9Devw>B#P!>rZcvXtp zC+~02AFfU;B;qldvqyxnKTEnQ?o}HQRO0=g&`8kNG{%}CS zDkGKBa0*yU4azaN1mpR!jR8%9ZsLpf(_gpy3jY6|1b=<(SklM0V_!)4;V%!_|G8(?h|Ms8OrYiozudBayE)q!68k7cB~(Fe#$wrM_Nc??4qWz134w_qNWolG; zrXv#7BtgG9!7B4t)m_WkBzbVzFqfz*#ZReKO3ey&{k<@VK~$kaM)1i_hn=nLGgDCR zTJ$?fw~>W(y^}o6+O!=Y&~8Xuru;5mE{4IX zIs<~e@G7h|>fKPD0j02q^9kBT)dvLEJ`d2aqby@s;cr&IDTp<(6qGf0l?;a+%BV7A zrhaNh%!OL2!8jy~Ys%Dj`-Ju`#tiF%7i*X{WpL@8Ixd>yxI5O&6rqj@Cj3}+#IMsv zitCnT!r>=A)v7r`+s<@K3oUI$0}tEhodWjsrMYjCAm?v(B=Z6X{s$La`NBpF&1bP?=TZlf5}1bNIJ zLj0lv-NC{xUP;4l_MG;aE@R>^Ua@RUUs-r5~52C6$q1EcJCC&~i$;y^G}=xp9}cTOI8Cq>NUO z?RSB1xtjWv?c) zW<2h0Wrdde49{z6Blijpt%&`+LBME8Q)ay^`VxPFCr2J*%kz^M#RCuVP7m8PgLI>w zhfCPY=KCk;jUe_D?p_e<715q3>y`eVv(?t%@a0NZ;SldQ{yNqt_4E2t?Zo2`zLde# zQymF~H_A6K5!LLs6~$+y#Vj(MUY-gKNuXETuGK?&Gwe@b%Ka{bPe+qstIffOJ}7}< zAMR+WhvjETZw+ZDD(^Q4?%^fH2O+I+*n`=Vk#=v0cxn=TL03+1ckUynfaVKfvSzEm zjghE!1SYcJY2s722}u)KDicnE>;f*30Jn&^$=r-VChw+pp*PSGB?(u^I%Mz3UEkf| zr8{Y^gs|~VfuuTHPRv>EZdBQGCM=}Es>jL1WL<^~%p5Psf&Re{-Q1xU}LO+*< zibAd^3BA?m3W5l_qSj$raKRy;24G<+9hc_-S9+emSG{+!=^tPL=e@eiZ~SLEyt z;hGo^xN)dnFHK*Qwp8fT@m9Z|Opvzl3ON{Cpw|wO%w=Sd;&nz;Ob3kQH83F-$_N;y zG{?Jp=Qus7o{GcS^7!^zT&o5@P#Zr$6yA~-9$*+IlH8 zTle&h0y=nJ+%h&I5WJNy_Egk6()T!uy&JJr$=(&Klj~ZtyWV}PF{s=Kal^npd4&lP zF>VL_r7bLX?3=4ys-dFhd$H@_rQqECSPi#Xe~rZ^6Uucw`AJs z%y4J<0q~+NFxnlWxhqMtcQD$IP%xfuk~iGZCo=EQ&jHjo@Jd(hclwqquveyDM#9e# z<`XUVpSgGG+l)SNFY7ZK>4paE%7`ax2XQbz`qDG)^}yN~J)AvRE@mRf0z*ITBK9o6 zFkgu&cs)O%3)^a&QN4Rd)6%}3eg-hZ$&HE{fRxV)6*v-%fB$=03g`%caPrHmRe|{J z8`b|-*DEWCEB{sC|Cfsz+D1tg^TX=FmUUFxXJ5V{011j@n6#=+DGxFa7*rfK65+>9 zO}jYlGIZ+t{)P4rwbv}A(_BiP5`LQc1(EW|IWweSPzofo(w))*cxyUTbz3XYD8V=kw(A#3#?;^P+4fkPVSnWeybtsAxbNqfhJJD=mRDxQ#4=q-|yB zYXC2n5dDR!EwvB0-;|9v!sUQ_02ldQJE2!*)FbpW9|F}?R1`eaD*>h_o6jzghtN|l zkcUzM4=I@kmrs!44RVi%f>`5_%+OjP@KfEGhsY2Sr3{#S2oVq$<(u($7pbR7NLQ_) z!{1!=klasxQFJ9wFDEWGg3kO-4n%jA%Vmbc`Yghg6k0!SGYqMDv5qwI+B-1 zOh|DrnvCv`SP6bMcrzzqnAWV+z+j7bR*VV_$x?a4Y6AqLV;si`Bh`USq~#Gs88gK? zOh&84M{Y6qN`+R&8N(T2hLq&EyyuOMrM+2Zi!v|;eCCZY#g6QZap_PAzv^jSONtVr zWd`79vLy%n+iZ{KRJhOGa+es6B#EX)vQqr`dbRMxOjZ1y9#J%eR1>k%DO$}(Axv~# z;{8I;ev(-hY+6`Z(x0ov_PJsV&&zsn&ogkuf`_lhIMr^mMHp+TK7*xDtf|F}EftSl z(Siye0E5o1$78OBiDFyy&Yb5F{}JFm3kmq0XhkPV zS=z=*u)CPj+oi(fsieeWmX50#k7Sed`t{o-_$_NPK(3xKVIhH!*NL~QkRXX`PO2>Q zv)o`_3jD6b=_2IExWyxv60D z4q+z9W#w>mt*jy{qLm4aOVlsDpYEpWN@yD2h_xRg#Z|F`32O{;SQcfyn-=(`Y1A2V z4w&0jfyJ&C?*)Z1HR+}WtyN*98-?DY_qJ2lR;xfbmpPlUK|CB9NAF{So!oB4${2*k z()j(32bNqi-B0+`5s1HqgniaTy=67x9gJ_guNUDJmTB@tp)+^I*p|0#_@>oQh2=#s z+u8RAsvzvKJy5m3=NII2ebis=C{n5oT31RxNQHDal-M$yE8Dxl_|;{Xm@TYhDGa2f6doRk5I~<~bGPW;^v$ zXIdWEj?HhR(dZ$g#d|EAtawz3<7{GHf4od;?Qf;+l1U#ws2rQ4PkS#nUdwz#wAoJr zL$O2P_?5?nT5Vlsbs8XFq-cE{3YgRD-Hi+dfp`}TQNQ5hcmR)MrL{Z_)Zcrcn)#b- zQPU){1AHyXJ0L>Lv*!B@wrzqNu@VIXgQTrm8PLg0^O|Z9rBg3H$(Embj>_BS1aZ8Q z<$7*zxwdL}RFH>?Y0&i8sDq^pPSnGTfm|9xM!RIwIFK6|rEW#>bec*aAJ(r2FnGw$=PsaRzY)H6l=q>mtO2Crr2x zxh9Hyi7FXe(uwfzT@kDWiQbmF)ajfzde}E`D$H$Tkd~KGnuBBbO*jQe-pRQoKUJpU zW1lm7K9$_q`#$SxtcoPyl_Cn^bww(3P^5`RnvF>3zg_HZi^@y%3b=e5y^7M;X?ADB zUEE7r6k25FJYb%7T@C)Ja(=E}f7&D~rAjoP0W^lgK6YurbL=zekhs@1PyJ*vgf<{- z`$N^PzKkwH34SXDXbcPfWsiJHFK`Bw#t4Gs2XOu9Zv~HlM@6R}hjUfCbASttpwr$n zSY`qv`PJ{0g zlKPD*=Wn;7N)>|!GhUPoe1(|>v*7Z9#%g-T2-~fCkQ388#?230wMW3(oI;mcdFqn@ zUL6~$@fB&9YUZe6~u*0Slkj^ja|$q zxB?xS8QWOtdDhj?LYsC^te)KE5KD%u30Pu<$$qA1_S0}%uvZYT*o~FmY4I?xb+*OP zMU!XrghRE^tBSBvc%0Cb8(!MB#NJ`ZN>1*p=5Nc*rapVe2JjAbGkk2WMeeuP^9&bN zRpQqhn{FV(9J`V>4BF10!{A+kw`@ly1@Z#GKE{ZjpwYINsRw>xK6O_A_>eJv_rG{1 z`~Ha~_)3S<-Ff}>D;kk&~R|PHF+OZ$nsEzPBpG8%l^Fy9eTNi!({@Lg9B_< zJW+DF=k^-1d80U*for^>A#+=;%PcfE)(sCZL%fvLX5sBKpj<({uf(>wxeTH)QmK?p zHxt?Nbv7Wx*(tqUQI_Q99MB4+q$@2L;J6_K)fjqUJmLRmyTE|jdRYbg4Dkl^Z!;J#jCyk(%i@V#1ms9NNY&i5Gzm6S+EmNK~v42a>`|zAO``F$agdh zvVkdt7EejzQ%_ecR9uvHw#RODXsKT?Ej_1|6Dn3+OPgI!yZEp^D{Q`e&G-f+kd4oi z8GGCDMKRqxeC3*CZ@c{>xqLh8^ImI$BwKGn|K+gzMZXLG%FYZ0U$@!G3#Dt#-XUN$ zyRw1o@Dr7|BFCfZR<#}ZEx7Y&PO=nQ*?QH4;L-Ejy6IZlWAwK*boXWOXzb37HhKq{ zjK{D3DrjCC{q*wtAWE;jf$%3=NSR$S$_zVwBAL+sS&}D;43xyoVm6|(G$deSZ5NR= zS3a$YkkMM&x3%!YfRe-C8@E-I({7-nSjg9P`Ge&$+zIq3Wfqnu<|c4XAge8_{yQDH`O@7bKOb8-u~Xo{>>K|) zB-zfc6lPWB)F}Gq(oajGQl*SFAx_*qVid!*lNmvbh6LlC&M6kC8MET5WG1UrwNpfg zg5Ble9Ww%ZCd9)C=@lS00%MMb<$niXP4T;ixPQPyF?TzYIw@w_H>W&v*$M1d%zk;E zR$kE*kk1;H(nO&h%aZ~fHI}5b!R!Gu#84a&GuBJ+n|Yp@*u^Ab&eI(~a|w)5q(4t1 zsx{WJ0km&M$u*uBm3ZODqcx^ZH(41f#94P9Bqitp-22-E8?TYVGz*yH;7NiI8DCH> zlIV<%+C?ab3diJF(A_p-YumTPvty2Fd25Okm}7!9+YD)8j&uC(RiXL##Z?3h1cn|V z1Lbs%73CUyxI>%$$p}Se7}S9%X(>&bNz)R((y-DE>F8Tp9(tk7s16DUjo0y}cWqnJ zgOI4(cb?)b6Rx5?eqSJvB?SS!Mrj&NRE43$<`h`&$BpaD^Dk-*qD6WRXP~dgirt?| zEsR48Wd^<15>e4x1otxV(X@{E$#dZr`T^TRYpO@YBQ!cv5eVE(%(n6B4_IW(jfHo( zK^AwK;~D*tq@mx+(IFz_JVyc8;nT?nrAU#u8N^%H!bj5o_2%|?FD z{`d$Zc`4Ghe;~|z)v03LjfMljKePU`+ z4l{SbtSm~JvH`6uagpvl#hAVV+nBpT6G5?c_AgARRRELKaws3z!>mjxXP=D<2yi)6> zEWGhTk={D^@`E==CDQ{tCuQC>RFSF85n2|gBYDb6|Kg{n=q)r{74viE5`h6YCD4+R zeDl*>x~RW8_|ng!nTsmCje41ChtH^XSH%t!bWbW9dF2NAM65wZH)`C_0c46?dGs&- z7UEtSb!Mpw>1^OnNvy>9B#F_F(usAF21%M&7B~$0+ReCF1I-PS+i;nBS=pd)+eM{l*5n$x1x&v_tYTg&5CxNkrQ5QF13|BSQ_A zI@npJNE+BXw11rQSj8AcZ^3uFzG(^diiC&`B|W(aFvKHjpjOkoCwZmbN{%c99S@|| zE_CP$D7lfzTur-$(x!@W^~COe_X%vB(`Mu?x>vk33MSwlwWra>ZEEMAsO=d7wppI~r`bhOUgBTJ`c5dm&h4ROaXbW?w zu73uyC`=yETob|pu0V%%s_8-@s<^#Spny$ct1n`KsLlG%231$C#A*fdq&|^K#h$J4 zo+%|7-7Ag||4cTe$t@dBt~QaQRDPk0>>$svoG+96K;^-tKD1t6PUdq2aw5pJm;$N4 zAddPv#@;M))z1L%XJ0y-)>L}c?6ji5Vr#kt#6=aa%uNXV3*rVD2}==9TYD(#DPR9L z$E#88ED60`9)}xKAnxWw6_AenIveyB7c;QqSCSbhI7w4b(V8Ua*UbKD>duU3je;jY@^ezOiEKLOV{Vb=KV)cQNT z;OQw=M%3J4bKSSt;y9eqqSK>y{2Q2g(S(<9Lqakn<22Vd^TkK$ZAxX$l)IvA2o1&TW%)u>gFatG_5Ua_L`rECJInB&Ra7s0 z5s`DmvdZjge2J1p0rduH(#sFcw8!TiS7Za%U5kvGfjgVS@ABCJVO^_524XQ>TyLcAYui>$`LQR4@BrO+ndNf)vD zv8t!#fn-p;Pe>+1QW(t%*XUwB9>XQUEfCundZ$tXEx-D_o)`Q|n7z zpD5|;+svq)8nax>vHMx&!xY36XaBf`5i5yW&ijTDYnH5{BI zTQ$5CyA9p-`8V}F3=K_v?$`L%^=o|lzfN=nEv&5!|Ghd>UR79CLD2@s1}V|EABK%V z6I1k)u1d-C1@T7~5FlWd!T#RAFAgz}7EcmMT*%}dLw98U;%A(a9K+>UfIolC!2k)I zT5uocnAg6j<9_LA<^BHtMgOw`Xm*E%0>&Qngu1y=AL$E!6zb{-!=ovY4^g>f?GT`$ zaw$Z2#rO?EW!&kh3q$>)Qj@PL(UZ#wic*d4Qxtzz>Sl$40$vY1=P2mvGXThXXPY-% zDAgHrx)&hs&770^KEKET%Esa3?rIv&Ah0-+Nw-IpAGP`e&wMl5mPil+9Plukew#DSc)sM7nB zZ`MP2%{PpPTG3$z9>0>suDpyU0)I!miYb5P@ysFpIYVGt>Hw^FF_CfB;xB?OD{(FP z-i~u9OO`UZ7oy6GvJZVXrWt{{m#oXsF5d26B5dBW<%TL85QPL}fhBBf+}5LU_>j`#br&kS5`~zousS zJXZH~7>uwc0LoNG7gjj5W}URi&lu9<&n1WmZw-dp7AC}`eLF}-ZX6%lX_;=Twg)IS zq{WWAZ}DffF4B^K`qoQvLa3FT+1zObdeZcZ!eCVu>BMQE{>5T)&l)acqkiwR_49Ox- z|FQQfjhWcttDCTuKQc28qTQvl7*S)_eyvNhIu_S;Dn7YCkcHb?pH;Y`R# z4!B%_pe=6pv2@rj!=&2tsQ|u+&F@`hKI$J4RvPBXywfx~#vA-?Jx&MTw0{?OC%OE2 z0%}?G6864^jk~!6a!WnpY)j4-$t4(L@>7<6fKwlfF=?NfV30;bzwY}e#unq~4wIhMHjdS-b7F^k zSPFo%HY{nEQFN5+Mom`=4^)Rs(re4ya=4ixo3tHX{$J3JvDUM7ee9$myBS;9!u_}re)`S@A(EZH zQ$`EsqAbFJ`m3shpabZZv-;NHGM%qb2k~Amfd4&`n4wNWkS zXyy7>=GVWRBMO?bb8-kDGLJJ>6n;O*w+w;QonCc8S?G;ILg-VB zD&v}Sn2|adR-6_wqPSv!!%(G@A9GrrxqaWn6vO1y>GC8UA@74z`zkER=zL)(WY5xuzcXoyR~8fAdI~lE(!^a-EXF zjif2@zG$8k{381lq~eIvonbp?(=5%I9>W$ctDuRzL;75V7-N4dec1JF<5qu|sK4&c zs1D7ZP6Bz-y9d>Oc(Zq1UKmEQwK$6FZgnRLo;})wT!>g3lwZjFFu0`

35?tmJO0 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 -jOPTpOg4^s{77`EXw!xXt>O>;@ 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

=?%@FmGO-r08f}dpb1A`PCL(wg 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

X;jNRCa1=i zh??RH#t(HYNfYG)93#L+O5d&xubYD81>`B!ur&OgW3Gd2ij$4O%LBfA$g0Mc5po4C zc&S0@S`4(totYHmMeO_2JAoBuE3GOp`{GaBEJ7{6JFoR__3E!+W?Q0A_s{Uh;{}T| zteL9&o*L43#ONq$JS#Vn?Bo`Dknh~~)5f9MZ{FJ(u&RZxz$kF)QADyNveUK#4wP;@ z=7-$bXM`5y1ZXww*+>sFg_W^Ke8{r!-E^NANCV5hcqq2rD27uo&_=x@(_rU$)n(^z z5NlF%zH=j^AzIoEwXxXe6H`XPpww|O>#fMFoWt5j`3ngd4dD0Cc#*R?j|ZXNJKu8P zSu$?Xkhc*r#S9+m&t3S~ker)4SN&ckZwp6XXdjQmWX}%u)$%@n((MD4&==+@Ky(xszwMyAtN!mcwZ{_zHv$J4!BX6A(rR zjJp7)y#AuhIYJq4kFcZKLqN-*gw&^KfgS407-%$aEN;RqAN3N4p^BygDJgfa9fEcO zqF1&(hU78RN(lefAC|Md*3zu-VqhYz(R3RVbAcHM1nIcVg2LtIdk`xT!_sR+?1MXi z%!vKm6^iD%%3=@g4KWfn4-?BLZ_*%MlWac6E7SkLt-JJ;GpRi+!E*u?+bHBI$9>7# zU4b1HlAWlqwT!o$74I)zia3 z8I6P?fNiLM)=B!4B8h3EW!$OJ%m<7b#ClTQHxuGQM)t9>Jc#ey#sc?zB+WwhzA7(H@av2u5mkPdPH~AH-N&zi({2tXt-(RJ`Wc)#P+g;&+d&`Fyo2p_! zq2TCYg{+T9R`;UHVxY9sMf=FBkw(5DAAHgsB@;HzGJkb)51Ga`}esW0`(xLnHmW-0A--?MmQc?ArbyOGP3S zk);&vsVqfGi=vWN5t*i`rfo7!8+kO@Nyw62gv4WuP_h-W(?*sOkrq;v?7r*FQk|K( z@0sWQ=J)G~_cj0jxz=-?>zw=C+H1}ipWY{Xt*A;Tvb$XK``aG3Ht(@}Vn)pgREZz* zac|BzKci>!H)lQyayxV`Gt+zWDyKvyTZZ;cWvd-McFz1|cV9o&QqD6;uV~O>Gr3>OA1T(~F5RMSyhf{P zLyt4TI(n~khPA2v(XSd#S;ThZ&l>)$Jfl%z&%7&&jxZd<$M zZU*$>i;jGnn&@n?>icWOb5_-gV>6wy>)U4ke4(yes}P?!dasY%%2(%Nr)+qhu#FS5 zHNx`Kx^i~ap|AcHs##;dJ@8s?JUT(I^-<2nC&_cQ^3I*Osa&;xVXC!b;?eq=YkhR1 zD$D&wtBf#k{gQHIp)G62qot|tmo4Wn3W|7nux3{EH`be%GxvmadHZNk$QhqUH&)+V zoTG5-cUIoty05Pn#CyN2(DQ7&w>$gd<$I^zF{iG(S?|^S>0SMh+T?}f1DYX&RM#xK5NZ|iktphRkfxr8}donaX`e8SG9fmnYo6q|FR~Q z+3)<&ram&$FI2z(vb-qL)goeylFyT%=jF3xZf9q0dr{YWxYug0uEqDdob-ylu&=_x zdRmt=?~co87)~y^DL=`;WQ57XmzK<-Uh}RP7iz18m{txMJ|Wltfsx<++plULnj06C z#rs7xzu6o6SZ-s5ibDAbqp}4PzJF-a89*;->z}dWwyd3d-uB$VdS2?!N@=OL`wYBp z%uKA(qx4{g_pO{Wsn^gXYmM5%N9$6~eLcmr>=CQJB2_gn_F=-O8o$|o zPL?_{Z*T5Z&U6WMXr`|&UApUJVd_eQ1sA#xn%kK4dh8e{Gp*E*CXwAMJ$3Sx63mKS zq7T2ZZkgPpwKgX0qFdPNQ`--5RCZ^}=E|RC{2H(>_MYmBVg6U*%eub59^d?Xn?f&m zOZfi#YUU%uN2g!Ey>Dj~+hTG0;gGBsn{Ma)&hFJ`(eJ0d4$0a%`1+aE4H`Xi@vZ@M zYE@uy z%D%g%U;OoE+2>K5Z{LHze{c2cu1mi@u6S7g1*8f{3AMv$5fBl%>CBO1hcVGE? zVNzb)gk{UV*Ozr(jjlZaCqvivx2uFzs3Y_Vl{&9RooBhjdK4{2mu`FjEr8xDKE=rm zf4yn=riq6xnDo~h+ST=Q*BA4xlTuoPpN>2@>y?L#hw~Kg^8q!gUe0xDuib8xO*T6p zG}>~C%braZpYElUeo)(Y^76GKy7$=gLgi`?W-rz}7r)s%ZpD;YPsWTq?@-)2;9A`H zErUiJUwvm`LX(bZY$0dZkZ+4M{svw@w$Y>VbNs&dj(S;1zfFAumu*$GTNj|SE|fyo zyZ5F~zqfU2M#_)Whc*;UI`5wX4c*Op6T(0Bf1US5MeiM z>WbcTZDJXbC2z;APx;mU_#B0@3Df}^X#ezuKeaE;!>G~p@b>pwiT>lUqW_r53e=}Y zP~k+aeh^%%MPr6VFvH=2%t#U#^m;5IPGT4?DqOc5&TdESMVSdL2A_f(>hkc^!1Q4h ziuwPD7{LtFj|~g0m@|+0V*G%A+D=s^S)8-dIGozWI^*c==Q5_-&1^rMZ*aSAf9`?J zDASbBblbl_6&xx?o1aWoDEQpJp=nRSC!aX`zh!1?i&Auu3!6mXHkz{2TFQ=D_N}1u-~E4&vj^KcdNj$3a?+ScvLDUpQs;uYt+9K zrN!~%b7B*#w)DC&xTx4CZACY)+dKQWXu4UhIbpZred4AShNI`N&|IO?T7A5(wsq33 zqVn6*-RDlCoIV)bWwQIhfyyyKJ&r{Tn0?taxgXuqzPF;@nA=0;KMpB3tLSCsJLZO0 z@4O3XV?RtNJL0G>XIQMQf4=*?36t+RWqR*5uU1)lj%xYnrBaKE%DKmezQZiOm)UE@ zE?4myv*l26@@+GX%&r$Hx(>8;-a&^V8}3e_RKNF;y*gXv+Zm(o&E9+aP)#4d>7}=I zhVSCa;B3|zs|J=)o7~U5nGp@KtVW8TdK2fS&5Wj!{euTqRqXDQKekG?xldYB^NhlW zD{ik)`|2y(WV(BJ2*Z2DRkgIc^Se(p%za2vD9|)3I4e8EX;tlovv-16NfsN9Fi%-H z7G<1mXgJ%B}ZBFR1A>&k(hV~nFPUh@}CzjqesU~+LbhGy}Z+9&` zJIedKvfjiGqYPY+AO3gL3HpT(Ml)!M*Kek%P_IttzF9fp)KD#z-oM*_(8y zg!*uQ)o5z#p{2`OA1-;luT~*&qVLJkdO6u&%OVTfKD>RK*;aVzo@_78@&k_A^PNYG zuA9kNlRDXCPFs2Juxdk@!0&JF-APr7(MzXNp8SyAXuqe8b8Sr1iVsNo6GvP&Pg$qmv;Sb5NRsP+hx!Fv@`_KtmZe9@fE^gfRxU(I`R zI(FcWlw{6iXYv$Wr z+o$ZZ+~+UrbU@jiSy-%RIelyWz~@BQM`Ci9BKuB2%Y1 zL(fBPsb2ZZJuN3TPaGfavs#fsdGmRnoN_JMlY?&Tqg~E#je1cRviY%0^-CX9 zN5@-+-mCJ`2FR3DT8`}9u-kH-Vs!d_op4)%3q&dYQeYuj+%cddOYJ@(Xc>6Kaa$(myTQtG|XP@s{d@T`>ynLm)+j= z+!67w%d6V1P$cawiqkxOtdDlU=nK_FPp@oIU9~%U^1Ujyjqdk({W4bB$BnA-VFVRc6Y>}}1O26&lTg}u`caAW={cM=pR7)M7e1$$E z2fa?zSN+HMOW$;3`+JeU-xh`YoVK{*3xOXv!()%H`*HK2-<8h`ugrT_$Xe(e=c=0e zGpDiS<|zHdx`%~ZPX?=(KAAkDxP0=iMn;^$-zhULJiD^;uN3-olH=E*uv8^pL`197k)8bX-dMxX729gSM?DgoR%Pg2% z|AC)r|BpE~f(1`_u-FWGp>48lTDqdXXR77v?evXU{x^7~7xqPTNI>vU(Qn1}zaXju z_!m)ig?$@6liB_S_=9r$U(mPFMmriPpO*V=8j~5qpkpAyLr}v&WI%%iApA2no%KLI zAWLyrf@-ltnZh9GC^qkdq>3U238S-vnEt4kB?iN#%OVDY8kWJ1BgGma7#EnW)~b;h z3nGfmq%lKD(eRP!!WOuQ-g&x`Lhr+{kp&TB!K=eVafJ!H!$1rwT?`Z>EP`CJp%}yy zA_y_QDeMY3k|G4Au#UKcp-FbCA=sE^5F#?XDvzM9jHyH9G7$EA%2tH|?C%p+Vd4RLv8fgaqo^xT?DA^%1ZvvJ)3>B3$ zf=?P}U_V0G_MwgwKh|ZrzZZ@Kz^m}1Ew(Hyx)xs{{Zh0bs{0jsQ8( z*&|Y@llajkHWwy*2CxPIGsZ@@8A?0?Fy82_*lZTVFN#gKr-u873U1~W)@hFuv)*I? z_y?HCaZ{B-R1pzyry4RPFgF{$UI>u7kZI717X+U)PCnFY1hD+z;^CsWZ~?~+n?|P+ z_`{C#R|b3qG)}9?VxG6+XMe6C&7`sfg_s=;Nf=~=PD#G z0tVjr9k|!Nvg0JhpW(XqDGxvZGoZmKu7URuP;}fn$c;jwqoSRqK-uYS`GT{vfg%_v z@VKcONl4LQ1@WFa_{+m|L$GcQWC`>Df#8$IiH0yD7fd_hI{YZx(Z z*)MQhO9Y%(`B-y*x$w(Q5}hE+?!5iM52@V-7|;c6f=?R9L5G-u!J5HQ1;s}uLo8;*S{{Z+w7&|&3F8HKz zMgpG{1k>pRLsyqMP#jQfa) z&PSO^g>Da*+>6(Fi2Q-Bk70uMf!z+=;e#hj1o0c_lZ zMmtD_?Gi=cLE7Vbl{A8Sl3?VMFg3-^l!$EQ$7FF|1c3sKGz5xdyp6ko0BCZ-v*#5@ zi8Kh^2Hv_MxD`&=Pe&N6uD$`|H-jj^^S#0>LU07i%b?;t)Isz0hXzmxDi&~+E6*kb zb)`qbW?LkA2~zXj#pfv?hlwCNx{@Gs6Ab=Zxz36}F8E9Y%VsLFA zpudD4Jki60^h9xso)U0phS0+aYd^HWiM&jQo>F2ViO% zJu;G428m%pBDv=&R*V6MRfWRJvYiLbVZI^KFmdAoh+^Z=bDPMUc{dM>muu0HXK|(A zxDKF1e6oKRA(^e+N^E+pn1qTH2X7;d4g>Hb;0>MowrL!>$p1(Ho)EwYjA9XmO3b44 zn327~>7e?@7ahgXlBxKPXXWotY90++EzW*0&mbVO!pvj8Txt?`Dl3rAmSi8~4fAtl zr=JCyPw;~m26k%+={ik6u5`HZfiMdohK~+!hWda9JOm?+!vvbSj*tN#Iw}6&sjF_( z0d6>OjKT2R))V6M7Yfj|5K{plw_0GfcfKzm4u<@NR~MQa2vPY9Of+~GW+;QkzY0S* zseHO{z0nzPjUb8P3B4#;5;lJkLa?Sp`qsaCz19+tWx#>(hzr{+B|7o47^x=H*`swD z81o0DE8J!NY?DOLQ3Y_<-UKPC=jr{5IiUP~pd?&DDLW-G@GMKF{u3-O^>5%PT7Zr# zXyb~5Eiv12u2Kelsen0}OYXHsIWYRdX(8v$F-=&Uv1WEa1Ki=!P1fiM6 z$vr9o+QZes1MQ)RpHlpFna|v0DU<~RgcC|JXq;fB!Bek?t0TYYBEUxj@2#hojkaXs zK-IWTqAp3mw+@A)UnI~sCr%mi7aSX{S#$&nf!}Ey+EoeAE>Yoes9Y4)2^#Z4yJq*Z z0Q>@c8c(vvuM-0E(m1bjkkD$VaVuUcn8sl(+Wtx7oGc*3cV>pW(j(|p?vjN+{Yl`- z%qkjL59oV97JL=({3aofprt`NP2@K9P5uh*n5-lm^$LZe$h;jd-oCCg9rl>05p)|C zHGqxUhN31w5xVG4l|>SSl6fCt+j=}EC$NG0w+WmE0q2%*QuHCAzk<=@HK;Z$YlQus zaOAx56Vfi!?&2jdJf=Iz7aS-M$`8wS6C>|D^Mahn)y{g{r17RU3{VuyU%JllV5Q5+ zm%+^MAQo`8@JezvD?hkqib~^e5lF|jt)Ig_6Oii|Bo2J3wzi6#%_YhYrgFEafB;6U zBV2Grq(Kyh|1cY$JO=ysgw`saI+SY2S@;?xcCTFnw|uGvFDL{7@ZwXyg&exwf06!zIr!{hh;_W7zNUv1__nbT(A$k9 zrC9gTRNfxozd{LzuW1I!kyG%MEdE~(i`tQ(9~&|Oz}ohjv_hLH0ZxNQQ5R0 zVxQIA^=j`g2yrJc2fk9zA50G3o)R_CpHPQ{%C={Q!unamNHlpN#|qcBeX0O6cF(@> zMkOqH4H-(#B}iUe=asBA6ep>a@c7l>1I<8)uhv(plamn(CSI)P^sQ~@fT;nP@GKdi zMb5+*%ahknkxs7t^H$Dr1hzBae0X%m>X5T>V@I%DM?1G-wnLHTeodX>C_erN8IUs| zd5jDvA#Wp%|8<8Z1SUgwqs;dQAL}JmOufPpEzWGKf%ZAi<3;XG2cVd1|y{ zgtEmI7D$AbT{O3@f?U>BRd`x7av*2uWOUKNBP-lEG$Q{nSRqklKIsZ)3d!aZuE)C3 zY0&Q>OvZ>|){)i|$YWE10pH2{K1TvW=L|_`W5i)F>gqSNdm1egcO#&6B2fw_YOGZt zu@uMzxAGMkIlwRvay@S3m(b=QW5BB|@yQ-Bm@r*~(C*b`V8Q3b_cU?_UhZIqg+Vis z)D)*_-DDSlDOP|ftg#$FA%L8Mp9~@75DE0&rOSr_8OKlLLFV=BFC2ScgUAU*@}a2v zBBe1_d+xsk3Of%ZcvaVJ5jg=rGWhA8P;H20`hn!=M6gUWs1CQiQWQA}nyt9?u7qXV z375_0t3iZFMd60c`)G0oej^T&I%rJH;ub~6qXQ>beFT%ILJGknFb{4PCi7jslBB3h zKQtJutOET6Lj>X+zgG}(@Qwv=EiKhX)Qr3D)?WiV8~}skwU*Huat>D}oU`#K-SOM4 zWNCf|)&^4t2rqCf){%qrwEvy@-vg9wHo0=|s0-Ac~l9u*!=4|SynL`Bm5 zCAib3(m|>hfngiClnoZ=^S6_;@MS^!I&gjh_K{}N=@C|;jA*(WEE(DKK!TR6&6zP9 z-f6>PG*DQsm|apa@@+%BUx)&6(BkUMCeR+*48fbqSvSd9c&!@VsSxp*WKkB)`YZG{ zT&;zJys?lRTae&8db6So$oA&HbeE%3cQlwn@U83dFUcABR*}4Gh?G<$ryZmT(Y_zn zp!oW2CA_0ve6)9pMAFVa!oPWV-33(;;}=9a?p#0Lk>m5l5VyHPn17MtuKfu3vKI=h zB#;QNNMq~B8F{k^tNj(+WnIpov$xmRC0;P_rbVcFq>H)3v9YjX5-58pmZhm zYyOS{+LeiPV^e7%;>EET_V~>Vu!c7Tj}s=2T6b~+-suD3qc?orY4HAELQNt&+0~3o z3I^|fJVw3!3CxDC^mp|qCnJ?pRH;a^TLwiH(-fcr z93yPCC4k?S17%M!-*PB4J7U;#T+&W zwS(l70vlLHSUee9kbg<5g-;msjAS( z*od4BjeyW#$h!wF)W0(k#QO<^R+!s4)BhJj32wN={#LIH2qafXa(FPkgIBhQFSk(s z>Fnk3c6u_YkkMk^`iw0Gn!B)u)4-&v4kM%Sf@Zm>VG!aPN_LnExWIh~QG8X~7DevJxHXc*U zeCRC_YoGtrn;^rGt_(}Ygr@HVXF^#3FFZ~{pHvcu7nQ+=yy+gq5_`B9>FL@;D}Pu4 zP&hz>cf)sVkxbBT2`RjYcJk!V0Ei9L?ZflS!)^b8iJO&SDJp6cB+fMFxsBCOTe!eV z8Yfx1Lox~1*r-d!2w>2V{l$}PnZMc+JsV&QL^#Ry1CmLEe2ZvL#Am}9dIAv41W9o3 znhQNsNtPExxPVMl5N=>M{8)q*HnGs2#?zJlNy!{Mw{oKfh)&C*bjUdM*(!Tvz|VGp zSa{SA&XG(9HlH0ukD_}qSs~&|7$lJIG^?=p5Q?tg(RkD|FH6rrxNbs19NlMa0gG}< zEI0tZAk4fXnF5PQ?vZdJQFgpCP;dujrGtI&x$E{d$vh;s5$AA7Fw-;oep;~lY=k{< zTz5-vk`eNY4M7);Xp0?DnCJBV;so%?YQlljc8`pLU_KW0GUNl}D~6dQz`Rli>rPyb zozKWf#FiMM6i5y=_QGoP_<{xa0Dh_?^feg;VL?u0lOLf8wwmAsYLNbMXDg^CBf=LL zv!d7}D-5KwF{_szMEfLLAUES{b*owe9x8fj*4f?BiT46A4OrX~J#(;NmfV2JfV>B! zz*}d24P@wOUCBd-d4`~pP%x1%wtU?2s zECxF$OhSK?c91z?F1XiLa4&6a)*t?bjIcvhqCSO8VAQXV`2)bq24QgA>pvvn+J?h& zQjCI-uhtLN=v9f#3dI|KZ0*TUGF_jhMT{c@_b|WH2pGkl&4r0BM@15ecR|F>}i(bx_R@NU?gDDc^P{BS1S7 zCwOad|Bgj1uYE5%eq_~occYu90Y21xLRNh`k^rB#ZiNz) z+bTvS4H?00rONrT;4+FZm*KfASe<}?s~cNpfEztLlF9Ny2V;n)<B(EIZdT-_NuySTR~8A*dm{H!v{kvjtheA*0S{tM`M#p^tt z938qSjBqKm9yUGq>Pj$aqDVS0g1jlbOyGtqKY&p41o|}+a^!W{d2ZT(KUW052UI`e z@rA;a->MUD)jhr^ytBZR-9_9!VJZ=RdjgPhgOFq2yhR44Y}6*fLu-{K0f!Sj^Th~a zhM{hjL^~i$_fUJG2Gbtp6IdJfqsr+79OziPfkQYv>*MbarwStpju9g-y)$Inb2xQJ z*)Nhb^=1;F3nxqR=3lg{t_5t*Qj|did`X)MXUfEy8C@#_k5n*Y;6EsW!y$s!Iq=Q2raj30pk5eV+OIXO>3f?Xg1UiP=lBLjzvFlcZ*QJV2j z+_!0N5R`qouzbPCueN}MLa-JmRt|EY4e9}_KEe3Wi4wdKQv#335n2E{k0zZMwtIHg zDgaY0{NQ!f&s1%R_ zpE6Ix5kLzoim-c#(#FNLH`XnIp?kr?3&(F>On@K3-KjJ{bA$_>w`oLt$%=WN=3h8B zO<4^;xF_W;lZ?-|u?xxba3if4Plh7_V9v+4ag;cc33yvxT!BROk7ABJs?60Nyyq+= zZG2+jtdtBd7(ek7cgO~(3#<~+IhPDmabvn-)?|DrFO&Nfu@IoeQy=0mWLlFCt?cd2vKM*7XSn&L9mn@l~vn?XU zbyJWjeuPX6-Us1!AAayY#LtbADFopl>PiTEO}^rta=`5eBH*s{Zj)r}PIe%$HR4!w z!a8R>M8heF20YyQrAX$$R3u)AoF%7Beu0JSA=Tj%+>Y%81nr9(?k+YQ)S^?v#DiB( z@hO=P+Ib5G)&)%oK53lSdkDZ;P@ls7g#p)p9Kr*b;*ob-uXQ&E)T5vqT=#4CNsFw( zT}8RaMTlvmAl={lb-tH4 zu$BSKUL7oKfb;Okq}U2WV1RZJ#2et%w1dkH0J%s-*l%P`NkHbB7Tx9|wx^FW+`#^3 z%jSY*gJ9PHPYemU62Q6hFqeT`Gp~PqjDXVzlrunsSHF5!B~Y}xrUvhjB(VpjZ`(a( zHjw-SB)A7%yG}rY)Q(CnetM9wRJ-xFCN&#ew6} zZ)TU)=3_sAAPWez1>p<7(>OslMF~3H&*%^q7R7y#R1_Ck*q3v+0Bxk616&;p_t-5` z+>Tui@xY589$PR3K;i76(14o?Nr9(F!K09L|7l`QoT341`nXU13j@ssTzn#Ny+exY z%w&^|86}z#8%CHP0Bp34g{R5Acg0|%E__FyoUmR-qu%0~v2YJ$_p1=8cmrk4JpyEB z_fB`wi0T-PcgWh&S*QSk)w)pf4K5-;?YN;Xh#DG74-ceE@a)4ab?fc|hcR&Ab!<`z z0SD3vz5RX@3HWUTVpJaic2`I-_ylsKi~t{#sq$8hF8UP$c z(1_5$oczu+0uHWS#c!)1dj>LUqq;#dsRcwl92Zp(AUeCFal5b>;WS1BRm}D_vgml3 zMX64p?I1{2qp^|Zy(Ylz@Idjxn+!Zqm=FEf?XddCg?Fqbg=7-V$C(fA&4338C~(e2 z=q62zNw%;SXqXB18th#FPI(1lGPcMce^I%DgmYVBRTE;v4wU#FXjY zOaLu0@l>(WhFcyA`dIxe=8v(M!cd82?`4fH(cLzt=cLEM>`5__T#Jz5~1KR#~ zw~ovCJH33k^Wen2BB}%7iM&h)LdOfEIsimpE6`W)ZMb^*@85U5I{^q@vD9(>x9}U8 z#$sRY-$&%jP-hapa)}tWqasFQ^8PQdK~O}|cn=wLNG<*)OoFkeagP6w4E$FzbtV$` pCW;QCz61Y*hB}FYh$7nGOW`uJJ7iaM`>}i%O+UCB6;LUZ{{uOm#_|9F literal 0 HcmV?d00001 diff --git a/lib/httpcore-4.1.jar b/lib/httpcore-4.1.jar new file mode 100644 index 0000000000000000000000000000000000000000..a7b1f3c10cb7ae2f56e4a3e70df7f04800e89f91 GIT binary patch literal 181041 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 z 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 HW5WC&VxuzU literal 0 HcmV?d00001 diff --git a/src/main/java/com/rackspacecloud/client/cloudfiles/FilesAuthorizationException.java b/src/main/java/com/rackspacecloud/client/cloudfiles/FilesAuthorizationException.java index 9be66c2..e5cb01a 100644 --- a/src/main/java/com/rackspacecloud/client/cloudfiles/FilesAuthorizationException.java +++ b/src/main/java/com/rackspacecloud/client/cloudfiles/FilesAuthorizationException.java @@ -4,8 +4,8 @@ package com.rackspacecloud.client.cloudfiles; -import org.apache.commons.httpclient.Header; -import org.apache.commons.httpclient.StatusLine; +import org.apache.http.Header; +import org.apache.http.StatusLine; public class FilesAuthorizationException extends FilesException { diff --git a/src/main/java/com/rackspacecloud/client/cloudfiles/FilesClient.java b/src/main/java/com/rackspacecloud/client/cloudfiles/FilesClient.java index 753a79e..b5d04ea 100644 --- a/src/main/java/com/rackspacecloud/client/cloudfiles/FilesClient.java +++ b/src/main/java/com/rackspacecloud/client/cloudfiles/FilesClient.java @@ -4,42 +4,58 @@ package com.rackspacecloud.client.cloudfiles; -import org.apache.log4j.Logger; -import org.apache.commons.codec.DecoderException; -import org.apache.commons.codec.EncoderException; -import org.apache.commons.codec.net.URLCodec; -import org.apache.commons.httpclient.*; -import org.apache.commons.httpclient.methods.*; -import org.apache.commons.httpclient.params.HttpMethodParams; -import org.apache.commons.lang.text.StrTokenizer; -import org.w3c.dom.Document; -import org.w3c.dom.Node; -import org.w3c.dom.NodeList; -import org.xml.sax.SAXException; - -import com.rackspacecloud.client.cloudfiles.wrapper.RequestEntityWrapper; - -import java.io.IOException; -import java.util.LinkedList; -import java.util.List; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.Map; import java.io.BufferedOutputStream; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; +import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.math.BigInteger; import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.LinkedList; +import java.util.List; +import java.util.Map; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.parsers.ParserConfigurationException; +import org.apache.commons.codec.DecoderException; +import org.apache.commons.codec.EncoderException; +import org.apache.commons.codec.net.URLCodec; +import org.apache.commons.lang.text.StrTokenizer; +import org.apache.http.Header; +import org.apache.http.HttpEntity; +import org.apache.http.HttpException; +import org.apache.http.HttpResponse; +import org.apache.http.HttpStatus; +import org.apache.http.NameValuePair; +import org.apache.http.client.HttpClient; +import org.apache.http.client.methods.HttpDelete; +import org.apache.http.client.methods.HttpGet; +import org.apache.http.client.methods.HttpHead; +import org.apache.http.client.methods.HttpPost; +import org.apache.http.client.methods.HttpPut; +import org.apache.http.client.utils.URLEncodedUtils; +import org.apache.http.entity.ByteArrayEntity; +import org.apache.http.entity.FileEntity; +import org.apache.http.entity.InputStreamEntity; +import org.apache.http.impl.client.DefaultHttpClient; +import org.apache.http.message.BasicNameValuePair; +import org.apache.http.protocol.HTTP; +import org.apache.log4j.Logger; +import org.w3c.dom.Document; +import org.w3c.dom.Node; +import org.w3c.dom.NodeList; +import org.xml.sax.SAXException; + +import com.rackspacecloud.client.cloudfiles.wrapper.RequestEntityWrapper; + /** * * A client for Cloud Files. Here follows a basic example of logging in, creating a container and an @@ -102,7 +118,7 @@ public class FilesClient private boolean snet = false; private String snetAddr = "https://snet-"; - private HttpClient client = new HttpClient(new MultiThreadedHttpConnectionManager()); + private HttpClient client = new DefaultHttpClient(); private static Logger logger = Logger.getLogger(FilesClient.class); @@ -211,17 +227,15 @@ public void setAccount(String account) */ public boolean login() throws IOException, HttpException { - GetMethod method = new GetMethod(authenticationURL); - method.getParams().setSoTimeout(connectionTimeOut); + HttpGet method = new HttpGet(authenticationURL); + method.getParams().setIntParameter("http.socket.timeout", connectionTimeOut); - method.setRequestHeader(FilesUtil.getProperty("auth_user_header", FilesConstants.X_STORAGE_USER_DEFAULT), + method.setHeader(FilesUtil.getProperty("auth_user_header", FilesConstants.X_STORAGE_USER_DEFAULT), username); - method.setRequestHeader(FilesUtil.getProperty("auth_pass_header", FilesConstants.X_STORAGE_PASS_DEFAULT), + method.setHeader(FilesUtil.getProperty("auth_pass_header", FilesConstants.X_STORAGE_PASS_DEFAULT), password); - client.executeMethod(method); - - FilesResponse response = new FilesResponse(method); + FilesResponse response = new FilesResponse(client.execute(method)); if (response.loginSuccess()) { @@ -237,9 +251,9 @@ public boolean login() throws IOException, HttpException logger.debug("storageURL: " + storageURL); logger.debug("authToken: " + authToken); logger.debug("cdnManagementURL:" + cdnManagementURL); - logger.debug("ConnectionManager:" + client.getHttpConnectionManager()); + logger.debug("ConnectionManager:" + client.getConnectionManager()); } - method.releaseConnection(); + method.abort(); return this.isLoggedin; } @@ -294,33 +308,29 @@ public List listContainersInfo(int limit, String marker) thr if (!this.isLoggedin()) { throw new FilesAuthorizationException("You must be logged in", null, null); } - GetMethod method = null; + HttpGet method = null; try { - method = new GetMethod(storageURL); - method.getParams().setSoTimeout(connectionTimeOut); - method.setRequestHeader(FilesConstants.X_AUTH_TOKEN, authToken); - LinkedList parameters = new LinkedList(); if(limit > 0) { - parameters.add(new NameValuePair("limit", String.valueOf(limit))); + parameters.add(new BasicNameValuePair("limit", String.valueOf(limit))); } if(marker != null) { - parameters.add(new NameValuePair("marker", marker)); + parameters.add(new BasicNameValuePair("marker", marker)); } - parameters.add(new NameValuePair("format", "xml")); - method.setQueryString(parameters.toArray(new NameValuePair[parameters.size()])); - client.executeMethod(method); - FilesResponse response = new FilesResponse(method); + parameters.add(new BasicNameValuePair("format", "xml")); + String uri = makeURI(storageURL, parameters); + method = new HttpGet(uri); + method.getParams().setIntParameter("http.socket.timeout", connectionTimeOut); + method.setHeader(FilesConstants.X_AUTH_TOKEN, authToken); + FilesResponse response = new FilesResponse(client.execute(method)); if (response.getStatusCode() == HttpStatus.SC_UNAUTHORIZED) { - method.removeRequestHeader(FilesConstants.X_AUTH_TOKEN); + method.removeHeaders(FilesConstants.X_AUTH_TOKEN); if(login()) { - method = new GetMethod(storageURL); - method.getParams().setSoTimeout(connectionTimeOut); - method.setRequestHeader(FilesConstants.X_AUTH_TOKEN, authToken); - method.setQueryString(parameters.toArray(new NameValuePair[parameters.size()])); - client.executeMethod(method); - response = new FilesResponse(method); + method = new HttpGet(uri); + method.getParams().setIntParameter("http.socket.timeout", connectionTimeOut); + method.setHeader(FilesConstants.X_AUTH_TOKEN, authToken); + response = new FilesResponse(client.execute(method)); } else { throw new FilesAuthorizationException("Re-login failed", response.getResponseHeaders(), response.getStatusLine()); @@ -387,7 +397,7 @@ else if (response.getStatusCode() == HttpStatus.SC_NOT_FOUND) } finally { if (method != null) - method.releaseConnection(); + method.abort(); } } @@ -440,37 +450,30 @@ public List listContainers(int limit, String marker) throws IOEx if (!this.isLoggedin()) { throw new FilesAuthorizationException("You must be logged in", null, null); } - GetMethod method = null; + HttpGet method = null; try { - method = new GetMethod(storageURL); - method.getParams().setSoTimeout(connectionTimeOut); - method.setRequestHeader(FilesConstants.X_AUTH_TOKEN, authToken); LinkedList parameters = new LinkedList(); if(limit > 0) { - parameters.add(new NameValuePair("limit", String.valueOf(limit))); + parameters.add(new BasicNameValuePair("limit", String.valueOf(limit))); } if(marker != null) { - parameters.add(new NameValuePair("marker", marker)); + parameters.add(new BasicNameValuePair("marker", marker)); } - if (parameters.size() > 0) { - method.setQueryString(parameters.toArray(new NameValuePair[parameters.size()])); - } - client.executeMethod(method); - FilesResponse response = new FilesResponse(method); + String uri = parameters.size() > 0 ? makeURI(storageURL, parameters) : storageURL; + method = new HttpGet(uri); + method.getParams().setIntParameter("http.socket.timeout", connectionTimeOut); + method.setHeader(FilesConstants.X_AUTH_TOKEN, authToken); + FilesResponse response = new FilesResponse(client.execute(method)); if (response.getStatusCode() == HttpStatus.SC_UNAUTHORIZED) { - method.releaseConnection(); + method.abort(); if(login()) { - method = new GetMethod(storageURL); - method.getParams().setSoTimeout(connectionTimeOut); - method.setRequestHeader(FilesConstants.X_AUTH_TOKEN, authToken); - if (parameters.size() > 0) { - method.setQueryString(parameters.toArray(new NameValuePair[parameters.size()])); - } - client.executeMethod(method); - response = new FilesResponse(method); + method = new HttpGet(uri); + method.getParams().setIntParameter("http.socket.timeout", connectionTimeOut); + method.setHeader(FilesConstants.X_AUTH_TOKEN, authToken); + response = new FilesResponse(client.execute(method)); } else { throw new FilesAuthorizationException("Re-login failed", response.getResponseHeaders(), response.getStatusLine()); @@ -480,7 +483,7 @@ public List listContainers(int limit, String marker) throws IOEx if (response.getStatusCode() == HttpStatus.SC_OK) { // logger.warn(method.getResponseCharSet()); - StrTokenizer tokenize = new StrTokenizer(inputStreamToString(response.getResponseBodyAsStream(), method.getResponseCharSet())); + StrTokenizer tokenize = new StrTokenizer(response.getResponseBodyAsString()); tokenize.setDelimiterString("\n"); String [] containers = tokenize.getTokenArray(); ArrayList containerList = new ArrayList(); @@ -502,10 +505,11 @@ else if (response.getStatusCode() == HttpStatus.SC_NOT_FOUND) } } catch (Exception ex) { + ex.printStackTrace(); throw new FilesException("Unexpected error, probably parsing Server XML", ex); } finally { - if (method != null) method.releaseConnection(); + if (method != null) method.abort(); } } @@ -524,7 +528,7 @@ else if (response.getStatusCode() == HttpStatus.SC_NOT_FOUND) * @throws FilesException There was another error in the request to the server. * @throws FilesAuthorizationException The client's login was invalid. */ - public List listObjectsStartingWith (String container, String startsWith, String path, int limit, String marker) throws IOException, HttpException, FilesException + public List listObjectsStartingWith (String container, String startsWith, String path, int limit, String marker) throws IOException, FilesException { if (!this.isLoggedin()) { throw new FilesAuthorizationException("You must be logged in", null, null); @@ -532,44 +536,36 @@ public List listObjectsStartingWith (String container, String start if (!isValidContainerName(container)) { throw new FilesInvalidNameException(container); } - GetMethod method = null; - try { - method = new GetMethod(storageURL+"/"+sanitizeForURI(container)); - method.getParams().setSoTimeout(connectionTimeOut); - method.setRequestHeader(FilesConstants.X_AUTH_TOKEN, authToken); - + HttpGet method = null; + try { LinkedList parameters = new LinkedList(); - parameters.add(new NameValuePair ("format", "xml")); + parameters.add(new BasicNameValuePair ("format", "xml")); if (startsWith != null) { - parameters.add(new NameValuePair (FilesConstants.LIST_CONTAINER_NAME_QUERY, startsWith)); + parameters.add(new BasicNameValuePair (FilesConstants.LIST_CONTAINER_NAME_QUERY, startsWith)); } if(path != null) { - parameters.add(new NameValuePair("path", path)); + parameters.add(new BasicNameValuePair("path", path)); } if(limit > 0) { - parameters.add(new NameValuePair("limit", String.valueOf(limit))); + parameters.add(new BasicNameValuePair("limit", String.valueOf(limit))); } if(marker != null) { - parameters.add(new NameValuePair("marker", marker)); + parameters.add(new BasicNameValuePair("marker", marker)); } - if (parameters.size() > 0) { - method.setQueryString(parameters.toArray(new NameValuePair[parameters.size()])); - } - client.executeMethod(method); - FilesResponse response = new FilesResponse(method); + String uri = parameters.size() > 0 ? makeURI(storageURL+"/"+sanitizeForURI(container), parameters) : storageURL; + method = new HttpGet(uri); + method.getParams().setIntParameter("http.socket.timeout", connectionTimeOut); + method.setHeader(FilesConstants.X_AUTH_TOKEN, authToken); + FilesResponse response = new FilesResponse(client.execute(method)); if (response.getStatusCode() == HttpStatus.SC_UNAUTHORIZED) { - method.removeRequestHeader(FilesConstants.X_AUTH_TOKEN); + method.removeHeaders(FilesConstants.X_AUTH_TOKEN); if(login()) { - method = new GetMethod(storageURL+"/"+sanitizeForURI(container)); - method.getParams().setSoTimeout(connectionTimeOut); - method.setRequestHeader(FilesConstants.X_AUTH_TOKEN, authToken); - if (parameters.size() > 0) { - method.setQueryString(parameters.toArray(new NameValuePair[parameters.size()])); - } - client.executeMethod(method); - response = new FilesResponse(method); + method = new HttpGet(uri); + method.getParams().setIntParameter("http.socket.timeout", connectionTimeOut); + method.setHeader(FilesConstants.X_AUTH_TOKEN, authToken); + response = new FilesResponse(client.execute(method)); } else { throw new FilesAuthorizationException("Re-login failed", response.getResponseHeaders(), response.getStatusLine()); @@ -644,12 +640,15 @@ else if (response.getStatusCode() == HttpStatus.SC_NOT_FOUND) throw new FilesException("Unexpected Server Result", response.getResponseHeaders(), response.getStatusLine()); } } + catch (FilesNotFoundException fnfe) { + throw fnfe; + } catch (Exception ex) { logger.error("Error parsing xml", ex); throw new FilesException("Error parsing server resposne", ex); } finally { - if (method != null) method.releaseConnection(); + if (method != null) method.abort(); } } @@ -664,7 +663,7 @@ else if (response.getStatusCode() == HttpStatus.SC_NOT_FOUND) * @throws FilesException There was another error in the request to the server. * @throws FilesAuthorizationException The client's login was invalid. */ - public List listObjects(String container) throws IOException, HttpException, FilesAuthorizationException, FilesException { + public List listObjects(String container) throws IOException, FilesAuthorizationException, FilesException { return listObjectsStartingWith(container, null, null, -1, null); } @@ -784,24 +783,21 @@ public boolean containerExists (String container) throws IOException, HttpExcept public FilesAccountInfo getAccountInfo() throws IOException, HttpException, FilesAuthorizationException, FilesException { if (this.isLoggedin()) { - HeadMethod method = null; + HttpHead method = null; try { - method = new HeadMethod(storageURL); - method.getParams().setSoTimeout(connectionTimeOut); - method.setRequestHeader(FilesConstants.X_AUTH_TOKEN, authToken); - client.executeMethod(method); - - FilesResponse response = new FilesResponse(method); + method = new HttpHead(storageURL); + method.getParams().setIntParameter("http.socket.timeout", connectionTimeOut); + method.setHeader(FilesConstants.X_AUTH_TOKEN, authToken); + FilesResponse response = new FilesResponse(client.execute(method)); if (response.getStatusCode() == HttpStatus.SC_UNAUTHORIZED) { - method.removeRequestHeader(FilesConstants.X_AUTH_TOKEN); + method.removeHeaders(FilesConstants.X_AUTH_TOKEN); if(login()) { - method.releaseConnection(); - method = new HeadMethod(storageURL); - method.getParams().setSoTimeout(connectionTimeOut); - method.setRequestHeader(FilesConstants.X_AUTH_TOKEN, authToken); - client.executeMethod(method); - response = new FilesResponse(method); + method.abort(); + method = new HttpHead(storageURL); + method.getParams().setIntParameter("http.socket.timeout", connectionTimeOut); + method.setHeader(FilesConstants.X_AUTH_TOKEN, authToken); + response = new FilesResponse(client.execute(method)); } else { throw new FilesAuthorizationException("Re-login failed", response.getResponseHeaders(), response.getStatusLine()); @@ -819,7 +815,7 @@ public FilesAccountInfo getAccountInfo() throws IOException, HttpException, File } } finally { - if (method != null) method.releaseConnection(); + if (method != null) method.abort(); } } else { @@ -844,23 +840,20 @@ public FilesContainerInfo getContainerInfo (String container) throws IOException if (isValidContainerName(container)) { - HeadMethod method = null; + HttpHead method = null; try { - method = new HeadMethod(storageURL+"/"+sanitizeForURI(container)); - method.getParams().setSoTimeout(connectionTimeOut); - method.setRequestHeader(FilesConstants.X_AUTH_TOKEN, authToken); - client.executeMethod(method); - - FilesResponse response = new FilesResponse(method); + method = new HttpHead(storageURL+"/"+sanitizeForURI(container)); + method.getParams().setIntParameter("http.socket.timeout", connectionTimeOut); + method.setHeader(FilesConstants.X_AUTH_TOKEN, authToken); + FilesResponse response = new FilesResponse(client.execute(method)); if (response.getStatusCode() == HttpStatus.SC_UNAUTHORIZED) { - method.removeRequestHeader(FilesConstants.X_AUTH_TOKEN); + method.removeHeaders(FilesConstants.X_AUTH_TOKEN); if(login()) { - method = new HeadMethod(storageURL+"/"+sanitizeForURI(container)); - method.getParams().setSoTimeout(connectionTimeOut); - method.setRequestHeader(FilesConstants.X_AUTH_TOKEN, authToken); - client.executeMethod(method); - response = new FilesResponse(method); + method = new HttpHead(storageURL+"/"+sanitizeForURI(container)); + method.getParams().setIntParameter("http.socket.timeout", connectionTimeOut); + method.setHeader(FilesConstants.X_AUTH_TOKEN, authToken); + response = new FilesResponse(client.execute(method)); } else { throw new FilesAuthorizationException("Re-login failed", response.getResponseHeaders(), response.getStatusLine()); @@ -882,7 +875,7 @@ else if (response.getStatusCode() == HttpStatus.SC_NOT_FOUND) } } finally { - if (method != null) method.releaseConnection(); + if (method != null) method.abort(); } } else @@ -910,23 +903,20 @@ public void createContainer(String name) throws IOException, HttpException, File { if (isValidContainerName(name)) { - PutMethod method = new PutMethod(storageURL+"/"+sanitizeForURI(name)); - method.getParams().setSoTimeout(connectionTimeOut); - method.setRequestHeader(FilesConstants.X_AUTH_TOKEN, authToken); + HttpPut method = new HttpPut(storageURL+"/"+sanitizeForURI(name)); + method.getParams().setIntParameter("http.socket.timeout", connectionTimeOut); + method.setHeader(FilesConstants.X_AUTH_TOKEN, authToken); try { - client.executeMethod(method); - - FilesResponse response = new FilesResponse(method); + FilesResponse response = new FilesResponse(client.execute(method)); if (response.getStatusCode() == HttpStatus.SC_UNAUTHORIZED) { - method.releaseConnection(); + method.abort(); if(login()) { - method = new PutMethod(storageURL+"/"+sanitizeForURI(name)); - method.getParams().setSoTimeout(connectionTimeOut); - method.setRequestHeader(FilesConstants.X_AUTH_TOKEN, authToken); - client.executeMethod(method); - response = new FilesResponse(method); + method = new HttpPut(storageURL+"/"+sanitizeForURI(name)); + method.getParams().setIntParameter("http.socket.timeout", connectionTimeOut); + method.setHeader(FilesConstants.X_AUTH_TOKEN, authToken); + response = new FilesResponse(client.execute(method)); } else { throw new FilesAuthorizationException("Re-login failed", response.getResponseHeaders(), response.getStatusLine()); @@ -946,7 +936,7 @@ else if (response.getStatusCode() == HttpStatus.SC_ACCEPTED) } } finally { - method.releaseConnection(); + method.abort(); } } else @@ -976,21 +966,19 @@ public boolean deleteContainer(String name) throws IOException, HttpException, F { if (isValidContainerName(name)) { - DeleteMethod method = new DeleteMethod(storageURL+"/"+sanitizeForURI(name)); + HttpDelete method = new HttpDelete(storageURL+"/"+sanitizeForURI(name)); try { - method.getParams().setSoTimeout(connectionTimeOut); - method.setRequestHeader(FilesConstants.X_AUTH_TOKEN, authToken); - client.executeMethod(method); - FilesResponse response = new FilesResponse(method); + method.getParams().setIntParameter("http.socket.timeout", connectionTimeOut); + method.setHeader(FilesConstants.X_AUTH_TOKEN, authToken); + FilesResponse response = new FilesResponse(client.execute(method)); if (response.getStatusCode() == HttpStatus.SC_UNAUTHORIZED) { - method.releaseConnection(); + method.abort(); if(login()) { - method = new DeleteMethod(storageURL+"/"+sanitizeForURI(name)); - method.getParams().setSoTimeout(connectionTimeOut); - method.setRequestHeader(FilesConstants.X_AUTH_TOKEN, authToken); - client.executeMethod(method); - response = new FilesResponse(method); + method = new HttpDelete(storageURL+"/"+sanitizeForURI(name)); + method.getParams().setIntParameter("http.socket.timeout", connectionTimeOut); + method.setHeader(FilesConstants.X_AUTH_TOKEN, authToken); + response = new FilesResponse(client.execute(method)); } else { throw new FilesAuthorizationException("Re-login failed", response.getResponseHeaders(), response.getStatusLine()); @@ -1014,7 +1002,7 @@ else if (response.getStatusCode() == HttpStatus.SC_CONFLICT) } } finally { - method.releaseConnection(); + method.abort(); } } else @@ -1045,23 +1033,20 @@ public String cdnEnableContainer(String name) throws IOException, HttpException, { if (isValidContainerName(name)) { - PutMethod method = null; + HttpPut method = null; try { - method = new PutMethod(cdnManagementURL+"/"+sanitizeForURI(name)); - method.getParams().setSoTimeout(connectionTimeOut); - method.setRequestHeader(FilesConstants.X_AUTH_TOKEN, authToken); - client.executeMethod(method); - - FilesResponse response = new FilesResponse(method); + method = new HttpPut(cdnManagementURL+"/"+sanitizeForURI(name)); + method.getParams().setIntParameter("http.socket.timeout", connectionTimeOut); + method.setHeader(FilesConstants.X_AUTH_TOKEN, authToken); + FilesResponse response = new FilesResponse(client.execute(method)); if (response.getStatusCode() == HttpStatus.SC_UNAUTHORIZED) { - method.releaseConnection(); + method.abort(); if(login()) { - method = new PutMethod(cdnManagementURL+"/"+sanitizeForURI(name)); - method.getParams().setSoTimeout(connectionTimeOut); - method.setRequestHeader(FilesConstants.X_AUTH_TOKEN, authToken); - client.executeMethod(method); - response = new FilesResponse(method); + method = new HttpPut(cdnManagementURL+"/"+sanitizeForURI(name)); + method.getParams().setIntParameter("http.socket.timeout", connectionTimeOut); + method.setHeader(FilesConstants.X_AUTH_TOKEN, authToken); + response = new FilesResponse(client.execute(method)); } else { throw new FilesAuthorizationException("Re-login failed", response.getResponseHeaders(), response.getStatusLine()); @@ -1081,7 +1066,7 @@ else if (response.getStatusCode() == HttpStatus.SC_UNAUTHORIZED) { } } finally { - method.releaseConnection(); + method.abort(); } } else @@ -1126,50 +1111,46 @@ private String cdnUpdateContainer(String name, int ttl, boolean enabled, String { if (isValidContainerName(name)) { - PostMethod method = null; + HttpPost method = null; try { - method = new PostMethod(cdnManagementURL+"/"+sanitizeForURI(name)); + method = new HttpPost(cdnManagementURL+"/"+sanitizeForURI(name)); - method.getParams().setSoTimeout(connectionTimeOut); - method.setRequestHeader(FilesConstants.X_AUTH_TOKEN, authToken); + method.getParams().setIntParameter("http.socket.timeout", connectionTimeOut); + method.setHeader(FilesConstants.X_AUTH_TOKEN, authToken); // TTL if (ttl > 0) { - method.setRequestHeader(FilesConstants.X_CDN_TTL, Integer.toString(ttl)); + method.setHeader(FilesConstants.X_CDN_TTL, Integer.toString(ttl)); } // Enabled - method.setRequestHeader(FilesConstants.X_CDN_ENABLED, Boolean.toString(enabled)); + method.setHeader(FilesConstants.X_CDN_ENABLED, Boolean.toString(enabled)); // Log Retention - method.setRequestHeader(FilesConstants.X_CDN_RETAIN_LOGS, Boolean.toString(retainLogs)); + method.setHeader(FilesConstants.X_CDN_RETAIN_LOGS, Boolean.toString(retainLogs)); // Referrer ACL if(referrerAcl != null) { - method.setRequestHeader(FilesConstants.X_CDN_REFERRER_ACL, referrerAcl); + method.setHeader(FilesConstants.X_CDN_REFERRER_ACL, referrerAcl); } // User Agent ACL if(userAgentACL != null) { - method.setRequestHeader(FilesConstants.X_CDN_USER_AGENT_ACL, userAgentACL); + method.setHeader(FilesConstants.X_CDN_USER_AGENT_ACL, userAgentACL); } - client.executeMethod(method); - - FilesResponse response = new FilesResponse(method); + FilesResponse response = new FilesResponse(client.execute(method)); if (response.getStatusCode() == HttpStatus.SC_UNAUTHORIZED) { - method.releaseConnection(); + method.abort(); if(login()) { - new PostMethod(cdnManagementURL+"/"+sanitizeForURI(name)); - method.getParams().setSoTimeout(connectionTimeOut); - method.setRequestHeader(FilesConstants.X_AUTH_TOKEN, authToken); + new HttpPost(cdnManagementURL+"/"+sanitizeForURI(name)); + method.getParams().setIntParameter("http.socket.timeout", connectionTimeOut); + method.setHeader(FilesConstants.X_AUTH_TOKEN, authToken); // TTL if (ttl > 0) { - method.setRequestHeader(FilesConstants.X_CDN_TTL, Integer.toString(ttl)); + method.setHeader(FilesConstants.X_CDN_TTL, Integer.toString(ttl)); } // Enabled - method.setRequestHeader(FilesConstants.X_CDN_ENABLED, Boolean.toString(enabled)); - - client.executeMethod(method); - response = new FilesResponse(method); + method.setHeader(FilesConstants.X_CDN_ENABLED, Boolean.toString(enabled)); + response = new FilesResponse(client.execute(method)); } else { throw new FilesAuthorizationException("Re-login failed", response.getResponseHeaders(), response.getStatusLine()); @@ -1189,7 +1170,7 @@ else if (response.getStatusCode() == HttpStatus.SC_UNAUTHORIZED) { } } finally { if (method != null) { - method.releaseConnection(); + method.abort(); } } } @@ -1220,23 +1201,20 @@ public FilesCDNContainer getCDNContainerInfo(String container) throws IOExceptio if (isLoggedin()) { if (isValidContainerName(container)) { - HeadMethod method = null; + HttpHead method = null; try { - method= new HeadMethod(cdnManagementURL+"/"+sanitizeForURI(container)); - method.getParams().setSoTimeout(connectionTimeOut); - method.setRequestHeader(FilesConstants.X_AUTH_TOKEN, authToken); - client.executeMethod(method); - - FilesResponse response = new FilesResponse(method); + method= new HttpHead(cdnManagementURL+"/"+sanitizeForURI(container)); + method.getParams().setIntParameter("http.socket.timeout", connectionTimeOut); + method.setHeader(FilesConstants.X_AUTH_TOKEN, authToken); + FilesResponse response = new FilesResponse(client.execute(method)); if (response.getStatusCode() == HttpStatus.SC_UNAUTHORIZED) { - method.releaseConnection(); + method.abort(); if(login()) { - method= new HeadMethod(cdnManagementURL+"/"+sanitizeForURI(container)); - method.getParams().setSoTimeout(connectionTimeOut); - method.setRequestHeader(FilesConstants.X_AUTH_TOKEN, authToken); - client.executeMethod(method); - response = new FilesResponse(method); + method= new HttpHead(cdnManagementURL+"/"+sanitizeForURI(container)); + method.getParams().setIntParameter("http.socket.timeout", connectionTimeOut); + method.setHeader(FilesConstants.X_AUTH_TOKEN, authToken); + response = new FilesResponse(client.execute(method)); } else { throw new FilesAuthorizationException("Re-login failed", response.getResponseHeaders(), response.getStatusLine()); @@ -1281,7 +1259,7 @@ else if (response.getStatusCode() == HttpStatus.SC_NOT_FOUND) { } finally { if (method != null) { - method.releaseConnection(); + method.abort(); } } } @@ -1310,23 +1288,20 @@ public boolean isCDNEnabled(String container) throws IOException, HttpException, if (isLoggedin()) { if (isValidContainerName(container)) { - HeadMethod method = null; + HttpHead method = null; try { - method= new HeadMethod(cdnManagementURL+"/"+sanitizeForURI(container)); - method.getParams().setSoTimeout(connectionTimeOut); - method.setRequestHeader(FilesConstants.X_AUTH_TOKEN, authToken); - client.executeMethod(method); - - FilesResponse response = new FilesResponse(method); + method= new HttpHead(cdnManagementURL+"/"+sanitizeForURI(container)); + method.getParams().setIntParameter("http.socket.timeout", connectionTimeOut); + method.setHeader(FilesConstants.X_AUTH_TOKEN, authToken); + FilesResponse response = new FilesResponse(client.execute(method)); if (response.getStatusCode() == HttpStatus.SC_UNAUTHORIZED) { - method.releaseConnection(); + method.abort(); if(login()) { - method= new HeadMethod(cdnManagementURL+"/"+sanitizeForURI(container)); - method.getParams().setSoTimeout(connectionTimeOut); - method.setRequestHeader(FilesConstants.X_AUTH_TOKEN, authToken); - client.executeMethod(method); - response = new FilesResponse(method); + method= new HttpHead(cdnManagementURL+"/"+sanitizeForURI(container)); + method.getParams().setIntParameter("http.socket.timeout", connectionTimeOut); + method.setHeader(FilesConstants.X_AUTH_TOKEN, authToken); + response = new FilesResponse(client.execute(method)); } else { throw new FilesAuthorizationException("Re-login failed", response.getResponseHeaders(), response.getStatusLine()); @@ -1357,7 +1332,7 @@ else if (response.getStatusCode() == HttpStatus.SC_NOT_FOUND) { } finally { if (method != null) { - method.releaseConnection(); + method.abort(); } } } @@ -1476,35 +1451,28 @@ public List listCdnContainers(int limit, String marker) throws IOExcepti { if (this.isLoggedin()) { - GetMethod method = null; + HttpGet method = null; try { - method = new GetMethod(cdnManagementURL); - method.getParams().setSoTimeout(connectionTimeOut); - method.setRequestHeader(FilesConstants.X_AUTH_TOKEN, authToken); - LinkedList params = new LinkedList(); + LinkedList params = new LinkedList(); if (limit > 0) { - params.add(new NameValuePair("limit", String.valueOf(limit))); + params.add(new BasicNameValuePair("limit", String.valueOf(limit))); } if (marker != null) { - params.add(new NameValuePair("marker", marker)); - } - if (params.size() > 0) { - method.setQueryString(params.toArray(new NameValuePair[params.size()])); + params.add(new BasicNameValuePair("marker", marker)); } - client.executeMethod(method); - FilesResponse response = new FilesResponse(method); + String uri = (params.size() > 0) ? makeURI(cdnManagementURL, params) : cdnManagementURL; + method = new HttpGet(uri); + method.getParams().setIntParameter("http.socket.timeout", connectionTimeOut); + method.setHeader(FilesConstants.X_AUTH_TOKEN, authToken); + FilesResponse response = new FilesResponse(client.execute(method)); if (response.getStatusCode() == HttpStatus.SC_UNAUTHORIZED) { - method.releaseConnection(); + method.abort(); if(login()) { - method = new GetMethod(cdnManagementURL); - method.getParams().setSoTimeout(connectionTimeOut); - method.setRequestHeader(FilesConstants.X_AUTH_TOKEN, authToken); - if (params.size() > 0) { - method.setQueryString(params.toArray(new NameValuePair[params.size()])); - } - client.executeMethod(method); - response = new FilesResponse(method); + method = new HttpGet(uri); + method.getParams().setIntParameter("http.socket.timeout", connectionTimeOut); + method.setHeader(FilesConstants.X_AUTH_TOKEN, authToken); + response = new FilesResponse(client.execute(method)); } else { throw new FilesAuthorizationException("Re-login failed", response.getResponseHeaders(), response.getStatusLine()); @@ -1513,7 +1481,7 @@ public List listCdnContainers(int limit, String marker) throws IOExcepti if (response.getStatusCode() == HttpStatus.SC_OK) { - StrTokenizer tokenize = new StrTokenizer(inputStreamToString(response.getResponseBodyAsStream(), method.getResponseCharSet())); + StrTokenizer tokenize = new StrTokenizer(response.getResponseBodyAsString()); tokenize.setDelimiterString("\n"); String [] containers = tokenize.getTokenArray(); List returnValue = new ArrayList(); @@ -1532,7 +1500,7 @@ else if (response.getStatusCode() == HttpStatus.SC_UNAUTHORIZED) { } } finally { - if (method != null) method.releaseConnection(); + if (method != null) method.abort(); } } else { @@ -1582,34 +1550,31 @@ public List listCdnContainerInfo(int limit, String marker) th { if (this.isLoggedin()) { - GetMethod method = null; + HttpGet method = null; try { - method = new GetMethod(cdnManagementURL); - method.getParams().setSoTimeout(connectionTimeOut); - method.setRequestHeader(FilesConstants.X_AUTH_TOKEN, authToken); LinkedList params = new LinkedList(); - params.add(new NameValuePair("format", "xml")); + params.add(new BasicNameValuePair("format", "xml")); if (limit > 0) { - params.add(new NameValuePair("limit", String.valueOf(limit))); + params.add(new BasicNameValuePair("limit", String.valueOf(limit))); } if (marker != null) { - params.add(new NameValuePair("marker", marker)); + params.add(new BasicNameValuePair("marker", marker)); } - method.setQueryString(params.toArray(new NameValuePair[params.size()])); + String uri = params.size() > 0 ? makeURI(cdnManagementURL, params) : cdnManagementURL; + method = new HttpGet(uri); + method.getParams().setIntParameter("http.socket.timeout", connectionTimeOut); + method.setHeader(FilesConstants.X_AUTH_TOKEN, authToken); - client.executeMethod(method); - FilesResponse response = new FilesResponse(method); + FilesResponse response = new FilesResponse(client.execute(method)); if (response.getStatusCode() == HttpStatus.SC_UNAUTHORIZED) { - method.releaseConnection(); + method.abort(); if(login()) { - method = new GetMethod(cdnManagementURL); - method.getParams().setSoTimeout(connectionTimeOut); - method.setRequestHeader(FilesConstants.X_AUTH_TOKEN, authToken); - method.setQueryString(params.toArray(new NameValuePair[params.size()])); + method = new HttpGet(uri); + method.getParams().setIntParameter("http.socket.timeout", connectionTimeOut); + method.setHeader(FilesConstants.X_AUTH_TOKEN, authToken); - client.executeMethod(method); - response = new FilesResponse(method); + response = new FilesResponse(client.execute(method)); } else { throw new FilesAuthorizationException("Re-login failed", response.getResponseHeaders(), response.getStatusLine()); @@ -1685,7 +1650,7 @@ else if (response.getStatusCode() == HttpStatus.SC_UNAUTHORIZED) { throw new FilesException("Problem parsing XML", ex); } finally { - if (method != null) method.releaseConnection(); + if (method != null) method.abort(); } } else { @@ -1771,36 +1736,34 @@ public boolean storeObjectAs (String container, File obj, String contentType, St throw new IOException("The alleged file was a directory"); } - PutMethod method = null; + HttpPut method = null; try { - method = new PutMethod(storageURL+"/"+sanitizeForURI(container)+"/"+sanitizeForURI(name)); - method.getParams().setSoTimeout(connectionTimeOut); - method.setRequestHeader(FilesConstants.X_AUTH_TOKEN, authToken); + method = new HttpPut(storageURL+"/"+sanitizeForURI(container)+"/"+sanitizeForURI(name)); + method.getParams().setIntParameter("http.socket.timeout", connectionTimeOut); + method.setHeader(FilesConstants.X_AUTH_TOKEN, authToken); if (useETag) { - method.setRequestHeader(FilesConstants.E_TAG, md5Sum (obj)); + method.setHeader(FilesConstants.E_TAG, md5Sum (obj)); } - method.setRequestEntity( new RequestEntityWrapper(new FileRequestEntity (obj, contentType), callback)); + method.setEntity( new RequestEntityWrapper(new FileEntity (obj, contentType), callback)); for(String key : metadata.keySet()) { - method.setRequestHeader(FilesConstants.X_OBJECT_META + key, sanitizeForURI(metadata.get(key))); + method.setHeader(FilesConstants.X_OBJECT_META + key, sanitizeForURI(metadata.get(key))); } - client.executeMethod(method); - FilesResponse response = new FilesResponse(method); + FilesResponse response = new FilesResponse(client.execute(method)); if (response.getStatusCode() == HttpStatus.SC_UNAUTHORIZED) { - method.releaseConnection(); + method.abort(); if(login()) { - method = new PutMethod(storageURL+"/"+sanitizeForURI(container)+"/"+sanitizeForURI(name)); - method.getParams().setSoTimeout(connectionTimeOut); - method.setRequestHeader(FilesConstants.X_AUTH_TOKEN, authToken); + method = new HttpPut(storageURL+"/"+sanitizeForURI(container)+"/"+sanitizeForURI(name)); + method.getParams().setIntParameter("http.socket.timeout", connectionTimeOut); + method.setHeader(FilesConstants.X_AUTH_TOKEN, authToken); if (useETag) { - method.setRequestHeader(FilesConstants.E_TAG, md5Sum (obj)); + method.setHeader(FilesConstants.E_TAG, md5Sum (obj)); } - method.setRequestEntity( new RequestEntityWrapper(new FileRequestEntity (obj, contentType), callback)); + method.setEntity( new RequestEntityWrapper(new FileEntity (obj, contentType), callback)); for(String key : metadata.keySet()) { - method.setRequestHeader(FilesConstants.X_OBJECT_META + key, sanitizeForURI(metadata.get(key))); + method.setHeader(FilesConstants.X_OBJECT_META + key, sanitizeForURI(metadata.get(key))); } - client.executeMethod(method); - response = new FilesResponse(method); + response = new FilesResponse(client.execute(method)); } else { throw new FilesAuthorizationException("Re-login failed", response.getResponseHeaders(), response.getStatusLine()); @@ -1824,7 +1787,7 @@ else if (response.getStatusCode() == HttpStatus.SC_LENGTH_REQUIRED) } } finally { - if (method != null) method.releaseConnection(); + if (method != null) method.abort(); } } else @@ -1896,37 +1859,40 @@ public boolean storeObject(String container, byte obj[], String contentType, Str if (isValidContainerName(container) && isValidObjectName(objName)) { - PutMethod method = null; + HttpPut method = null; try { - method = new PutMethod(storageURL+"/"+sanitizeForURI(container)+"/"+sanitizeForURI(objName)); - method.getParams().setSoTimeout(connectionTimeOut); - method.setRequestHeader(FilesConstants.X_AUTH_TOKEN, authToken); + method = new HttpPut(storageURL+"/"+sanitizeForURI(container)+"/"+sanitizeForURI(objName)); + method.getParams().setIntParameter("http.socket.timeout", connectionTimeOut); + method.setHeader(FilesConstants.X_AUTH_TOKEN, authToken); if (useETag) { - method.setRequestHeader(FilesConstants.E_TAG, md5Sum (obj)); + method.setHeader(FilesConstants.E_TAG, md5Sum (obj)); } - method.setRequestEntity(new RequestEntityWrapper(new ByteArrayRequestEntity (obj, contentType), callback)); + ByteArrayEntity entity = new ByteArrayEntity (obj); + entity.setContentType(contentType); + method.setEntity(new RequestEntityWrapper(entity, callback)); for(String key : metadata.keySet()) { // logger.warn("Key:" + key + ":" + sanitizeForURI(metadata.get(key))); - method.setRequestHeader(FilesConstants.X_OBJECT_META + key, sanitizeForURI(metadata.get(key))); + method.setHeader(FilesConstants.X_OBJECT_META + key, sanitizeForURI(metadata.get(key))); } - client.executeMethod(method); - FilesResponse response = new FilesResponse(method); + + FilesResponse response = new FilesResponse(client.execute(method)); if (response.getStatusCode() == HttpStatus.SC_UNAUTHORIZED) { - method.releaseConnection(); + method.abort(); if(login()) { - method = new PutMethod(storageURL+"/"+sanitizeForURI(container)+"/"+sanitizeForURI(objName)); - method.getParams().setSoTimeout(connectionTimeOut); - method.setRequestHeader(FilesConstants.X_AUTH_TOKEN, authToken); + method = new HttpPut(storageURL+"/"+sanitizeForURI(container)+"/"+sanitizeForURI(objName)); + method.getParams().setIntParameter("http.socket.timeout", connectionTimeOut); + method.setHeader(FilesConstants.X_AUTH_TOKEN, authToken); if (useETag) { - method.setRequestHeader(FilesConstants.E_TAG, md5Sum (obj)); + method.setHeader(FilesConstants.E_TAG, md5Sum (obj)); } - method.setRequestEntity(new RequestEntityWrapper(new ByteArrayRequestEntity (obj, contentType), callback)); + entity = new ByteArrayEntity (obj); + entity.setContentType(contentType); + method.setEntity(new RequestEntityWrapper(entity, callback)); for(String key : metadata.keySet()) { - method.setRequestHeader(FilesConstants.X_OBJECT_META + key, sanitizeForURI(metadata.get(key))); + method.setHeader(FilesConstants.X_OBJECT_META + key, sanitizeForURI(metadata.get(key))); } - client.executeMethod(method); - response = new FilesResponse(method); + response = new FilesResponse(client.execute(method)); } else { throw new FilesAuthorizationException("Re-login failed", response.getResponseHeaders(), response.getStatusLine()); @@ -1951,7 +1917,7 @@ else if (response.getStatusCode() == HttpStatus.SC_LENGTH_REQUIRED) } } finally{ - if (method != null) method.releaseConnection(); + if (method != null) method.abort(); } } else @@ -1991,20 +1957,22 @@ public boolean storeStreamedObject(String container, InputStream data, String co String objName = name; if (isValidContainerName(container) && isValidObjectName(objName)) { - PutMethod method = new PutMethod(storageURL+"/"+sanitizeForURI(container)+"/"+sanitizeForURI(objName)); - method.setContentChunked(true); - method.getParams().setSoTimeout(connectionTimeOut); - method.setRequestHeader(FilesConstants.X_AUTH_TOKEN, authToken); - method.setRequestEntity(new InputStreamRequestEntity(data, contentType)); + HttpPut method = new HttpPut(storageURL+"/"+sanitizeForURI(container)+"/"+sanitizeForURI(objName)); + method.getParams().setIntParameter("http.socket.timeout", connectionTimeOut); + method.setHeader(FilesConstants.X_AUTH_TOKEN, authToken); + InputStreamEntity entity = new InputStreamEntity(data, -1); + entity.setChunked(true); + entity.setContentType(contentType); + method.setEntity(entity); for(String key : metadata.keySet()) { // logger.warn("Key:" + key + ":" + sanitizeForURI(metadata.get(key))); - method.setRequestHeader(FilesConstants.X_OBJECT_META + key, sanitizeForURI(metadata.get(key))); + method.setHeader(FilesConstants.X_OBJECT_META + key, sanitizeForURI(metadata.get(key))); } - method.removeRequestHeader("Content-Length"); + method.removeHeaders("Content-Length"); + try { - client.executeMethod(method); - FilesResponse response = new FilesResponse(method); + FilesResponse response = new FilesResponse(client.execute(method)); if (response.getStatusCode() == HttpStatus.SC_CREATED) { @@ -2017,7 +1985,7 @@ public boolean storeStreamedObject(String container, InputStream data, String co } } finally { - method.releaseConnection(); + method.abort(); } } else @@ -2048,42 +2016,40 @@ public boolean storeStreamedObject(String container, InputStream data, String co * @throws HttpException There was a protocol level error talking to CloudFiles * @throws FilesException There was an error talking to CloudFiles. */ -public boolean storeObjectAs(String container, String name, RequestEntity entity, Map metadata, String md5sum) throws IOException, HttpException, FilesException +public boolean storeObjectAs(String container, String name, HttpEntity entity, Map metadata, String md5sum) throws IOException, HttpException, FilesException { if (this.isLoggedin()) { String objName = name; if (isValidContainerName(container) && isValidObjectName(objName)) { - PutMethod method = new PutMethod(storageURL+"/"+sanitizeForURI(container)+"/"+sanitizeForURI(objName)); - method.getParams().setSoTimeout(connectionTimeOut); - method.setRequestHeader(FilesConstants.X_AUTH_TOKEN, authToken); - method.setRequestEntity(entity); + HttpPut method = new HttpPut(storageURL+"/"+sanitizeForURI(container)+"/"+sanitizeForURI(objName)); + method.getParams().setIntParameter("http.socket.timeout", connectionTimeOut); + method.setHeader(FilesConstants.X_AUTH_TOKEN, authToken); + method.setEntity(entity); if (useETag && md5sum != null) { - method.setRequestHeader(FilesConstants.E_TAG, md5sum); + method.setHeader(FilesConstants.E_TAG, md5sum); } - method.setRequestHeader("Content-Type", entity.getContentType()); + method.setHeader(entity.getContentType()); for(String key : metadata.keySet()) { - method.setRequestHeader(FilesConstants.X_OBJECT_META + key, sanitizeForURI(metadata.get(key))); + method.setHeader(FilesConstants.X_OBJECT_META + key, sanitizeForURI(metadata.get(key))); } try { - client.executeMethod(method); - FilesResponse response = new FilesResponse(method); + FilesResponse response = new FilesResponse(client.execute(method)); if (response.getStatusCode() == HttpStatus.SC_UNAUTHORIZED) { - method.releaseConnection(); + method.abort(); login(); - method = new PutMethod(storageURL+"/"+sanitizeForURI(container)+"/"+sanitizeForURI(objName)); - method.getParams().setSoTimeout(connectionTimeOut); - method.setRequestHeader(FilesConstants.X_AUTH_TOKEN, authToken); - method.setRequestEntity(entity); - method.setRequestHeader("Content-Type", entity.getContentType()); + method = new HttpPut(storageURL+"/"+sanitizeForURI(container)+"/"+sanitizeForURI(objName)); + method.getParams().setIntParameter("http.socket.timeout", connectionTimeOut); + method.setHeader(FilesConstants.X_AUTH_TOKEN, authToken); + method.setEntity(entity); + method.setHeader(entity.getContentType()); for(String key : metadata.keySet()) { - method.setRequestHeader(FilesConstants.X_OBJECT_META + key, sanitizeForURI(metadata.get(key))); + method.setHeader(FilesConstants.X_OBJECT_META + key, sanitizeForURI(metadata.get(key))); } - client.executeMethod(method); - response = new FilesResponse(method); + response = new FilesResponse(client.execute(method)); } if (response.getStatusCode() == HttpStatus.SC_CREATED) @@ -2097,7 +2063,7 @@ public boolean storeObjectAs(String container, String name, RequestEntity entity } } finally { - method.releaseConnection(); + method.abort(); } } else @@ -2131,23 +2097,21 @@ public void deleteObject (String container, String objName) throws IOException, { if (isValidContainerName(container) && isValidObjectName(objName)) { - DeleteMethod method = null; + HttpDelete method = null; try { - method = new DeleteMethod(storageURL+"/"+sanitizeForURI(container)+"/"+sanitizeForURI(objName)); - method.getParams().setSoTimeout(connectionTimeOut); - method.setRequestHeader(FilesConstants.X_AUTH_TOKEN, authToken); - client.executeMethod(method); - FilesResponse response = new FilesResponse(method); + method = new HttpDelete(storageURL+"/"+sanitizeForURI(container)+"/"+sanitizeForURI(objName)); + method.getParams().setIntParameter("http.socket.timeout", connectionTimeOut); + method.setHeader(FilesConstants.X_AUTH_TOKEN, authToken); + FilesResponse response = new FilesResponse(client.execute(method)); if (response.getStatusCode() == HttpStatus.SC_UNAUTHORIZED) { - method.releaseConnection(); + method.abort(); login(); - method = new DeleteMethod(storageURL+"/"+sanitizeForURI(container)+"/"+sanitizeForURI(objName)); - method.getParams().setSoTimeout(connectionTimeOut); - method.getParams().setSoTimeout(connectionTimeOut); - method.setRequestHeader(FilesConstants.X_AUTH_TOKEN, authToken); - client.executeMethod(method); - response = new FilesResponse(method); + method = new HttpDelete(storageURL+"/"+sanitizeForURI(container)+"/"+sanitizeForURI(objName)); + method.getParams().setIntParameter("http.socket.timeout", connectionTimeOut); + method.getParams().setIntParameter("http.socket.timeout", connectionTimeOut); + method.setHeader(FilesConstants.X_AUTH_TOKEN, authToken); + response = new FilesResponse(client.execute(method)); } @@ -2164,7 +2128,7 @@ else if (response.getStatusCode() == HttpStatus.SC_NOT_FOUND) } } finally { - if (method != null) method.releaseConnection(); + if (method != null) method.abort(); } } else @@ -2201,21 +2165,18 @@ public FilesObjectMetaData getObjectMetaData (String container, String objName) { if (isValidContainerName(container) && isValidObjectName(objName)) { - HeadMethod method = new HeadMethod(storageURL+"/"+sanitizeForURI(container)+"/"+sanitizeForURI(objName)); + HttpHead method = new HttpHead(storageURL+"/"+sanitizeForURI(container)+"/"+sanitizeForURI(objName)); try { - method.getParams().setSoTimeout(connectionTimeOut); - method.setRequestHeader(FilesConstants.X_AUTH_TOKEN, authToken); - client.executeMethod(method); - - FilesResponse response = new FilesResponse(method); + method.getParams().setIntParameter("http.socket.timeout", connectionTimeOut); + method.setHeader(FilesConstants.X_AUTH_TOKEN, authToken); + FilesResponse response = new FilesResponse(client.execute(method)); if (response.getStatusCode() == HttpStatus.SC_UNAUTHORIZED) { - method.releaseConnection(); + method.abort(); login(); - method.getParams().setSoTimeout(connectionTimeOut); - method.setRequestHeader(FilesConstants.X_AUTH_TOKEN, authToken); - client.executeMethod(method); - response = new FilesResponse(method); + method.getParams().setIntParameter("http.socket.timeout", connectionTimeOut); + method.setHeader(FilesConstants.X_AUTH_TOKEN, authToken); + response = new FilesResponse(client.execute(method)); } if (response.getStatusCode() == HttpStatus.SC_NO_CONTENT || @@ -2255,7 +2216,7 @@ else if (response.getStatusCode() == HttpStatus.SC_NOT_FOUND) } } finally { - method.releaseConnection(); + method.abort(); } } else @@ -2292,15 +2253,12 @@ public byte[] getObject (String container, String objName) throws IOException, H { if (isValidContainerName(container) && isValidObjectName(objName)) { - GetMethod method = new GetMethod(storageURL+"/"+sanitizeForURI(container)+"/"+sanitizeForURI(objName)); - method.getParams().setSoTimeout(connectionTimeOut); - method.setRequestHeader(FilesConstants.X_AUTH_TOKEN, authToken); + HttpGet method = new HttpGet(storageURL+"/"+sanitizeForURI(container)+"/"+sanitizeForURI(objName)); + method.getParams().setIntParameter("http.socket.timeout", connectionTimeOut); + method.setHeader(FilesConstants.X_AUTH_TOKEN, authToken); try { - client.executeMethod(method); - - - FilesResponse response = new FilesResponse(method); + FilesResponse response = new FilesResponse(client.execute(method)); if (response.getStatusCode() == HttpStatus.SC_OK) { @@ -2314,7 +2272,7 @@ else if (response.getStatusCode() == HttpStatus.SC_NOT_FOUND) } } finally { - method.releaseConnection(); + method.abort(); } } else @@ -2358,20 +2316,18 @@ public InputStream getObjectAsStream (String container, String objName) throws I logger.warn ("Truncated Object Name is: " + objName); } - GetMethod method = new GetMethod(storageURL+"/"+sanitizeForURI(container)+"/"+sanitizeForURI(objName)); - method.getParams().setSoTimeout(connectionTimeOut); - method.setRequestHeader(FilesConstants.X_AUTH_TOKEN, authToken); - client.executeMethod(method); - FilesResponse response = new FilesResponse(method); + HttpGet method = new HttpGet(storageURL+"/"+sanitizeForURI(container)+"/"+sanitizeForURI(objName)); + method.getParams().setIntParameter("http.socket.timeout", connectionTimeOut); + method.setHeader(FilesConstants.X_AUTH_TOKEN, authToken); + FilesResponse response = new FilesResponse(client.execute(method)); if (response.getStatusCode() == HttpStatus.SC_UNAUTHORIZED) { - method.releaseConnection(); + method.abort(); login(); - method = new GetMethod(storageURL+"/"+sanitizeForURI(container)+"/"+sanitizeForURI(objName)); - method.getParams().setSoTimeout(connectionTimeOut); - method.setRequestHeader(FilesConstants.X_AUTH_TOKEN, authToken); - client.executeMethod(method); - response = new FilesResponse(method); + method = new HttpGet(storageURL+"/"+sanitizeForURI(container)+"/"+sanitizeForURI(objName)); + method.getParams().setIntParameter("http.socket.timeout", connectionTimeOut); + method.setHeader(FilesConstants.X_AUTH_TOKEN, authToken); + response = new FilesResponse(client.execute(method)); } if (response.getStatusCode() == HttpStatus.SC_OK) @@ -2382,7 +2338,7 @@ public InputStream getObjectAsStream (String container, String objName) throws I } else if (response.getStatusCode() == HttpStatus.SC_NOT_FOUND) { - method.releaseConnection(); + method.abort(); throw new FilesNotFoundException("Container: " + container + " did not have object " + objName, response.getResponseHeaders(), response.getStatusLine()); } @@ -2664,11 +2620,11 @@ public void setUseETag(boolean useETag) { } public void setUserAgent(String userAgent) { - client.getParams().setParameter(HttpMethodParams.USER_AGENT, userAgent); + client.getParams().setParameter(HTTP.USER_AGENT, userAgent); } public String getUserAgent() { - return client.getParams().getParameter(HttpMethodParams.USER_AGENT).toString(); + return client.getParams().getParameter(HTTP.USER_AGENT).toString(); } private boolean isValidContainerName(String name) { @@ -2698,36 +2654,31 @@ public String getCdnManagementURL() { /** * @param config */ - public void setHostConfiguration(HostConfiguration config) { - client.setHostConfiguration(config); - } - private HttpMethod doUpdateObjectMetadata(String container, + /*public void setHostConfiguration(HostConfiguration config) { + client.setHostConfiguration(config); + } */ + private HttpResponse doUpdateObjectMetadata(String container, String object, Map metadata) throws HttpException, IOException { - HttpClient httpClient; - PostMethod method; + HttpPost method; - method = new PostMethod(storageURL + + method = new HttpPost(storageURL + "/"+FilesClient.sanitizeForURI(container)+ "/"+FilesClient.sanitizeForURI(object)); - method.getParams().setSoTimeout(connectionTimeOut); - method.setRequestHeader(FilesConstants.X_AUTH_TOKEN, authToken); + method.getParams().setIntParameter("http.socket.timeout", connectionTimeOut); + method.setHeader(FilesConstants.X_AUTH_TOKEN, authToken); if (!(metadata == null || metadata.isEmpty())) { for(String key:metadata.keySet()) - method.setRequestHeader(FilesConstants.X_OBJECT_META+key, + method.setHeader(FilesConstants.X_OBJECT_META+key, FilesClient.sanitizeForURI(metadata.get(key))); } - - httpClient = new HttpClient(); - httpClient.executeMethod(method); - return method; + return client.execute(method); } - + public boolean updateObjectMetadata(String container, String object, Map metadata) throws FilesAuthorizationException, HttpException, IOException, FilesInvalidNameException { - HttpMethod method; FilesResponse response; if (!isLoggedin) { @@ -2740,24 +2691,49 @@ public boolean updateObjectMetadata(String container, String object, if (!isValidObjectName(object)) throw new FilesInvalidNameException(object); - method = null; try { - method = doUpdateObjectMetadata(container, object, metadata); - response = new FilesResponse(method); + HttpResponse resp = doUpdateObjectMetadata(container, object, metadata); + response = new FilesResponse(resp); if (response.getStatusCode() == HttpStatus.SC_UNAUTHORIZED) { - method.releaseConnection(); + // method.abort(); TODO: Update this if(login()) { - method = doUpdateObjectMetadata(container, object, metadata); + doUpdateObjectMetadata(container, object, metadata); } } return true; } finally { - if (method != null) - method.releaseConnection(); + //if (method != null) + // method.abort(); //TODO: Update this } } + + private String makeURI(String base, List parameters) { + return base + "?" + URLEncodedUtils.format(parameters, "UTF-8"); + } + + /* + * + *private void setQueryParameters(HttpRequestBase method, List parameters) throws FilesException{ + URI oldURI = method.getURI(); + try { + URI newURI = URIUtils.createURI(oldURI.getScheme(), oldURI.getHost(), -1, + URLEncoder.encode(oldURI.getPath(), "UTF-8"), URLEncodedUtils.format(parameters, "UTF-8"), null); + logger.warn("Old Path: " + oldURI.getPath()); + logger.warn("New URI: " + newURI); + method.setURI(newURI); + } + catch (UnsupportedEncodingException uee) { + logger.error("Somehow, we don't have UTF-8, this is quite a surprise", uee); + throw new FilesException("Somehow, we don't have UTF-8, this is quite a surprise", uee); + } + catch (URISyntaxException use) { + logger.error("Bad Syntax", use); + throw new FilesException("Bad URL Syntax", use); + } + } + */ public void useSnet(){ if(snet){ } diff --git a/src/main/java/com/rackspacecloud/client/cloudfiles/FilesContainer.java b/src/main/java/com/rackspacecloud/client/cloudfiles/FilesContainer.java index cd2c73d..21d6272 100644 --- a/src/main/java/com/rackspacecloud/client/cloudfiles/FilesContainer.java +++ b/src/main/java/com/rackspacecloud/client/cloudfiles/FilesContainer.java @@ -4,7 +4,7 @@ package com.rackspacecloud.client.cloudfiles; -import org.apache.commons.httpclient.HttpException; +import org.apache.http.HttpException; import org.apache.log4j.Logger; import java.util.List; @@ -72,7 +72,7 @@ public void setName(String name) * @throws FilesAuthorizationException * @throws FilesInvalidNameException */ - public List getObjects() throws HttpException, IOException, FilesAuthorizationException, FilesException + public List getObjects() throws IOException, FilesAuthorizationException, FilesException { if (client != null) diff --git a/src/main/java/com/rackspacecloud/client/cloudfiles/FilesContainerExistsException.java b/src/main/java/com/rackspacecloud/client/cloudfiles/FilesContainerExistsException.java index c430253..e5d3713 100644 --- a/src/main/java/com/rackspacecloud/client/cloudfiles/FilesContainerExistsException.java +++ b/src/main/java/com/rackspacecloud/client/cloudfiles/FilesContainerExistsException.java @@ -3,8 +3,9 @@ */ package com.rackspacecloud.client.cloudfiles; -import org.apache.commons.httpclient.Header; -import org.apache.commons.httpclient.StatusLine; +import org.apache.http.Header; +import org.apache.http.StatusLine; + /** * @author lvaughn diff --git a/src/main/java/com/rackspacecloud/client/cloudfiles/FilesContainerNotEmptyException.java b/src/main/java/com/rackspacecloud/client/cloudfiles/FilesContainerNotEmptyException.java index 56164a7..9daf3ee 100644 --- a/src/main/java/com/rackspacecloud/client/cloudfiles/FilesContainerNotEmptyException.java +++ b/src/main/java/com/rackspacecloud/client/cloudfiles/FilesContainerNotEmptyException.java @@ -3,8 +3,8 @@ */ package com.rackspacecloud.client.cloudfiles; -import org.apache.commons.httpclient.Header; -import org.apache.commons.httpclient.StatusLine; +import org.apache.http.Header; +import org.apache.http.StatusLine; /** * @author lvaughn diff --git a/src/main/java/com/rackspacecloud/client/cloudfiles/FilesException.java b/src/main/java/com/rackspacecloud/client/cloudfiles/FilesException.java index 65d9036..4d46b72 100644 --- a/src/main/java/com/rackspacecloud/client/cloudfiles/FilesException.java +++ b/src/main/java/com/rackspacecloud/client/cloudfiles/FilesException.java @@ -3,9 +3,9 @@ */ package com.rackspacecloud.client.cloudfiles; -import org.apache.commons.httpclient.Header; -import org.apache.commons.httpclient.StatusLine; -import org.apache.commons.httpclient.HttpException; +import org.apache.http.Header; +import org.apache.http.StatusLine; +import org.apache.http.HttpException; /** * @author lvaughn @@ -51,7 +51,7 @@ public String getHttpHeadersAsString () StringBuffer httpHeaderString = new StringBuffer(); for (Header h: httpHeaders) - httpHeaderString.append(h.toExternalForm()); + httpHeaderString.append(h.getName() + ": " + h.getValue() + "\n"); return httpHeaderString.toString(); } @@ -85,7 +85,7 @@ public String getHttpStatusMessage () */ public String getHttpVersion () { - return httpStatusLine == null ? null : httpStatusLine.getHttpVersion(); + return httpStatusLine == null ? null : httpStatusLine.getProtocolVersion().toString(); } } diff --git a/src/main/java/com/rackspacecloud/client/cloudfiles/FilesNotFoundException.java b/src/main/java/com/rackspacecloud/client/cloudfiles/FilesNotFoundException.java index 6580639..5869587 100644 --- a/src/main/java/com/rackspacecloud/client/cloudfiles/FilesNotFoundException.java +++ b/src/main/java/com/rackspacecloud/client/cloudfiles/FilesNotFoundException.java @@ -3,8 +3,8 @@ */ package com.rackspacecloud.client.cloudfiles; -import org.apache.commons.httpclient.Header; -import org.apache.commons.httpclient.StatusLine; +import org.apache.http.Header; +import org.apache.http.StatusLine; /** * @author lvaughn diff --git a/src/main/java/com/rackspacecloud/client/cloudfiles/FilesObject.java b/src/main/java/com/rackspacecloud/client/cloudfiles/FilesObject.java index 3e5b995..1ac93c2 100644 --- a/src/main/java/com/rackspacecloud/client/cloudfiles/FilesObject.java +++ b/src/main/java/com/rackspacecloud/client/cloudfiles/FilesObject.java @@ -5,7 +5,7 @@ package com.rackspacecloud.client.cloudfiles; import org.apache.log4j.Logger; -import org.apache.commons.httpclient.HttpException; +import org.apache.http.HttpException; import java.io.*; import java.security.NoSuchAlgorithmException; @@ -300,6 +300,9 @@ public static FilesObject uploadObject(File obj, String mimeType, FilesContainer // This should never happen logger.fatal("Install doesn't have MD5, can't upload files", nsae); } + catch (HttpException ex) { + throw new FilesException("Error in network operation", ex); + } return result; } diff --git a/src/main/java/com/rackspacecloud/client/cloudfiles/FilesResponse.java b/src/main/java/com/rackspacecloud/client/cloudfiles/FilesResponse.java index 4df4dc7..99720f5 100644 --- a/src/main/java/com/rackspacecloud/client/cloudfiles/FilesResponse.java +++ b/src/main/java/com/rackspacecloud/client/cloudfiles/FilesResponse.java @@ -4,10 +4,12 @@ package com.rackspacecloud.client.cloudfiles; -import org.apache.commons.httpclient.Header; -import org.apache.commons.httpclient.StatusLine; -import org.apache.commons.httpclient.HttpMethod; -import org.apache.commons.httpclient.HttpStatus; +import org.apache.http.Header; +import org.apache.http.HttpResponse; +import org.apache.http.StatusLine; +import org.apache.http.HttpStatus; +import org.apache.http.util.EntityUtils; +import org.apache.http.HttpEntity; import org.apache.log4j.Logger; import java.io.IOException; @@ -15,25 +17,21 @@ public class FilesResponse { - private HttpMethod httpmethod = null; + private HttpResponse response = null; + private HttpEntity entity = null; private static Logger logger = Logger.getLogger(FilesResponse.class); /** * @param method The HttpMethod that generated this response */ - public FilesResponse (HttpMethod method) + public FilesResponse (HttpResponse response) { - httpmethod = method; - + this.response = response; + entity = response.getEntity(); if (logger.isDebugEnabled()) { - logger.debug ("Request Method: "+method.getName()); - logger.debug ("Request Path: " + method.getPath()); - logger.debug ("Status Line: " + getStatusLine()); - Header[] reqHeaders = method.getRequestHeaders(); - for (Header rH: reqHeaders) - logger.debug(rH.toExternalForm()); + logger.debug ("Status Line: " + getStatusLine()); Header [] responseHeaders = getResponseHeaders(); for (int i=0; i < responseHeaders.length;i++) @@ -142,7 +140,7 @@ public String getLastModified () */ public Header[] getResponseHeaders() { - return httpmethod.getResponseHeaders(); + return response.getAllHeaders(); } /** @@ -152,7 +150,7 @@ public Header[] getResponseHeaders() */ public StatusLine getStatusLine() { - return httpmethod.getStatusLine(); + return response.getStatusLine(); } /** @@ -162,7 +160,7 @@ public StatusLine getStatusLine() */ public int getStatusCode () { - return httpmethod.getStatusCode(); + return response.getStatusLine().getStatusCode(); } /** @@ -172,7 +170,7 @@ public int getStatusCode () */ public String getStatusMessage () { - return httpmethod.getStatusText(); + return response.getStatusLine().getReasonPhrase(); } /** @@ -180,10 +178,11 @@ public String getStatusMessage () * * @return The method name */ - public String getMethodName () + /*public String getMethodName () { - return httpmethod.getName(); + return response.getName(); } + */ /** * Returns the response body as text @@ -193,7 +192,7 @@ public String getMethodName () */ public String getResponseBodyAsString () throws IOException { - return httpmethod.getResponseBodyAsString(); + return EntityUtils.toString(entity); } /** @@ -204,7 +203,7 @@ public String getResponseBodyAsString () throws IOException */ public InputStream getResponseBodyAsStream () throws IOException { - return httpmethod.getResponseBodyAsStream(); + return entity.getContent(); } /** @@ -215,7 +214,7 @@ public InputStream getResponseBodyAsStream () throws IOException */ public byte[] getResponseBody () throws IOException { - return httpmethod.getResponseBody(); + return EntityUtils.toByteArray(entity); } /** @@ -226,7 +225,7 @@ public byte[] getResponseBody () throws IOException */ public Header getResponseHeader(String headerName) { - return httpmethod.getResponseHeader(headerName); + return response.getFirstHeader(headerName); } /** @@ -302,6 +301,10 @@ public String getCdnUrl () */ public Header[] getResponseHeaders(String headerName) { - return httpmethod.getResponseHeaders(headerName); + return response.getHeaders(headerName); + } + + public String getContentEncoding() { + return entity.getContentEncoding().getValue(); } } diff --git a/src/main/java/com/rackspacecloud/client/cloudfiles/sample/FilesCli.java b/src/main/java/com/rackspacecloud/client/cloudfiles/sample/FilesCli.java index 0b328e7..83602c1 100644 --- a/src/main/java/com/rackspacecloud/client/cloudfiles/sample/FilesCli.java +++ b/src/main/java/com/rackspacecloud/client/cloudfiles/sample/FilesCli.java @@ -61,7 +61,7 @@ private boolean doLogin() { } return result; - } catch (IOException e) { + } catch (Exception e) { System.out.println("Error logging in!"); e.printStackTrace(); return false; diff --git a/src/main/java/com/rackspacecloud/client/cloudfiles/sample/FilesCopy.java b/src/main/java/com/rackspacecloud/client/cloudfiles/sample/FilesCopy.java index 3ee215c..23ff44b 100644 --- a/src/main/java/com/rackspacecloud/client/cloudfiles/sample/FilesCopy.java +++ b/src/main/java/com/rackspacecloud/client/cloudfiles/sample/FilesCopy.java @@ -8,7 +8,7 @@ import org.apache.commons.lang.SystemUtils; import org.apache.commons.lang.StringUtils; import org.apache.commons.io.FilenameUtils; -import org.apache.commons.httpclient.HttpException; +import org.apache.http.HttpException; import org.apache.log4j.Logger; @@ -234,7 +234,7 @@ public static void main (String args[]) throws NoSuchAlgorithmException, FilesEx System.err.println( "Please see the logs for more details. Error Message: "+err.getMessage() ); }//catch (FilesAuthorizationException err) - catch ( IOException err) + catch ( Exception err) { logger.fatal("IOException : "+ err); System.err.println( "Please see the logs for more details. Error Message: "+err.getMessage() ); diff --git a/src/main/java/com/rackspacecloud/client/cloudfiles/sample/FilesList.java b/src/main/java/com/rackspacecloud/client/cloudfiles/sample/FilesList.java index 6f1bf9e..63b7dee 100644 --- a/src/main/java/com/rackspacecloud/client/cloudfiles/sample/FilesList.java +++ b/src/main/java/com/rackspacecloud/client/cloudfiles/sample/FilesList.java @@ -17,7 +17,7 @@ import org.apache.commons.lang.StringUtils; // import org.apache.log4j.Logger; -import org.apache.commons.httpclient.HttpException; +import org.apache.http.HttpException; import com.rackspacecloud.client.cloudfiles.*; @@ -85,10 +85,11 @@ else if (line.hasOption("H")) System.err.println( "Please see the logs for more details. Error Message: "+err.getMessage() ); err.printStackTrace(System.err); }//catch( ParseException err ) - catch (FilesException err) + catch( HttpException err ) { - System.err.println( "Please see the logs for more details. Error Message: "+err.getMessage() ); - }//catch (FilesAuthorizationException err) + System.err.println( "Please see the logs for more details. Error Message: "+err.getMessage() ); + err.printStackTrace(System.err); + }//catch( ParseException err ) catch ( IOException err) { diff --git a/src/main/java/com/rackspacecloud/client/cloudfiles/sample/FilesMakeContainer.java b/src/main/java/com/rackspacecloud/client/cloudfiles/sample/FilesMakeContainer.java index 5b3ef2a..3c6df66 100644 --- a/src/main/java/com/rackspacecloud/client/cloudfiles/sample/FilesMakeContainer.java +++ b/src/main/java/com/rackspacecloud/client/cloudfiles/sample/FilesMakeContainer.java @@ -7,7 +7,7 @@ //import org.apache.log4j.Logger; import org.apache.commons.lang.StringUtils; import org.apache.commons.cli.*; -import org.apache.commons.httpclient.HttpException; +import org.apache.http.HttpException; import java.io.IOException; import java.security.NoSuchAlgorithmException; @@ -60,7 +60,7 @@ else if (args.length > 0) err.printStackTrace(System.err); }//catch( ParseException err ) - catch ( IOException err) + catch ( Exception err) { System.err.println( "Please see the logs for more details. Error Message: "+err.getMessage() ); }//catch ( IOException err) diff --git a/src/main/java/com/rackspacecloud/client/cloudfiles/sample/FilesRemove.java b/src/main/java/com/rackspacecloud/client/cloudfiles/sample/FilesRemove.java index e48c7eb..74e09a6 100644 --- a/src/main/java/com/rackspacecloud/client/cloudfiles/sample/FilesRemove.java +++ b/src/main/java/com/rackspacecloud/client/cloudfiles/sample/FilesRemove.java @@ -7,7 +7,7 @@ import org.apache.log4j.Logger; import org.apache.commons.lang.StringUtils; import org.apache.commons.cli.*; -import org.apache.commons.httpclient.HttpException; +import org.apache.http.HttpException; import java.io.*; import java.security.NoSuchAlgorithmException; @@ -60,9 +60,9 @@ public static void main (String args[]) throws NoSuchAlgorithmException, FilesEx System.err.println( "Please see the logs for more details. Error Message: "+err.getMessage() ); err.printStackTrace(System.err); }//catch( ParseException err ) - catch ( IOException err) + catch ( Exception err) { - logger.fatal("IOException : "+ err); + logger.fatal("Exception : "+ err); System.err.println( "Please see the logs for more details. Error Message: "+err.getMessage() ); }//catch ( IOException err) }//end main diff --git a/src/main/java/com/rackspacecloud/client/cloudfiles/wrapper/RequestEntityWrapper.java b/src/main/java/com/rackspacecloud/client/cloudfiles/wrapper/RequestEntityWrapper.java index dc6bcca..2c63f5f 100644 --- a/src/main/java/com/rackspacecloud/client/cloudfiles/wrapper/RequestEntityWrapper.java +++ b/src/main/java/com/rackspacecloud/client/cloudfiles/wrapper/RequestEntityWrapper.java @@ -4,9 +4,11 @@ package com.rackspacecloud.client.cloudfiles.wrapper; import java.io.IOException; +import java.io.InputStream; import java.io.OutputStream; -import org.apache.commons.httpclient.methods.RequestEntity; +import org.apache.http.Header; +import org.apache.http.HttpEntity; import com.rackspacecloud.client.cloudfiles.IFilesTransferCallback; @@ -14,11 +16,11 @@ * @author lvaughn * */ -public class RequestEntityWrapper implements RequestEntity { - private RequestEntity entity; +public class RequestEntityWrapper implements HttpEntity { + private HttpEntity entity; private IFilesTransferCallback callback = null; - public RequestEntityWrapper(RequestEntity entity, IFilesTransferCallback callback) { + public RequestEntityWrapper(HttpEntity entity, IFilesTransferCallback callback) { this.entity = entity; this.callback = callback; } @@ -33,7 +35,7 @@ public long getContentLength() { /* (non-Javadoc) * @see org.apache.commons.httpclient.methods.RequestEntity#getContentType() */ - public String getContentType() { + public Header getContentType() { return entity.getContentType(); } @@ -46,9 +48,54 @@ public boolean isRepeatable() { /* (non-Javadoc) * @see org.apache.commons.httpclient.methods.RequestEntity#writeRequest(java.io.OutputStream) - */ + * public void writeRequest(OutputStream stream) throws IOException { - entity.writeRequest(new OutputStreamWrapper(stream, callback)); + ((RequestEntityWrapper) entity).writeRequest(new OutputStreamWrapper(stream, callback)); + + } */ + + /* (non-Javadoc) + * @see org.apache.http.HttpEntity#consumeContent() + */ + @SuppressWarnings("deprecation") + public void consumeContent() throws IOException { + entity.consumeContent(); + + } + + /* (non-Javadoc) + * @see org.apache.http.HttpEntity#getContent() + */ + public InputStream getContent() throws IOException, IllegalStateException { + return entity.getContent(); + } + + /* (non-Javadoc) + * @see org.apache.http.HttpEntity#getContentEncoding() + */ + public Header getContentEncoding() { + return entity.getContentEncoding(); + } + + /* (non-Javadoc) + * @see org.apache.http.HttpEntity#isChunked() + */ + public boolean isChunked() { + return entity.isChunked(); + } + + /* (non-Javadoc) + * @see org.apache.http.HttpEntity#isStreaming() + */ + public boolean isStreaming() { + return entity.isStreaming(); + } + + /* (non-Javadoc) + * @see org.apache.http.HttpEntity#writeTo(java.io.OutputStream) + */ + public void writeTo(OutputStream os) throws IOException { + entity.writeTo(new OutputStreamWrapper(os, callback)); } diff --git a/src/test/java/com/rackspacecloud/client/cloudfiles/FilesClientTestCase.java b/src/test/java/com/rackspacecloud/client/cloudfiles/FilesClientTestCase.java index b21186a..3f75838 100644 --- a/src/test/java/com/rackspacecloud/client/cloudfiles/FilesClientTestCase.java +++ b/src/test/java/com/rackspacecloud/client/cloudfiles/FilesClientTestCase.java @@ -15,7 +15,7 @@ import java.util.Map; import java.util.Random; -import org.apache.commons.httpclient.methods.ByteArrayRequestEntity; +import org.apache.http.entity.ByteArrayEntity; import org.apache.commons.io.FilenameUtils; import org.apache.commons.lang.SystemUtils; import org.apache.log4j.Logger; @@ -82,7 +82,7 @@ public void testLogin() { } public void testAccountInfo() { - String containerName = createTempContainerName("byte-array"); + String containerName = createTempContainerName("acct-info"); String filename = makeFileName("accountinfo"); FilesClient client = new FilesClient(); try { @@ -92,6 +92,7 @@ public void testAccountInfo() { assertFalse(client.containerExists(containerName)); // Add it + //logger.error(client.getStorageURL()); client.createContainer(containerName); // See that it's there @@ -163,13 +164,16 @@ public void testContainerCreation() { FilesClient client = new FilesClient(); try { assertTrue(client.login()); - String containerName = createTempContainerName(""); + String containerName = createTempContainerName("container"); // Make sure it's not there assertFalse(client.containerExists(containerName)); // Add it + //logger.error("Creating the container"); client.createContainer(containerName); + //logger.error("URL:\n" + client.getStorageURL() + "/" + containerName + "\n"); + Thread.sleep(10000); // See that it's there assertTrue(client.containerExists(containerName)); @@ -272,6 +276,7 @@ public void testContainerCreationWithSpaces() { } catch (Exception e) { + e.printStackTrace(); fail(e.getMessage()); } } @@ -748,6 +753,7 @@ public void testContainerListingWithXML() { } catch (Exception e) { + e.printStackTrace(); fail(e.getMessage()); } @@ -804,11 +810,11 @@ public void testLineNoiseSaving() { FilesClient client = new FilesClient(); // client.setUseETag(false); assertTrue(client.login()); - + // Set up client.createContainer(containerName); - // Store it + // Store it assertTrue(client.storeObject(containerName, randomData, "application/octet-stream", filename, new HashMap())); // Make sure it's there @@ -834,6 +840,7 @@ public void testLineNoiseSaving() { } catch (Exception e) { + logger.error("LGV: LINE NOISE", e); e.printStackTrace(); fail(e.getMessage()); } @@ -851,7 +858,9 @@ public void testRequestEntitySaving() { client.createContainer(containerName); // Store it - ByteArrayRequestEntity entity = new ByteArrayRequestEntity(randomData, "test/content_type"); + ByteArrayEntity entity = new ByteArrayEntity(randomData); + entity.setContentType("test/content_type"); + assertTrue(client.storeObjectAs(containerName, filename, entity, new HashMap(), FilesClient.md5Sum(randomData))); // Make sure it's there @@ -1239,6 +1248,7 @@ public void testCDNContainerList() { List containers = client.listCdnContainers(); assertTrue(containers.size() > 0); } catch (Exception e) { + e.printStackTrace(); fail(e.getMessage()); } } From 190bcdcbc1fd5b49745b188fb7b43978b33b3297 Mon Sep 17 00:00:00 2001 From: Lowell Vaughn Date: Tue, 14 Dec 2010 17:28:59 -0600 Subject: [PATCH 29/64] Delimeter support, better auth url support --- .../client/cloudfiles/FilesClient.java | 123 ++++++++++++++---- .../client/cloudfiles/FilesConstants.java | 2 +- .../client/cloudfiles/FilesObject.java | 8 ++ .../cloudfiles/FilesClientTestCase.java | 54 +++++++- 4 files changed, 161 insertions(+), 26 deletions(-) diff --git a/src/main/java/com/rackspacecloud/client/cloudfiles/FilesClient.java b/src/main/java/com/rackspacecloud/client/cloudfiles/FilesClient.java index b5d04ea..e98aad7 100644 --- a/src/main/java/com/rackspacecloud/client/cloudfiles/FilesClient.java +++ b/src/main/java/com/rackspacecloud/client/cloudfiles/FilesClient.java @@ -42,11 +42,17 @@ import org.apache.http.client.methods.HttpPost; import org.apache.http.client.methods.HttpPut; import org.apache.http.client.utils.URLEncodedUtils; +import org.apache.http.conn.scheme.PlainSocketFactory; +import org.apache.http.conn.scheme.Scheme; +import org.apache.http.conn.scheme.SchemeRegistry; +import org.apache.http.conn.ssl.SSLSocketFactory; import org.apache.http.entity.ByteArrayEntity; import org.apache.http.entity.FileEntity; import org.apache.http.entity.InputStreamEntity; import org.apache.http.impl.client.DefaultHttpClient; +import org.apache.http.impl.conn.tsccm.ThreadSafeClientConnManager; import org.apache.http.message.BasicNameValuePair; +import org.apache.http.params.BasicHttpParams; import org.apache.http.protocol.HTTP; import org.apache.log4j.Logger; import org.w3c.dom.Document; @@ -117,8 +123,8 @@ public class FilesClient private boolean useETag = true; private boolean snet = false; private String snetAddr = "https://snet-"; - - private HttpClient client = new DefaultHttpClient(); + + private HttpClient client = null; private static Logger logger = Logger.getLogger(FilesClient.class); @@ -128,20 +134,32 @@ public class FilesClient * @param account The Cloud Files account to use * @param connectionTimeOut The connection timeout, in ms. */ - public FilesClient(String username, String password, String account, int connectionTimeOut) + public FilesClient(String username, String password, String authUrl, String account, int connectionTimeOut) { + BasicHttpParams params = new BasicHttpParams(); + this.username = username; this.password = password; this.account = account; + params.setParameter("http.socket.timeout", this.connectionTimeOut ); + SchemeRegistry schemeRegistry = new SchemeRegistry(); + schemeRegistry.register( + new Scheme("http", PlainSocketFactory.getSocketFactory(), 80)); + schemeRegistry.register( + new Scheme("https", SSLSocketFactory.getSocketFactory(), 443)); + client = new DefaultHttpClient(new ThreadSafeClientConnManager(params, schemeRegistry), params); + + if (authUrl == null) { + authUrl = FilesUtil.getProperty("auth_url"); + } if (account != null && account.length() > 0) { - this.authenticationURL = FilesUtil.getProperty("auth_url")+VERSION+"/"+account+FilesUtil.getProperty("auth_url_post"); + this.authenticationURL = authUrl +VERSION+"/"+account+FilesUtil.getProperty("auth_url_post"); } else { - this.authenticationURL = FilesUtil.getProperty("auth_url"); + this.authenticationURL = authUrl; } this.connectionTimeOut = connectionTimeOut; - client.getParams().setParameter("http.socket.timeout", this.connectionTimeOut ); setUserAgent(FilesConstants.USER_AGENT); if (logger.isDebugEnabled()) { @@ -158,11 +176,11 @@ public FilesClient(String username, String password, String account, int connect * * @param username * @param password - * @param account + * @param authUrl */ - public FilesClient(String username, String password, String account) + public FilesClient(String username, String password, String authUrl) { - this (username, password, account, FilesUtil.getIntProperty("connection_timeout")); + this (username, password, authUrl, null, FilesUtil.getIntProperty("connection_timeout")); } /** @@ -173,7 +191,7 @@ public FilesClient(String username, String password, String account) */ public FilesClient(String username, String apiAccessKey) { - this (username, apiAccessKey, null, FilesUtil.getIntProperty("connection_timeout")); + this (username, apiAccessKey, null, null, FilesUtil.getIntProperty("connection_timeout")); //lConnectionManagerogger.warn("LGV"); //logger.debug("LGV:" + client.getHttpConnectionManager()); } @@ -186,7 +204,8 @@ public FilesClient(String username, String apiAccessKey) public FilesClient() { this (FilesUtil.getProperty("username"), - FilesUtil.getProperty("password"), + FilesUtil.getProperty("password"), + null, FilesUtil.getProperty("account"), FilesUtil.getIntProperty("connection_timeout")); } @@ -530,6 +549,26 @@ else if (response.getStatusCode() == HttpStatus.SC_NOT_FOUND) */ public List listObjectsStartingWith (String container, String startsWith, String path, int limit, String marker) throws IOException, FilesException { + return listObjectsStartingWith(container, startsWith, path, limit, marker, null); + } + /** + * List all of the objects in a container with the given starting string. + * + * @param container The container name + * @param startsWith The string to start with + * @param path Only look for objects in this path + * @param limit Return at most limit objects + * @param marker Returns objects lexicographically greater than marker. Used in conjunction with limit to paginate the list. + * @param delimter Use this argument as the delimiter that separates "directories" + * + * @return A list of FilesObjects starting with the given string + * @throws IOException There was an IO error doing network communication + * @throws HttpException There was an error with the http protocol + * @throws FilesException There was another error in the request to the server. + * @throws FilesAuthorizationException The client's login was invalid. + */ + public List listObjectsStartingWith (String container, String startsWith, String path, int limit, String marker, Character delimiter) throws IOException, FilesException + { if (!this.isLoggedin()) { throw new FilesAuthorizationException("You must be logged in", null, null); } @@ -541,8 +580,7 @@ public List listObjectsStartingWith (String container, String start LinkedList parameters = new LinkedList(); parameters.add(new BasicNameValuePair ("format", "xml")); if (startsWith != null) { - parameters.add(new BasicNameValuePair (FilesConstants.LIST_CONTAINER_NAME_QUERY, startsWith)); - } + parameters.add(new BasicNameValuePair (FilesConstants.LIST_CONTAINER_NAME_QUERY, startsWith)); } if(path != null) { parameters.add(new BasicNameValuePair("path", path)); } @@ -552,6 +590,9 @@ public List listObjectsStartingWith (String container, String start if(marker != null) { parameters.add(new BasicNameValuePair("marker", marker)); } + if (delimiter != null) { + parameters.add(new BasicNameValuePair("delimiter", delimiter.toString())); + } String uri = parameters.size() > 0 ? makeURI(storageURL+"/"+sanitizeForURI(container), parameters) : storageURL; method = new HttpGet(uri); @@ -588,13 +629,19 @@ public List listObjectsStartingWith (String container, String start NodeList objectNodes = containerList.getChildNodes(); for(int i=0; i < objectNodes.getLength(); ++i) { Node objectNode = objectNodes.item(i); - if(!"object".equals(objectNode.getNodeName())) continue; + String nodeName = objectNode.getNodeName(); + if(!("object".equals(nodeName) || "subdir".equals(nodeName))) continue; String name = null; String eTag = null; long size = -1; String mimeType = null; String lastModified = null; NodeList objectData = objectNode.getChildNodes(); + if ("subdir".equals(nodeName)) { + size = 0; + mimeType = "application/directory"; + name = objectNode.getAttributes().getNamedItem("name").getNodeValue(); + } for(int j=0; j < objectData.getLength(); ++j) { Node data = objectData.item(j); if ("name".equals(data.getNodeName())) { @@ -652,10 +699,42 @@ else if (response.getStatusCode() == HttpStatus.SC_NOT_FOUND) } } + /** + * List the objects in a container in lexicographic order. + * + * @param container The container name + * + * @return A list of FilesObjects starting with the given string + * @throws IOException There was an IO error doing network communication + * @throws HttpException There was an error with the http protocol + * @throws FilesException There was another error in the request to the server. + * @throws FilesAuthorizationException The client's login was invalid. + */ + public List listObjects(String container) throws IOException, FilesAuthorizationException, FilesException { + return listObjectsStartingWith(container, null, null, -1, null, null); + } + + /** + * List the objects in a container in lexicographic order. + * + * @param container The container name + * @param delimter Use this argument as the delimiter that separates "directories" + * + * @return A list of FilesObjects starting with the given string + * @throws IOException There was an IO error doing network communication + * @throws HttpException There was an error with the http protocol + * @throws FilesException There was another error in the request to the server. + * @throws FilesAuthorizationException The client's login was invalid. + */ + public List listObjects(String container, Character delimiter) throws IOException, FilesAuthorizationException, FilesException { + return listObjectsStartingWith(container, null, null, -1, null, delimiter); + } + /** * List the objects in a container in lexicographic order. * * @param container The container name + * @param limit Return at most limit objects * * @return A list of FilesObjects starting with the given string * @throws IOException There was an IO error doing network communication @@ -663,24 +742,23 @@ else if (response.getStatusCode() == HttpStatus.SC_NOT_FOUND) * @throws FilesException There was another error in the request to the server. * @throws FilesAuthorizationException The client's login was invalid. */ - public List listObjects(String container) throws IOException, FilesAuthorizationException, FilesException { - return listObjectsStartingWith(container, null, null, -1, null); + public List listObjects(String container, int limit) throws IOException, HttpException, FilesAuthorizationException, FilesException { + return listObjectsStartingWith(container, null, null, limit, null, null); } /** * List the objects in a container in lexicographic order. * * @param container The container name - * @param limit Return at most limit objects + * @param path Only look for objects in this path * * @return A list of FilesObjects starting with the given string * @throws IOException There was an IO error doing network communication * @throws HttpException There was an error with the http protocol * @throws FilesException There was another error in the request to the server. - * @throws FilesAuthorizationException The client's login was invalid. */ - public List listObjects(String container, int limit) throws IOException, HttpException, FilesAuthorizationException, FilesException { - return listObjectsStartingWith(container, null, null, limit, null); + public List listObjects(String container, String path) throws IOException, HttpException, FilesAuthorizationException, FilesException { + return listObjectsStartingWith(container, null, path, -1, null, null); } /** @@ -688,14 +766,15 @@ public List listObjects(String container, int limit) throws IOExcep * * @param container The container name * @param path Only look for objects in this path + * @param delimter Use this argument as the delimiter that separates "directories" * * @return A list of FilesObjects starting with the given string * @throws IOException There was an IO error doing network communication * @throws HttpException There was an error with the http protocol * @throws FilesException There was another error in the request to the server. */ - public List listObjects(String container, String path) throws IOException, HttpException, FilesAuthorizationException, FilesException { - return listObjectsStartingWith(container, null, path, -1, null); + public List listObjects(String container, String path, Character delimiter) throws IOException, HttpException, FilesAuthorizationException, FilesException { + return listObjectsStartingWith(container, null, path, -1, null, delimiter); } /** diff --git a/src/main/java/com/rackspacecloud/client/cloudfiles/FilesConstants.java b/src/main/java/com/rackspacecloud/client/cloudfiles/FilesConstants.java index ac0d979..0c8d321 100644 --- a/src/main/java/com/rackspacecloud/client/cloudfiles/FilesConstants.java +++ b/src/main/java/com/rackspacecloud/client/cloudfiles/FilesConstants.java @@ -12,7 +12,7 @@ public class FilesConstants { private static Logger logger = Logger.getLogger(FilesConstants.class); - public static final String USER_AGENT = "java-cloudfiles/1.5.4"; + public static final String USER_AGENT = "java-cloudfiles/1.6.0"; /** HTTP Header token that identifies the username to Cloud Files **/ public static final String X_STORAGE_USER_DEFAULT = "x-auth-user"; diff --git a/src/main/java/com/rackspacecloud/client/cloudfiles/FilesObject.java b/src/main/java/com/rackspacecloud/client/cloudfiles/FilesObject.java index 1ac93c2..22ae7ac 100644 --- a/src/main/java/com/rackspacecloud/client/cloudfiles/FilesObject.java +++ b/src/main/java/com/rackspacecloud/client/cloudfiles/FilesObject.java @@ -354,4 +354,12 @@ public String getLastModified() throws HttpException, IOException, FilesAuthoriz public void setLastModified(String lastModified) { this.lastModified = lastModified; } + + /** + * + * @return True if the "object" is really a directory. + */ + public boolean isDirectory() { + return this.size == 0 && "application/directory".equals(this.mimeType); + } } diff --git a/src/test/java/com/rackspacecloud/client/cloudfiles/FilesClientTestCase.java b/src/test/java/com/rackspacecloud/client/cloudfiles/FilesClientTestCase.java index 3f75838..a647d54 100644 --- a/src/test/java/com/rackspacecloud/client/cloudfiles/FilesClientTestCase.java +++ b/src/test/java/com/rackspacecloud/client/cloudfiles/FilesClientTestCase.java @@ -43,12 +43,11 @@ public class FilesClientTestCase extends TestCase { private static int NUMBER_RANDOM_BYTES = 513; public void testConstructor() { - FilesClient client = new FilesClient("foo", "bar", "baz"); + FilesClient client = new FilesClient("foo", "bar"); assertNotNull(client); assertEquals("foo", client.getUserName()); assertEquals("bar", client.getPassword()); - assertEquals("baz", client.getAccount()); } @@ -71,6 +70,9 @@ public void testLogin() { } // Now try a failed login + // Note: This causes a warning from DefaultHttpClient along these lines: + // 13 Dec 2010 15:46:26 WARN impl.client.DefaultHttpClient - Authentication error: Unable to respond to any of these challenges: {} + // It's just trying a little too hard to be helpful. client = new FilesClient(FilesUtil.getProperty("username"), FilesUtil.getProperty("password") + " this is a bogus password", FilesUtil.getProperty("account")); @@ -947,6 +949,53 @@ public void testObjectListing() { } } + public void testObjectListingWithDelimiter() { + String containerName = createTempContainerName("delimiter"); + try { + byte randomData[] = makeRandomBytes(); + FilesClient client = new FilesClient(); + assertTrue(client.login()); + + // Set up + client.createContainer(containerName); + + // Store it + for (int i=0; i < 10; i++) { + assertTrue(client.storeObject(containerName, randomData, "application/octet-stream", "foo/testfile" + i + ".bogus", new HashMap())); + assertTrue(client.storeObject(containerName, randomData, "application/octet-stream", "bar/testfile" + i + ".bogus", new HashMap())); + } + + // Make sure it's there + List objects = client.listObjects(containerName); + assertEquals(20, objects.size()); + + // Now check with delimiter + objects = client.listObjects(containerName, new Character('/')); + assertEquals(2, objects.size()); + for(FilesObject obj : objects) { + assertTrue(obj.isDirectory()); + } + + objects = client.listObjects(containerName, "foo", new Character('/')); + assertEquals(10, objects.size()); + for (FilesObject obj : objects) { + assertTrue(obj.getName().startsWith("foo/")); + } + + // Clean up + for (int i=0; i < 10; i++) { + client.deleteObject(containerName, "foo/testfile" + i + ".bogus"); + client.deleteObject(containerName, "bar/testfile" + i + ".bogus"); + } + assertTrue(client.deleteContainer(containerName)); + + } + catch (Exception e) { + e.printStackTrace(); + fail(e.getMessage()); + } + } + public void testContainerListingWithLimitMarker() { try { FilesClient client = new FilesClient(); @@ -1439,7 +1488,6 @@ public void testPathCreationAndListing() { assertFalse(client.containerExists(containerName)); } catch (Exception e) { - e.printStackTrace(); fail(e.getMessage()); } } From ce88b094514bd69112903656c02075be654ba87c Mon Sep 17 00:00:00 2001 From: Lowell Vaughn Date: Tue, 14 Dec 2010 17:31:02 -0600 Subject: [PATCH 30/64] cleaning up libraries --- lib/commons-httpclient-3.1.jar | Bin 305001 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 lib/commons-httpclient-3.1.jar diff --git a/lib/commons-httpclient-3.1.jar b/lib/commons-httpclient-3.1.jar deleted file mode 100644 index 7c59774aed4f5dd08778489aaad565690ff7c132..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 305001 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 tc` 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 te}nOVCD`j|-apix?}<1@fDFJGl From 76dd73ecebfe55f739afbc3f7ff3bd32f7a212f0 Mon Sep 17 00:00:00 2001 From: Lowell Vaughn Date: Wed, 15 Dec 2010 09:17:18 -0600 Subject: [PATCH 31/64] Fixing test case that got dropped by Eclipse --- .../client/cloudfiles/SnetFilesClientTestCase.java | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/test/java/com/rackspacecloud/client/cloudfiles/SnetFilesClientTestCase.java b/src/test/java/com/rackspacecloud/client/cloudfiles/SnetFilesClientTestCase.java index 07b3974..fc5b0b0 100644 --- a/src/test/java/com/rackspacecloud/client/cloudfiles/SnetFilesClientTestCase.java +++ b/src/test/java/com/rackspacecloud/client/cloudfiles/SnetFilesClientTestCase.java @@ -15,7 +15,6 @@ import java.util.Map; import java.util.Random; -import org.apache.commons.httpclient.methods.ByteArrayRequestEntity; import org.apache.commons.io.FilenameUtils; import org.apache.commons.lang.SystemUtils; import org.apache.log4j.Logger; @@ -930,8 +929,7 @@ public void testRequestEntitySaving() { client.createContainer(containerName); // Store it - ByteArrayRequestEntity entity = new ByteArrayRequestEntity(randomData, "test/content_type"); - assertTrue(client.storeObjectAs(containerName, filename, entity, new HashMap(), FilesClient.md5Sum(randomData))); + assertTrue(client.storeObject(containerName, randomData, "test/content_type", filename, new HashMap())); // Make sure it's there List objects = client.listObjects(containerName); From 09a12d41aa5e6e39fb5d6e99b3297c19e06aa67d Mon Sep 17 00:00:00 2001 From: Lowell Vaughn Date: Wed, 15 Dec 2010 09:19:51 -0600 Subject: [PATCH 32/64] Fixing test case that got dropped by Eclipse, updating to get new tag --- .../com/rackspacecloud/client/cloudfiles/FilesConstants.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/rackspacecloud/client/cloudfiles/FilesConstants.java b/src/main/java/com/rackspacecloud/client/cloudfiles/FilesConstants.java index 0c8d321..fa97cbf 100644 --- a/src/main/java/com/rackspacecloud/client/cloudfiles/FilesConstants.java +++ b/src/main/java/com/rackspacecloud/client/cloudfiles/FilesConstants.java @@ -12,7 +12,7 @@ public class FilesConstants { private static Logger logger = Logger.getLogger(FilesConstants.class); - public static final String USER_AGENT = "java-cloudfiles/1.6.0"; + public static final String USER_AGENT = "java-cloudfiles/1.6.1"; /** HTTP Header token that identifies the username to Cloud Files **/ public static final String X_STORAGE_USER_DEFAULT = "x-auth-user"; From 671ee1a1c8502096e05d76a7c5bcc3e62f32a51b Mon Sep 17 00:00:00 2001 From: Lowell Vaughn Date: Mon, 17 Jan 2011 11:08:50 -0600 Subject: [PATCH 33/64] Java 1.5 build and custom HttpClient --- .../client/cloudfiles/FilesClient.java | 67 ++++++++++++------- .../client/cloudfiles/FilesConstants.java | 2 +- .../cloudfiles/FilesClientTestCase.java | 58 ++++++++++++++++ 3 files changed, 103 insertions(+), 24 deletions(-) diff --git a/src/main/java/com/rackspacecloud/client/cloudfiles/FilesClient.java b/src/main/java/com/rackspacecloud/client/cloudfiles/FilesClient.java index e98aad7..bf2e95f 100644 --- a/src/main/java/com/rackspacecloud/client/cloudfiles/FilesClient.java +++ b/src/main/java/com/rackspacecloud/client/cloudfiles/FilesClient.java @@ -42,6 +42,7 @@ import org.apache.http.client.methods.HttpPost; import org.apache.http.client.methods.HttpPut; import org.apache.http.client.utils.URLEncodedUtils; +import org.apache.http.conn.ClientConnectionManager; import org.apache.http.conn.scheme.PlainSocketFactory; import org.apache.http.conn.scheme.Scheme; import org.apache.http.conn.scheme.SchemeRegistry; @@ -53,6 +54,7 @@ import org.apache.http.impl.conn.tsccm.ThreadSafeClientConnManager; import org.apache.http.message.BasicNameValuePair; import org.apache.http.params.BasicHttpParams; +import org.apache.http.params.HttpParams; import org.apache.http.protocol.HTTP; import org.apache.log4j.Logger; import org.w3c.dom.Document; @@ -129,46 +131,65 @@ public class FilesClient private static Logger logger = Logger.getLogger(FilesClient.class); /** + * @param client The HttpClient to talk to Swift * @param username The username to log in to * @param password The password * @param account The Cloud Files account to use * @param connectionTimeOut The connection timeout, in ms. */ - public FilesClient(String username, String password, String authUrl, String account, int connectionTimeOut) - { - BasicHttpParams params = new BasicHttpParams(); - + public FilesClient(HttpClient client, String username, String password, String authUrl, String account, int connectionTimeOut) { + this.client = client; this.username = username; this.password = password; this.account = account; - params.setParameter("http.socket.timeout", this.connectionTimeOut ); - SchemeRegistry schemeRegistry = new SchemeRegistry(); - schemeRegistry.register( - new Scheme("http", PlainSocketFactory.getSocketFactory(), 80)); - schemeRegistry.register( - new Scheme("https", SSLSocketFactory.getSocketFactory(), 443)); - client = new DefaultHttpClient(new ThreadSafeClientConnManager(params, schemeRegistry), params); - - if (authUrl == null) { - authUrl = FilesUtil.getProperty("auth_url"); + if(authUrl == null) { + authUrl = FilesUtil.getProperty("auth_url"); } - if (account != null && account.length() > 0) { - this.authenticationURL = authUrl +VERSION+"/"+account+FilesUtil.getProperty("auth_url_post"); + if(account != null && account.length() > 0) { + this.authenticationURL = authUrl + VERSION + "/" + account + FilesUtil.getProperty("auth_url_post"); } else { - this.authenticationURL = authUrl; + this.authenticationURL = authUrl; } this.connectionTimeOut = connectionTimeOut; setUserAgent(FilesConstants.USER_AGENT); - if (logger.isDebugEnabled()) { - logger.debug("UserName: "+ this.username); - logger.debug("AuthenticationURL: "+ this.authenticationURL); - logger.debug("ConnectionTimeOut: "+ this.connectionTimeOut); + if(logger.isDebugEnabled()) { + logger.debug("UserName: " + this.username); + logger.debug("AuthenticationURL: " + this.authenticationURL); + logger.debug("ConnectionTimeOut: " + this.connectionTimeOut); } - //logger.debug("LGV:" + client.getHttpConnectionManager()); - } + } + + /** + * @param username The username to log in to + * @param password The password + * @param account The Cloud Files account to use + * @param connectionTimeOut The connection timeout, in ms. + */ + public FilesClient(String username, String password, String authUrl, String account, final int connectionTimeOut) + { + this(new DefaultHttpClient() { + protected HttpParams createHttpParams() { + BasicHttpParams params = new BasicHttpParams(); + org.apache.http.params.HttpConnectionParams.setSoTimeout(params, connectionTimeOut); + params.setParameter("http.socket.timeout", connectionTimeOut); + return params; + } + + @Override + protected ClientConnectionManager createClientConnectionManager() { + SchemeRegistry schemeRegistry = new SchemeRegistry(); + schemeRegistry.register( + new Scheme("http", PlainSocketFactory.getSocketFactory(), 80)); + schemeRegistry.register( + new Scheme("https", SSLSocketFactory.getSocketFactory(), 443)); + return new ThreadSafeClientConnManager(createHttpParams(), schemeRegistry); + } + }, username, password, authUrl, account, connectionTimeOut); + + } /** * This method uses the default connection time out of CONNECTON_TIMEOUT. If account diff --git a/src/main/java/com/rackspacecloud/client/cloudfiles/FilesConstants.java b/src/main/java/com/rackspacecloud/client/cloudfiles/FilesConstants.java index fa97cbf..6684e74 100644 --- a/src/main/java/com/rackspacecloud/client/cloudfiles/FilesConstants.java +++ b/src/main/java/com/rackspacecloud/client/cloudfiles/FilesConstants.java @@ -12,7 +12,7 @@ public class FilesConstants { private static Logger logger = Logger.getLogger(FilesConstants.class); - public static final String USER_AGENT = "java-cloudfiles/1.6.1"; + public static final String USER_AGENT = "java-cloudfiles/1.6.2"; /** HTTP Header token that identifies the username to Cloud Files **/ public static final String X_STORAGE_USER_DEFAULT = "x-auth-user"; diff --git a/src/test/java/com/rackspacecloud/client/cloudfiles/FilesClientTestCase.java b/src/test/java/com/rackspacecloud/client/cloudfiles/FilesClientTestCase.java index a647d54..c9e9970 100644 --- a/src/test/java/com/rackspacecloud/client/cloudfiles/FilesClientTestCase.java +++ b/src/test/java/com/rackspacecloud/client/cloudfiles/FilesClientTestCase.java @@ -16,6 +16,7 @@ import java.util.Random; import org.apache.http.entity.ByteArrayEntity; +import org.apache.http.impl.client.DefaultHttpClient; import org.apache.commons.io.FilenameUtils; import org.apache.commons.lang.SystemUtils; import org.apache.log4j.Logger; @@ -390,6 +391,63 @@ public void testContainerNameNoSlashes() { fail(e.getMessage()); } } + public void testCustomHttpClient() { + String containerName = createTempContainerName("customHttp"); + String filename = makeFileName("customHttpFile"); + String fullPath = FilenameUtils.concat(SYSTEM_TMP.getAbsolutePath(), filename); + logger.debug("Test File Location: " + fullPath); + try { + byte randomData[] = makeRandomFile(fullPath); + + DefaultHttpClient httpClient = new DefaultHttpClient(); + + FilesClient client = new FilesClient(httpClient, + FilesUtil.getProperty("username"), + FilesUtil.getProperty("password"), + null, + FilesUtil.getProperty("account"), + FilesUtil.getIntProperty("connection_timeout")); + assertTrue(client.login()); + + // Set up + client.createContainer(containerName); + + // Store it + logger.info("About to save: " + filename); + assertTrue(client.storeObjectAs(containerName, new File(fullPath), "application/octet-stream", filename)); + + // Make sure it's there + List objects = client.listObjects(containerName); + assertEquals(1, objects.size()); + FilesObject obj = objects.get(0); + assertEquals(filename, obj.getName()); + assertEquals("application/octet-stream", obj.getMimeType()); + + // Make sure the data is correct + assertArrayEquals(randomData, client.getObject(containerName, filename)); + + // Make sure the data is correct as a stream + InputStream is = client.getObjectAsStream(containerName, filename); + byte otherData[] = new byte[NUMBER_RANDOM_BYTES]; + is.read(otherData); + assertArrayEquals(randomData, otherData); + assertEquals(-1, is.read()); // Could hang if there's a bug on the other end + + // Clean up + client.deleteObject(containerName, filename); + assertTrue(client.deleteContainer(containerName)); + + } + catch (Exception e) { + e.printStackTrace(); + fail(e.getMessage()); + } + finally { + File f = new File(fullPath); + f.delete(); + } + + } public void testFileSaving() { String containerName = createTempContainerName("file-test"); From 61f5c9c3aa60d6a7742bd5afa7477047ea6cc3d0 Mon Sep 17 00:00:00 2001 From: Lowell Vaughn Date: Mon, 17 Jan 2011 13:15:06 -0600 Subject: [PATCH 34/64] Fix issue where metadata updating isn't releasing the conection --- .../client/cloudfiles/FilesClient.java | 53 ++++++----- .../cloudfiles/FilesClientTestCase.java | 90 ++++++++++++++++++- 2 files changed, 114 insertions(+), 29 deletions(-) diff --git a/src/main/java/com/rackspacecloud/client/cloudfiles/FilesClient.java b/src/main/java/com/rackspacecloud/client/cloudfiles/FilesClient.java index bf2e95f..f88f5e1 100644 --- a/src/main/java/com/rackspacecloud/client/cloudfiles/FilesClient.java +++ b/src/main/java/com/rackspacecloud/client/cloudfiles/FilesClient.java @@ -2754,28 +2754,7 @@ public String getCdnManagementURL() { /** * @param config */ - /*public void setHostConfiguration(HostConfiguration config) { - client.setHostConfiguration(config); - } */ - private HttpResponse doUpdateObjectMetadata(String container, - String object, Map metadata) - throws HttpException, IOException { - HttpPost method; - - method = new HttpPost(storageURL + - "/"+FilesClient.sanitizeForURI(container)+ - "/"+FilesClient.sanitizeForURI(object)); - method.getParams().setIntParameter("http.socket.timeout", connectionTimeOut); - method.setHeader(FilesConstants.X_AUTH_TOKEN, authToken); - if (!(metadata == null || metadata.isEmpty())) { - for(String key:metadata.keySet()) - method.setHeader(FilesConstants.X_OBJECT_META+key, - FilesClient.sanitizeForURI(metadata.get(key))); - } - - return client.execute(method); - } - + public boolean updateObjectMetadata(String container, String object, Map metadata) throws FilesAuthorizationException, HttpException, IOException, FilesInvalidNameException { @@ -2791,20 +2770,40 @@ public boolean updateObjectMetadata(String container, String object, if (!isValidObjectName(object)) throw new FilesInvalidNameException(object); + String postUrl = storageURL + "/"+FilesClient.sanitizeForURI(container) + + "/"+FilesClient.sanitizeForURI(object); + + HttpPost method = null; try { - HttpResponse resp = doUpdateObjectMetadata(container, object, metadata); + method = new HttpPost(postUrl); + method.getParams().setIntParameter("http.socket.timeout", connectionTimeOut); + method.setHeader(FilesConstants.X_AUTH_TOKEN, authToken); + if (!(metadata == null || metadata.isEmpty())) { + for(String key:metadata.keySet()) + method.setHeader(FilesConstants.X_OBJECT_META+key, + FilesClient.sanitizeForURI(metadata.get(key))); + } + HttpResponse resp = client.execute(method); response = new FilesResponse(resp); if (response.getStatusCode() == HttpStatus.SC_UNAUTHORIZED) { - // method.abort(); TODO: Update this + method.abort(); if(login()) { - doUpdateObjectMetadata(container, object, metadata); + method = new HttpPost(postUrl); + method.getParams().setIntParameter("http.socket.timeout", connectionTimeOut); + method.setHeader(FilesConstants.X_AUTH_TOKEN, authToken); + if (!(metadata == null || metadata.isEmpty())) { + for(String key:metadata.keySet()) + method.setHeader(FilesConstants.X_OBJECT_META+key, + FilesClient.sanitizeForURI(metadata.get(key))); + } + client.execute(method); } } return true; } finally { - //if (method != null) - // method.abort(); //TODO: Update this + if (method != null) + method.abort(); } } diff --git a/src/test/java/com/rackspacecloud/client/cloudfiles/FilesClientTestCase.java b/src/test/java/com/rackspacecloud/client/cloudfiles/FilesClientTestCase.java index c9e9970..57d7101 100644 --- a/src/test/java/com/rackspacecloud/client/cloudfiles/FilesClientTestCase.java +++ b/src/test/java/com/rackspacecloud/client/cloudfiles/FilesClientTestCase.java @@ -599,8 +599,7 @@ public void testFileSavingWithCallback() { finally { File f = new File(fullPath); f.delete(); - } - + } } public void testFileSavingWithMetadata() { String containerName = createTempContainerName("meta-data-test"); @@ -670,6 +669,93 @@ public void testFileSavingWithMetadata() { } + public void testMetadataUpdate() { + String containerName = createTempContainerName("metadata-update"); + String filename = makeFileName("random-with-meta"); + String fullPath = FilenameUtils.concat(SYSTEM_TMP.getAbsolutePath(), filename); + logger.info("Test File Location: " + fullPath); + try { + makeRandomFile(fullPath); + + // DefaultHttpClient is single threaded, which will catch a big we've seen with not + // releasing the connection + DefaultHttpClient httpClient = new DefaultHttpClient(); + FilesClient client = new FilesClient(httpClient, + FilesUtil.getProperty("username"), + FilesUtil.getProperty("password"), + null, + FilesUtil.getProperty("account"), + FilesUtil.getIntProperty("connection_timeout")); + assertTrue(client.login()); + + // Set up + client.createContainer(containerName); + + // Store it + HashMap meta = new HashMap(); + meta.put("Foo", "bar"); + meta.put("Uni", "\u0169\u00f1\u00efcode-test"); + meta.put("Width", "336"); + meta.put("Height", "183"); + assertTrue(client.storeObjectAs(containerName, new File(fullPath), "application/octet-stream", filename, meta)); + + // Make sure it's there + List objects = client.listObjects(containerName); + assertEquals(1, objects.size()); + FilesObject obj = objects.get(0); + assertEquals(filename, obj.getName()); + assertEquals("application/octet-stream", obj.getMimeType()); + + // Make sure the metadata is correct + FilesObjectMetaData metadata = client.getObjectMetaData(containerName, filename); + assertNotNull(metadata); + Map serverMetadata = metadata.getMetaData(); + assertEquals(meta.size(), serverMetadata.size()); + for(String key : meta.keySet()) { + assertTrue(serverMetadata.containsKey(key)); + assertEquals(meta.get(key), serverMetadata.get(key)); + } + + // Make sure we can update + meta.put("Foo", "one"); + meta.put("Uni", "\u0169\u00f1\u00eftwo"); + meta.put("Width", "three"); + meta.put("Height", "four"); + assertTrue(client.updateObjectMetadata(containerName, filename, meta)); + + // Re-fect and make sure things are the same + objects = client.listObjects(containerName); + assertEquals(1, objects.size()); + obj = objects.get(0); + assertEquals(filename, obj.getName()); + assertEquals("application/octet-stream", obj.getMimeType()); + metadata = client.getObjectMetaData(containerName, filename); + assertNotNull(metadata); + serverMetadata = metadata.getMetaData(); + assertEquals(meta.size(), serverMetadata.size()); + for(String key : meta.keySet()) { + assertTrue(serverMetadata.containsKey(key)); + assertEquals(meta.get(key), serverMetadata.get(key)); + } + // Clean up + client.deleteObject(containerName, filename); + assertTrue(client.deleteContainer(containerName)); + + } + catch (FilesException e) { + e.printStackTrace(); + fail(e.getHttpStatusMessage() + ":" + e.getMessage()); + } + catch (Exception e) { + e.printStackTrace(); + fail(e.getMessage()); + } + finally { + File f = new File(fullPath); + f.delete(); + } + } + public void testFileSavingNoETag() { String containerName = createTempContainerName("etagless"); String filename = makeFileName("etagless"); From 91dcfae5dcfed613394dee6bfa762dd15b60ae72 Mon Sep 17 00:00:00 2001 From: Lowell Vaughn Date: Sat, 22 Jan 2011 12:07:32 -0600 Subject: [PATCH 35/64] Add getCDNURL method to FilesObject --- .../client/cloudfiles/FilesClient.java | 3 +- .../client/cloudfiles/FilesObject.java | 20 +++++ .../cloudfiles/FilesClientTestCase.java | 74 +++++++++++++++++++ 3 files changed, 96 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/rackspacecloud/client/cloudfiles/FilesClient.java b/src/main/java/com/rackspacecloud/client/cloudfiles/FilesClient.java index f88f5e1..caa940b 100644 --- a/src/main/java/com/rackspacecloud/client/cloudfiles/FilesClient.java +++ b/src/main/java/com/rackspacecloud/client/cloudfiles/FilesClient.java @@ -2578,7 +2578,8 @@ public static String md5Sum (byte[] data) throws IOException public static String sanitizeForURI(String str) { URLCodec codec= new URLCodec(); try { - return codec.encode(str).replaceAll("\\+", "%20").replaceAll("%2F", "/"); + //return codec.encode(str).replaceAll("\\+", "%20").replaceAll("%2F", "/"); + return codec.encode(str).replaceAll("\\+", "%20"); } catch (EncoderException ee) { logger.warn("Error trying to encode string for URI", ee); diff --git a/src/main/java/com/rackspacecloud/client/cloudfiles/FilesObject.java b/src/main/java/com/rackspacecloud/client/cloudfiles/FilesObject.java index 22ae7ac..cafb378 100644 --- a/src/main/java/com/rackspacecloud/client/cloudfiles/FilesObject.java +++ b/src/main/java/com/rackspacecloud/client/cloudfiles/FilesObject.java @@ -362,4 +362,24 @@ public void setLastModified(String lastModified) { public boolean isDirectory() { return this.size == 0 && "application/directory".equals(this.mimeType); } + + /** + * + * @return The CDN url for the object (if its container has been CDN enabled), null if + * the container hasn't been CDN enabled. + * @throws HttpException + * @throws IOException + * @throws FilesException + */ + public String getCDNURL () throws FilesException, IOException, HttpException { + try { + FilesCDNContainer c = client.getCDNContainerInfo(container); + return c.getCdnURL() + "/" + name; + } + catch (FilesNotFoundException fnfe) { + // Not enabled + return null; + } + + } } diff --git a/src/test/java/com/rackspacecloud/client/cloudfiles/FilesClientTestCase.java b/src/test/java/com/rackspacecloud/client/cloudfiles/FilesClientTestCase.java index 57d7101..5459d27 100644 --- a/src/test/java/com/rackspacecloud/client/cloudfiles/FilesClientTestCase.java +++ b/src/test/java/com/rackspacecloud/client/cloudfiles/FilesClientTestCase.java @@ -498,6 +498,48 @@ public void testFileSaving() { } } + public void testSlashInName() { + String containerName = createTempContainerName("slashTest"); + String filename = makeFileName("slash/backslash\\slash"); + try { + byte randomData[] = makeRandomBytes(); + FilesClient client = new FilesClient(); + // client.setUseETag(false); + assertTrue(client.login()); + + // Set up + client.createContainer(containerName); + + // Store it + assertTrue(client.storeObject(containerName, randomData, "application/octet-stream", filename, new HashMap())); + + // Make sure it's there + List objects = client.listObjects(containerName); + assertEquals(1, objects.size()); + FilesObject obj = objects.get(0); + assertEquals(filename, obj.getName()); + assertEquals("application/octet-stream", obj.getMimeType()); + + // Make sure the data is correct + assertArrayEquals(randomData, client.getObject(containerName, filename)); + + // Make sure the data is correct as a stream + InputStream is = client.getObjectAsStream(containerName, filename); + byte otherData[] = new byte[NUMBER_RANDOM_BYTES]; + is.read(otherData); + assertArrayEquals(randomData, otherData); + assertEquals(-1, is.read()); // Could hang if there's a bug on the other end + + // Clean up + client.deleteObject(containerName, filename); + assertTrue(client.deleteContainer(containerName)); + + } + catch (Exception e) { + e.printStackTrace(); + fail(e.getMessage()); + } + } public void testSaveAs() { String containerName = createTempContainerName("file-test"); String filename = makeFileName("random"); @@ -1497,6 +1539,38 @@ public void testCDNContainerFullListing() { } } + public void testCDNUrlOnObject() { + String containerName = createTempContainerName("cdnURLtest"); + String filename = makeFileName("cdnURLtest"); + try { + byte randomData[] = makeRandomBytes(); + FilesClient client = new FilesClient(); + // client.setUseETag(false); + assertTrue(client.login()); + + // Set up + client.createContainer(containerName); + String cdnUrl = client.cdnEnableContainer(containerName); + + // Store it + assertTrue(client.storeObject(containerName, randomData, "application/octet-stream", filename, new HashMap())); + + // Make sure it's there + List objects = client.listObjects(containerName); + + // See that the CDN URL works + FilesObject obj = objects.get(0); + assertEquals(cdnUrl + "/" + filename, obj.getCDNURL()); + + // Clean up + client.deleteObject(containerName, filename); + assertTrue(client.deleteContainer(containerName)); + + } catch (Exception e) { + fail(e.getMessage()); + } + + } public void testCDNContainerFullListingAll() { FilesClient client = new FilesClient(); From 967293247828343a6e0a95fd1c70622ebc601198 Mon Sep 17 00:00:00 2001 From: Lowell Vaughn Date: Sat, 22 Jan 2011 16:39:21 -0600 Subject: [PATCH 36/64] Re-changing the build.xml file --- build.xml | 1 + .../client/cloudfiles/FilesClient.java | 19 +++++++++++------- .../cloudfiles/FilesClientTestCase.java | 20 +++++++++---------- .../cloudfiles/SnetFilesClientTestCase.java | 16 +++++++-------- 4 files changed, 31 insertions(+), 25 deletions(-) diff --git a/build.xml b/build.xml index 98357a7..ec456ee 100644 --- a/build.xml +++ b/build.xml @@ -57,6 +57,7 @@ diff --git a/src/main/java/com/rackspacecloud/client/cloudfiles/FilesClient.java b/src/main/java/com/rackspacecloud/client/cloudfiles/FilesClient.java index caa940b..67f1fb6 100644 --- a/src/main/java/com/rackspacecloud/client/cloudfiles/FilesClient.java +++ b/src/main/java/com/rackspacecloud/client/cloudfiles/FilesClient.java @@ -1765,11 +1765,12 @@ else if (response.getStatusCode() == HttpStatus.SC_UNAUTHORIZED) { * @param obj The File containing the file to copy over * @param contentType The MIME type of the file * @param name The name of the file on the server + * @return The ETAG if the save was successful, null otherwise * @throws IOException There was an IO error doing network communication * @throws HttpException There was an error with the http protocol * @throws FilesException */ - public boolean storeObjectAs (String container, File obj, String contentType, String name) throws IOException, HttpException, FilesException + public String storeObjectAs (String container, File obj, String contentType, String name) throws IOException, HttpException, FilesException { return storeObjectAs(container, obj, contentType, name, new HashMap(), null); } @@ -1781,11 +1782,12 @@ public boolean storeObjectAs (String container, File obj, String contentType, St * @param obj The File containing the file to copy over * @param contentType The MIME type of the file * @param name The name of the file on the server + * @return The ETAG if the save was successful, null otherwise * @throws IOException There was an IO error doing network communication * @throws HttpException There was an error with the http protocol * @throws FilesException */ - public boolean storeObjectAs (String container, File obj, String contentType, String name, IFilesTransferCallback callback) throws IOException, HttpException, FilesException + public String storeObjectAs (String container, File obj, String contentType, String name, IFilesTransferCallback callback) throws IOException, HttpException, FilesException { return storeObjectAs(container, obj, contentType, name, new HashMap(), callback); } @@ -1798,11 +1800,12 @@ public boolean storeObjectAs (String container, File obj, String contentType, St * @param contentType The MIME type of the file * @param name The name of the file on the server * @param metadata A map with the metadata as key names and values as the metadata values + * @return The ETAG if the save was successful, null otherwise * @throws IOException There was an IO error doing network communication * @throws HttpException There was an error with the http protocol * @throws FilesAuthorizationException */ - public boolean storeObjectAs (String container, File obj, String contentType, String name, Map metadata) throws IOException, HttpException, FilesException + public String storeObjectAs (String container, File obj, String contentType, String name, Map metadata) throws IOException, HttpException, FilesException { return storeObjectAs (container, obj, contentType, name, metadata, null); } @@ -1816,11 +1819,12 @@ public boolean storeObjectAs (String container, File obj, String contentType, St * @param name The name of the file on the server * @param metadata A map with the metadata as key names and values as the metadata values * @param metadata The callback object that will be called as the data is sent + * @return The ETAG if the save was successful, null otherwise * @throws IOException There was an IO error doing network communication * @throws HttpException There was an error with the http protocol * @throws FilesException */ - public boolean storeObjectAs (String container, File obj, String contentType, String name, Map metadata, IFilesTransferCallback callback) throws IOException, HttpException, FilesException + public String storeObjectAs (String container, File obj, String contentType, String name, Map metadata, IFilesTransferCallback callback) throws IOException, HttpException, FilesException { if (this.isLoggedin()) { @@ -1871,7 +1875,7 @@ public boolean storeObjectAs (String container, File obj, String contentType, St } if (response.getStatusCode() == HttpStatus.SC_CREATED) { - return true; + return response.getResponseHeader(FilesConstants.E_TAG).getValue(); } else if (response.getStatusCode() == HttpStatus.SC_PRECONDITION_FAILED) { @@ -1912,11 +1916,12 @@ else if (response.getStatusCode() == HttpStatus.SC_LENGTH_REQUIRED) * @param container The name of the container to place the file in * @param obj The File to transfer * @param contentType The file's MIME type + * @return The ETAG if the save was successful, null otherwise * @throws IOException There was an IO error doing network communication * @throws HttpException There was an error with the http protocol * @throws FilesException */ - public boolean storeObject (String container, File obj, String contentType) throws IOException, HttpException, FilesException + public String storeObject (String container, File obj, String contentType) throws IOException, HttpException, FilesException { return storeObjectAs(container, obj, contentType, obj.getName()); } @@ -2111,7 +2116,7 @@ public boolean storeStreamedObject(String container, InputStream data, String co * @param entity The name of the request entity (make sure to set the Content-Type * @param metadata The metadata for the object * @param md5sum The 32 character hex encoded MD5 sum of the data - * @return True of the save was successful + * @return The ETAG if the save was successful, null otherwise * @throws IOException There was a socket level exception talking to CloudFiles * @throws HttpException There was a protocol level error talking to CloudFiles * @throws FilesException There was an error talking to CloudFiles. diff --git a/src/test/java/com/rackspacecloud/client/cloudfiles/FilesClientTestCase.java b/src/test/java/com/rackspacecloud/client/cloudfiles/FilesClientTestCase.java index 5459d27..587f985 100644 --- a/src/test/java/com/rackspacecloud/client/cloudfiles/FilesClientTestCase.java +++ b/src/test/java/com/rackspacecloud/client/cloudfiles/FilesClientTestCase.java @@ -136,7 +136,7 @@ public void testMultipleFilesNotThere() { String[] names = new String[10]; for(int i=0; i < 10; ++i) names[i] = "File" + (i + 1) + ".txt"; for(int i=0; i < 5; ++i) - assertTrue(client.storeObjectAs(containerName, new File(fullPath), "application/octet-stream", names[i])); + assertNotNull(client.storeObjectAs(containerName, new File(fullPath), "application/octet-stream", names[i])); for (int i = 0; i < 10; i++) { String fileName = names[i]; @@ -414,7 +414,7 @@ public void testCustomHttpClient() { // Store it logger.info("About to save: " + filename); - assertTrue(client.storeObjectAs(containerName, new File(fullPath), "application/octet-stream", filename)); + assertNotNull(client.storeObjectAs(containerName, new File(fullPath), "application/octet-stream", filename)); // Make sure it's there List objects = client.listObjects(containerName); @@ -464,7 +464,7 @@ public void testFileSaving() { // Store it logger.info("About to save: " + filename); - assertTrue(client.storeObjectAs(containerName, new File(fullPath), "application/octet-stream", filename)); + assertNotNull(client.storeObjectAs(containerName, new File(fullPath), "application/octet-stream", filename)); // Make sure it's there List objects = client.listObjects(containerName); @@ -556,7 +556,7 @@ public void testSaveAs() { // Store it logger.info("About to save: " + filename); - assertTrue(client.storeObjectAs(containerName, new File(fullPath), "application/octet-stream", otherFileName)); + assertNotNull(client.storeObjectAs(containerName, new File(fullPath), "application/octet-stream", otherFileName)); // Make sure it's there List objects = client.listObjects(containerName); @@ -605,7 +605,7 @@ public void testFileSavingWithCallback() { // Store it logger.info("About to save: " + filename); TesterCallback callback = new TesterCallback(); - assertTrue(client.storeObjectAs(containerName, new File(fullPath), "application/octet-stream", filename, callback)); + assertNotNull(client.storeObjectAs(containerName, new File(fullPath), "application/octet-stream", filename, callback)); // Make sure the callback was called assertEquals(randomData.length, callback.bytesSent); @@ -662,7 +662,7 @@ public void testFileSavingWithMetadata() { meta.put("Uni", "\u0169\u00f1\u00efcode-test"); meta.put("Width", "336"); meta.put("Height", "183"); - assertTrue(client.storeObjectAs(containerName, new File(fullPath), "application/octet-stream", filename, meta)); + assertNotNull(client.storeObjectAs(containerName, new File(fullPath), "application/octet-stream", filename, meta)); // Make sure it's there List objects = client.listObjects(containerName); @@ -739,7 +739,7 @@ public void testMetadataUpdate() { meta.put("Uni", "\u0169\u00f1\u00efcode-test"); meta.put("Width", "336"); meta.put("Height", "183"); - assertTrue(client.storeObjectAs(containerName, new File(fullPath), "application/octet-stream", filename, meta)); + assertNotNull(client.storeObjectAs(containerName, new File(fullPath), "application/octet-stream", filename, meta)); // Make sure it's there List objects = client.listObjects(containerName); @@ -816,7 +816,7 @@ public void testFileSavingNoETag() { client.createContainer(containerName); // Store it - assertTrue(client.storeObjectAs(containerName, new File(fullPath), "application/octet-stream", filename)); + assertNotNull(client.storeObjectAs(containerName, new File(fullPath), "application/octet-stream", filename)); // Make sure it's there List objects = client.listObjects(containerName); @@ -865,7 +865,7 @@ public void testContainerListing() { // Store it logger.info("About to save: " + filename); - assertTrue(client.storeObjectAs(containerName, new File(fullPath), "application/octet-stream", filename)); + assertNotNull(client.storeObjectAs(containerName, new File(fullPath), "application/octet-stream", filename)); // Make sure it's there List objects = client.listObjects(containerName); @@ -1435,7 +1435,7 @@ public void testUnicode() { client.createContainer(containerName); // Store it - assertTrue(client.storeObjectAs(containerName, new File(fullPath), "application/octet-stream", filename)); + assertNotNull(client.storeObjectAs(containerName, new File(fullPath), "application/octet-stream", filename)); // Make sure it's there List objects = client.listObjects(containerName); diff --git a/src/test/java/com/rackspacecloud/client/cloudfiles/SnetFilesClientTestCase.java b/src/test/java/com/rackspacecloud/client/cloudfiles/SnetFilesClientTestCase.java index fc5b0b0..4c7b33c 100644 --- a/src/test/java/com/rackspacecloud/client/cloudfiles/SnetFilesClientTestCase.java +++ b/src/test/java/com/rackspacecloud/client/cloudfiles/SnetFilesClientTestCase.java @@ -138,7 +138,7 @@ public void testMultipleFilesNotThere() { String[] names = new String[10]; for(int i=0; i < 10; ++i) names[i] = "File" + (i + 1) + ".txt"; for(int i=0; i < 5; ++i) - assertTrue(client.storeObjectAs(containerName, new File(fullPath), "application/octet-stream", names[i])); + assertNotNull(client.storeObjectAs(containerName, new File(fullPath), "application/octet-stream", names[i])); for (int i = 0; i < 10; i++) { String fileName = names[i]; @@ -460,7 +460,7 @@ public void testFileSaving() { // Store it logger.info("About to save: " + filename); - assertTrue(client.storeObjectAs(containerName, new File(fullPath), "application/octet-stream", filename)); + assertNotNull(client.storeObjectAs(containerName, new File(fullPath), "application/octet-stream", filename)); // Make sure it's there List objects = client.listObjects(containerName); @@ -512,7 +512,7 @@ public void testSaveAs() { // Store it logger.info("About to save: " + filename); - assertTrue(client.storeObjectAs(containerName, new File(fullPath), "application/octet-stream", otherFileName)); + assertNotNull(client.storeObjectAs(containerName, new File(fullPath), "application/octet-stream", otherFileName)); // Make sure it's there List objects = client.listObjects(containerName); @@ -563,7 +563,7 @@ public void testFileSavingWithCallback() { // Store it logger.info("About to save: " + filename); TesterCallback callback = new TesterCallback(); - assertTrue(client.storeObjectAs(containerName, new File(fullPath), "application/octet-stream", filename, callback)); + assertNotNull(client.storeObjectAs(containerName, new File(fullPath), "application/octet-stream", filename, callback)); // Make sure the callback was called assertEquals(randomData.length, callback.bytesSent); @@ -623,7 +623,7 @@ public void testFileSavingWithMetadata() { meta.put("Uni", "\u0169\u00f1\u00efcode-test"); meta.put("Width", "336"); meta.put("Height", "183"); - assertTrue(client.storeObjectAs(containerName, new File(fullPath), "application/octet-stream", filename, meta)); + assertNotNull(client.storeObjectAs(containerName, new File(fullPath), "application/octet-stream", filename, meta)); // Make sure it's there List objects = client.listObjects(containerName); @@ -691,7 +691,7 @@ public void testFileSavingNoETag() { client.createContainer(containerName); // Store it - assertTrue(client.storeObjectAs(containerName, new File(fullPath), "application/octet-stream", filename)); + assertNotNull(client.storeObjectAs(containerName, new File(fullPath), "application/octet-stream", filename)); // Make sure it's there List objects = client.listObjects(containerName); @@ -742,7 +742,7 @@ public void testContainerListing() { // Store it logger.info("About to save: " + filename); - assertTrue(client.storeObjectAs(containerName, new File(fullPath), "application/octet-stream", filename)); + assertNotNull(client.storeObjectAs(containerName, new File(fullPath), "application/octet-stream", filename)); // Make sure it's there List objects = client.listObjects(containerName); @@ -1282,7 +1282,7 @@ public void testUnicode() { client.createContainer(containerName); // Store it - assertTrue(client.storeObjectAs(containerName, new File(fullPath), "application/octet-stream", filename)); + assertNotNull(client.storeObjectAs(containerName, new File(fullPath), "application/octet-stream", filename)); // Make sure it's there List objects = client.listObjects(containerName); From a606667640b9871a800b3853de26ab40c6aef1e6 Mon Sep 17 00:00:00 2001 From: Lowell Vaughn Date: Mon, 24 Jan 2011 21:02:12 -0600 Subject: [PATCH 37/64] picking up code changes that were lost --- .../com/rackspacecloud/client/cloudfiles/sample/FilesCli.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/rackspacecloud/client/cloudfiles/sample/FilesCli.java b/src/main/java/com/rackspacecloud/client/cloudfiles/sample/FilesCli.java index 83602c1..01d62dc 100644 --- a/src/main/java/com/rackspacecloud/client/cloudfiles/sample/FilesCli.java +++ b/src/main/java/com/rackspacecloud/client/cloudfiles/sample/FilesCli.java @@ -293,7 +293,7 @@ else if(components.length == 3) { System.out.println("Container " + containerName + " does not exist"); return true; } - if (client.storeObject(containerName, file, mimeType)) { + if (client.storeObject(containerName, file, mimeType) != null) { System.out.println("Object " + file.getName() + " was created"); } return true; From bf5076b781803c2a5414e3333c7ba0706c154194 Mon Sep 17 00:00:00 2001 From: Lowell Vaughn Date: Wed, 26 Jan 2011 17:40:45 -0600 Subject: [PATCH 38/64] cleaning up a couple of missed methods --- .../rackspacecloud/client/cloudfiles/FilesClient.java | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/src/main/java/com/rackspacecloud/client/cloudfiles/FilesClient.java b/src/main/java/com/rackspacecloud/client/cloudfiles/FilesClient.java index 67f1fb6..57d90e4 100644 --- a/src/main/java/com/rackspacecloud/client/cloudfiles/FilesClient.java +++ b/src/main/java/com/rackspacecloud/client/cloudfiles/FilesClient.java @@ -2055,7 +2055,7 @@ else if (response.getStatusCode() == HttpStatus.SC_LENGTH_REQUIRED) * @throws HttpException There was an error with the http protocol * @throws FilesException */ - public boolean storeStreamedObject(String container, InputStream data, String contentType, String name, Map metadata) throws IOException, HttpException, FilesException + public String storeStreamedObject(String container, InputStream data, String contentType, String name, Map metadata) throws IOException, HttpException, FilesException { if (this.isLoggedin()) { @@ -2081,8 +2081,7 @@ public boolean storeStreamedObject(String container, InputStream data, String co if (response.getStatusCode() == HttpStatus.SC_CREATED) { - logger.debug ("Object stored : " + name); - return true; + return response.getResponseHeader(FilesConstants.E_TAG).getValue(); } else { logger.error(response.getStatusLine()); @@ -2121,7 +2120,7 @@ public boolean storeStreamedObject(String container, InputStream data, String co * @throws HttpException There was a protocol level error talking to CloudFiles * @throws FilesException There was an error talking to CloudFiles. */ -public boolean storeObjectAs(String container, String name, HttpEntity entity, Map metadata, String md5sum) throws IOException, HttpException, FilesException +public String storeObjectAs(String container, String name, HttpEntity entity, Map metadata, String md5sum) throws IOException, HttpException, FilesException { if (this.isLoggedin()) { @@ -2159,8 +2158,7 @@ public boolean storeObjectAs(String container, String name, HttpEntity entity, M if (response.getStatusCode() == HttpStatus.SC_CREATED) { - logger.debug ("Object stored : " + name); - return true; + return response.getResponseHeader(FilesConstants.E_TAG).getValue(); } else { logger.debug(response.getStatusLine()); From e6d6c373d7069788248f98dcd59e927ed40fe03b Mon Sep 17 00:00:00 2001 From: Lowell Vaughn Date: Wed, 26 Jan 2011 17:41:47 -0600 Subject: [PATCH 39/64] cleaning up a couple of missed methods --- .../rackspacecloud/client/cloudfiles/FilesClientTestCase.java | 4 ++-- .../client/cloudfiles/SnetFilesClientTestCase.java | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/test/java/com/rackspacecloud/client/cloudfiles/FilesClientTestCase.java b/src/test/java/com/rackspacecloud/client/cloudfiles/FilesClientTestCase.java index 587f985..c82716c 100644 --- a/src/test/java/com/rackspacecloud/client/cloudfiles/FilesClientTestCase.java +++ b/src/test/java/com/rackspacecloud/client/cloudfiles/FilesClientTestCase.java @@ -1049,7 +1049,7 @@ public void testRequestEntitySaving() { ByteArrayEntity entity = new ByteArrayEntity(randomData); entity.setContentType("test/content_type"); - assertTrue(client.storeObjectAs(containerName, filename, entity, new HashMap(), FilesClient.md5Sum(randomData))); + assertNotNull(client.storeObjectAs(containerName, filename, entity, new HashMap(), FilesClient.md5Sum(randomData))); // Make sure it's there List objects = client.listObjects(containerName); @@ -1287,7 +1287,7 @@ public void testStreamedSaving() { client.createContainer(containerName); // Store it - assertTrue(client.storeStreamedObject(containerName, new ByteArrayInputStream(randomData), "application/octet-stream", filename, new HashMap())); + assertNotNull(client.storeStreamedObject(containerName, new ByteArrayInputStream(randomData), "application/octet-stream", filename, new HashMap())); // Make sure it's there List objects = client.listObjects(containerName); diff --git a/src/test/java/com/rackspacecloud/client/cloudfiles/SnetFilesClientTestCase.java b/src/test/java/com/rackspacecloud/client/cloudfiles/SnetFilesClientTestCase.java index 4c7b33c..09a5cb4 100644 --- a/src/test/java/com/rackspacecloud/client/cloudfiles/SnetFilesClientTestCase.java +++ b/src/test/java/com/rackspacecloud/client/cloudfiles/SnetFilesClientTestCase.java @@ -1128,7 +1128,7 @@ public void testStreamedSaving() { client.createContainer(containerName); // Store it - assertTrue(client.storeStreamedObject(containerName, new ByteArrayInputStream(randomData), "application/octet-stream", filename, new HashMap())); + assertNotNull(client.storeStreamedObject(containerName, new ByteArrayInputStream(randomData), "application/octet-stream", filename, new HashMap())); // Make sure it's there List objects = client.listObjects(containerName); From e36c58a234ab07fe32c779d8b43f0387341f60e8 Mon Sep 17 00:00:00 2001 From: Lowell Vaughn Date: Mon, 7 Feb 2011 10:03:46 -0600 Subject: [PATCH 40/64] Changing FilesResponse to accept all 2xx response codes and updaing user agent version string --- .../com/rackspacecloud/client/cloudfiles/FilesConstants.java | 2 +- .../com/rackspacecloud/client/cloudfiles/FilesResponse.java | 5 ++--- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/src/main/java/com/rackspacecloud/client/cloudfiles/FilesConstants.java b/src/main/java/com/rackspacecloud/client/cloudfiles/FilesConstants.java index 6684e74..6feac21 100644 --- a/src/main/java/com/rackspacecloud/client/cloudfiles/FilesConstants.java +++ b/src/main/java/com/rackspacecloud/client/cloudfiles/FilesConstants.java @@ -12,7 +12,7 @@ public class FilesConstants { private static Logger logger = Logger.getLogger(FilesConstants.class); - public static final String USER_AGENT = "java-cloudfiles/1.6.2"; + public static final String USER_AGENT = "java-cloudfiles/1.7.3"; /** HTTP Header token that identifies the username to Cloud Files **/ public static final String X_STORAGE_USER_DEFAULT = "x-auth-user"; diff --git a/src/main/java/com/rackspacecloud/client/cloudfiles/FilesResponse.java b/src/main/java/com/rackspacecloud/client/cloudfiles/FilesResponse.java index 99720f5..e1c560a 100644 --- a/src/main/java/com/rackspacecloud/client/cloudfiles/FilesResponse.java +++ b/src/main/java/com/rackspacecloud/client/cloudfiles/FilesResponse.java @@ -46,10 +46,9 @@ public FilesResponse (HttpResponse response) */ public boolean loginSuccess () { - if (getStatusCode() == HttpStatus.SC_UNAUTHORIZED ) - return false; + int statusCode = getStatusCode(); - if (getStatusCode() == HttpStatus.SC_NO_CONTENT) + if (statusCode >= 200 && statusCode < 300) return true; return false; From 1fb920de144de2e02e3971a887405483902fa855 Mon Sep 17 00:00:00 2001 From: Lowell Vaughn Date: Thu, 24 Feb 2011 15:02:15 -0600 Subject: [PATCH 41/64] Edge purge for CDN --- .../client/cloudfiles/FilesClient.java | 127 ++++++++++++++++++ .../client/cloudfiles/FilesConstants.java | 4 +- .../client/cloudfiles/FilesResponse.java | 1 - .../cloudfiles/FilesClientTestCase.java | 25 ++++ 4 files changed, 155 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/rackspacecloud/client/cloudfiles/FilesClient.java b/src/main/java/com/rackspacecloud/client/cloudfiles/FilesClient.java index 57d90e4..ebcdc36 100644 --- a/src/main/java/com/rackspacecloud/client/cloudfiles/FilesClient.java +++ b/src/main/java/com/rackspacecloud/client/cloudfiles/FilesClient.java @@ -1607,6 +1607,133 @@ else if (response.getStatusCode() == HttpStatus.SC_UNAUTHORIZED) { throw new FilesAuthorizationException("You must be logged in", null, null); } } + + /** + * Purges all items from a given container from the CDN + * + * @param container The name of the container + * @param emailAddresses An optional comma separated list of email addresses to be notified when the purge is complete. + * null if desired. + * @throws IOException Error talking to the cdn management server + * @throws HttpException Error with HTTP + * @throws FilesAuthorizationException Log in was not successful, or account is suspended + * @throws FilesException Other error + */ + public void purgeCDNContainer(String container, String emailAddresses) throws IOException, HttpException, FilesAuthorizationException, FilesException { + if (! isLoggedin) { + throw new FilesAuthorizationException("You must be logged in", null, null); + } + if (!isValidContainerName(container)) { + throw new FilesInvalidNameException(container); + } + HttpDelete method = null; + try { + String deleteUri = cdnManagementURL + "/" + sanitizeForURI(container); + method = new HttpDelete(deleteUri); + method.getParams().setIntParameter("http.socket.timeout", connectionTimeOut); + method.setHeader(FilesConstants.X_AUTH_TOKEN, authToken); + if (emailAddresses != null) { + method.setHeader(FilesConstants.X_PURGE_EMAIL, emailAddresses); + } + + FilesResponse response = new FilesResponse(client.execute(method)); + + if (response.getStatusCode() == HttpStatus.SC_UNAUTHORIZED) { + method.abort(); + if(login()) { + method = new HttpDelete(deleteUri); + method.getParams().setIntParameter("http.socket.timeout", connectionTimeOut); + method.setHeader(FilesConstants.X_AUTH_TOKEN, authToken); + if (emailAddresses != null) { + method.setHeader(FilesConstants.X_PURGE_EMAIL, emailAddresses); + } + response = new FilesResponse(client.execute(method)); + } + else { + throw new FilesAuthorizationException("Re-login failed", response.getResponseHeaders(), response.getStatusLine()); + } + } + + if (response.getStatusCode() == HttpStatus.SC_NO_CONTENT) + { + return; + } + else if (response.getStatusCode() == HttpStatus.SC_UNAUTHORIZED) { + throw new FilesAuthorizationException("User not Authorized!",response.getResponseHeaders(), response.getStatusLine()); + } + else { + throw new FilesException("Unexpected server response",response.getResponseHeaders(), response.getStatusLine()); + } + } + finally { + if (method != null) method.abort(); + } + + } + + /** + * Purges all items from a given container from the CDN + * + * @param container The name of the container + * @param object The name of the object + * @param emailAddresses An optional comma separated list of email addresses to be notified when the purge is complete. + * null if desired. + * @throws IOException Error talking to the cdn management server + * @throws HttpException Error with HTTP + * @throws FilesAuthorizationException Log in was not successful, or account is suspended + * @throws FilesException Other error + */ + public void purgeCDNObject(String container, String object, String emailAddresses) throws IOException, HttpException, FilesAuthorizationException, FilesException { + if (! isLoggedin) { + throw new FilesAuthorizationException("You must be logged in", null, null); + } + if (!isValidContainerName(container)) { + throw new FilesInvalidNameException(container); + } + HttpDelete method = null; + try { + String deleteUri = cdnManagementURL + "/" + sanitizeForURI(container) +"/"+sanitizeForURI(object); + method = new HttpDelete(deleteUri); + method.getParams().setIntParameter("http.socket.timeout", connectionTimeOut); + method.setHeader(FilesConstants.X_AUTH_TOKEN, authToken); + if (emailAddresses != null) { + method.setHeader(FilesConstants.X_PURGE_EMAIL, emailAddresses); + } + + FilesResponse response = new FilesResponse(client.execute(method)); + + if (response.getStatusCode() == HttpStatus.SC_UNAUTHORIZED) { + method.abort(); + if(login()) { + method = new HttpDelete(deleteUri); + method.getParams().setIntParameter("http.socket.timeout", connectionTimeOut); + method.setHeader(FilesConstants.X_AUTH_TOKEN, authToken); + if (emailAddresses != null) { + method.setHeader(FilesConstants.X_PURGE_EMAIL, emailAddresses); + } + response = new FilesResponse(client.execute(method)); + } + else { + throw new FilesAuthorizationException("Re-login failed", response.getResponseHeaders(), response.getStatusLine()); + } + } + + if (response.getStatusCode() == HttpStatus.SC_NO_CONTENT) + { + return; + } + else if (response.getStatusCode() == HttpStatus.SC_UNAUTHORIZED) { + throw new FilesAuthorizationException("User not Authorized!",response.getResponseHeaders(), response.getStatusLine()); + } + else { + throw new FilesException("Unexpected server response",response.getResponseHeaders(), response.getStatusLine()); + } + } + finally { + if (method != null) method.abort(); + } + + } /** * Gets list of all of the containers associated with this account. diff --git a/src/main/java/com/rackspacecloud/client/cloudfiles/FilesConstants.java b/src/main/java/com/rackspacecloud/client/cloudfiles/FilesConstants.java index 6feac21..fcc66bc 100644 --- a/src/main/java/com/rackspacecloud/client/cloudfiles/FilesConstants.java +++ b/src/main/java/com/rackspacecloud/client/cloudfiles/FilesConstants.java @@ -12,7 +12,7 @@ public class FilesConstants { private static Logger logger = Logger.getLogger(FilesConstants.class); - public static final String USER_AGENT = "java-cloudfiles/1.7.3"; + public static final String USER_AGENT = "java-cloudfiles/1.8.0"; /** HTTP Header token that identifies the username to Cloud Files **/ public static final String X_STORAGE_USER_DEFAULT = "x-auth-user"; @@ -56,6 +56,8 @@ public class FilesConstants public static final int METADATA_NAME_LENGTH = 1024; public static final int METADATA_VALUE_LENGTH = 1024; + public static final String X_PURGE_EMAIL = "X-Purge-Email"; + /** Prefix Cloud Files expects on all Meta data headers on Objects **/ public static final String X_OBJECT_META = "X-Object-Meta-"; diff --git a/src/main/java/com/rackspacecloud/client/cloudfiles/FilesResponse.java b/src/main/java/com/rackspacecloud/client/cloudfiles/FilesResponse.java index e1c560a..dcd8612 100644 --- a/src/main/java/com/rackspacecloud/client/cloudfiles/FilesResponse.java +++ b/src/main/java/com/rackspacecloud/client/cloudfiles/FilesResponse.java @@ -7,7 +7,6 @@ import org.apache.http.Header; import org.apache.http.HttpResponse; import org.apache.http.StatusLine; -import org.apache.http.HttpStatus; import org.apache.http.util.EntityUtils; import org.apache.http.HttpEntity; import org.apache.log4j.Logger; diff --git a/src/test/java/com/rackspacecloud/client/cloudfiles/FilesClientTestCase.java b/src/test/java/com/rackspacecloud/client/cloudfiles/FilesClientTestCase.java index c82716c..f4f7bf4 100644 --- a/src/test/java/com/rackspacecloud/client/cloudfiles/FilesClientTestCase.java +++ b/src/test/java/com/rackspacecloud/client/cloudfiles/FilesClientTestCase.java @@ -1572,6 +1572,31 @@ public void testCDNUrlOnObject() { } + public void testCDNPurge() { + String containerName = createTempContainerName("cdnPurgeTest"); + try { + FilesClient client = new FilesClient(); + // client.setUseETag(false); + assertTrue(client.login()); + + // Set up + client.createContainer(containerName); + String cdnUrl = client.cdnEnableContainer(containerName); + assertNotNull(cdnUrl); + + client.purgeCDNContainer(containerName, "lowell.vaughn@rackspace.com"); + client.purgeCDNContainer(containerName, null); + client.purgeCDNObject(containerName, "object.txt", "lowell.vaughn@rackspace.com"); + + assertTrue(client.deleteContainer(containerName)); + + } catch (Exception e) { + e.printStackTrace(); + fail(e.getMessage()); + } + + } + public void testCDNContainerFullListingAll() { FilesClient client = new FilesClient(); try { From 2898263abbdd1c0bbf198cd8acfbbd2a5784a701 Mon Sep 17 00:00:00 2001 From: Lowell Vaughn Date: Thu, 3 Mar 2011 11:26:06 -0600 Subject: [PATCH 42/64] Add support for the SSL header --- .../client/cloudfiles/FilesCDNContainer.java | 21 +++++++++++++++++++ .../client/cloudfiles/FilesClient.java | 5 ++++- .../client/cloudfiles/FilesConstants.java | 4 +++- .../client/cloudfiles/FilesResponse.java | 13 ++++++++++++ .../cloudfiles/FilesClientTestCase.java | 1 + 5 files changed, 42 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/rackspacecloud/client/cloudfiles/FilesCDNContainer.java b/src/main/java/com/rackspacecloud/client/cloudfiles/FilesCDNContainer.java index 25c2118..c822691 100644 --- a/src/main/java/com/rackspacecloud/client/cloudfiles/FilesCDNContainer.java +++ b/src/main/java/com/rackspacecloud/client/cloudfiles/FilesCDNContainer.java @@ -13,6 +13,7 @@ public class FilesCDNContainer { private String referrerACL; private int ttl; private String cdnURL; + private String sslURL = null; private String name; private boolean retainLogs; @@ -37,6 +38,11 @@ public FilesCDNContainer(String cdnURL) { this.cdnURL = cdnURL; } + public FilesCDNContainer(String cdnURL, String sslUrl) { + this.cdnURL = cdnURL; + this.sslURL = sslUrl; + } + public FilesCDNContainer(String name, boolean enabled, int ttl, boolean retainLogs) { this.enabled = enabled; this.ttl = ttl; @@ -122,5 +128,20 @@ public void setName(String name) { this.name = name; } + /** + * @return The URL for accessing content in this container via the CDN + */ + public String getSSLURL() { + return sslURL; + } + + /** + * + * @param sslURL the sslURL to set + */ + void setSSLURL(String sslURL) { + this.sslURL = sslURL; + } + } diff --git a/src/main/java/com/rackspacecloud/client/cloudfiles/FilesClient.java b/src/main/java/com/rackspacecloud/client/cloudfiles/FilesClient.java index ebcdc36..b87d29e 100644 --- a/src/main/java/com/rackspacecloud/client/cloudfiles/FilesClient.java +++ b/src/main/java/com/rackspacecloud/client/cloudfiles/FilesClient.java @@ -1832,9 +1832,12 @@ public List listCdnContainerInfo(int limit, String marker) th if ("name".equals(data.getNodeName())) { container.setName(data.getTextContent()); } - else if ("cdn_url".equals(data.getNodeName())) { + else if ("cdn_url".equals(data.getNodeName())) { container.setCdnURL(data.getTextContent()); } + else if ("cdn_ssl_url".equals(data.getNodeName())) { + container.setSSLURL(data.getTextContent()); + } else if ("cdn_enabled".equals(data.getNodeName())) { container.setEnabled(Boolean.parseBoolean(data.getTextContent())); } diff --git a/src/main/java/com/rackspacecloud/client/cloudfiles/FilesConstants.java b/src/main/java/com/rackspacecloud/client/cloudfiles/FilesConstants.java index fcc66bc..bf101e2 100644 --- a/src/main/java/com/rackspacecloud/client/cloudfiles/FilesConstants.java +++ b/src/main/java/com/rackspacecloud/client/cloudfiles/FilesConstants.java @@ -12,7 +12,7 @@ public class FilesConstants { private static Logger logger = Logger.getLogger(FilesConstants.class); - public static final String USER_AGENT = "java-cloudfiles/1.8.0"; + public static final String USER_AGENT = "java-cloudfiles/1.8.1"; /** HTTP Header token that identifies the username to Cloud Files **/ public static final String X_STORAGE_USER_DEFAULT = "x-auth-user"; @@ -35,6 +35,8 @@ public class FilesConstants /** HTTP header token that is returned by calls to the CDN Management API **/ public static final String X_CDN_URI = "X-CDN-URI"; /** HTTP header token that is returned by calls to the CDN Management API **/ + public static final String X_CDN_SSL_URI = "X-CDN-SSL-URI"; + /** HTTP header token that is returned by calls to the CDN Management API **/ public static final String X_CDN_TTL = "X-TTL"; /** HTTP header token that is returned by calls to the CDN Management API **/ public static final String X_CDN_RETAIN_LOGS = "X-Log-Retention"; diff --git a/src/main/java/com/rackspacecloud/client/cloudfiles/FilesResponse.java b/src/main/java/com/rackspacecloud/client/cloudfiles/FilesResponse.java index dcd8612..018e019 100644 --- a/src/main/java/com/rackspacecloud/client/cloudfiles/FilesResponse.java +++ b/src/main/java/com/rackspacecloud/client/cloudfiles/FilesResponse.java @@ -291,6 +291,19 @@ public String getCdnUrl () return null; } + /** + * Get the SSL URL For a shared container + * + * @return null if the header is not present or the correct value as defined by the header + */ + public String getCdnSslUrl () + { + Header cdnHeader = getResponseHeader (FilesConstants.X_CDN_SSL_URI); + if (cdnHeader != null ) + return cdnHeader.getValue(); + return null; + } + /** * Returns the response headers with the given name. Note that header-name matching is case insensitive. * diff --git a/src/test/java/com/rackspacecloud/client/cloudfiles/FilesClientTestCase.java b/src/test/java/com/rackspacecloud/client/cloudfiles/FilesClientTestCase.java index f4f7bf4..108350b 100644 --- a/src/test/java/com/rackspacecloud/client/cloudfiles/FilesClientTestCase.java +++ b/src/test/java/com/rackspacecloud/client/cloudfiles/FilesClientTestCase.java @@ -1526,6 +1526,7 @@ public void testCDNContainerFullListing() { assertEquals(5, containers.size()); for (int i=0; i < 5; i++) { assertEquals(originalContainers.get(i), containers.get(i).getName()); + assertNotNull(containers.get(i).getSSLURL()); } // Now check out a marker From c72c38dac4ef4633057df635a91e779f811cbdb0 Mon Sep 17 00:00:00 2001 From: Lowell Vaughn Date: Wed, 9 Mar 2011 09:03:03 -0600 Subject: [PATCH 43/64] More SSL stuff --- .../java/com/rackspacecloud/client/cloudfiles/FilesClient.java | 1 + .../rackspacecloud/client/cloudfiles/FilesClientTestCase.java | 1 + 2 files changed, 2 insertions(+) diff --git a/src/main/java/com/rackspacecloud/client/cloudfiles/FilesClient.java b/src/main/java/com/rackspacecloud/client/cloudfiles/FilesClient.java index b87d29e..cd43028 100644 --- a/src/main/java/com/rackspacecloud/client/cloudfiles/FilesClient.java +++ b/src/main/java/com/rackspacecloud/client/cloudfiles/FilesClient.java @@ -1325,6 +1325,7 @@ public FilesCDNContainer getCDNContainerInfo(String container) throws IOExceptio { FilesCDNContainer result = new FilesCDNContainer(response.getCdnUrl()); result.setName(container); + result.setSSLURL(response.getCdnSslUrl()); for (Header hdr : response.getResponseHeaders()) { String name = hdr.getName().toLowerCase(); if ("x-cdn-enabled".equals(name)) { diff --git a/src/test/java/com/rackspacecloud/client/cloudfiles/FilesClientTestCase.java b/src/test/java/com/rackspacecloud/client/cloudfiles/FilesClientTestCase.java index 108350b..513cd38 100644 --- a/src/test/java/com/rackspacecloud/client/cloudfiles/FilesClientTestCase.java +++ b/src/test/java/com/rackspacecloud/client/cloudfiles/FilesClientTestCase.java @@ -1644,6 +1644,7 @@ public void testCDNApi() { // assertEquals("", info.getReferrerACL()); String cdnUrl = info.getCdnURL(); assertNotNull(cdnUrl); + assertNotNull(info.getSSLURL()); client.cdnUpdateContainer(containerName, 31415, false, true); assertFalse(client.isCDNEnabled(containerName)); From 35fd29f9332fc404a5eb0d7a3a74e28f2dd1f83d Mon Sep 17 00:00:00 2001 From: Lowell Vaughn Date: Wed, 9 Mar 2011 09:12:33 -0600 Subject: [PATCH 44/64] More SSL stuff --- .../rackspacecloud/client/cloudfiles/FilesClientTestCase.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/test/java/com/rackspacecloud/client/cloudfiles/FilesClientTestCase.java b/src/test/java/com/rackspacecloud/client/cloudfiles/FilesClientTestCase.java index 513cd38..66dbc33 100644 --- a/src/test/java/com/rackspacecloud/client/cloudfiles/FilesClientTestCase.java +++ b/src/test/java/com/rackspacecloud/client/cloudfiles/FilesClientTestCase.java @@ -1585,7 +1585,7 @@ public void testCDNPurge() { String cdnUrl = client.cdnEnableContainer(containerName); assertNotNull(cdnUrl); - client.purgeCDNContainer(containerName, "lowell.vaughn@rackspace.com"); + //client.purgeCDNContainer(containerName, "lowell.vaughn@rackspace.com"); client.purgeCDNContainer(containerName, null); client.purgeCDNObject(containerName, "object.txt", "lowell.vaughn@rackspace.com"); From 2129da61bf496241e61e47df1a522410c52ebdc3 Mon Sep 17 00:00:00 2001 From: Lowell Vaughn Date: Thu, 24 Mar 2011 16:40:22 -0500 Subject: [PATCH 45/64] Fixing bug with object purging with slashes in the name - Thanks to Cyberduck users and author for finding it --- .../client/cloudfiles/FilesClient.java | 29 ++++++++----------- .../client/cloudfiles/FilesConstants.java | 2 +- .../cloudfiles/FilesClientTestCase.java | 4 ++- 3 files changed, 16 insertions(+), 19 deletions(-) diff --git a/src/main/java/com/rackspacecloud/client/cloudfiles/FilesClient.java b/src/main/java/com/rackspacecloud/client/cloudfiles/FilesClient.java index cd43028..525625f 100644 --- a/src/main/java/com/rackspacecloud/client/cloudfiles/FilesClient.java +++ b/src/main/java/com/rackspacecloud/client/cloudfiles/FilesClient.java @@ -1447,21 +1447,6 @@ else if (response.getStatusCode() == HttpStatus.SC_NOT_FOUND) { } } - /* * - * Not currently used (but soon will be) - * @param container - */ - // public void purgeCDNContainer(String container) { -/// // Stub -// } - - /* * - * Not currently used (but soon will be) - * @param container - */ -// public void purgeCDNObject(String container, String object) { - // // Stub -// } /** * Creates a path (but not any of the sub portions of the path) @@ -1693,7 +1678,7 @@ public void purgeCDNObject(String container, String object, String emailAddresse } HttpDelete method = null; try { - String deleteUri = cdnManagementURL + "/" + sanitizeForURI(container) +"/"+sanitizeForURI(object); + String deleteUri = cdnManagementURL + "/" + sanitizeForURI(container) +"/"+sanitizeAndPreserveSlashes(object); method = new HttpDelete(deleteUri); method.getParams().setIntParameter("http.socket.timeout", connectionTimeOut); method.setHeader(FilesConstants.X_AUTH_TOKEN, authToken); @@ -2712,7 +2697,6 @@ public static String md5Sum (byte[] data) throws IOException public static String sanitizeForURI(String str) { URLCodec codec= new URLCodec(); try { - //return codec.encode(str).replaceAll("\\+", "%20").replaceAll("%2F", "/"); return codec.encode(str).replaceAll("\\+", "%20"); } catch (EncoderException ee) { @@ -2721,6 +2705,17 @@ public static String sanitizeForURI(String str) { } } + public static String sanitizeAndPreserveSlashes(String str) { + URLCodec codec= new URLCodec(); + try { + return codec.encode(str).replaceAll("\\+", "%20").replaceAll("%2F", "/"); + } + catch (EncoderException ee) { + logger.warn("Error trying to encode string for URI", ee); + return str; + } + } + public static String unencodeURI(String str) { URLCodec codec= new URLCodec(); try { diff --git a/src/main/java/com/rackspacecloud/client/cloudfiles/FilesConstants.java b/src/main/java/com/rackspacecloud/client/cloudfiles/FilesConstants.java index bf101e2..c3d6b1c 100644 --- a/src/main/java/com/rackspacecloud/client/cloudfiles/FilesConstants.java +++ b/src/main/java/com/rackspacecloud/client/cloudfiles/FilesConstants.java @@ -12,7 +12,7 @@ public class FilesConstants { private static Logger logger = Logger.getLogger(FilesConstants.class); - public static final String USER_AGENT = "java-cloudfiles/1.8.1"; + public static final String USER_AGENT = "java-cloudfiles/1.8.2"; /** HTTP Header token that identifies the username to Cloud Files **/ public static final String X_STORAGE_USER_DEFAULT = "x-auth-user"; diff --git a/src/test/java/com/rackspacecloud/client/cloudfiles/FilesClientTestCase.java b/src/test/java/com/rackspacecloud/client/cloudfiles/FilesClientTestCase.java index 66dbc33..4fe4446 100644 --- a/src/test/java/com/rackspacecloud/client/cloudfiles/FilesClientTestCase.java +++ b/src/test/java/com/rackspacecloud/client/cloudfiles/FilesClientTestCase.java @@ -1587,7 +1587,9 @@ public void testCDNPurge() { //client.purgeCDNContainer(containerName, "lowell.vaughn@rackspace.com"); client.purgeCDNContainer(containerName, null); - client.purgeCDNObject(containerName, "object.txt", "lowell.vaughn@rackspace.com"); + //client.purgeCDNObject(containerName, "object.txt", "lowell.vaughn@rackspace.com"); + client.purgeCDNObject(containerName, "object.txt", null); + client.purgeCDNObject(containerName, "path/object.txt", null); assertTrue(client.deleteContainer(containerName)); From 346eb0aaf34d79e75901bbf8351c6053e3d441d2 Mon Sep 17 00:00:00 2001 From: Conrad Weidenkeller Date: Thu, 31 Mar 2011 05:49:42 -0600 Subject: [PATCH 46/64] added support for manifests to support Large Objects --- .../client/cloudfiles/FilesClient.java | 154 +++++++++++++++++- .../client/cloudfiles/FilesConstants.java | 2 + 2 files changed, 153 insertions(+), 3 deletions(-) diff --git a/src/main/java/com/rackspacecloud/client/cloudfiles/FilesClient.java b/src/main/java/com/rackspacecloud/client/cloudfiles/FilesClient.java index 525625f..70730a7 100644 --- a/src/main/java/com/rackspacecloud/client/cloudfiles/FilesClient.java +++ b/src/main/java/com/rackspacecloud/client/cloudfiles/FilesClient.java @@ -1873,6 +1873,136 @@ else if (response.getStatusCode() == HttpStatus.SC_UNAUTHORIZED) { throw new FilesAuthorizationException("You must be logged in", null, null); } } + /** + * Create a manifest on the server, including metadata + * + * @param container The name of the container + * @param obj The File containing the file to copy over + * @param contentType The MIME type of the file + * @param name The name of the file on the server + * @param manifest Set manifest content here + * @param callback The object to which any callbacks will be sent (null if you don't want callbacks) + * @throws IOException There was an IO error doing network communication + * @throws HttpException There was an error with the http protocol + * @throws FilesException + */ + public boolean createManifestObject(String container, String contentType, String name, String manifest, IFilesTransferCallback callback) throws IOException, HttpException, FilesException + { + return createManifestObject(container, contentType, name, manifest, new HashMap(), callback); + } + /** + * Create a manifest on the server, including metadata + * + * @param container The name of the container + * @param obj The File containing the file to copy over + * @param contentType The MIME type of the file + * @param name The name of the file on the server + * @param manifest Set manifest content here + * @param metadata A map with the metadata as key names and values as the metadata values + * @throws IOException There was an IO error doing network communication + * @throws HttpException There was an error with the http protocol + * @throws FilesException + */ + public boolean createManifestObject(String container, String contentType, String name, String manifest, Map metadata) throws IOException, HttpException, FilesException + { + return createManifestObject(container, contentType, name, manifest, metadata, null); + } + /** + * Create a manifest on the server, including metadata + * + * @param container The name of the container + * @param obj The File containing the file to copy over + * @param contentType The MIME type of the file + * @param name The name of the file on the server + * @param manifest Set manifest content here + * @param metadata A map with the metadata as key names and values as the metadata values + * @param callback The object to which any callbacks will be sent (null if you don't want callbacks) + * @throws IOException There was an IO error doing network communication + * @throws HttpException There was an error with the http protocol + * @throws FilesException + */ + public boolean createManifestObject(String container, String contentType, String name, String manifest, Map metadata, IFilesTransferCallback callback) throws IOException, HttpException, FilesException + { + byte[] arr = new byte[0]; + if (this.isLoggedin()) + { + String objName = name; + if (isValidContainerName(container) && isValidObjectName(objName)) + { + + HttpPut method = null; + try { + method = new HttpPut(storageURL+"/"+sanitizeForURI(container)+"/"+sanitizeForURI(objName)); + method.getParams().setIntParameter("http.socket.timeout", connectionTimeOut); + method.setHeader(FilesConstants.X_AUTH_TOKEN, authToken); + method.setHeader(FilesConstants.MANIFEST_HEADER, manifest); + ByteArrayEntity entity = new ByteArrayEntity (arr); + entity.setContentType(contentType); + method.setEntity(new RequestEntityWrapper(entity, callback)); + for(String key : metadata.keySet()) { + // logger.warn("Key:" + key + ":" + sanitizeForURI(metadata.get(key))); + method.setHeader(FilesConstants.X_OBJECT_META + key, sanitizeForURI(metadata.get(key))); + } + + FilesResponse response = new FilesResponse(client.execute(method)); + + if (response.getStatusCode() == HttpStatus.SC_UNAUTHORIZED) { + method.abort(); + if(login()) { + method = new HttpPut(storageURL+"/"+sanitizeForURI(container)+"/"+sanitizeForURI(objName)); + method.getParams().setIntParameter("http.socket.timeout", connectionTimeOut); + method.setHeader(FilesConstants.X_AUTH_TOKEN, authToken); + if (manifest != null){ + method.setHeader(FilesConstants.MANIFEST_HEADER, manifest); + } + entity = new ByteArrayEntity (arr); + entity.setContentType(contentType); + method.setEntity(new RequestEntityWrapper(entity, callback)); + for(String key : metadata.keySet()) { + method.setHeader(FilesConstants.X_OBJECT_META + key, sanitizeForURI(metadata.get(key))); + } + response = new FilesResponse(client.execute(method)); + } + else { + throw new FilesAuthorizationException("Re-login failed", response.getResponseHeaders(), response.getStatusLine()); + } + } + + if (response.getStatusCode() == HttpStatus.SC_CREATED) + { + return true; + } + else if (response.getStatusCode() == HttpStatus.SC_PRECONDITION_FAILED) + { + throw new FilesException("Etag missmatch", response.getResponseHeaders(), response.getStatusLine()); + } + else if (response.getStatusCode() == HttpStatus.SC_LENGTH_REQUIRED) + { + throw new FilesException("Length miss-match", response.getResponseHeaders(), response.getStatusLine()); + } + else + { + throw new FilesException("Unexpected Server Response", response.getResponseHeaders(), response.getStatusLine()); + } + } + finally{ + if (method != null) method.abort(); + } + } + else + { + if (!isValidObjectName(objName)) { + throw new FilesInvalidNameException(objName); + } + else { + throw new FilesInvalidNameException(container); + } + } + } + else { + throw new FilesAuthorizationException("You must be logged in", null, null); + } + } /** * Store a file on the server @@ -2884,9 +3014,25 @@ public String getCdnManagementURL() { /** * @param config */ - - public boolean updateObjectMetadata(String container, String object, + public boolean updateObjectManifest(String container, String object, String manifest) throws FilesAuthorizationException, + HttpException, IOException, FilesInvalidNameException + { + return updateObjectMetadataAndManifest(container, object, new HashMap(), manifest); + } + /** + * @param config + */ + public boolean updateObjectMetadata(String container, String object, Map metadata) throws FilesAuthorizationException, + HttpException, IOException, FilesInvalidNameException + { + return updateObjectMetadataAndManifest(container, object, metadata, null); + } + /** + * @param config + */ + public boolean updateObjectMetadataAndManifest(String container, String object, + Map metadata, String manifest) throws FilesAuthorizationException, HttpException, IOException, FilesInvalidNameException { FilesResponse response; @@ -2894,7 +3040,6 @@ public boolean updateObjectMetadata(String container, String object, throw new FilesAuthorizationException("You must be logged in", null, null); } - if (!isValidContainerName(container)) throw new FilesInvalidNameException(container); if (!isValidObjectName(object)) @@ -2906,6 +3051,9 @@ public boolean updateObjectMetadata(String container, String object, HttpPost method = null; try { method = new HttpPost(postUrl); + if (manifest != null){ + method.setHeader(FilesConstants.MANIFEST_HEADER, manifest); + } method.getParams().setIntParameter("http.socket.timeout", connectionTimeOut); method.setHeader(FilesConstants.X_AUTH_TOKEN, authToken); if (!(metadata == null || metadata.isEmpty())) { diff --git a/src/main/java/com/rackspacecloud/client/cloudfiles/FilesConstants.java b/src/main/java/com/rackspacecloud/client/cloudfiles/FilesConstants.java index c3d6b1c..9cd4c85 100644 --- a/src/main/java/com/rackspacecloud/client/cloudfiles/FilesConstants.java +++ b/src/main/java/com/rackspacecloud/client/cloudfiles/FilesConstants.java @@ -48,6 +48,8 @@ public class FilesConstants public static final String X_CDN_REFERRER_ACL = "X-Referrer-ACL "; /** HTTP Header used by Cloud Files for the MD5Sum of the object being created in a Container **/ public static final String E_TAG = "ETag"; + /** HTTP Header used for Object Manifest **/ + public static final String MANIFEST_HEADER = "X-Object-Manifest"; /** These constants are used for performing queries on the content of a container **/ public static final String LIST_CONTAINER_NAME_QUERY = "prefix"; public static final String LIST_CONTAINER_LIMIT_OBJ_COUNT_QUERY = "limit"; From f26f13c6aab6f13af06d99540a29aca4ffa47524 Mon Sep 17 00:00:00 2001 From: Lowell Vaughn Date: Thu, 7 Jul 2011 16:16:20 -0500 Subject: [PATCH 47/64] Addingnew login method --- .../client/cloudfiles/FilesClient.java | 26 +++++++++ .../client/cloudfiles/FilesConstants.java | 2 +- .../cloudfiles/FilesClientTestCase.java | 53 ++++++++++++++++++- 3 files changed, 79 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/rackspacecloud/client/cloudfiles/FilesClient.java b/src/main/java/com/rackspacecloud/client/cloudfiles/FilesClient.java index 525625f..fdc89ff 100644 --- a/src/main/java/com/rackspacecloud/client/cloudfiles/FilesClient.java +++ b/src/main/java/com/rackspacecloud/client/cloudfiles/FilesClient.java @@ -298,6 +298,22 @@ public boolean login() throws IOException, HttpException return this.isLoggedin; } + + /** + * Log in to CloudFiles. This method performs the authentication and sets up the client's internal state. + * + * @throws IOException There was an IO error doing network communication + * @throws HttpException There was an error with the http protocol + */ + public boolean login(String authToken, String storageURL, String cdnManagmentUrl) throws IOException, HttpException + { + isLoggedin = true; + this.storageURL = storageURL; + this.cdnManagementURL = cdnManagmentUrl; + this.authToken = authToken; + return true; + } + /** * List all of the containers available in an account, ordered by container name. * @@ -1712,6 +1728,7 @@ else if (response.getStatusCode() == HttpStatus.SC_UNAUTHORIZED) { throw new FilesAuthorizationException("User not Authorized!",response.getResponseHeaders(), response.getStatusLine()); } else { + System.out.println(response.getStatusLine()); throw new FilesException("Unexpected server response",response.getResponseHeaders(), response.getStatusLine()); } } @@ -2757,11 +2774,20 @@ public String getStorageURL() /** * @return Get's our storage token. */ + @Deprecated public String getStorageToken() { return authToken; } + /** + * @return Get's our storage token. + */ + public String getAuthToken() + { + return authToken; + } + /** * Has this instance of the client authenticated itself? Note, this does not mean that a call * right now will work, if the auth token has timed out, you will need to re-auth. diff --git a/src/main/java/com/rackspacecloud/client/cloudfiles/FilesConstants.java b/src/main/java/com/rackspacecloud/client/cloudfiles/FilesConstants.java index c3d6b1c..f9c7f93 100644 --- a/src/main/java/com/rackspacecloud/client/cloudfiles/FilesConstants.java +++ b/src/main/java/com/rackspacecloud/client/cloudfiles/FilesConstants.java @@ -12,7 +12,7 @@ public class FilesConstants { private static Logger logger = Logger.getLogger(FilesConstants.class); - public static final String USER_AGENT = "java-cloudfiles/1.8.2"; + public static final String USER_AGENT = "java-cloudfiles/1.9.0"; /** HTTP Header token that identifies the username to Cloud Files **/ public static final String X_STORAGE_USER_DEFAULT = "x-auth-user"; diff --git a/src/test/java/com/rackspacecloud/client/cloudfiles/FilesClientTestCase.java b/src/test/java/com/rackspacecloud/client/cloudfiles/FilesClientTestCase.java index 4fe4446..14d9cc5 100644 --- a/src/test/java/com/rackspacecloud/client/cloudfiles/FilesClientTestCase.java +++ b/src/test/java/com/rackspacecloud/client/cloudfiles/FilesClientTestCase.java @@ -176,7 +176,7 @@ public void testContainerCreation() { //logger.error("Creating the container"); client.createContainer(containerName); //logger.error("URL:\n" + client.getStorageURL() + "/" + containerName + "\n"); - Thread.sleep(10000); + //Thread.sleep(10000); // See that it's there assertTrue(client.containerExists(containerName)); @@ -206,6 +206,57 @@ public void testContainerCreation() { } } + public void testAlternateLoginMethod() { + FilesClient client = new FilesClient(); + try { + assertTrue(client.login()); + String containerName = createTempContainerName("container"); + + // Make sure it's not there + assertFalse(client.containerExists(containerName)); + + // Add it + //logger.error("Creating the container"); + client.createContainer(containerName); + //logger.error("URL:\n" + client.getStorageURL() + "/" + containerName + "\n"); + Thread.sleep(1000); + + // See that it's there + assertTrue(client.containerExists(containerName)); + assertNotNull(client.getContainerInfo(containerName)); + + // Create a new Client + FilesClient newClient = new FilesClient(); + newClient.login(client.getAuthToken(), client.getStorageURL(), client.getCdnManagementURL()); + + // See that it's still there + assertTrue(newClient.containerExists(containerName)); + assertNotNull(newClient.getContainerInfo(containerName)); + + // Try Adding it again + try { + newClient.createContainer(containerName); + fail("Allowed duplicate container creation"); + } + catch (FilesContainerExistsException fcee) { + // Hooray! + } + + // See that it's still there + assertTrue(newClient.containerExists(containerName)); + + // Delete it + assertTrue(newClient.deleteContainer(containerName)); + + // Make sure it's gone + assertFalse(newClient.containerExists(containerName)); + + + } catch (Exception e) { + fail(e.getMessage()); + } + } + public void testContainerNotThereDeletion() { FilesClient client = new FilesClient(); try { From 15d88b484b57037680593c1342db487f1ebd6aea Mon Sep 17 00:00:00 2001 From: Lowell Vaughn Date: Thu, 7 Jul 2011 16:20:08 -0500 Subject: [PATCH 48/64] Update path for CLI version --- run_cli.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/run_cli.sh b/run_cli.sh index 3625e5b..017fc42 100755 --- a/run_cli.sh +++ b/run_cli.sh @@ -1,5 +1,5 @@ #!/bin/sh -export CLASSPATH=lib/commons-cli-1.1.jar:lib/commons-httpclient-3.1.jar:lib/commons-lang-2.4.jar:lib/junit.jar:lib/commons-codec-1.3.jar:lib/commons-io-1.4.jar:lib/commons-logging-1.1.1.jar:lib/log4j-1.2.15.jar:dist/java-cloudfiles.jar:. +export CLASSPATH=lib/httpcore-4.1.jar:lib/commons-cli-1.1.jar:lib/httpclient-4.0.3.jar:lib/commons-lang-2.4.jar:lib/junit.jar:lib/commons-codec-1.3.jar:lib/commons-io-1.4.jar:lib/commons-logging-1.1.1.jar:lib/log4j-1.2.15.jar:dist/java-cloudfiles.jar:. java com.rackspacecloud.client.cloudfiles.sample.FilesCli From afeb617f897cf0b5526d7f9443711f1d02cc0707 Mon Sep 17 00:00:00 2001 From: Tim Simpson Date: Mon, 8 Aug 2011 22:14:06 -0500 Subject: [PATCH 49/64] Added a non-interactive mode to the CLI tool and a batch file for Windows users. --- run_cli.bat | 4 + run_cli.sh | 2 +- .../client/cloudfiles/sample/FilesCli.java | 100 +++++++++++++++--- 3 files changed, 88 insertions(+), 18 deletions(-) create mode 100644 run_cli.bat diff --git a/run_cli.bat b/run_cli.bat new file mode 100644 index 0000000..50b11cb --- /dev/null +++ b/run_cli.bat @@ -0,0 +1,4 @@ +@ECHO OFF +SET SCRIPT_DIR=%~dp0 +java -classpath %SCRIPT_DIR%lib/httpcore-4.1.jar;%SCRIPT_DIR%lib/commons-cli-1.1.jar;%SCRIPT_DIR%lib/httpclient-4.0.3.jar;%SCRIPT_DIR%lib/commons-lang-2.4.jar;%SCRIPT_DIR%lib/junit.jar;%SCRIPT_DIR%lib/commons-codec-1.3.jar;%SCRIPT_DIR%lib/commons-io-1.4.jar;%SCRIPT_DIR%lib/commons-logging-1.1.1.jar;%SCRIPT_DIR%lib/log4j-1.2.15.jar;%SCRIPT_DIR%dist/java-cloudfiles.jar;%SCRIPT_DIR%. com.rackspacecloud.client.cloudfiles.sample.FilesCli %* +@ECHO ON diff --git a/run_cli.sh b/run_cli.sh index 017fc42..c9572a4 100755 --- a/run_cli.sh +++ b/run_cli.sh @@ -2,4 +2,4 @@ export CLASSPATH=lib/httpcore-4.1.jar:lib/commons-cli-1.1.jar:lib/httpclient-4.0.3.jar:lib/commons-lang-2.4.jar:lib/junit.jar:lib/commons-codec-1.3.jar:lib/commons-io-1.4.jar:lib/commons-logging-1.1.1.jar:lib/log4j-1.2.15.jar:dist/java-cloudfiles.jar:. -java com.rackspacecloud.client.cloudfiles.sample.FilesCli +java com.rackspacecloud.client.cloudfiles.sample.FilesCli $@ diff --git a/src/main/java/com/rackspacecloud/client/cloudfiles/sample/FilesCli.java b/src/main/java/com/rackspacecloud/client/cloudfiles/sample/FilesCli.java index 01d62dc..ed803d6 100644 --- a/src/main/java/com/rackspacecloud/client/cloudfiles/sample/FilesCli.java +++ b/src/main/java/com/rackspacecloud/client/cloudfiles/sample/FilesCli.java @@ -11,6 +11,7 @@ import java.io.InputStream; import java.io.InputStreamReader; import java.text.DecimalFormat; +import java.util.ArrayList; import java.util.List; import java.util.Map; @@ -42,23 +43,8 @@ private boolean doLogin() { System.out.print("Password: "); String password = console.readLine().trim(); - - System.out.print("Account (return if using Mosso directly): "); - String account = console.readLine().trim(); - - if (account.length() == 0) { - account = null; - } - client = new FilesClient(username, password, account); - boolean result = client.login(); - - if (result) { - System.out.println("Logged in!"); - } - else { - System.out.println("Login failed"); - } + final boolean result = doLogin(username, password); return result; } catch (Exception e) { @@ -70,6 +56,11 @@ private boolean doLogin() { } + private boolean doLogin(final String username, final String password) throws Exception { + client = new FilesClient(username, password); + return client.login(); + } + private static final String HELP_STRING = "Commands:\n" + " get List the containers for this account\n" + @@ -93,9 +84,16 @@ private boolean evaluateCommand(String cmd) { System.out.println(HELP_STRING); return true; } + return evaluateCommand(components); + } + + private boolean evaluateCommand(String[] components) { String command = components[0].toLowerCase(); + if ("help".equals(command)) { + System.out.println(HELP_STRING); + } // Exit if("exit".equals(command) || "quit".equals(command)) { System.out.println("Exiting"); @@ -362,17 +360,85 @@ else if(components.length == 3) { } // We should never get here - System.out.println("Unrecognized command " + cmd); + System.out.println("Unrecognized command " + command); System.out.println(HELP_STRING); return true; } + public static class CommandLineOptions { + public final String userName; + public final String password; + public final String[] command; + + public CommandLineOptions(String[] args) { + String userName = null; + String password = null; + List command = new ArrayList(); + userName = System.getenv("CLOUDFILES_USERNAME"); + password = System.getenv("CLOUDFILES_PASSWORD"); + for (int i = 0; i < args.length; i ++) { + if ("username".equals(args[i])) { + if (i >= args.length - 1) { + throw new RuntimeException("No argument following option 'username'."); + } + userName = args[i + 1]; + i ++; + } else if ("password".equals(args[i])) { + if (i >= args.length - 1) { + throw new RuntimeException("No argument following option 'password'."); + } + password = args[i + 1]; + i ++; + } else { + command.add(args[i]); + } + } + if (userName == null) { + throw new RuntimeException("No username specified (use option 'username' or set CLOUDFILES_USERNAME environment variable)."); + } + if (password == null) { + throw new RuntimeException("No password specified (use option 'password' or set CLOUDFILES_PASSWORD environment variable)."); + } + this.userName = userName; + this.password = password; + this.command = new String[command.size()]; + command.toArray(this.command); + } + + } /** * @param args */ public static void main(String[] args) { + if (args.length < 1) { + interactiveMode(); + } else { + parseArgs(args); + } + } + + public static void parseArgs(String[] args) { + try { + final CommandLineOptions options = new CommandLineOptions(args); + final FilesCli cli = new FilesCli(); + if (!cli.doLogin(options.userName, options.password)) { + throw new RuntimeException("Failed to login."); + } + if (options.command.length == 0) { + System.out.println("Login was successful, but no other commands were specified."); + System.out.println(HELP_STRING); + } else { + cli.evaluateCommand(options.command); + } + } catch(Exception e) { + System.err.println("Error:" + e.getMessage()); + e.printStackTrace(); + } + } + + public static void interactiveMode() { FilesCli commandLine = new FilesCli(); if (commandLine.doLogin()) { From f6ab5560f66fb894248e589045dda372022c8e0b Mon Sep 17 00:00:00 2001 From: Tim Simpson Date: Mon, 8 Aug 2011 22:32:16 -0500 Subject: [PATCH 50/64] Renamed the CLI scripts to start with 'cloudfiles' instead of 'run_cli'. --- run_cli.bat => cloudfiles.bat | 0 run_cli.sh => cloudfiles.sh | 0 2 files changed, 0 insertions(+), 0 deletions(-) rename run_cli.bat => cloudfiles.bat (100%) rename run_cli.sh => cloudfiles.sh (100%) diff --git a/run_cli.bat b/cloudfiles.bat similarity index 100% rename from run_cli.bat rename to cloudfiles.bat diff --git a/run_cli.sh b/cloudfiles.sh similarity index 100% rename from run_cli.sh rename to cloudfiles.sh From 716c92beb8109be1b7368d2995cfb514f150bef7 Mon Sep 17 00:00:00 2001 From: Tim Simpson Date: Mon, 8 Aug 2011 22:36:12 -0500 Subject: [PATCH 51/64] Fixed ant build script. --- build.xml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/build.xml b/build.xml index ec456ee..770b389 100644 --- a/build.xml +++ b/build.xml @@ -128,7 +128,8 @@ - + + From 8c5288d7290aebf056879a3e14f2a3a956e52541 Mon Sep 17 00:00:00 2001 From: Andrew Woods Date: Sat, 13 Aug 2011 16:20:03 -0400 Subject: [PATCH 52/64] This update adds the method FilesClient.copyObject() which calls down to the relevant REST method. --- .../client/cloudfiles/FilesClient.java | 91 ++++++++++++ .../client/cloudfiles/FilesConstants.java | 2 + .../cloudfiles/FilesClientTestCase.java | 132 +++++++++++++++++- 3 files changed, 223 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/rackspacecloud/client/cloudfiles/FilesClient.java b/src/main/java/com/rackspacecloud/client/cloudfiles/FilesClient.java index 0b88049..8e22acc 100644 --- a/src/main/java/com/rackspacecloud/client/cloudfiles/FilesClient.java +++ b/src/main/java/com/rackspacecloud/client/cloudfiles/FilesClient.java @@ -32,6 +32,7 @@ import org.apache.http.Header; import org.apache.http.HttpEntity; import org.apache.http.HttpException; +import org.apache.http.HttpHeaders; import org.apache.http.HttpResponse; import org.apache.http.HttpStatus; import org.apache.http.NameValuePair; @@ -2447,6 +2448,96 @@ public String storeObjectAs(String container, String name, HttpEntity entity, Ma } } + /** + * This method copies the object found in the source container with the + * source object name to the destination container with the destination + * object name. + * @param sourceContainer of object to copy + * @param sourceObjName of object to copy + * @param destContainer where object copy will be copied + * @param destObjName of object copy + * @return ETAG if successful, else null + * @throws IOException indicates a socket level error talking to CloudFiles + * @throws HttpException indicates a protocol level error talking to CloudFiles + * @throws FilesException indicates an error talking to CloudFiles + */ + public String copyObject(String sourceContainer, + String sourceObjName, + String destContainer, + String destObjName) + throws HttpException, IOException { + String etag = null; + if (this.isLoggedin()) { + + if (isValidContainerName(sourceContainer) && + isValidObjectName(sourceObjName) && + isValidContainerName(destContainer) && + isValidObjectName(destObjName)) { + + HttpPut method = null; + try { + String sourceURI = sanitizeForURI(sourceContainer) + + "/" + sanitizeForURI(sourceObjName); + String destinationURI = sanitizeForURI(destContainer) + + "/" + sanitizeForURI(destObjName); + + method = new HttpPut(storageURL + "/" + destinationURI); + method.getParams().setIntParameter("http.socket.timeout", + connectionTimeOut); + method.setHeader(FilesConstants.X_AUTH_TOKEN, authToken); + method.setHeader(FilesConstants.X_COPY_FROM, sourceURI); + + FilesResponse response = new FilesResponse(client.execute( + method)); + + if (response.getStatusCode() == HttpStatus.SC_UNAUTHORIZED) { + method.abort(); + + login(); + method = new HttpPut(storageURL + "/" + destinationURI); + method.getParams().setIntParameter("http.socket.timeout", + connectionTimeOut); + method.setHeader(FilesConstants.X_AUTH_TOKEN, authToken); + method.setHeader(FilesConstants.X_COPY_FROM, sourceURI); + + response = new FilesResponse(client.execute(method)); + } + + if (response.getStatusCode() == HttpStatus.SC_CREATED) { + etag = response.getResponseHeader(FilesConstants.E_TAG) + .getValue(); + + } else { + throw new FilesException("Unexpected status from server", + response.getResponseHeaders(), + response.getStatusLine()); + } + + } finally { + if (method != null) { + method.abort(); + } + } + } else { + if (!isValidContainerName(sourceContainer)) { + throw new FilesInvalidNameException(sourceContainer); + } else if (!isValidObjectName(sourceObjName)) { + throw new FilesInvalidNameException(sourceObjName); + } else if (!isValidContainerName(destContainer)) { + throw new FilesInvalidNameException(destContainer); + } else { + throw new FilesInvalidNameException(destObjName); + } + } + } else { + throw new FilesAuthorizationException("You must be logged in", + null, + null); + } + + return etag; + } + /** * Delete the given object from it's container. * diff --git a/src/main/java/com/rackspacecloud/client/cloudfiles/FilesConstants.java b/src/main/java/com/rackspacecloud/client/cloudfiles/FilesConstants.java index df425ab..0bc7b8c 100644 --- a/src/main/java/com/rackspacecloud/client/cloudfiles/FilesConstants.java +++ b/src/main/java/com/rackspacecloud/client/cloudfiles/FilesConstants.java @@ -46,6 +46,8 @@ public class FilesConstants public static final String X_CDN_USER_AGENT_ACL = "X-User-Agent-ACL"; /** HTTP header token that is returned by calls to the CDN Management API **/ public static final String X_CDN_REFERRER_ACL = "X-Referrer-ACL "; + /** HTTP header used by Cloud Files for the source of an object being copied. The value of this header is // **/ + public static final String X_COPY_FROM = "X-Copy-From"; /** HTTP Header used by Cloud Files for the MD5Sum of the object being created in a Container **/ public static final String E_TAG = "ETag"; /** HTTP Header used for Object Manifest **/ diff --git a/src/test/java/com/rackspacecloud/client/cloudfiles/FilesClientTestCase.java b/src/test/java/com/rackspacecloud/client/cloudfiles/FilesClientTestCase.java index 14d9cc5..8916531 100644 --- a/src/test/java/com/rackspacecloud/client/cloudfiles/FilesClientTestCase.java +++ b/src/test/java/com/rackspacecloud/client/cloudfiles/FilesClientTestCase.java @@ -15,6 +15,7 @@ import java.util.Map; import java.util.Random; +import org.apache.http.HttpException; import org.apache.http.entity.ByteArrayEntity; import org.apache.http.impl.client.DefaultHttpClient; import org.apache.commons.io.FilenameUtils; @@ -900,8 +901,135 @@ public void testFileSavingNoETag() { } } - - public void testContainerListing() { + + public void testCopyObject() throws Exception { + String containerSrc = createTempContainerName("copy-source"); + String containerDest = createTempContainerName("copy-dest"); + doTestCopyObject(containerSrc, containerDest); + } + + public void testCopyObjectSameContainer() throws Exception { + String containerSrc = createTempContainerName("copy-source1"); + doTestCopyObject(containerSrc, containerSrc); + } + + public void testCopyObjectNoDestContainer() throws Exception { + String containerSrc = createTempContainerName("copy-source2"); + String containerDest = null; + + try { + System.err.println("-- expected 404 exception below --"); + doTestCopyObject(containerSrc, containerDest); + fail("exception expected"); + + } catch (FilesException fe) { + assertEquals(404, fe.getHttpStatusCode()); + } + } + + public void doTestCopyObject(String containerSrc, String containerDest) + throws Exception { + String filename = makeFileName("copy"); + String fullPath = FilenameUtils.concat(SYSTEM_TMP.getAbsolutePath(), + filename); + logger.info("Test Copy File Location: " + fullPath); + try { + byte randomData[] = makeRandomFile(fullPath); + FilesClient client = new FilesClient(); + assertTrue(client.login()); + + // Set up + client.createContainer(containerSrc); + if (null != containerDest && !containerSrc.equals(containerDest)) { + client.createContainer(containerDest); + } + + // Store it + logger.info("About to save: " + filename); + String mime = "application/octet-stream"; + assertNotNull(client.storeObjectAs(containerSrc, + new File(fullPath), + mime, + filename)); + + verifyStoredObject(containerSrc, + filename, + mime, + randomData, + client); + + // Do the copy + logger.info("About to copy: " + filename); + String dest = null == containerDest ? "not-exist" : containerDest; + String etag = client.copyObject(containerSrc, + filename, + dest, + filename); + + String md5 = FilesClient.md5Sum(randomData); + assertEquals(md5, etag); + + verifyStoredObject(containerDest, + filename, + mime, + randomData, + client); + + // Clean up + client.deleteObject(containerSrc, filename); + assertTrue(client.deleteContainer(containerSrc)); + if (null != containerDest && !containerSrc.equals(containerDest)) { + client.deleteObject(containerDest, filename); + assertTrue(client.deleteContainer(containerDest)); + } + + } catch (FilesException fe) { + System.err.println(fe.getHttpHeadersAsString()); + System.err.println(fe.getHttpStatusMessage()); + System.err.println(fe.getHttpStatusCode()); + System.err.println(fe.getMessage()); + fe.printStackTrace(); + throw fe; + + } catch (Exception e) { + e.printStackTrace(); + System.err.println(e.getMessage()); + throw e; + + } finally { + File f = new File(fullPath); + f.delete(); + } + } + + private void verifyStoredObject(String container, + String objName, + String mime, + byte[] data, + FilesClient client) + throws IOException, HttpException { + + // Make sure it's there + List objects = client.listObjects(container); + assertEquals(1, objects.size()); + FilesObject obj = objects.get(0); + assertEquals(objName, obj.getName()); + assertEquals(mime, obj.getMimeType()); + + // Make sure the data is correct + assertArrayEquals(data, client.getObject(container, objName)); + + // Make sure the data is correct as a stream + InputStream is = client.getObjectAsStream(container, objName); + byte otherData[] = new byte[NUMBER_RANDOM_BYTES]; + is.read(otherData); + assertArrayEquals(data, otherData); + + // Could hang if there's a bug on the other end + assertEquals(-1, is.read()); + } + + public void testContainerListing() { String containerName = createTempContainerName(""); String filename = makeFileName(""); String fullPath = FilenameUtils.concat(SYSTEM_TMP.getAbsolutePath(), filename); From 7d82e75439ddf0ae059a0fc39287c4cec9ef6cdc Mon Sep 17 00:00:00 2001 From: Lowell Vaughn Date: Thu, 25 Aug 2011 11:41:03 -0500 Subject: [PATCH 53/64] Fixing multi-threaded issue pointed out by Yaguang Wang at Intel (who also provided the fix) --- .../java/com/rackspacecloud/client/cloudfiles/FilesUtil.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/rackspacecloud/client/cloudfiles/FilesUtil.java b/src/main/java/com/rackspacecloud/client/cloudfiles/FilesUtil.java index a4a0a75..cf9a438 100644 --- a/src/main/java/com/rackspacecloud/client/cloudfiles/FilesUtil.java +++ b/src/main/java/com/rackspacecloud/client/cloudfiles/FilesUtil.java @@ -31,7 +31,7 @@ public class FilesUtil { * * @throws IOException */ - private static void loadPropertiesFromClasspath() throws IOException { + private static synchronized void loadPropertiesFromClasspath() throws IOException { props = new Properties(); InputStream inputStream = FilesUtil.class.getClassLoader() .getResourceAsStream(file); From 650697d478b6762a2dab420eae60e5db4cd8e119 Mon Sep 17 00:00:00 2001 From: Conrad Weidenkeller Date: Mon, 12 Sep 2011 08:13:33 -0500 Subject: [PATCH 54/64] Added Support for CDN Streaming URL --- .../client/cloudfiles/FilesCDNContainer.java | 22 ++++++++++++++++++- .../client/cloudfiles/FilesClient.java | 4 ++++ .../client/cloudfiles/FilesConstants.java | 4 +++- .../client/cloudfiles/FilesResponse.java | 13 +++++++++++ .../cloudfiles/FilesClientTestCase.java | 2 ++ 5 files changed, 43 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/rackspacecloud/client/cloudfiles/FilesCDNContainer.java b/src/main/java/com/rackspacecloud/client/cloudfiles/FilesCDNContainer.java index c822691..9752907 100644 --- a/src/main/java/com/rackspacecloud/client/cloudfiles/FilesCDNContainer.java +++ b/src/main/java/com/rackspacecloud/client/cloudfiles/FilesCDNContainer.java @@ -14,6 +14,7 @@ public class FilesCDNContainer { private int ttl; private String cdnURL; private String sslURL = null; + private String streamingURL = null; private String name; private boolean retainLogs; @@ -43,6 +44,12 @@ public FilesCDNContainer(String cdnURL, String sslUrl) { this.sslURL = sslUrl; } + public FilesCDNContainer(String cdnURL, String sslUrl, String streamingUrl) { + this.cdnURL = cdnURL; + this.sslURL = sslUrl; + this.streamingURL = streamingUrl; + } + public FilesCDNContainer(String name, boolean enabled, int ttl, boolean retainLogs) { this.enabled = enabled; this.ttl = ttl; @@ -142,6 +149,19 @@ public String getSSLURL() { void setSSLURL(String sslURL) { this.sslURL = sslURL; } + + /** + * @return The Streaming URL for accessing content in this container via the CDN + */ + public String getStreamingURL() { + return this.streamingURL; + } - + /** + * + * @param sstreamingURL the streamingURL to set + */ + void setStreamingURL(String streamingURL) { + this.streamingURL = streamingURL; + } } diff --git a/src/main/java/com/rackspacecloud/client/cloudfiles/FilesClient.java b/src/main/java/com/rackspacecloud/client/cloudfiles/FilesClient.java index 8e22acc..332d2b1 100644 --- a/src/main/java/com/rackspacecloud/client/cloudfiles/FilesClient.java +++ b/src/main/java/com/rackspacecloud/client/cloudfiles/FilesClient.java @@ -1343,6 +1343,7 @@ public FilesCDNContainer getCDNContainerInfo(String container) throws IOExceptio FilesCDNContainer result = new FilesCDNContainer(response.getCdnUrl()); result.setName(container); result.setSSLURL(response.getCdnSslUrl()); + result.setStreamingURL(response.getCdnStreamingUrl()); for (Header hdr : response.getResponseHeaders()) { String name = hdr.getName().toLowerCase(); if ("x-cdn-enabled".equals(name)) { @@ -1842,6 +1843,9 @@ else if ("cdn_url".equals(data.getNodeName())) { else if ("cdn_ssl_url".equals(data.getNodeName())) { container.setSSLURL(data.getTextContent()); } + else if ("cdn_streaming_url".equals(data.getNodeName())) { + container.setStreamingURL(data.getTextContent()); + } else if ("cdn_enabled".equals(data.getNodeName())) { container.setEnabled(Boolean.parseBoolean(data.getTextContent())); } diff --git a/src/main/java/com/rackspacecloud/client/cloudfiles/FilesConstants.java b/src/main/java/com/rackspacecloud/client/cloudfiles/FilesConstants.java index 0bc7b8c..584cb03 100644 --- a/src/main/java/com/rackspacecloud/client/cloudfiles/FilesConstants.java +++ b/src/main/java/com/rackspacecloud/client/cloudfiles/FilesConstants.java @@ -12,7 +12,7 @@ public class FilesConstants { private static Logger logger = Logger.getLogger(FilesConstants.class); - public static final String USER_AGENT = "java-cloudfiles/1.9.0"; + public static final String USER_AGENT = "java-cloudfiles/1.9.1"; /** HTTP Header token that identifies the username to Cloud Files **/ public static final String X_STORAGE_USER_DEFAULT = "x-auth-user"; @@ -37,6 +37,8 @@ public class FilesConstants /** HTTP header token that is returned by calls to the CDN Management API **/ public static final String X_CDN_SSL_URI = "X-CDN-SSL-URI"; /** HTTP header token that is returned by calls to the CDN Management API **/ + public static final String X_CDN_Streaming_URI = "X-CDN-Streaming-URI"; + /** HTTP header token that is returned by calls to the CDN Management API **/ public static final String X_CDN_TTL = "X-TTL"; /** HTTP header token that is returned by calls to the CDN Management API **/ public static final String X_CDN_RETAIN_LOGS = "X-Log-Retention"; diff --git a/src/main/java/com/rackspacecloud/client/cloudfiles/FilesResponse.java b/src/main/java/com/rackspacecloud/client/cloudfiles/FilesResponse.java index 018e019..adb8b9f 100644 --- a/src/main/java/com/rackspacecloud/client/cloudfiles/FilesResponse.java +++ b/src/main/java/com/rackspacecloud/client/cloudfiles/FilesResponse.java @@ -303,6 +303,19 @@ public String getCdnSslUrl () return cdnHeader.getValue(); return null; } + + /** + * Get the SSL URL For a shared container + * + * @return null if the header is not present or the correct value as defined by the header + */ + public String getCdnStreamingUrl () + { + Header cdnHeader = getResponseHeader (FilesConstants.X_CDN_Streaming_URI); + if (cdnHeader != null ) + return cdnHeader.getValue(); + return null; + } /** * Returns the response headers with the given name. Note that header-name matching is case insensitive. diff --git a/src/test/java/com/rackspacecloud/client/cloudfiles/FilesClientTestCase.java b/src/test/java/com/rackspacecloud/client/cloudfiles/FilesClientTestCase.java index 8916531..6f13378 100644 --- a/src/test/java/com/rackspacecloud/client/cloudfiles/FilesClientTestCase.java +++ b/src/test/java/com/rackspacecloud/client/cloudfiles/FilesClientTestCase.java @@ -1706,6 +1706,7 @@ public void testCDNContainerFullListing() { for (int i=0; i < 5; i++) { assertEquals(originalContainers.get(i), containers.get(i).getName()); assertNotNull(containers.get(i).getSSLURL()); + assertNotNull(containers.get(i).getStreamingURL()); } // Now check out a marker @@ -1826,6 +1827,7 @@ public void testCDNApi() { String cdnUrl = info.getCdnURL(); assertNotNull(cdnUrl); assertNotNull(info.getSSLURL()); + assertNotNull(info.getStreamingURL()); client.cdnUpdateContainer(containerName, 31415, false, true); assertFalse(client.isCDNEnabled(containerName)); From 3a794cc1478767450454c32cebf88b6975d7247d Mon Sep 17 00:00:00 2001 From: Conrad Weidenkeller Date: Mon, 12 Sep 2011 08:17:30 -0500 Subject: [PATCH 55/64] Needed to bump version number in FilesConstants.java --- .../com/rackspacecloud/client/cloudfiles/FilesConstants.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/rackspacecloud/client/cloudfiles/FilesConstants.java b/src/main/java/com/rackspacecloud/client/cloudfiles/FilesConstants.java index 584cb03..5e09da5 100644 --- a/src/main/java/com/rackspacecloud/client/cloudfiles/FilesConstants.java +++ b/src/main/java/com/rackspacecloud/client/cloudfiles/FilesConstants.java @@ -12,7 +12,7 @@ public class FilesConstants { private static Logger logger = Logger.getLogger(FilesConstants.class); - public static final String USER_AGENT = "java-cloudfiles/1.9.1"; + public static final String USER_AGENT = "java-cloudfiles/1.9.2"; /** HTTP Header token that identifies the username to Cloud Files **/ public static final String X_STORAGE_USER_DEFAULT = "x-auth-user"; From 21a867975e13cbfa118374f523b2fc124b5ec504 Mon Sep 17 00:00:00 2001 From: Alex Date: Mon, 21 Nov 2011 19:26:00 -0500 Subject: [PATCH 56/64] allow ability to set/load prop files from arbitrary input source --- .../client/cloudfiles/FilesUtil.java | 217 ++++++++++-------- 1 file changed, 120 insertions(+), 97 deletions(-) diff --git a/src/main/java/com/rackspacecloud/client/cloudfiles/FilesUtil.java b/src/main/java/com/rackspacecloud/client/cloudfiles/FilesUtil.java index cf9a438..765b6ef 100644 --- a/src/main/java/com/rackspacecloud/client/cloudfiles/FilesUtil.java +++ b/src/main/java/com/rackspacecloud/client/cloudfiles/FilesUtil.java @@ -1,113 +1,136 @@ /* * See COPYING for license information. - */ + */ package com.rackspacecloud.client.cloudfiles; +import org.apache.log4j.Logger; + import java.io.FileNotFoundException; -import java.io.InputStream; import java.io.IOException; +import java.io.InputStream; import java.util.Properties; -import org.apache.log4j.Logger; - /** - * Cloud Files utilities + * Cloud Files utilities */ -public class FilesUtil { +public class FilesUtil +{ private static Logger logger = Logger.getLogger(FilesUtil.class); - /** - * The name of the properties file we're looking for - */ - private final static String file = "cloudfiles.properties"; - - /** - * A cache of the properties - */ - private static Properties props = null; - - /** - * Find the properties file in the class path and load it. - * - * @throws IOException - */ - private static synchronized void loadPropertiesFromClasspath() throws IOException { + + /** + * The name of the properties file we're looking for + */ + private final static String file = "cloudfiles.properties"; + + /** + * A cache of the properties + */ + private static Properties props = null; + + + /** + * Find the properties file in the class path and load it. + * + * @throws IOException + */ + private static synchronized void loadPropertiesFromClasspath() throws IOException + { props = new Properties(); - InputStream inputStream = FilesUtil.class.getClassLoader() - .getResourceAsStream(file); + InputStream io = FilesUtil.class.getClassLoader().getResourceAsStream(file); + if (io == null) + { + throw new FileNotFoundException("Property file '" + file + "' not found in the classpath."); + } + loadProperties(io); + } + - if (inputStream == null) { - throw new FileNotFoundException("Property file '" + file - + "' not found in the classpath"); + /** + * Loads properties from input stream. + * + * @param io + * @throws IOException + */ + public static void loadProperties(final InputStream io) throws IOException + { + if (null == io) + { + throw new IllegalArgumentException("Input stream cannot be null."); + } + props = new Properties(); + props.load(io); + } + + + /** + * Look up a property from the properties file. + * + * @param key The name of the property to be found + * @return The value of the property + */ + public static String getProperty(final String key) + { + if (props == null) + { + try + { + loadPropertiesFromClasspath(); + } + catch (Exception e) + { + logger.warn("Unable to load properties file.", e); + } + } + return props.getProperty(key); + } + + + /** + * Look up a property from the properties file. + * + * @param key The name of the property to be found + * @return The value of the property + */ + public static String getProperty(final String key, final String defaultValue) + { + if (props == null) + { + try + { + loadPropertiesFromClasspath(); + } + catch (Exception e) + { + logger.warn("Unable to load properties file.", e); + } + } + return props.getProperty(key, defaultValue); + } + + + /** + * Looks up the value of a key from the properties file and converts it to an integer. + * + * @param key + * @return The value of that key + */ + public static int getIntProperty(final String key) + { + final String property = getProperty(key); + if (property == null) + { + logger.warn("Could not load integer property " + key + "."); + return -1; + } + try + { + return Integer.parseInt(property); + } + catch (NumberFormatException e) + { + logger.warn("Invalid format for a number in properties file: " + property + ".", e); + return -1; } - props.load(inputStream); - } - - /** - * Look up a property from the properties file. - * - * @param key The name of the property to be found - * @return The value of the property - */ - public static String getProperty(String key) - { - if (props == null) - { - try - { - loadPropertiesFromClasspath(); - } - catch (Exception IOException) - { - logger.warn("Unable to load properties file."); - return null; - } - } - return props.getProperty(key); - } - - /** - * Look up a property from the properties file. - * - * @param key The name of the property to be found - * @return The value of the property - */ - public static String getProperty(String key, String defaultValue) - { - if (props == null) - { - try - { - loadPropertiesFromClasspath(); - } - catch (Exception IOException) - { - logger.warn("Unable to load properties file."); - return null; - } - } - return props.getProperty(key, defaultValue); - } - - /** - * Looks up the value of a key from the properties file and converts it to an integer. - * - * @param key - * @return The value of that key - */ - public static int getIntProperty(String key) { - String property = getProperty(key); - - if (property == null) { - logger.warn("Could not load integer property " + key); - return -1; - } - try { - return Integer.parseInt(property); - } - catch (NumberFormatException nfe) { - logger.warn("Invalid format for a number in properties file: " + property, nfe); - return -1; - } - } + } } From 5f26f490a4d4809f305ba534877c77891a904192 Mon Sep 17 00:00:00 2001 From: timt000 Date: Sat, 26 Nov 2011 21:48:50 -0500 Subject: [PATCH 57/64] missing closing quote --- README | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README b/README index e78246e..81c25d1 100644 --- a/README +++ b/README @@ -1,7 +1,7 @@ In order to build: 1) Download the repository (which if you're doing this, you already have) -2) type "ant compile" (or "ant package if you'd like the full package) +2) type "ant compile" (or "ant package" if you'd like the full package) In order to run unit tests From 5b57d1cc862b3a605f285f9ebeb4b2e4dc0898f8 Mon Sep 17 00:00:00 2001 From: Christophe Hamerling Date: Wed, 21 Dec 2011 16:46:42 +0100 Subject: [PATCH 58/64] POM file for java-clouds --- .gitignore | 6 ++ pom.xml | 100 ++++++++++++++++++ .../client/cloudfiles/FilesClient.java | 1 - 3 files changed, 106 insertions(+), 1 deletion(-) create mode 100644 .gitignore create mode 100644 pom.xml diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..5e342df --- /dev/null +++ b/.gitignore @@ -0,0 +1,6 @@ +target +.settings +.project +.checkstyle +.classpath +*/.checkstyle-rules.xml \ No newline at end of file diff --git a/pom.xml b/pom.xml new file mode 100644 index 0000000..cfab734 --- /dev/null +++ b/pom.xml @@ -0,0 +1,100 @@ + + + 4.0.0 + + + org.sonatype.oss + oss-parent + 7 + + + java-cloudfiles + java-cloudfiles + com.rackspacecloud + 1.0-SNAPSHOT + jar + + + + commons-cli + commons-cli + 1.1 + + + commons-io + commons-io + 1.4 + + + commons-lang + commons-lang + 2.4 + + + commons-codec + commons-codec + 1.3 + + + commons-logging + commons-logging + 1.1.1 + + + org.apache.httpcomponents + httpclient + 4.0.3 + + + log4j + log4j + 1.2.15 + + + junit + junit + 3.8.1 + test + + + + + install + + + src/main/java/com/rackspacecloud/client/cloudfiles/ + com/rackspacecloud/client/cloudfiles/ + + MIME.types + + + + + + + org.apache.maven.plugins + maven-compiler-plugin + + 1.6 + 1.6 + + + + org.apache.maven.plugins + maven-eclipse-plugin + 2.8 + + true + true + + + + + + + scm:git:git@github.com/rackspace/java-cloudfiles.git + scm:git:git@github.com/rackspace/java-cloudfiles.git + git@github.com/rackspace/java-cloudfiles.git + + \ No newline at end of file diff --git a/src/main/java/com/rackspacecloud/client/cloudfiles/FilesClient.java b/src/main/java/com/rackspacecloud/client/cloudfiles/FilesClient.java index 332d2b1..3368a90 100644 --- a/src/main/java/com/rackspacecloud/client/cloudfiles/FilesClient.java +++ b/src/main/java/com/rackspacecloud/client/cloudfiles/FilesClient.java @@ -32,7 +32,6 @@ import org.apache.http.Header; import org.apache.http.HttpEntity; import org.apache.http.HttpException; -import org.apache.http.HttpHeaders; import org.apache.http.HttpResponse; import org.apache.http.HttpStatus; import org.apache.http.NameValuePair; From bdef915ae5be2e64d000bcb523a518677d5b5d09 Mon Sep 17 00:00:00 2001 From: Kevin Downey Date: Fri, 20 Jan 2012 19:12:26 -0800 Subject: [PATCH 59/64] no reason for these to be private instance members --- .../com/rackspacecloud/client/cloudfiles/FilesClient.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/rackspacecloud/client/cloudfiles/FilesClient.java b/src/main/java/com/rackspacecloud/client/cloudfiles/FilesClient.java index 332d2b1..7f6956d 100644 --- a/src/main/java/com/rackspacecloud/client/cloudfiles/FilesClient.java +++ b/src/main/java/com/rackspacecloud/client/cloudfiles/FilesClient.java @@ -3108,7 +3108,7 @@ public String getUserAgent() { return client.getParams().getParameter(HTTP.USER_AGENT).toString(); } - private boolean isValidContainerName(String name) { + public static boolean isValidContainerName(String name) { if (name == null) return false; int length = name.length(); if (length == 0 || length > FilesConstants.CONTAINER_NAME_LENGTH) return false; @@ -3116,7 +3116,7 @@ private boolean isValidContainerName(String name) { //if (name.indexOf('?') != -1) return false; return true; } - private boolean isValidObjectName(String name) { + public static boolean isValidObjectName(String name) { if (name == null) return false; int length = name.length(); if (length == 0 || length > FilesConstants.OBJECT_NAME_LENGTH) return false; From 2fe6be56772eb8e41e63e5e08cc46a69c7b1c6f4 Mon Sep 17 00:00:00 2001 From: Kevin Downey Date: Fri, 20 Jan 2012 19:13:16 -0800 Subject: [PATCH 60/64] add getObjectAsRangedStream --- .../client/cloudfiles/FilesClient.java | 58 +++++++++++++++++++ 1 file changed, 58 insertions(+) diff --git a/src/main/java/com/rackspacecloud/client/cloudfiles/FilesClient.java b/src/main/java/com/rackspacecloud/client/cloudfiles/FilesClient.java index 7f6956d..93eede4 100644 --- a/src/main/java/com/rackspacecloud/client/cloudfiles/FilesClient.java +++ b/src/main/java/com/rackspacecloud/client/cloudfiles/FilesClient.java @@ -2820,6 +2820,64 @@ else if (response.getStatusCode() == HttpStatus.SC_NOT_FOUND) return null; } + public InputStream getObjectAsRangedStream (String container, String objName, long offset, long length) throws IOException, HttpException, FilesAuthorizationException, FilesInvalidNameException, FilesNotFoundException + { + if (this.isLoggedin()) + { + if (isValidContainerName(container) && isValidObjectName(objName)) + { + if (objName.length() > FilesConstants.OBJECT_NAME_LENGTH) + { + logger.warn ("Object Name supplied was truncated to Max allowed of " + FilesConstants.OBJECT_NAME_LENGTH + " characters !"); + objName = objName.substring(0, FilesConstants.OBJECT_NAME_LENGTH); + logger.warn ("Truncated Object Name is: " + objName); + } + + HttpGet method = new HttpGet(storageURL+"/"+sanitizeForURI(container)+"/"+sanitizeForURI(objName)); + method.getParams().setIntParameter("http.socket.timeout", connectionTimeOut); + method.setHeader(FilesConstants.X_AUTH_TOKEN, authToken); + method.setHeader("Range", "bytes="+offset+"-"+length); + FilesResponse response = new FilesResponse(client.execute(method)); + + if (response.getStatusCode() == HttpStatus.SC_UNAUTHORIZED) { + method.abort(); + login(); + method = new HttpGet(storageURL+"/"+sanitizeForURI(container)+"/"+sanitizeForURI(objName)); + method.getParams().setIntParameter("http.socket.timeout", connectionTimeOut); + method.setHeader(FilesConstants.X_AUTH_TOKEN, authToken); + response = new FilesResponse(client.execute(method)); + } + + if (response.getStatusCode() == HttpStatus.SC_OK) + { + logger.info ("Object data retreived : "+objName); + // DO NOT RELEASE THIS CONNECTION + return response.getResponseBodyAsStream(); + } + else if (response.getStatusCode() == HttpStatus.SC_NOT_FOUND) + { + method.abort(); + throw new FilesNotFoundException("Container: " + container + " did not have object " + objName, + response.getResponseHeaders(), response.getStatusLine()); + } + } + else + { + if (!isValidObjectName(objName)) { + throw new FilesInvalidNameException(objName); + } + else { + throw new FilesInvalidNameException(container); + } + } + } + else { + throw new FilesAuthorizationException("You must be logged in", null, null); + } + return null; + } + + /** * Utility function to write an InputStream to a file * From 48c487ece966b89881a655bd6b507ff0a6c70518 Mon Sep 17 00:00:00 2001 From: David Kocher Date: Wed, 1 Feb 2012 12:01:31 +0100 Subject: [PATCH 61/64] Update dependencies --- pom.xml | 31 ++++++++++++++++++------------- 1 file changed, 18 insertions(+), 13 deletions(-) diff --git a/pom.xml b/pom.xml index cfab734..568610c 100644 --- a/pom.xml +++ b/pom.xml @@ -19,42 +19,47 @@ commons-cli commons-cli - 1.1 + 1.2 commons-io commons-io - 1.4 + 2.1 commons-lang commons-lang - 2.4 + 2.6 commons-codec commons-codec - 1.3 + 1.6 commons-logging commons-logging 1.1.1 - - org.apache.httpcomponents - httpclient - 4.0.3 - + + org.apache.httpcomponents + httpcore + 4.1.4 + + + org.apache.httpcomponents + httpclient + 4.1.2 + log4j log4j - 1.2.15 + 1.2.16 junit junit - 3.8.1 + 4.10 test @@ -76,8 +81,8 @@ org.apache.maven.plugins maven-compiler-plugin - 1.6 - 1.6 + 1.5 + 1.5 From 880ac66a5b384239c4b928a6512828b1cdcce2a7 Mon Sep 17 00:00:00 2001 From: David Kocher Date: Wed, 1 Feb 2012 12:05:56 +0100 Subject: [PATCH 62/64] Fix issue #26 --- .../client/cloudfiles/FilesClient.java | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/src/main/java/com/rackspacecloud/client/cloudfiles/FilesClient.java b/src/main/java/com/rackspacecloud/client/cloudfiles/FilesClient.java index d94e3be..85c81c7 100644 --- a/src/main/java/com/rackspacecloud/client/cloudfiles/FilesClient.java +++ b/src/main/java/com/rackspacecloud/client/cloudfiles/FilesClient.java @@ -179,14 +179,14 @@ protected HttpParams createHttpParams() { } @Override - protected ClientConnectionManager createClientConnectionManager() { - SchemeRegistry schemeRegistry = new SchemeRegistry(); - schemeRegistry.register( - new Scheme("http", PlainSocketFactory.getSocketFactory(), 80)); - schemeRegistry.register( - new Scheme("https", SSLSocketFactory.getSocketFactory(), 443)); - return new ThreadSafeClientConnManager(createHttpParams(), schemeRegistry); - } + protected ClientConnectionManager createClientConnectionManager() { + SchemeRegistry schemeRegistry = new SchemeRegistry(); + schemeRegistry.register( + new Scheme("http", 80, PlainSocketFactory.getSocketFactory())); + schemeRegistry.register( + new Scheme("https", 443, SSLSocketFactory.getSocketFactory())); + return new ThreadSafeClientConnManager(createHttpParams(), schemeRegistry); + } }, username, password, authUrl, account, connectionTimeOut); } From adc3b615baa9860062f9b14b8f558783790d6a8d Mon Sep 17 00:00:00 2001 From: Lowell Vaughn Date: Tue, 7 Feb 2012 11:14:04 -0600 Subject: [PATCH 63/64] Updating libraries to get around issue with SSL login --- lib/httpclient-4.0.3.jar | Bin 292893 -> 0 bytes lib/httpclient-4.1.3.jar | Bin 0 -> 352585 bytes lib/{httpcore-4.1.jar => httpcore-4.1.4.jar} | Bin 181041 -> 181409 bytes .../cloudfiles/FilesClientTestCase.java | 2 +- 4 files changed, 1 insertion(+), 1 deletion(-) delete mode 100644 lib/httpclient-4.0.3.jar create mode 100644 lib/httpclient-4.1.3.jar rename lib/{httpcore-4.1.jar => httpcore-4.1.4.jar} (66%) diff --git a/lib/httpclient-4.0.3.jar b/lib/httpclient-4.0.3.jar deleted file mode 100644 index fd0d37745cb62ae14c5630cded409798413a6e09..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 292893 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 z

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

35?tmJO0 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 -jOPTpOg4^s{77`EXw!xXt>O>;@ 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

=?%@FmGO-r08f}dpb1A`PCL(wg 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

X;jNRCa1=i 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 diff --git a/lib/httpclient-4.1.3.jar b/lib/httpclient-4.1.3.jar new file mode 100644 index 0000000000000000000000000000000000000000..dfa8793c26a659666a62472d476956bd21ab9460 GIT binary patch literal 352585 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 xSo9 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%0AufLEmDgl=7lq*(Kz2Ai<8hph%lC6$P;;sHQT`$l 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 literal 0 HcmV?d00001 diff --git a/lib/httpcore-4.1.jar b/lib/httpcore-4.1.4.jar similarity index 66% rename from lib/httpcore-4.1.jar rename to lib/httpcore-4.1.4.jar index a7b1f3c10cb7ae2f56e4a3e70df7f04800e89f91..1606a2e3f93423450a7c985673e6c7c633959abe 100644 GIT binary patch delta 47850 zcmZ5{19&IRvugsu4uZhW+P^5tMkpB+AEs#&E663nKsIkL%O0R+%gcoz}m)! zfZH%5w&#jj-rJF4sQ! zzUWn*1Vgrs6o_WSKsZ3Oz!g_Or?(YuF%5wz-};CcRPj%OYkmcf3xGNUY&97O>V zXiO~Rln57(0WK5F0$O}HsQbk-*{x=mW}yndM@J!pz^N=u(36(-XjN}g$&JXc1K}sDLJALq;b7Gxs7AXewoGlJ2=lgDi2;#2CXxv7+VwQ~NoMU-B2gAkV@E&j`aZBTNL-&?VPJUO70gdYNZyWY?j=|1 z;(3Rv0{O4Y{1(g~NHvt$1rw<c`D+u{Cz6#%osurH_Oh6>M4HX8J!cx}@7>O7Y`C_guCj0O<-jfsnd98y zwpa%r>#olzqdSdI1oy6ghai>UjMBCjrfyYf0%qP9_&0Fy8ymO>T+b$w)XKdeD@zq{ z5w@i1URhUs()P-!w-tVs)Oo`5HTGQPcPhnWStW4Us^XE(NW#G2s*kXpoTlh-@GJDU zpFAL5h%Qw|+fW%gL~;MD3djF(8(=l}vK9SRJ;Z;kVlj97)9C#v*3Ks7R|&3<3k6YP z6Cf1AuL7S64X<5v#b&C6D~PgjDJ9v$ZsY;^b;zsDbDnA=2U*BPOvm52w&QXsON--@ zrp4GqW#6GgtI;-e$IqmzaxRqIVN-|Wf}VrOwKY<$*6_z@98cFzv$ogud-4tP+jpQe z1M729dUGsOsg{T}Ub+_T@>#XQ-VP@hB|!O7G&I!%t%XK*r_*4P_NL3x&kf>H92TsV zI(RF19cJ-B^zL%yF{<<8tP#F24-ZIMB+?Szg48ss;0DrpEwC#ojB{)FiRb9nn^ADZGh=4cx;KwC+b;?sq5hTbg<0e~8eK|Z(|07AQ9~T|1hEbYJ%7AbU zM;Cj0x4{|Rz~Iwmo54Ff_?h4wbo2+JWWS_i5Y`F^TuuQ z#UeVJyMPLCUM{!7 zb~U_KnopyPrV|*Bg@`&u4;^ zjj8FIS@#wlb(t6}9oQ{MPXP5?p}XOi*LLPJx~Vmui?#b)P~1#b_8|ID4npcT8k7gJ z&LC6%y)~SEQ_-|2s6=F=dVeMg1wqne3`N%^75+Z}rK=JDxO2QaFcX%CW-`GSpNbO{ zF9Tcy{iiXSY@_WM195AT>}g%z?w~KhssjgK9yjD_TIh!0ayUMTS-?p;A0v~TUyRKy z?0olVL+a@`ZRcVn`?Z4jKl{6U%dBxA;i&ZsV!dSm+O%?nAFfJk@mCDPim8o`WI@_f z3p=wtzk$VPWy!G5nDBu}zEdt!PjFEfIb3IzdMA|iiRny5QH2D zZUe|y1mGR=T?arW2*C#&Vki#(Cq6Jhq4x(H_~*EVM{EAvzzfu?0Py!Jnq$Tl8IX%5 z`Mby&xh%xUAR+d z96Rea5kNIwP23#0)0^Zw-t^cmRkeR$n7 z8wp_T_;KqAS++2ddn?^|QDCW1zXeh3Mp<0I6;9FB_nhe8bf=UF*SK!@!o>E=p#sZ+=k@z`Zp}F-QX1Oj_5UVo8`Dt{N87~ zv*cvh<}@HR4}M@ZNU6Z#SSGau@A#uRuu{mYDH2XOucH7eX3l_0KgU`qG$LQ7iMV*3 zxr~RYDq*##ovDJ&R-J#f;yq5iYqZRDHD7tO0{Buja8;~L0sc*CM-q|aBli)3#k4?c zIXCc#Hs$A1F}D42id%&-oS+Qh`3KH9|IHCjN0CId`9HGTeG zXd+Ue6P#P(a8h%98<(}&7-=@|QT&fUqmtUrW<~@R^Km%F>@&ilI!bI1E~aw!u>L`mmfg3Y%V@QtTe}LSxd}8jO>#aX}uae(|b1fJG-5W7)5SE);rR6O5%E| zPEsSpS#yqBdjt*yw#A49WySA6h9|FXWLxZ4jeYXk+Bg_^#LGAp0}P{kz5^7UkUt}m;)o32$_x2&a6sxjRwh*e2TF_yy<6xFlf@jQ5eWDun z_Nl$y*loD~7VRCv+v!psF2`F0Eo`c11|*KA-4IqLkH8U zcL*8e4)4C>g>n zzSV*v5r?p4sA~7n;?M4!$dKDPXIt#l-&2{VTy+X`~2`WJx)cNOvK{M7deA z#2&P?PZ+?dZ&XzS8TQ!TCc>&g5u8!P_D|t}`#7K(C`Dqe z=C7eqR5&|xWnRUcV*~Ah`SGW?=KI+E=R7ITJjm?9zM=9^tcH@WUln`-2^r^oqgrqH zQI{;~g`2%%<4#gB`lgC`ofCs5;1o5+7-EwLI8J~r`DJ*oapnWv{)!n*Ysxz-p9mI# z0czpg(f}WMEb7VG3Sn>V_l43$#wp+Xc(pV@fJi1UTW9qoB!86MtPu+$lXX1b=0JS3 z#BBAXQk#j{u*uv&D4?6C*QxBW8#df4J!@Xhy1Dk3|u4B(8SVJ(|OZa##-szYubufwVZ zv$+_Y&Q7F|I$F*Wew;Z|HlaLot&UX(2LV}3aIvDy@NTe@0KI&EkPSwxQLK}Z4@nda zT`5Q6dv4_7&ey`+g0iDwqj8t;t=pmdrt4K zfMTy331jyFMF6><#7DWmG~m?*>WK?w(1Oe-MG6p;I`i<8EsAmXi>W*8cm7J9IN~M**nqK*%qAs@Dd+5?@omI?mQ~aFi zCPdUtT{8iuUxQ%uAGSQN@~Rx*QF|%VW(aW#|Nj zD*&=)lXU7f&{bR5&NvwvIG0MUq+*sbe`eiGcc4Awwb{j0+VkCLtpc&xKa4Jmd@-3- zLh!iyv$EA|r^-Uw7^~A+g&OyulyH=$8kZf=*vUxkWX{^x9TMC+Y)|FAhz}$FqV9A| z=t*n44O*nt6dXnHigq@=E;`l(#f2_u5`YvZyI#2;d7B0?;cSaDHd83OamRG-)pC$g zNwVL9aqi-1HaBsYvm~>mlk-bi#llET;Gc7<9xRk@(z?7K)ifpAr{4Ze)pizyjIR1# z{M)OU$W2zvowFrF)>lqhTSC?)^CoCf0*5|8;p2Rn<2jvZWK!3`YU`mtFoX?E33MhDwHSoINn3bjfG6Fat1WLUXy# z@KW>d}W31obnrYi>2A9 zBMSdC&WYM>{B*F=v=c{<#chuTyLRBhOgBnn{B!`FrFkDEBVxLSAG(S$c(xditWWm+ zT=|LExiz$iV=12*qP16&6M0R76MIcOa~Oaa`bUZrr60*& zDN9KH*y_aIE0}or^z`=jb(l)W{hH)!dQ|QKCW~LVJ+#93D|$}C9h)Eh-@j=mP=g<& z2b>(CTjg1Gi|Oh ztEiG$5>6IS-fQOFT^6Tj#hFbS^)aemqRdn2FOL)7ga;^d**ojW&PauSc?NBZY7O*$R`Dh0&sWkd-q3Ja-b9}0)I)K}e1U8AJ-Oo&Z-Q(3qQP{$?_F{* z&fue1cq3oZC)?0QN_QHJ>>rqHa%^nL%bt8D7Uc&SbtgZFK*CcW3uoYiS>GpJZ|jv+ zD*5}YAih};=|%t;x={X+NTTqFJU~}$$Fusw4e?D29;R1p#9F-YQp@tr2~7)SqTcj# z`SB6UE3+%~E{v82nAyL=A`Yky%rF>%^~XKScf}&aN09kqq_;&zkOj<-dh%itff~ zU8K=+1$&Ab`w4vM5q#!FDhvb#?#MU-holMX8OS!)X7zf$vBhYz6>wyU1S-I^X=#>% zy+a2ofGPr*BZ;h(ow!^Ivh07|qG2$FLeouJIQAPO{qEC+FfyJs>I$W=Hxo^PAPBvb ze>Z-eMZ70z8t}=dO=EXF|Ht;#jj9^tE)06al>gSRou~NFa?nz zw4eFwueFv@h4tA5EYDCRp~x}A@+AFt*wIQ<3Gw$fr=NnxGatf=wa{AxE>&GJrLdkTe zP}H}fF9y>!%(HDnp^BKKIjate8y|Gg$JSANk<20~=d?o#YXpfe-fBg^954!ba5v3V zgKYru&xa%C@2rMAhlztRdzreZ&069O>1uK01!j4Pe|0tu6*+3vyA!_sV-)I}jPx@y z>ehj6{|5nfhAwsnRUZNui|Xu#YYG}9^Rc88sFHD%M?M;vP)Dy7SWG-x@*^j$xk0pv znS5Sx91t-Ql35xlNEz~xCLN6;V}K^PX)Hj|Nu!Jl+SNBl5jdw3Kc8bh6Ww#tC1G@T z)uk|!Mm3@>CuwT9dS#Kb{gH$Bk%s;thBSwiGju?IG2!(A3GIQOjMi6jJBX8qOhw*t z5D$>7VBFLzRdq&!TaBJJ$m4I#=ayRx_U7nIm+J1C#E%3Uenz4iIb@0SWQi)n-wcT0 zo~#_(<2;Z9N9Y81a0A081?O_s(S^*pfi7ekv9raiT}3Y}T2~C|lthUp6Gi2&Nyl3W zFe^ZxDwtA1($+0);tHTEe1FBLXfgA=F3hEscUnD8^Co6S%o3(|NL;0I#8Tdc0%`b3 zZK_5zcg_4E9Gc&I#n6|DXHrX4%>meoyzf=w(REzqiSq-dWqi5Ynycwm60XQEm=#oB zlf{uV4qJ*F#DU3lO`}~-Y{sn4Ea zL;)ATL32cfN_}5Id|Y{X)PysDd~QO>xq{uev_=}s2??|r$k~_yn3%Ak7@(N_w5S6Z zeWVA}H?D9Mm`0$KLRLcNEEKs^keWOlaXv(7GSE|@S~&h+#*br6rfDq7a9{XRq-U4L zw<$@@tddRUm=DbGoEp2UgYq^14W=boZYCgLMj*)ph0>Ucu(TgKKwL;2|vBmBLI#T$> z#-F@qI2^Up>vCEpCd0D)q~aD_KE34({NqSr;o*C1PJ#aHEFP~w0}&+z)drEL8OX7% z{!5waxyOs}gC5dc5?_)4W`3c)pcu1`{w4^c$}up>;-RQaCF~)Q$NT+MBnlBAP!{D)mMK$|@3oqRmdtdS*m4lu$HK#P$2&qY zzh9hXfYOgf$~<^mY*&zL2cXFvNX`!LH-@Z*J0DCiDCK1X{PQUQkfangDbo?Ac~i1F z%=)=#wtDQW#4C}oD!)-GvD9M>^b2bqT1!?m?_3CfpF?j4If<~XqYw=6ZI;4^z%M|% z-`B-2KRxv?T7~RKEmEy(3A50lbKqfHq5t6;U}Chk3fY>fj^H6RcSCkkg)>y#)FiQc zyl22>tnh%gFzc)W?4x&%D{5Y_bO%rox}(tO4_vTpE8bCTlXOoB`v_a%A)`AS;A5Yt zc1AwHIiJ}>LeNrN--u;L!P0CGXc>D~+rzYjBOsa3is#LdPySwInN^q$b=pB?jvlGz1qY zn}gfjsV?I7+~gDzyeG(b+&J@W}{ewla19e9~ez6mOoAL*TP`e!knR8mqGc6gwG#=$ACL0T>d z@(NK-YJ=dD7&Xk%r1{1Hf7v^O^12avx87Qvq%=Pwy=9FOG`D0xq#+%B$diVVLi|mH z1tmo~YS9Yo3dP$saMTxoj5goRc<3D_IQk;^4kmEpIC`?BdW87K+MjD8U#v?8AmgwX zu1N?6Y2)DbT3`tac{=tTHsNw9V%%?uDJAddP{W$Q4jG4I@ee5$gJA}v-5-W9 z;lV}6{829UdAK2rG}TUFIeF_EK+iQA)1$)=pxX*M#HYY(FAvHZ(%tNT@dz4v1@5u% z!d%FQOK=Uc;)j_FBYHNW)`prBSq)OR6~Vm%h|c{QV7usreh20cJ}`X(qkDhj6KN1~ znS;(&jWbsD^Ku04dIjPUC<*upd*YZ0Gmf7%lG^wX7ct`ADygsAKhqju;E3L{kK;Gs z`YE){*B|O3+xIQC-rq2Bm<*16q$zPld*}+jyik_B4#hEh<*q`9JErkt4FTD;Suh_J z&|*SMV|9hlv~de(#YeGqRaU?*gqzB0tQw79Q0PGE7B36!M-p>IamcZ!v#3ZLzw>7` zP@6{%Ma(g&gjY(OiRDHhf_MDJXzhwp^~s`)I}6$i8jro03DSLakMWCTe2vSL1OtdK_%(+3?Qd@*v7axpkN^O zR3ImqE=428`Y<}~d7SYZOADU#GuiF?VUZ6Y@<}#_v&N~%rtf^jKhRRKbl7~u6s${8 zZW<@|*&Ek$Uw7wgwLmDVF}o}w)G$teg0IAKVFqP=E zVOg+TVrnDxeqAtntQ6*(DcEht8C(of%VEjarti*#->TX@DZlahe2Yx^;%?ib(4i|) zy5nxiMF!*sSO%d)d^;(JkZ@X9v+~KUG<|B~bWW!0o9$7^Ga45%(&zC8J`lo)F z4_a{6pJ1D4@C}=;?AeGflT1u2&Xy`0^C%_eXJV)+@|I5&En!#Tao(vDqMwEoc9f;z z;SLLYjBpzy@YE*8*OMVJU?R{^bFA5_t-)}ek}?eptszAR?AK!war(+@1Dpr zdv~6?)Sn|{dZ=ixwV<)|qoQw70PFWT9t|FFDO-ae$NE11(zJ&Sd9>uGk`U{b)mA;e zKuuexxMt-d2UJfZw92MaB=>1du1k}!WvjS&43p_iS@o7?hkj)u9;jR;3bcNny<~xV2|Y9yK*sPulz8x8nRWRJ7-mQ(I4s_Al)B zoAO8Hj{-s?{HetWOP|ngfxPrNyzX|yXO;Lr4AI-)b0#6T#M_0*`>@0@1R3Qrd8uSj zzxYY9!!5s`zd~3;%XGq*Z%7|IIdKF8MexnN3zeOi0V^*c@;kt$A^D1pzxf+OM@`@! z3G%}CEU3J>9uCb>u>) zxcWP0fF88{9*8*ASqt@?`)sHZoFN>l%fxOgEU3yNQ|WKHmB<^WP(mgJ%a>cU$kibf zzf$i3nW9@vf?Y!4XPP>wbVnDjkFjBude7)-Umhg&$YP%Z*m!bt8@M`{hWz=r?{!` zSitZtT*$!9p#MIQ{ly9D-`oIXNZ@Pee^0jVfrI>W`-X2zA;Q1U9so^^HwM8-B})IB zPXT<03yvfT6AY0^d`Jw8mMC(_4tUbPU)g*NX8Z7ek{(rW!4z#C6S0R6=1yW^6CrS7 z+^CF=-2{+DtN2PpFR6JE5+ zpZLXzrg)qdd11<5tVxm|8W|?%R~)u(woKJrz+`r0kIM7yP3#oGJ&?vkjO?g?3aUdC z>{HfcDsRpzO%%q66UbE^{f>bT89sCvaJ&HQP7|ddx0o6XGLOBo+NhsVsJg!d&Dzr2 zoo;$yELOj>{PfXbZ@*nx0H|=<3O#;(g*DaU2;waU1o&1ZLV>+tVc0xvJIy5`TmMQy zAQtI(cIY(?3^T*Iv??N$1LnWd%J|^R-WDkYx8;cG&Dddn08hs(zC>CdRQGsA;^!w=Z^R>EXUW!EzB-H zq}c08ZjLI}&uTWc55iosjCW-5Td-ODx7a&lg>|amf1L9F@yQl(eBeBge?6d$7MKeB zAG;@j(~}ncwfhxVVh{a)l0%?U|N0zM3kf=K&%aT3fLxQnZQ|D*KR^Xl1MQ1}Vhu?h z87UbBys4R3)wsG@T@VaRPD~NCZk@1I%D(^HoO5ey)*3K*`a0XwcP3KGD6j}=N6T|1 z>uY22F46Sonu1Kp(iQ8P`(@L++j-i3X6^IorM3rDG9Pb96>fp6+NcD-gQ=3k!gw{h z0cT#x2PrVb`P@{V9&lokHWHxCFxc8v#-OjPExuN7t);plgOiffS(Spwt~=+bHXs4Q z%L2P_VqQP7_V|__Jal>gxM@m3I?L|9rOB?GVw9@9kh14l2!cE_wiD-fFq`5>gPP{i zD#jxQ?4*|0V?L2#cBc9#o$}ju)JI7Qk(>{iMw7-19>8d)QSqhPq?yD3I`Y&1IK2gp+{#=T)WWV7Ddj7gh7X?5*?^6{GGzKh z77ke{%?EXX*Y0)ru);{2{aqxyai8K?6TD}*^4Ib#NzG#gMsnTRR9OxYnuEm1y?Qnk zj;1r+f$COg7CZXkG(30=6$3a#5*BeWY37fj5Cs>X2!NTu(!{&ah|TGW6MRSv8O5rw zTx_G+Sb~vUd$G0FdbO|ejBTCmCSD^xfQb_Fs=|yqEGvfV`E)fB7~T^f9B+YGX;G;^ zBBs#V##nd6wRr0ndELwRhSW%=okpwkm3$6_z-GrF%GvjNx@idJBU@rDsjQ(_3JOw&%EHUXa z&33?1YlA>{h8{c#ek+PoVM@I{-@Wo@DSQR2;xz6;M}JYP}vUu1UQHoSsDTpAaUt|E`F{hFB*oZh!3vI))-rCgy|&=cbo0GwQ9 zUXJQq_Aq+-Wh!`w<`~2`)TY044z^ASbczIRjPBYizAAYU9@~_MC_0ti3czZB(R1h< z$2$~_LLGoGLtu3!r!YsY=&-2WIH}1?B;H6Gel{0>_q(1_$)uI>B7#xkWtOhKu?oiq zJlnPt9(d9G%KF6opHUR?A3jpYq90@t3J7QgInjTMz5({^9O|D5cwsbGBpntAXb}Sl zi0khJOqz;A1dIc)aZz1D|C*l6o@CnOGb&?3#V-(K5rG1M2qwcJ8I|-{6txwM%S_Ka z+~?b$#Fw$GT!t(bIFGarL>F7MEJi0x&r`DWMI$V(ZmM2iA33kBd6wv~)#zw%w{CxF z<76equ6Q2Fa=!Mw9BJw4nn`aF@VmqM1@XBZ3G1}L*0>8WN3`GbL*z6#FlXd6a6eE- zw14Oi+~98=2z0o;%--A_n%dgjJQ(iMS2fPX+!^%MryKf1;4=}}ceWY}$@kiv%E3R% zi`aS>hv~OD$cpIfJR2$DI2tK&hsDS@?JTm%w>OmdiV#ciuuFZ7*bsAbf9lQWm5~`} zk9W6=&4>ZmchmPwq0Buv_GDByT#d#9MAa!tv~iCvFy3xP@_DUCD_y_b?WKA=*5i(B za$OIvN zbP?wSub_k7*RF5zU&I~L*LJf?FEfg(r!OMPzp|#pzpAQcGa}n~uOF-2hz=4e-Ga`Z z79Fc0S5d_c|Kjp)P7&Z)&}Lc4mCn4V{)4P-!kHOWWYi4BWplv+OJ!G{#-KQT&S8qW z<<$;Qxrn*2HKnN-;f4&_ph_?d*A`Q zI7bvY=`f-$bHck|KDK=f>umy30t2&$A!=#>**=@})8p*^xt>zj4q4r3)V%<`iQS?J zrcDXO5DGCG3$OTmV)?{juU?0%8d*P#o>B<}^koV2)O{AEd_L>bGdr7H)cvhdOs$}v zol|o&GCO5`a02AES#u%wWgZqHUfGY4A4z)uk$?f7Yj`<%H6K+ojrA)OKka%UiK3)vAm{ zR_gOld@`hmn>){kZD{mI5Y@7JanW4P_{)z}A`8k*m1FC5BFkcyoI5Y78yyei&>i-! zjCrF?yNXz@N?A(xX)YD-JasARUK=P%VBoiC3QpY)BxvOKN9;dE#qgxie+=;gXx#R# z(RmoZWrsRm+j@1)wG~Y`12IlYg;UJ)dv*&A`cu_DQEs3oM>XoBQ3JFZ^f%1N>cfdX z2pWA5rF#N+uI5d=WQTz2X|_ioY5amUv^HzOX((7TOdg3vzHqniA|iGQ9$fr0lIUn; zmv4D>B{+vHYFA3J8h(3I4oMjT^y6)5+#1_Q1#IXOE{Xl#txJz1-NPFZM;ID8OuMab>9jVAj$A1)QLYL3hj#=Ny7ICIaU)X7j|A_8VO+E1| zfT=h$H6*jL$59Y(4~~#bOtv$Ag=8to+4T-0#gThL9HrsrCUdco&rZMsOjG?Fftln; zZ~nB_$y%;8CBrVPgd%%K8NtKovL)RBW5GZCo zy8e0j=-kI@pR4?{>bYqTVEMY-Ya*wj`Lf(`!mqHad+fR#PRRhePb_zR;_QMZ19Nc( zK3XtnkO?oJ=7cFJjs;F*lsPIvu^4o~@dv4xZHXI#beWyM@UblE+>z<1EQ>Kmx)XSH zS&Ez=j48+&@4C53YX? zS4bxslI*O4j3Z{IVF;#X>+nZu(lAnFMx^}bF_ZI;tNq`x!-0;pB8pj;a=uG+Be1Vo zsF!NKOW22Lf6fqsf2Q$Aaf36iASvd>3kxL2Q>q!CzkT*2 zqJb{tHT0+?!u-sQXj#~oIu>+^8!YoPCUoy79s>9$Z&kGOXUieeib0(nxENk5y8Wg& zT`Ru8rvF9tM1Qoz)iw6%9u;lZ8q%)T zc*f)Px!nowN&yPu-Po{)0+e^bzL<|EN_&-C!;Zz#M#Wc_L!=yqlp=4pU{tgZePJj0 zvWZHvjd2a(!b$^D2?J|U!>bZO5F%@0G|f~&(r@$9QF|p9f$wNanlH zAjj0@t|{be%jbghDDzVRGPY9l^`fF|9c5Oa#zu~$l23uRFw9C)|X zcv{UDWqcc`BA#RxEkRL?(gUsZEeP*wtQN)gjpt_=O|Lcftq4b^ z2V1%v+#hxh=;b-Q8=97UMBagspJ^J74N)-xIjJz)#GE_XNL%-v>pykugn|PNk~xgL zPa|Jem`ddQBI_HlOuy%07>9ZRuja%d!(XRVmVj*Xw_5`LcY*0%$ibGEvRS{hmFoaP zY~FP1`^}Qj{HZd?Q3UhTvCkovTt-BThIwWFFcFs)`ZzcbC|y`Q?nMM+FRDuwaYgsl zwSAQ&`~<{k27Lm`pqXS5s=>&?VB)H}uy&%E9ODj8r&a0dV<6V)F&r6$UI%J~hZP}? zp8z8bwLef8_=Gqe5u7O}@CWN?1VSRfIb>~!pTSw5wBVSuBo_LDJ+;rw8Nn4j#iLBgNGL=iH>M{y?_^Co&Hc04j^#f9{ zG9ikr5yg7T?<^L-cECxw97KE(qNj|kQ*~rcAYm*gG7T2{Nzd~lkUmMGScilsF#+&U z;X|#0S&od*n1H=8edJ3Hm`_J z2I3xO?{a}tzT22vToOW2mOQ&1Ysyd&jY(Qg#$jfl=!|P7Az}ERr&XDO36g^{V~{snW1QBI4Ox|Ed=cTA(5rLS?MKTPIy69jdX>IcuJ$>Fw9>KLoWcu z6{Y+G=)lt%LZ6?&sCNV1Lp6%nR3j&u2fdh(Vf70Z~f(CVP~mhq_8b}{@7@;_MrAE@6@@y+pH zF*=6hf`3CN4end~VE;r;9${rrKmT&l(=e$wn7{%68wETyEI)JiRa~9Aq~hm*sK%y= zpG_E+{sq4jG0&1Qz!rHf5hj`&ST9&~HfE%i4~`<)i_~#V3PcxhY``Me#eQH#8$=Bc zdPKJT*rU8~p00r{wyXM^1~%!v?YVQ}IsK9I=lmwN7T8jh;+Hq_lZZ$U76JOeFU$|0 zRYE~z0K%)IVj2QC7v8gR9o7&RO0N=}C-dci32@S`AhS5r`A`~WEMy&m5@8O~L!vR) z@qmi)GAPxAXH2B#0f~4O)cp)3Cc^p2WJC7@H)QaAhT=}U8Wb`Hg4t9If zn9~CadNWWrS?`?=nB?!vT1xy3&~=+_!0|p_H^6XF)XhLphz-qW%$U>94F`i z0NY4AI+&NjP*kJHuc+%4g>xy^)VS%SIXj$1VKbuqsa6mNk1AfAWS!^1pfEcN`cT%Z z{tEeQ$rA414;!i)<9j0@z_8?*>XMwA+(B8REbiPujX7PoYM(rj>}kw~^^u$QmT4I~y@ zRos4661FZo;Bf&aC!gtie zi$_iiZE=fcPp(9G!ok>c$8Y5Xu*w}7aDO}HS3o-O=MqsrABXU^e>2S5b`QQO*@40K zV4ywm!qLzC&qO+X@0!ex7n`H);f9Xl8={LSMxN-Wv!mFiv!g^3cUhBx;glL$bdo2= zuHO8og~3eE$Dnsn3Inno!q)_g7wQPa_EN8rxDS$_%R|ZbM5G7Og;S6vAT-PZ>*Yb% zzK?31d6<24fd1YDk|0jQIdrgmG}&-}--|MX8@98SrTNw&#s}=h#&Z8~pR_Ky_Gu4w zN3h6^!2jWPQvaK_AYq&?;$=*1Yu*gvPML~W1YfL-7O3`^91&|%4(XPRqmHJfUfd?G zBvlRw8@f5*3s#ax28Qlp zi!urhdN7Gz)ppvg*{ec+w)! zttsG5wt)NQdi+XFe2@C$l=XXRMvc2#W&k{iu5z0?ZN|-da*mtmkX`EOZf; zDj6qe(JEh9QZK~_02zR{Qv!FR7~)Pn;GMLGLhg}!bPsH$Z?54JX2GlwkKu?BsT`Bd z?G?P8mXFugpJ^0o7jHZ@YV625EW|gM+%8>JW8 z%OwuNFc_5><8LS{yAASLXm>ocZLDZm>8ZKZr4h94!-?5JI&ZOEx`8_Iu6PA?h$Zxt z_!RZ{(Lm=%ykUSmN%qQDuC3g3T0+gILM3KH2)algJaQ2&tk>)edB8<~% zGJ{&t;v+FMYHr!1JNA9#RoEt>j=5)d)OnXJrNNO%>td#C3 z0W_K&J;lddP{{8V_@k3MQ1z&>SCyZ&`)5MfQ@e^tNR5oZtyTJ+PMC#6@wW`+RYyQ( z8FgNUcFte0d8)o-09PN57aW1>=pRo&c6ckh>GdqYZ?bn^ zJb|mRxrYXGaE zx=JZc4Tp0N3?hNpl?cF{#QYLJ_9txi9PE{bJAQAW-&SKY!EeEaqqb%t0S!@k*2ST_ z?QhPkp?NWPaM$>|=;vx%(rt9ODqMeYpVK$F^;71jvyhOc2mS(F1Egay(XJh%CLnyh z3jy(nH3ly6to#B0Mo9pTW#{m%4igNfVA9d8P`~y#QN($y&|~!yRraDxb5&Gr1RvI2 zsX=k16r;J$ZjZJ2D$i(7Zc@2%KtZy+!(xv>pv95UK=T#FpuAjS%nF?3*k$Rm8yr$B zpkeWEg%igd7AyF^d~fpAAxiOZbYsavUS0=d+X^~Aw-^b^Zv;vTSw7s z46?ST;@t>pWNCv^N4%zK7sHW1L$!xyzrOB~)(?49$*ZDxierWwsIf|t1i%%A6#^WNWgn;2rZXLMl#MG-91@)g;u>H z5CADpyng>P{5K`m+L+mM{vUlG9$d8sVM49aSJ+1ZIP%yhqXe#Qz6Vf>taQSBo7j9a z^Y=O!c_%^>NLdUj4##L?I)F-GR}7vy)iuqXW?;1Igdw0yL)X=Y*6Q3RK6Zh%0v+^G?J>Wz! zrKFm{TT`0h{4Bbd!%uRn09+v`PPV;aCi{pyXwFb488GB@2fKbd zve?gJaeYB>TG;lfdkAf#V>E;zgpD&e^e<;|8E7q-oLy(7_rh;BnJ z@$G2Xr!sB(^Kywe!`1yxgXX4{XwX6;_xJ=!fxUPn2}hJoH}h~@j;BCmG$1!Mm1 zQc2`>csSIaW?8FGzrB>@1yzK1v}h~0W~}pCE}3vY)m8l_l0~9Wb{@EmFVsCgJui)u zt4vf3V~LgLsSi`oVgPL_w&vFG)AL&MWNjPPuedjlj;&@_jGy55sja{=#peq>;{3SA zt!{#dVg7*Hl99^%MJgs0^AgAe#fm&#fy@3y_Q&m8$t|SNN_DPHW1yLrQkTu`T!qCj ztC^Wr56n!*Cu0lsl*|X(a#=!0mLI&C40WBO3z7R#uOl^1tkxLLT-==|wzh0#*YmfU z#Yw0}tHnFMyg54n-4YX0hS@730=OL`eDK9Q6J#A%UXpSNvw2D<9|RyzN?GwJ4t`9; zZm1+babH4cEx_8;Ke~ALxSfk4AoxMxG{d%$ogHdGZ<1NLcv?%Vl+;)`a!(k(ZS)K0 z5tkNiep+`haH+Ut*$b)`=XhEfc!p3mJ(*Zw-DA^wAUrUE5>Lp2_`~{fxze}F$0fS6 zQ5{06?R*T>=U?vOrs=db9KP^Gh%eds-8S-lr!09Nctjtu{D(QXnyk;!B*HWS>R zPQ}kNnv;`wm-{attY{1Osz~pkjtvAy(_zleEK`Jc!le80VMu{~Zn`SLizq~Q^WwaU z!Uzk(cof?(DAko=L;l6}L=@BAd`uT|Y-eYBjrMTkA>bwAg^dbA{ob{xffZ!#Y1(>$ z5v9cCGLF*81f0ufM~r6Fhlxxg~jf4lnqqg=X&E>Sc}I!Ww4V z)R%sEJ~qC`S396H-Oo1fGqUB^(g0v)?Ud5oB!nwsHm-Yc&Lm6sBy-}V2@VodrT*@k z%5t8TT03K@Ck-FQga%L#D$QMn9~83%-5HKylp4Z56@z zrUJn$-o3*P*7O<`q&JV5MYOpB;ayCzdDm6zsMHWd3Hv|*rZ5lD9xiqY&OL|v_@h?p zje1Hwbt0`lJ^<#7SGdLFP!uaU`4V*P`tANPlJIh0WZh?MC8h=@o2rWH3e!n`(>m!T zB4AY;IF{^G`^AvT@$mBmNkjKR)&-Bt&)i(@t1!8Qw|b~my)p1jl`P+Z*~uk@E<-n9 zse2pM?0~=)h65JF`nhTHbDQtY&U0K{;(~Y=cyRO>aEfJhRH{wbc#Mn2*{b7|h@_9D+9cmr zG0s4K6XQimbG#)2W2sO3oJfwa=XsIn8L-oIljL`SlS}xZa2#XVqmcNLs@;Wrz(MjV zU9b`Mi*ovHlfwev6T2z}v)8i{%qN4xGHPTgVyIKNW4GiOe6~DATd!QWwiZ1c=`KnS zQ!Q7LrfuNufAESXM{zLJzqAgeky%A{=no&j5&qxn3n>vmRA-qj0R5K(k}C%`3Gt_N zY5G&8Ci$I9>GbJ8?odw|Hi(fO3<0$C-won{(M-z19mX(&}+jb3V$6AaPd6@KJ#LNEk$|pW*c6N4^ zUtb@4b|T&?_$S9sPsw=NAhZQepF3G^cqf0iY*-L_obSGVKz)$G2JJY)=v;o*U!MSu z^0<3YGG1)&tr=;r_Z8n?AGz^&DD*y)uc8d#;US3(WTNsDZ3P(3-Q4i{@}mv_-o=<2 z*b#qZm?q5pBwP7LY}+QN`~>}LMr>PXLjS2RHE)YO9uXKNNFV6V!#3ZQWrPBgqqQ)d z-x#GIP~n?7LU#~e_Fy{wpHnV@5VMic%qTq?%s4$#vSOF)-kGHr2ZPX>wJIp0PH9qI zJ)>3w9*Vsj zThF4H=*hE-*R|&AC(Mp5IWD{OQ%9AU%gf-H;SbAZYUydHP-r#H7M&L{_UpEZ&9dLX z`5oV>c|ia&mxR;|?PH379jAJAb?baB_?(J78sTGHuK`S3q0h!5o>1sHWR4`QNqdK~u?$i#l7$e%R zpW0hEXsu?yEKWy_FWW)4MO2LK4^Wx&&qyCh4tVPfoF5H;u_&wn-tJ%93QAjwCuO`V zE(<#TQ(PXs4QuI8rMIpkL@=ghb~Jo$?!MM4A+O2V%sL`B8f&#S_^`9~)Y`3HRNxO` z|7$+P?DhaX(`7Oh$*xp*4`#H$r0`SK!Yz(5#E7;AK(ay3r&d((+q1vmTf54&hiLGp zY5$Bg<%ZWFxTRbmO+W@1eG+_RTW&%wU>t**+`A3p2ZNiRXzBErHE_MEm_qYK~P9 zPQG*+q4lsL!kE#j2*;i0@b8}4n=lNUg@_QJw;g(f407#YO!bBmp({it3 zxd@5+G4crb)v5B@%u#!wUMF1cF zc^x}wA|`g+K5d%Zls&J+s42a~M@vj1v9=_OJzt8w?0_}7`vShArfpg)w3LMw(UYa> zhbv3fARIPSaKhsxO%dc3LFgVbY}ujzAAk0g|C&D#Y{!p(C&{zpIPmxV}nx zobbma`HS!X<5fyzK*o{D*!-#E(t6e~#g-FJS1%fBR^pWnFZq@gPFD{ri|;6^Z^*{z z1Na-&4k9Pnjzaqj&g6{kw#o?LWWr-0ABgZ{^Gy0YzX_d2z##EUV`5-tE8@6=m`|Dy zZm|S#Vhkt4_B!$w8yqSZ`@H)HtoKE3ok5V#?j1H2FGG z4qD3d%%ygDG32Y4-x!ko)umnE_Nya!q!Mp|C)YQyuRH9jUoovq+2FO5cp_Hd`n<;F zypcnn;9brZcV@jhKya^vMY;YfLhG9qMIHl`$UiPjy-gmg^{wuJ25AnhM<4SkT|QT# zwJEk9;tFh9>3{U-<#m4(JN-4el&4gVb7yeel2$9noK*RYLBI2&=WwClz)^#srTb;xFN|B4&~^A_j(!Rv z<86pC_tJgxZW%fa;^~-jKf!Mf`ku~+z>ar`rL?xyqBDB?m?!jDrav!J5EnRFNqYCH zm)@oJiSs(Cdlh{Owv{Ix25U_JTtZ4P>{vGSzPbT38z-mnPo8r)c_XkeP0obhZXbbD zd&Q}JTNjkAA5>(GrUi9fDzdsESNTp#CKk zGgm{)9_iyA^@}eOAye}h#zo>dzkn|NT@~DuLCuE9#-?C+1dbn6jOiQxgNv4jigu?M zh0kA-&KFK;Vp20h*=gz6ss2me0Fe8zKBJBuGrM1mtyRG|sGCz=`5H69m9GWSJ<^e| zSk%Y=cuR_Hi<+))R#U3(r!{YY9GjKvjC%vxWW2`PF|6cF1D(};W{teAhuY6!q)$Z~fep)7p5v>JG&w-+MPP(2ERq`^ z#!}P}7rBbe27+x7WkOl^03InmCz4&2!A>%z9U{qXd3a2|iA9EPeJh;U0b4xhra?h> z*D%*_;-D-M__v58Qw!#HyDGG0$+%aDHQ^;+G^AMcYH2V65BwwsavEAhn08N8n?Pvx zvHdXXK+$d$fgm!PTgcB>IY3&6I#Nbc9QJ5YC0%@4YBC5>WFeI6P=v=&Z+iWMP+n2* z(*wDxg`b}7>M~LdRdDrHSSkHbLQd}Q2P}f{?E#V(Wl0Eukj)cC%KcoSxqK-$!-kZY zDC1npoOE3Q``&SPA1OfxC$*jR5xjATE~!lfz#uF~e`n-M^?;L;5)hI$rXTf-C24P7 z*k(S#qB&OM67=Wp-}D(zr!E=of!_chjrbiBnngEZ3c8gb%3|ak0LCqYOEP%aejKd; z2MTL-BS@}aGi{1!oZ=y)(VEcG(x`7F(!{=BD<~Z!Q$Ce2=t$Ax79`CePt<4`W^NkSu z_45w{{r^k$)iwth{`G&Oxui8nf3H(r!~bP=D@MP2zeTC*IitOos~V;1tYBUxyXXp$ zA8q4>YsAE!#B|`%SNzfQzU8gBq!-8~)GVobZbbp|S$z>XCtL<-8BY;ek0amRYx;3B zuCN}!+piQ#Cfl@{tUl4Rj&oUT-1zbycx2bDY`i^Pp?ssl^jVB@!a&oPeNqg%VK3=} z#L-XM0_KHN6CTKHyJ`LC#J?oj@3V2&`+VdgO&!f{!Iuwdpc^J9gdO(?-=IieYh z_4}MzN&_0XDj7yI>#~0p5fgtgz4df`vXp4CENPO|Elr93+zh1s)0Z?MMiq{0IRAx# zI&qS+y?S@$7z#O7tjt|=SzSg;>Hw##PE`ssBp?;%YzzCD`luVM2y-vq@C35dnmbLt z0w!jW>rVXV%*JmPJKEeuIMg1EQTD8Qg1KYZ>+KHpd8R#uG9jnsM!!y82XG4h9yMUQoEw0pj0-B1^mHaXzVRGOoqh zngDa{>ePx^SfAt|;da0auli(usNAY@KHgc)yZ11;_%(jjF(4PiuHzj-*vs9Zvb0j3 z*44gyxy>Np@DkCeyt5iR9@Z`z->zSibW$Frj3{#)jmKow>7ST7>OHNvbhd>5?w=|x zArYU(Y>K@+Q?o~j_hWWxEIF8a-aDUT#}haqYsTtxIXGGVWLl4QS#mZR;%^KvQjXL&R3+?p^Gjd6HM}7EU z@SS}B8)322KnzT)D$^){1*7*fm^!lW)9AJY;gg!F*~GA8Ukq{VIk-Y!BhlEikufl< z^-x1`9yhVrpOExWS{qos3I zT16?_Buw__ltg{|8{xF-aaQ;Ne({1C!?oE3x{h3u7~yeyqiepul(!D|AdT&%TiYY| zW-hNbL-D9uxqF{+q7r@=m|BS#v@Q@PwEKY?E_9$Gm1XBNghYGWJyv1#*2USEp&g0* zn%0e9bUx{u4gPs{U!0n1NSpc=*EIxBuY`JTm807$1S4pJxdbkRlRy}8FhO>9)IpOF z9x(?aAn;3gVaSve7+xP0(k!hmowyE6jXFTNRvl0`q7ADEf@HPr;~nJ0vH&`8&J3%}PEVF@y3)9x!G-G*y%U@3PSrxXBz`r?E613%Taw>m;hzS=MXMs* zB|;Cy8?_B6bcg_HFE;d-9a39}GJe zkHKG)aWGOyI=nl--gcsGF9aTLBbRM+W;Km;e#1HwEhp5t1591Dpue8N^{R8pAn$Tq5ecUI9Rjhb zmN&sG6J6|}mao8Xcy2!sHkx6G0%`%3(G(cJC2ejN-(g`kl^-MTGYs(lf$lATYiOaw zZ6oHzf7vV}lvjK$Ff>1+i+zsKq{}5;Aq(14Q@jo@Lg5%3B00BJW7BQzs~ub3k8QKK zijKa3RZ-Gpcl>qNg5@DhB;*`N-eW<0@uHdvw`r!47tzdQcA zXbiJQO>b?}sc0%2I>`o};X2+S!(0-ebtveq3bWdy4d7q9rU&sm8a5b%e&lo?*BZ6J zxGvhihC0J`)*8w2iq0lIshn66#01h;X+x}_v55jIy^-@nZlI${#j>~x0_PWv0rv1KEN=P)zOZ;;T)u>U zakxR$m+)$N>8fxHn7lqHGK=hTPX0~%`+sDQpAa^6CEg`Iw9ufgKrl?udmu-v8+6e4 zr|(gS4u<+G>RC#h`FBr%Z}0CBKW7<_S@FFs$~z`NpU{I%RJUPa{a08d>c}6C_^wrQ zfqqwj5P&vg0XTJgL0JEY4=qxBV1Gb@^+2t5al{WF%nAQ*4}$K7h<^u^lC=H%P@*V; zFycFs!1_*t=19nOph!57!l(a55Thvhr z&AqGmFLPKMT~1}o6*8S(0=&QQ-rFM}Ur&Yb-LE=N#$5OwtiGOXY#4lCx>7?3NSTd` zGUgBF*X0SCeUJ@5VWu-wl3)m?N-k&yqWq9+@vYi{$M^8)#OtH4kgTOa!*HoM(p+## zH_D;rjaVVyVy9nN8e?RxF$;dnIAQZSe;~JS5`DOuEZp7@(0vOLa(35a>enE+3|Xyj zQDKkhwBVZO3ceIM8bcn|j@~mcaToBIIV&(L618$ZXAsNMs>M^XoFDC7*)-DuVtk>6 zh(VKFZi-4Xs7pgg#aJj$Yww|DH~Q(_W%N_5Zn(TxcUP`lnWzBnjk}50zgQ#4K=Cjn zp0(prVmKFFm-x8NFO}F7K16bOwqvC7`95fn$tTZow8@rLV`ts};7TH5B!)%2pM%~W zZEh=HwjzlzG+cnAF5kY_=h`_5c*I$4#{p2;8P^t6q~a10WV0gbq-{LOXqKm>bK6-7 zw|toUSrpAv&)7;|O=7Pd-#eXvt{2ONAe%G9@NMq(~%# zzcNEo$zfVZC+s~-0zb~4ZBtZU(`7s%ZW(Zkk&L+Ok+T6p+=RD*vqog1l!v>)MM@@W{TtX;CwWaP=6QyZ(d#3K<@|nH|WUO zi2RF@+^jwSl$8yEV3mL4Pg8I*SpL7e^x0t9|3FvsP%uQeKkb{o#)HBC4L!P0MKZnb zwMGR*P;4?7F6dVg7%EW1<|~>S`Wi>I)NE~{@ze);6tLO)LLy9N$%aazd1V^_*frzHZB;!EeDQ}e;O)~dtQdNpCaaB`Fy&AoF?=qeBJ|Y=liB@FOH4LB7=WI z3d}K4{KQXT5i>f9Hgj%Bo)w59szV;kq#K5k^2LoRa3vPOSTz7c7$St77o%7Dh$N^! z!)*6Qvbh$bg3S;t#CZct@+{3})cigC1NSM4ilG!JiMj3Oh?sT30->;3dDiSBZmBP+ z#qe`)-Xu=L0K`wA%TkMJT^xI`#Q46_;PB@IeA@YT(jCo-2Y&g%Mp(-}H*>n|{i^v| zkGnQ^r|~8!bRk;S{asm7dgOC%TRi48`nDF(p~V5et@PLkg?kRJ29Nc!ddb zGn8?q%juodpzY`$f_*dtl39(OpyrD!%ckPn6mddiC1W=MB2Gv*k9d@B^%0D%E^lYL*T@iAdTMi$)J(a6%`O>p`N7%g=Na>^xRG?eVDcU4 z=po#FJp2s8A8g`dtI>(66nJX*!k-dit@okli56rozv@`kIq;4uL(LYJnzZc$&LYg& zH-JmL;9QVErJUB1ZynZVEB@rM^%L}d7BwO{*8RMuyDH(XNya4$69>WLnaOjGzvxo! zW8+*_qZ>Y5b4PFD;7=Os_9@{{8qp`|1C~>zQ>94flV$eFL&Q>HD^}+h7SLRO;mG0c zOh=xHhKyNKWJ^mOOrE%dF~ZrV*c~jov6=10Q&`LZ7uC|aP#ajL>r)$@RZo_Glk(zh zr9^`qbq7Z|b9dz1^LEtQi?&?x9X90<9gf^_FD%_P2EE)32BELNBi_fSPOS6E=`=O2 z&els2Dev#LkjFCf>%vUBs!d(Si8?FiaTS^rM>e2+R8Hcs{!}3scFrdfGH&$KUJGR| zODk~!sCQ8=k?fh=6CMOPoMjl*vPAvsI|>028hH!+Dr&hw4kA5m-54u(#`nRJO2>-G z#iflhnTfVB*%=%)B|>A7DAzIux&{S~+MYYlCC^CPpJR?fJHo{_C@SNnWxGRsLA0Uu zFItp~dwbcjA6ltz0ZS7{&%ucKZc5-ydbdOJKr?RhDj(fD3cvBahh`(fbS&#=FrJSh zr8<7;CT3n?;_z5Pyy}gyd!wrCO;;uUE<^q`Nci887W*}hK0VF^L&copB5Mw|jpIQ| z0KMV1c_|4h4%quq7GVfE)_YRVKM@CeMq`BL`(e)X81ct7x?YuEX2vM=kzV3hb6&x@ z0NHi@eliV1i%q&he6TG(P=9J8RI?PpK6`;X6r`U_k8I3nG=i88rNC%H!hJ9zx%&1D z!K_xJW$T6#>RAQ(xXX#M>Vop-m)4D5PgqUd4A+&iDHmIizdZ+nOds(_1Z^yK9>ZJ8 zl-ItJ-1@1hG?%7xfc#+%MEW_x%KYekfs;6NR^borM!(6DGcq5Gtx)H~zKzkLrbw2c zlPTEx8culRjK;{-%1(GkI z{fOL2M1Ih}-oi2Gop_01**U1PK`&=u8sGhDJu%Mh}3OF;OB8!4bY3?f{? z3i(RU`&509z!)nd8A~P^b6sTqNU=c*+0Z%AAkELEAz#^s`#VHi$40NAae#3%IgoL? zEnF~w$C|x~!W#<($1?JvsD@;#D>MnbK}9nOhVIu^yg;tl3yK|T1GtWVBGAQ^40*bJ zYm@AFV&VlKR@T@xFHgz3#h3&|IU$zzSivbcWpb02y;T-}lMAxboPQ%W1a{<lo#(-qS@hF zgF`z0n98U6=j+uY7dz7aU(GWUo8_XLHi-$sNl#^TJc!sjyEV$eiOSup6w$a&l-Xf- z3b^42)G|K|$^|{?CQOS*e?NfO-Uj56>p{#N8`QNL8LDfv?uU`9^0fZ1o!7RgOgrdZ zbY2Sq$~Ad68@Mb2g9L&5gP{N?9Z-eP2fO+h3JVjHe=5t=DmS<-*=hNu5R_3g3WpQl z3BJopO2F3=?T~5c-XP!5(o(P)I~=d_qM)NcUkO}gD{dgr5~K4m-RyT7|ze8kp_HZm^Px8Vl1@1uJ(m{E(u zGDpfx%YW7xI)z(c=^MgtGv~R-MyG$b%xyXj!R#|#uhNRqu9j9e0fEYPQzsTi+qHKQ zbu#pdk5x}8MCc40@KRp_LA1$QP8n!*dy8tUlQt4wrfeM8;{qH5zNNHf#dn zd^Vct_%-?;$O~EeiHJ^N>0{=Xj;%bbqC~>|H(1A&;!7jTc}6|@3aG+_g2)MAV2W6@#ZmH z%f?a4@#L?S10kR3$ceRI>%pN^D~!`B1T_M2bn|><+lL`-W0fs^;!5{MdPm(pGLuxN zTzfXt_TcFS)iaEyL0GOs+O_5wnr`8HA5*LDA!G^Zx5i+dUipU__Uwu2=@0A$kqmr& zh+Zl0heBEDoj6su zt$tJ_daF6<$EU2)u%opr)1KuKKOjv`Y*XsEfpzv|GZR&@xau>oO3?5eAH2W-VbRfGTrV1oIqDf|%z6(p&MP1*+~ z>hMCrm8ls+Z3ZjaAMm!bVBKp!*91bIRH8E7R6LAsp@C0bn=o(7#{E zbC0Gr6@R;1pSo}}^K!Ddd)5O@6@^W#)%mIiT<3=dfV1kv7N+-7my;=CqlyP?uwZL!F5z~SnO7Sqmsl~H=8z;+4$F>?z6R2DeNKG)w6LFVhqet z>zRm~2hS)|bH&>gE~E`(kk=QE34gBISA!$SuC4I)PQj#*tne|DM%7-^bR5G3VO4CP zdT=sy0q^U=ZAgey=IMTd&>W&&TILlf@=fwovm~)F%CmNF%RJ|`_a9(qo{OX{Caoc1 zGu5tS)a7F+&F6%HxjFiuklg|+G$|w)B}j~uTfA?r4y4QUDhUO%f^N> z()3o`R)S|$BUtwu-5(`ISzE1C_l`Irpcu{Tf$d^D8i{d~Tz1KDICfNn^yLN&TMT!q z$bDR}E9#2ztyN}f9bK{X<5t0Yf>Mk9`bGpTml>YawkhiF((t(CdKQWHkeP?EN{Whs z5V$hlbbaT0#(dwp}8ejR6aFQwkb%hqKW0$YsKo)Kk6uTPs|OK}4g79uOeM4IOtyr@|S zibdisyk^XHOII7>Ouy5HQ62^?%V!_aFTxQnU&8dpUQ+pt*wi4V*Wlwv;|a3HU}dIz zg)uU1JTYiy6xy!)V5fb32^DH^4UdAHu93Qi1=I?YRCf* zd1?SFo86x`skxa?XBTby27(ZdKjyAG=6DNxh;>t$f#Ztzva0^FKG+lvx>>23c-AFd zP!sPwK3+ZH?2^gc+(lXydNrkL4|FZX-k~%0sbKD>JrLnxEpG|l*DSF>0U}l)u8Wi6 z(&br^AAc_6Vp1UY&fY%-x9ty^JBukPC!Bq@NxUg8m-g&7N6*o}pbSIfI&}0JJfHLB zxwGHbESkl;&eYo1rfqIq)YYidUJ0*cqv(ELDtzmA1JwEI(4UB(Hqz0raYNK`wUUPw zEsITk7=G!C+L(28IahM{0Nd>j%1y`X1dyYAg0(M%Pr*KqnJAp{e~v`f`;Fv@S?fe# zG!ay=Nolzie2OfWi}n4UyFCkXawMf*nQW7x@axADM?yJwK^LH-y*8SdJTh9<-Z$2M zaLz!XxRF@akXh3{^({q_3-cmp-1L6GvSkV+S78;LXRPpRTC-PNZQe_sq>C6eKBN^C zzS{;~*{|uOGu096mGt|lpEWRV6hOuVxq~uk7DrOB&vE|?*(O9ouKkVl>E>XcAYlG; zYQhwIDFU^sfJxFpMkqos5|MO#DBq5X!2a<`HoRX@lC0CViSmrZHhqm=8~ClWe0n42 zN(e0$#GndB2+X81)jby@tP0&JdlzsuWA^-_@^mDXejA6ehiyY1FvgZKqGP?aGV9w9 z?ocat435)XqI*vo=B0J1m)yj(cC7u%5}=4C?q)=Q0jOKOor_<^2T#b?KSum zllbPTXwn;{D&%?dmRuFsR^x=wXs4k^C6q*W5Ditm9ZC}7dHg|pQY3c0W#`UVGGR+t zpQ;zRfkA!Ea&JER%q>OB0PHn74Y??RsUI0=nE@GS$EFC|iILb(W(c7>WZMV{>jU>K zW~E|Pt19$*RCyJ?OhwM6Sy|44A_Xw~-ru@Rn!tD3QH!+1OT^V+&^#wdCiXpR8TT zz-PZK$}7cv?5$t7V;rK|yM3bYs>3`)c?b2epML0b2MwH{j|;=+_o)k(Ed731_`iKZgSvA7=%7Yru$MpRex!Z&-2MBZq7@QU+x1=^ zd4CSC$;s{i`lnR{EqbH9gZ~OXoqR8nQ0c>>uFXCW{Qt+*kTJ; z1v{{!@YyNZsaB(M2N}|9I(KC=bOsoQHH9kIjiGS|due-`>jm9{d6gdgEfhK9tzQee z!~FM#f;>G`)HTNB(&N|tb=c0>>#R$?fGQ;(I_h#nYL4ZF^;*mkIxHP~9!YF<-`k&| zw^%y^xq|4_^T+@w<&9*tGq;~Cdqls8l zqC+(|jHX*F*Ur*)$}ab+JwJOcX$_*E(n>N*z~ds1Z_w)U(oly4a9ET$oviE60Bi4v zPSezEGJL+-e=b&M9918n^LOgyFfF8sD5AW${C@hgTr9Og^;a#aX{L%F33j)bU!AYw zii`A7hTUkqm4b#$;MaEb7C`mq%k5<0a1PXH(D<{{;IHj;mh(9~ovl5RP!h}@>UJuo zIjS9OXYfaub&;NKZwPozwo6|KLZG1(EQnN7sfGN_;T|%6Fh$;hrCsZGpK7J<%;wkE zE5WE~b2J|s82Rt7PD#U4z||GaVL9)J38c4pEf$%WwaeJp)yOC7aX>AFicBF(BDQYSsmI~BgUA%X z>AlE>Owv8*b710RX^ohAYQ}s(a_-CTDQS$D$h7!P^%_Vp%R}fJQ5!dHDA3FNiY3~) zF1FB&IS<&#H-WC@i%B7v?~F%#nyBlNaGUN37{U<2hl(tYNl_uR2D*296Kui*9aNJn zV!k2VOy=P_*N@b_Lf#pI9n?q`ftY_-B>te`@BhTV{lxsUHVAQht(R|=Vwv7ss?^v# zTCJGVwy%HQ(yP@YZJR8zrjL7?gGt(!9d@NsYLVj1#XG7NHa=mO1&gR1Fv;n3~E1%_J<*>NPy6>X?;u@BsY(%YrCd<)y{mV@Eg4 z-^%Ns5X58rZtt{aw2r%V+K0RvG2Zbwuf*jQ?dq!USJwd;)9 zM97o*mg+{4YIT;%lHfZg3sf!kil^fl$lMCJySsDCw)ooc_4mv3g3SjHRaM& zud1Ss8a;fFGBnAxETIw2j3#P7h%f^+RW1c9PG~Z1VQPWY{a7q;G~!o^J;~vA-qigX zGz3Nx167fOEO%r>vbvlV-TR zLU$W4;WI{>Z7~pL%k&^IDj0hR-xz=AMzn9^+oA#w1bctD3=FcJz69^harLlta5L`U zjy$&5I5yhIxKrYL+AVkt%GG>acGbUWM2&x4BSQe!9MhsT; zhk0hluhyQ}hgIU_jFVhFHqUxr<0l2iXVPTr(jt!!o#L#}(3tNfNNt@cZN zDjb1E*KdO>`+PdanJct-|EQdRlr`oKw!0j(72vo~)uz$E!gVAwIK4 z-@Q9f+UcfrlabN-0W8rBMN7z0EHpB3^z59DgHz{=UdQyj^Oj1U%j-npOY&V2?T#Y2 zh*Td+))1A=1412YRi=?Px#`=WO{t`*XIOPY0(cinI!leP+d~RgSGW&&h=^;nm*%-uN)OuR;V? z<&{@H^<{(7o~CJq&Ecb&J1E3vtKrJQh1aKsjs^dME7}lPO0BgZ@iIcZ+&wWmgG6i627*pc-@c)1;|OC>{ki2 zwQq%eRG?ZyLpX2Bk!NR4oRW<7DG76yL+B#Ofmx?a4U+!imxCpwz>V4*LY7PwhmqGA zgZ?wN2YlwI6xN$QYT~6@_iU9>JSxVr>kLWO9kG?tDiNQ!g;jN|tl|*GQeHjHQU=?6 z@1s0J8CD0hCmdf@;sw?hYGTkfv#2K!`#V^lUO1X03v)fwjErL-SR$W)!38Gj5SS2$ zEs_cuWQ8WA2icuYDCeeDG#}fz0OAyx?2b7ymx%hX%;86>YT#oBIe8B#JLUjwN<^M1vUuwW#ND0(K1!(z`PJzxU>J+lSY!#d|_pbGKpiS!is}khzq!=`ieDJ&Hu8cb1*WVg% zlYuNC}TLCyAd@cYS@JzU2Lj&>Y?a6B;@uOK zrw#b__5dsRLl-@BC^#;Hh%o4*0ylC`itZeCmN9Q+7!_B-OltfnYm00Mb00DrT@)@t zslORWRex)_O7SZ`usBb>d3;pOHSUysA;TopHUeLtHG@Xvu+aW^f;PC&1-H~L(DXA7 zz@gHv2buA(NV7C4qIZ2$EI=L=Qfr^0$@R!91k6ICSo)g7k8v&nV+F(p!B+mIn<;*x zo}8-$Ct1pL8d9k?XaF`^h#Gb<3OTw4M|?JjuX9o@Af4P5xK`_0#|E0D^9f7oP6Ga@Gh2z5* zR(bR|`vFOIQBv}K!yfjb_hA>}4^E%B%-hGO*jVi$X-Tg7kZx0t`gP(-|7-$7A}@qw z9+3lTZyng*%z&=%Eu;{2kEDT}ErMUI&Wc?O0bsJIz#jA-*?cTkGFQyCTM8{`k&l_Z z4P;!-^imh3>8(<2WCrATgl8Q~7cf~wV~U(&rnD0FhuHWbh|49ocfofaprYce{pq3K zDqS+p8{}r+Z?ZaB#75$k<4L~ymwY6=u{cad@0uoWx|xM>qCV*u3vss;#Tm=~JjbUm#2f^ZZ4$2>p zquGL2JC|_F2Sp@FP-)w_QZ{q6*UV8l(dDhYIYKIwReEChgSP?M#*Iv4R>g&waJG+Vv{y&>x(EFBwZ$e@Q zp!|hI9Kc0nL45oG6<{-YN8FSk>fk03>Zf!F++`A;GE(c^NU|G)Wr1#Z1p1E?2xBhp zC;w$n7UWUhDmDU^g=>5VZKq3mudkCQ0${tj(kVY$139b09^{2#aNAoZBM6N!u? zI95pDP{~d&i>S7X0^yt4#pJ>`+IY7bVZ{3JQM?f1Y+7?yfVc?n$M9I8MSDUU1SK(! z`i_Z&R&(_^&j|5t>9*WPBsG--9|y%6g?9v`xPIJRpHB^!Qv0pHQQ@Yztdzg@I^A{j z^L(&R#K1YX$O%GikvXkh{t<#@qdCi1Vbb8S3j2m~lzFFZdh4|A#`r0!pAd0|w`rOX z|4(0a9{OiRpq(pKu#)@Y7JlSLwZP9$pAQT8G04;mZ@5(aqh5L3uVL5 zXV4mg`vTY!DQ1x=&xPAW3b92DhR{Q^vYIhsQ3`UHQvJ1*Yv%2n*ygcGbCXNsAUw@0 za}tRV8;03LT}PqIQranoKQPG?o8f%h!jT#qUL4d5 zP9QmBadZK9BthiA;~`1)})tV+V;2 z__x9j-9V-G;bWja$0>nXm`XC|-feANZ$~L0n}*Z+`26W^-|{O=Qh*mvy+BeN%jJ&# zs_F<&FX~!WouTAZAupoe1^jVgNt3jL_=V#g!s*8+&XBJqNr#AZDu;0UM>1{!mkjIq z9DRWG`wzakLrfhiOS)JGKLb6s7z42k#^4=Lj)B7NTOtFn2=!>9y2Qu(D39YYK((8e8?%)A-aB-bwN!z{i1=ASoAp2v>G7+*wR^0dGeh=DZ5Kq?ywo;Q}?!ZzGk>a5PIk zyj*5-X5+mRSE0f-iB-qNt&HVmPa+?_FF4Uc%wKRQG$Swqy?pmAk73FIImiN8xbK@M zq2U~K z=)|cX@~L316|YJBkYi&5LrOAp z?zOc)Farb}wYh$1Em)s2w8Z`y8?_@0P-8-KSNS5b+m)|8A-zqqE=>}`+_L!TTB@Rl z9IjLs-f7RV+ zpW;eozu|9-p9w=^y-3pvur-Uz1N<77!TbzFp%-TF>U=6o|c8!r6o1oc#rs1l;XG);|F1#s?SNpl;;q$_h1t9Ezgeq&(rU_ znI#5Ow>$;m(dP9qb9AkK+>M6i(M`;yJ1kX)?$8&@%bxnhGxF7UQM z&x$%gx`r~jU*(N4cq0d;BQIlqo?x75K%h}J`%?4K&Nq;|F9y zs|U?N%I2~y75wb2wCIz=pN;`*9ij~`-V7qu`ipnm_R_wiEI&UYdUe{EzHZOW(ISiv z-rqG6wnF02I_8%NNK>eC@+4aVcP)K0w!M;(4TuFuFS>^{XSjaye zGjq{~G;*sZqbCvnpT4dHoT}&jyT`t7*>_n&iR>gxCA5*fB0^=U>`8L%*~P`N6rso( zA(CCzB3YtjuMk2jsr=`jbEWJ1e}4CQPWNU$?=tVa^Ugcx%*>G~m26d}{$^*xdgdv; zFOyPM_}t0#46;SBGvic>*``)3y?URq-mz6VR~`2!Y%{oB#~A15-=4A-_9tRU{oX*Q z!a-_ljX^X@B9?1`Ci}Q0c38%L_;F- zZRdo_-S;8%cYatFGCXKoB;2`bH}sb0B62x@Y%}ZrBDh_He4*E*UALLel$v)~F=zlX z8q&)$v}Sku`RIjpQG{{=ukWPnqF26)=dT+@veN%b`bm@uVbuNWAGq zll#Wp4j5Yp+OxY&Zw1@#S&(5B!@a3nVLbheQeZxxd+hX2Qvth{HP*uSpIbD>k1uuI ztE>9e&7^x6dUfO0b?Ix^HMO<*T5*l_FI|izC%lycrEk4j^5xuppeK-{nKR}r+4(GQ z>TImdE&3_@3Vx$zm5P*@Nw%nh311#*YvDk>BO%L<+ql4@&a>N|$ndp@o;EEj50&CR zC;yx#xI6jLY&1=|*xEE1x4(7ErVG3a<5fkMznRQo zXg^n5S8h~RoK(AU#W;u2G}6Ry-Ux72)#@gQeV;5?nr^<1ygPF1n?22HQIL8oPO-EY>9!6V$H0i?rn z?=HGI$&>v|kCK*1*xM}i<nSB~F#l9%hcZoKOH{)9!+OzwGF{Xen_+o!I$ zKb%>{R*TXyYI!KF$N5-IwE0v8_l4GvrIKNWSB;L+epM`W-1#e%b|7H&=F@Mq{onWW zc3&f3KW1ciKB+h4;q_C}D{6z4?K$+)Hi@6Vh)*APHp%tWrd$t_qis5y#(PGRhdr$& zuJzpG)%b|fIB^H95z?|o8{=jAV~ z6fq6%p(bJ}BOQNqj_@`a{gR=1x|-;mY4>1qsB54sA#jhkGuLD$_HDD_^}PW`RO9jt zE;$b*CInd$ew`ebQJ@m6%Z+KRt*117`DfS3;+B&z^NOp>bvEOI07;O9U4XLHZ%+o% z#2EP+YYDVqgJ>8|_@2<>Xvt;sIPuFuD|j;YMUN~KZQGmtu<}VE*DRD2WVhWV;njX*(h5RcWof zjj_m@F>xwW^7{_&lfE(O-X#&W(45OcY{Nye1=a6vyx4P^Iz5f+?6OgN4%q5W@}_+g zaZ7H3q??-LlUCqK_0u}!aw|~T3X56kk>Eua(gNq%`f)KoThevDFDsD?r_`I+f*s_- ztavAk3MWOO6KBCvf7ai$=vSP!V^bum?> zFUw7+tV=WJ{vjuRx>33F1IBz~*FwYJ2e5?|n5Trms871FvaPbJ55t8t0A z3+*dXK!Ee6Mz(dK(Nf?cc$JVeJ2*l{cj&13j=T2~Pto6lNqT$ojcH9K$XK`ok`mYp zTSQfkCP_b;{Y26Dq;BmM$G3pCnAo2NQQbq8UNyC9QyM+>P0MO&^ca>BT#9?$myyM^ zvGw1pW+aBbTu=2*C&>ug%7>}eh)(HmA8l1*X|+2|ug!Abm5UYPae69}L$>Ym0W8!v zS;el&vPc1*v~sxzdZ~x;By*G}M5RGxg8Y?sZ`nUb?nx4<5ub<&{=vnqqp;t-Sf>Bb zPj*hE>ic3XM(9kyUO!--%k=7AMmz( z;2sok)JXYJwkr9FZWg+S@AJ+oU#*gGld|k>bNSvfA3xxEN%pI8>5HrLv~M3O^a*xT z&{(=Fa)GyhFuUhH<%qg?_v)yS(5WU%>Sw{JO0=e_#~p>o+P>fW@+-f(SduFH#zX?v zKfBt|E}PnN+QLMj>|uz)Y9e^k&WlMj9_Tu03Y&k9W-~#pkNnOg$t0yIj)u3bt{k)@oAV-nOf% zgvwoGrlgW=_di^fD;RkTqAy_iB-K-zgKhAa5PC3<*-8Bfq9ivQIo(+GLXPIua%M0+ zdD@C@W7|rwmPFc-iyt0auNXI;59~Q1me6-++}&5JNa28N-Gw$>s=m!RGt;Z72Ga~q ztz;b*!YN{&W>>oW^4|TtUvOG3JN&if&?DW4XFWzs+pk}SdI=cns_9(UA&T!xbJYnI+;(;QGuhK{MWVSW^xt|O-uOH>MLar zkJZzE4?6tmo{_J4fX#{vbuRS@{UgdjWgbTHOhODN8vM5Nhkt4fIDg?Mxo2eN&x0H&k(+~BQ!G${E7@5=Vo6|4x0rMGdVXSoY{G%4&lpzh4P zd*Cte0{@{l{ur;=DQ4*;%XvG_@0F{kmZ#aPXR+t@pSr-hSpTT!z^nb1#RK}>i<4xx zw~WXuB(V|-)1OQ{tQlm7du*_6|GN>g z^a)5>HY!!QP5emKfoW{&d?^`r2q36bC(c9ca&h1 z2tl@s4C+Py3g^~ihS8MtIuqnec*Vh4e63V~XChT7f zF;uQMV>r-+)MjDCwFMybG57jb~%5!4yDJB)m|BQNl9!8LL!uHXhZiNadzhi*`Fb-&p9lSpCF_*Z5ogkA*j6 zciptoZ!3M-cTO?oC2ps=g>;95+qIl3Hu67vYTavPj!2EcG;uWYxMaOt)k$uIZ8$$0-g>idX z5tP!(CHgv{uGJ#GYgV+Qz9_@pCtN8_8LTAJnWI-P>}wM_{z{_GbX)EN62IfU*ftf} zTTQ}#PSIv0sl99M?_0=kbFPqbHI?q-a1*E1H8K&G%+VJZ+JP0=m8Nr2AeX$Eh2y0z zM|V54njt+e6d3;JZI%wqN7uZ#?|{L0?+uP-1=?p5@1?7wKZQQT(Vr4eWq;3zO$|~t z`}4E;8kRr1^y_}!A%Qmw?*x!E0r)!!`cg~S$sU?Ropop@#EJns7Mp>;z>MCI1R3&c zuQ#+G{T1X59br(p5wF3UJ}k`#UY9k>3y*k1TG%u0JW34MAGzZWKJI#s3!O20`t$~e zms`Fc$g@2!oO>~SZ@;wYORKnRB4!VZ`xdSI->yG-s9vmg)JiyzgbLCid8)cHdnxgz zf>G*WS9#?n9nz))BDT`(hk|ySoo^PP&_x>Ah#Q%aS?up2x>c zCFm@TVU4@HLM3&&?ZnPHHi&(m^!E84-w-b$OupYCuU#K96A3Z&P2v(1Ikr8Mwq+=S zI$K>kC(7a*2W*DBl55w^Dkb2)@UFq1Ug_}oM5^=MYEgHCgHy>3-0 zBoy1Y-#rO}HBQd5jj#yOcgPo%vwCrq_WM7!9+Et&%odl}ec3D>qv+R_*q)NvaD2fe z?AG9GDuru1jPRkHimswR(<)}9^bTPShd-!gy z^B))QyZ(9Z-N)bWVX4n^%hNB~ILvT;5|4i!8MU;!b);Af<|t9!-o|mp@bh#>OUFK& z@tw*MBll=_W0Ksyibgu=N;+%addJ)=5xH{fkc)aLwtXfrE+jaZg$kFD$2Q1mOs~^Q z62+#(evJE|+LbTqyE+VBvQ1`tNZLhGR60a`J1LeTV|=lI_n~6(h37ICq$D5R4~R^D zaP`*91KAnpo%L{6F-aqOvJx&pACSO6>x{B_4S@ z{YKlSV8#7GA@LTf;rn|m?ze3(Wzc*atjf7U9?5#Ab4djoO~;fP)l4zCkIqH%~scz=UU;5PI z_TrNy_3S0(KJ4Q$x6?jlQR1b!_Bp~{sXt!zJTmQZ6*z7beKyb7TuMD9MPBZS@xnXz zkGxFFsXfY{S(`~0J;#51`bw=eVJ_1rp0N0pT92wBVm%{7$G&iv*`@D#t#mXG4_8@D z{H(*>7^De*ed}DfkP7_po7wq@u1qnrIhg;6Y*58+wLBYL1X`Vz4V@7-%=JdBqvf)uir&L2)yH}aXKFv6xthpvakZ2uk)pmxcq#3b+1x`i z^JEj~l4aj(qguWy_l{!*sWz@h?`l5pq4sRHYq`_+VpZ6v;y}lh&uYFuuAL!Y*}gQ) z48`qzIV>DQC;UzOW@LiOD7&PhW}yWo&6gxM_Y?1{KJB>AMpBM_)MYhjZ}jEK*qS?g za6$jB+E==RRihGPCYh$Mb2+80;d1KO48d zEj06-<58fFYFntkc z(C4r8>J{Bvw_i6S)7E89?1i@WoKvrxW7rG(#0e6H%($+(tlxYuq1mpvm60|1`cyhZ}eVm-8+ zc}=!|Cz&6P1?#-zVp4En~ z>|iMck002xXKiqIBb+4inO7S;hs9R8ieK-dx$;B3Bt5Itxrre%c5qbEuOb3w%<}RF zM|C!Z9>3IfOihyYJ1d)Cbm;)jj(bqxn4g%;Yc}EC`*_#ge6PFw{`nL8`+b{{FlVHK zUv--7t&%G1<$X4zP1`FRI-4(du4Eo(5_@%8FW|R-p^(l>`qh*<>FI*E@Np%lr_Ihk^2(2^>Q049tuLLI85%0u_xo7RA*ZRl zic=0p&l_c(2*3F8R#U;{%(Ke6&= z4TCGyD_k1>qdKXS^+!G-W_SnR`t}`sSlS(Y8glw=SW5k2{dM+)7y<3s3HPjR2CZb= zjF;6zGQ?=qq~spAY79ONezN$X1(tAcX;IZ3mnBXE&Hh*uy=6kOCIJ=>tI#{sFTH!iS0Ew^kSc;@3?W9NuKNl>)q0^dE|R0tI+p zYJ0){e-bhQGH@Fl|G~@Z!@#np5G&&rQ7}^o#7XvB3j^VVz$&I)!4Qq$Ruy15Y;E09ugEs%uqmzf;`$&s z@QIfP9QZ`Uu2=|xgOj9%5nhP&c`~c0H(;?47jQ}yBKR9Af^Q(i0GU-zpNy>EY1?h#xK6hnAJ95z6@Br36AflM)fK zYK;xHuxcVCiIT~tA!RN)Ff%iT8~=uMZg?z>U<1xI?NdX*q#Qs+{91;MPkF#?Jp_*% zpCE(X(;)$r*&@oU=_tNX1>u7hIHw{~N)1t}j1ek0KNS*13*%5KF>rUA8TgbcCD>kr zR{<@JNk&LH?KTAR!zCF6{mRxaXbFG`eKXKeW{v;lY5It}Gy+;_7MMVmNW>l|RNqM{4CkiFHs3nG6>sH& z$Ut5~569nv_z=HA-a!xed;Q16hVCf-U@Ej7HAQg>Vu~1VRN0IXMjY)d9lX9#KcW{k z6X{wOut7qFe|hsiHeqBK3!Mk%I|Aern=mUHrNK8beHtW)>R^EC@HUR9kP3FgHxoW+ zz`M`}3ryG$$piZ(6Rf%UX1T3>v^g0M7l*kyG0dCR#J^=I;s5Q^tQm+ik2MNy_Cfdj z1&VQihCp42W5rq)0ZogG9$){S0v}zF7o!NHb+bYP#;+ozFi{5t zjK9vfc`*G}UMyue*$gFE8uUk`%`S?}g1H+ADsLVG zxV1}iOe4y`b2lMwM4;2~W&dR$s0|nozwC44Qy$?j}cy{vFIZ~(N>G8`%7;M@?xfmi?$BIT1=-U@7Y3bZ}(nC8ia2*K?*47yD81}}fm zY9JLz;>F-(-38&=m<RyE}VnzA2ZL#B8BQQcq&C08wt@N(l-w}-0I5G z3V1&JxLpyf@bMf1oZE4Ine zZCkMv)t?nX*xor~zn;fR!Q!s+oqEM8By+p4G7CD`viB##K(JP(J2M1-g| zJ3R>k<8vS$1Y2V9&c7UBR=_1ngeCU|>3tZq2Z2TXus@Oyiig0poe1^|z+&wn5yT@< zXC13W>M(s31OKXpR1pTlhr+Dt03m*fiy#pL$7>i^`3AHLrL7A?dhm`mWl z2>r`mVOC>6i+_|rT&GxnOp*;G3crXa80l^2y|G*%Vgg*mP|-j0K(0C5FY;*v5Ub(GrqEPSWxKY4~L>Fc7jM@pCrB zi&9yGLNHG_l#0qs%!WjeDuz3=Pget(&Y(j}5mhla9fgiNVz$8s*@Tw4nWqr_8Q|l9 zj>Nq=KNH38&f3VkZf7DgXYQf}M^AwSDms(EXmbzu)*&PLJ|3@$sJFR=d+SK{CJ*I$ z+6%*ma23Fh1Dkugx2nejzr4R;7O>NsV^fpOy_{Q{&ZiWW5t&68SZP{Bf6D>)>Hya+ zB5P4Rg8lD7YN)aO;*s7HT#13x;vr4MLB=&x@8WwYJs>3xH*$|LaGV&}#dKQ|qJ;}3 zAT%{asOS!^HeUx+QQ#6L61cmXKvnRF5C@hieJXAPOe?sEm7Cwd)`~*ha6`pLsO_mh z^z46vuoBsfjo7%CqU=D?QE(9_5Ct_GVk;q0L`AX}{t=IWNQVDZjJ9sGVjM^^i<(F1 z5h9klo>1&74xyPf!jIazJ;oF8iUwXrJiNFzV3MSvJ)2>I_0+=seE=E>pu{#+XhQlY zuIARi^VTuYE}#=UX+}HmZ66FJe)}3aqmWQNboLjhM>Jqa9CNy!qRa#sm^Smj(u9uW z1pvPX;KbpSwiOTG2vJpp3Hf^4mwh;Z9{`sSxHdlJ0V-{O)uI1q9DE*%C`;Rpmi`GP zFe2JHx4{K`mj`5b{UaD`q$AuSpaY2qsC8O5%4lCW#Dlg&EC}+TAg%`~NU8wKb6ie? zh4!&g8xF!(jvyp^QBtti4$ZAQ_dF^y0u`48h8HB#L9q{oI@bY8WM0#a@@VVdkb=6+ z=AOK*Y5(v51|BSfw2=THU}o}i3`j5m(um_z_#na%C%`}hXJmj4cNgLz7F6V3bo446 z!ocdlY%tirM-O9bH)LK7kW$O3zooSBZEc7)=?Nin zZSMBlnl4ej|4T!G-~UILsMn($m1q8zf(ep7m>@C!73zzsl=<;5gaR(DfkY7-Y;Kj> z+9O;R{^Dt1uzQLfsRu%Y-$6A8Mz{AMZ6O{^N|yf;QNY&w!2Pg|nr+>KvC*>S0W;tJ zp#d8)(7|JK3&z$MKK0`-o(2Y6GdPgCB8uU+XWRs%%@PR%!XIQ0o(R9t#& zTE+?d%nHyD&-#4V|KgF_Gs5IG5IZ8|P^6&JTi`OXzyicU}X)lRJ#rW2-FGF%^MYC;&?nEA>MNPb3Q0 zFJKtpYo!}qMXLbmDqloU6|e<_+F>MCV`hK}E&{U<$K|i$|49FnM+j+~i>tRbv4{l9 z8Z5Hj#!X7-757x*7!O^jlFka|hvNB@;tc`%Ri0=SdEB&L7#Ro7;sf{D(Gef&5 zx(rNA{ht)CMinIj?G8?=DJ0-A$CqAT19%!Bgt!;~RLA3m;kOkSMmWEWfS)3Zmr(>( zUj`R3zDX11?@kJ$1nq`>#9=FsZqQQr-OKV%?>8v@g7#Iamb$xRZ0ZWG`l4tT1kQGI#}2y@(|GDJ@SAN8px2(NSzUdsZ4zkrMQ{<@j-Ka}`|V@X9D zGYNx2L=A(BTM#fW&82I2;mO>s=wZ7zarp8D7J( zQc)AoM;kaDanE_`2Em!U5F1Qa5A8r1Frc&kes>6#%7J7MbL8*Z)_or^z~^7Y&5+{( z$Cg8CLPX2ffWHa@o4>-^WTo*>`XWZD7DRcmQ(+f_>~kANzYt zOf%6zuMd=62b%97!ghP(hXr{c2fyy=pCS^*zyDz(Szn*N3i~yJyEVw_sEkI4n{=BG z1a}8Ol0*-(wldjlbUc$&D2d!ZBvd5CYpb@lb^%JF1m`zFj6(l;eEL^Me7yyN5RJ58 O@V-JOilrb3l>Q%jnc@=w delta 47519 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 diff --git a/src/test/java/com/rackspacecloud/client/cloudfiles/FilesClientTestCase.java b/src/test/java/com/rackspacecloud/client/cloudfiles/FilesClientTestCase.java index 6f13378..aaf0cbb 100644 --- a/src/test/java/com/rackspacecloud/client/cloudfiles/FilesClientTestCase.java +++ b/src/test/java/com/rackspacecloud/client/cloudfiles/FilesClientTestCase.java @@ -1766,7 +1766,7 @@ public void testCDNPurge() { assertNotNull(cdnUrl); //client.purgeCDNContainer(containerName, "lowell.vaughn@rackspace.com"); - client.purgeCDNContainer(containerName, null); + //client.purgeCDNContainer(containerName, null); //client.purgeCDNObject(containerName, "object.txt", "lowell.vaughn@rackspace.com"); client.purgeCDNObject(containerName, "object.txt", null); client.purgeCDNObject(containerName, "path/object.txt", null); From 91bd5c1d50f1f7fd62727ae560003921a416ac2d Mon Sep 17 00:00:00 2001 From: Vaidy Gopalakrishnan Date: Thu, 24 May 2012 05:33:44 +0000 Subject: [PATCH 64/64] getObjectAsRangedStream can now be given a negative length parameter, which will fetch the trailing part of the file starting with the given offset. --- .../rackspacecloud/client/cloudfiles/FilesClient.java | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/rackspacecloud/client/cloudfiles/FilesClient.java b/src/main/java/com/rackspacecloud/client/cloudfiles/FilesClient.java index 85c81c7..20dd367 100644 --- a/src/main/java/com/rackspacecloud/client/cloudfiles/FilesClient.java +++ b/src/main/java/com/rackspacecloud/client/cloudfiles/FilesClient.java @@ -2835,7 +2835,14 @@ public InputStream getObjectAsRangedStream (String container, String objName, lo HttpGet method = new HttpGet(storageURL+"/"+sanitizeForURI(container)+"/"+sanitizeForURI(objName)); method.getParams().setIntParameter("http.socket.timeout", connectionTimeOut); method.setHeader(FilesConstants.X_AUTH_TOKEN, authToken); - method.setHeader("Range", "bytes="+offset+"-"+length); + if (offset >= 0) + { + method.setHeader("Range", "bytes="+offset+"-"+length); + } + else + { + method.setHeader("Range", "bytes="+offset+"-"); + } FilesResponse response = new FilesResponse(client.execute(method)); if (response.getStatusCode() == HttpStatus.SC_UNAUTHORIZED) {