001: /*
002: * Copyright 2005-2007 Noelios Consulting.
003: *
004: * The contents of this file are subject to the terms of the Common Development
005: * and Distribution License (the "License"). You may not use this file except in
006: * compliance with the License.
007: *
008: * You can obtain a copy of the license at
009: * http://www.opensource.org/licenses/cddl1.txt See the License for the specific
010: * language governing permissions and limitations under the License.
011: *
012: * When distributing Covered Code, include this CDDL HEADER in each file and
013: * include the License file at http://www.opensource.org/licenses/cddl1.txt If
014: * applicable, add the following below this CDDL HEADER, with the fields
015: * enclosed by brackets "[]" replaced with your own identifying information:
016: * Portions Copyright [yyyy] [name of copyright owner]
017: */
018:
019: package org.restlet.example.book.rest.ch3;
020:
021: import java.util.ArrayList;
022: import java.util.List;
023:
024: import org.restlet.data.Response;
025: import org.restlet.data.Status;
026: import org.restlet.resource.DomRepresentation;
027: import org.w3c.dom.Node;
028:
029: /**
030: * Amazon S3 bucket.
031: *
032: * @author Jerome Louvel (contact@noelios.com)
033: */
034: public class S3Bucket extends S3Authorized {
035:
036: private String name;
037:
038: private boolean truncated;
039:
040: public S3Bucket(String name) {
041: this .name = name;
042: }
043:
044: /**
045: * Stores this bucket on S3. Analagous to ActiveRecord::Base#save, which
046: * stores an object in the database.
047: */
048: public Status save() {
049: return authorizedPut(getUri(), null).getStatus();
050: }
051:
052: /**
053: * Deletes this bucket.
054: */
055: public Status delete() {
056: return authorizedDelete(getUri()).getStatus();
057: }
058:
059: /**
060: * Get the objects in this bucket: all of them, or some subset.
061: *
062: * If S3 decides not to return the whole bucket/subset, the second return
063: * value will be set to true. To get the rest of the objects, you'll need to
064: * manipulate the subset options.
065: *
066: * Subset options are :Prefix, :Marker, :Delimiter, :MaxKeys. For details,
067: * see the S3 docs on "Listing Keys".
068: *
069: * @return The objects in this nucket.
070: */
071: public List<S3Object> getObjects(String prefix, String marker,
072: String delimiter, Integer maxKeys) {
073: List<S3Object> result = new ArrayList<S3Object>();
074:
075: // Construct the request URI by appending optional listing keys
076: StringBuilder uri = new StringBuilder().append(getUri());
077: String suffix = "?";
078: if (prefix != null) {
079: uri.append(suffix).append("prefix=").append(prefix);
080: suffix = "&";
081: }
082: if (marker != null) {
083: uri.append(suffix).append("marker=").append(marker);
084: suffix = "&";
085: }
086: if (delimiter != null) {
087: uri.append(suffix).append("delimiter=").append(delimiter);
088: suffix = "&";
089: }
090: if (maxKeys != null) {
091: uri.append(suffix).append("maxKeys=").append(maxKeys);
092: suffix = "&";
093: }
094:
095: // Make the request and parse the document.
096: Response response = authorizedGet(uri.toString());
097: DomRepresentation document = response.getEntityAsDom();
098:
099: // Update the truncated flag
100: this .truncated = document.getNodes("//IsTruncated").get(0)
101: .getTextContent().equals("true");
102:
103: // Browse the list of object keys
104: for (Node node : document.getNodes("//Contents/Key")) {
105: result.add(new S3Object(this , node.getTextContent()));
106: }
107:
108: return result;
109: }
110:
111: public boolean isTruncated() {
112: return this .truncated;
113: }
114:
115: public String getUri() {
116: return S3App.HOST + getName();
117: }
118:
119: public String getName() {
120: return this .name;
121: }
122:
123: public void setName(String name) {
124: this.name = name;
125: }
126:
127: }
|