Issue 18: implemented GetBucket options

git-svn-id: http://jclouds.googlecode.com/svn/trunk@482 3d8758e0-26b5-11de-8745-db77d3ebf521
This commit is contained in:
adrian.f.cole 2009-05-07 19:57:46 +00:00
parent aeba634379
commit 373f643ce8
29 changed files with 959 additions and 299 deletions

View File

@ -42,8 +42,8 @@ import com.google.common.collect.Multimap;
*/ */
public class HttpRequest { public class HttpRequest {
String method; private final String method;
String uri; private final String uri;
Multimap<String, String> headers = HashMultimap.create(); Multimap<String, String> headers = HashMultimap.create();
Object content; Object content;
String contentType; String contentType;
@ -75,18 +75,10 @@ public class HttpRequest {
return method; return method;
} }
public void setMethod(String method) {
this.method = method;
}
public String getUri() { public String getUri() {
return uri; return uri;
} }
public void setUri(String uri) {
this.uri = uri;
}
public Multimap<String, String> getHeaders() { public Multimap<String, String> getHeaders() {
return headers; return headers;
} }

View File

@ -1,4 +1,29 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<!--
Copyright (C) 2009 Adrian Cole <adrian@jclouds.org>
====================================================================
Licensed to the Apache Software Foundation (ASF) under one
or more contributor license agreements. See the NOTICE file
distributed with this work for additional information
regarding copyright ownership. The ASF licenses this file
to you under the Apache License, Version 2.0 (the
"License"); you may not use this file except in compliance
with the License. You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing,
software distributed under the License is distributed on an
"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
KIND, either express or implied. See the License for the
specific language governing permissions and limitations
under the License.
====================================================================
-->
<metadata xsi:schemaLocation="http://maven.apache.org/METADATA/1.0.0 http://maven.apache.org/xsd/metadata-1.0.0.xsd" xmlns="http://maven.apache.org/METADATA/1.0.0" <metadata xsi:schemaLocation="http://maven.apache.org/METADATA/1.0.0 http://maven.apache.org/xsd/metadata-1.0.0.xsd" xmlns="http://maven.apache.org/METADATA/1.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<groupId>org.jclouds</groupId> <groupId>org.jclouds</groupId>

View File

@ -1,4 +1,29 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<!--
Copyright (C) 2009 Adrian Cole <adrian@jclouds.org>
====================================================================
Licensed to the Apache Software Foundation (ASF) under one
or more contributor license agreements. See the NOTICE file
distributed with this work for additional information
regarding copyright ownership. The ASF licenses this file
to you under the Apache License, Version 2.0 (the
"License"); you may not use this file except in compliance
with the License. You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing,
software distributed under the License is distributed on an
"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
KIND, either express or implied. See the License for the
specific language governing permissions and limitations
under the License.
====================================================================
-->
<metadata xsi:schemaLocation="http://maven.apache.org/METADATA/1.0.0 http://maven.apache.org/xsd/metadata-1.0.0.xsd" xmlns="http://maven.apache.org/METADATA/1.0.0" <metadata xsi:schemaLocation="http://maven.apache.org/METADATA/1.0.0 http://maven.apache.org/xsd/metadata-1.0.0.xsd" xmlns="http://maven.apache.org/METADATA/1.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<groupId>org.jclouds</groupId> <groupId>org.jclouds</groupId>

View File

@ -1,4 +1,29 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<!--
Copyright (C) 2009 Adrian Cole <adrian@jclouds.org>
====================================================================
Licensed to the Apache Software Foundation (ASF) under one
or more contributor license agreements. See the NOTICE file
distributed with this work for additional information
regarding copyright ownership. The ASF licenses this file
to you under the Apache License, Version 2.0 (the
"License"); you may not use this file except in compliance
with the License. You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing,
software distributed under the License is distributed on an
"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
KIND, either express or implied. See the License for the
specific language governing permissions and limitations
under the License.
====================================================================
-->
<metadata xsi:schemaLocation="http://maven.apache.org/METADATA/1.0.0 http://maven.apache.org/xsd/metadata-1.0.0.xsd" xmlns="http://maven.apache.org/METADATA/1.0.0" <metadata xsi:schemaLocation="http://maven.apache.org/METADATA/1.0.0 http://maven.apache.org/xsd/metadata-1.0.0.xsd" xmlns="http://maven.apache.org/METADATA/1.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<groupId>org.jclouds</groupId> <groupId>org.jclouds</groupId>

View File

@ -1,4 +1,29 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<!--
Copyright (C) 2009 Adrian Cole <adrian@jclouds.org>
====================================================================
Licensed to the Apache Software Foundation (ASF) under one
or more contributor license agreements. See the NOTICE file
distributed with this work for additional information
regarding copyright ownership. The ASF licenses this file
to you under the Apache License, Version 2.0 (the
"License"); you may not use this file except in compliance
with the License. You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing,
software distributed under the License is distributed on an
"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
KIND, either express or implied. See the License for the
specific language governing permissions and limitations
under the License.
====================================================================
-->
<metadata xsi:schemaLocation="http://maven.apache.org/METADATA/1.0.0 http://maven.apache.org/xsd/metadata-1.0.0.xsd" xmlns="http://maven.apache.org/METADATA/1.0.0" <metadata xsi:schemaLocation="http://maven.apache.org/METADATA/1.0.0 http://maven.apache.org/xsd/metadata-1.0.0.xsd" xmlns="http://maven.apache.org/METADATA/1.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<groupId>org.jclouds</groupId> <groupId>org.jclouds</groupId>

View File

@ -1,4 +1,29 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<!--
Copyright (C) 2009 Adrian Cole <adrian@jclouds.org>
====================================================================
Licensed to the Apache Software Foundation (ASF) under one
or more contributor license agreements. See the NOTICE file
distributed with this work for additional information
regarding copyright ownership. The ASF licenses this file
to you under the Apache License, Version 2.0 (the
"License"); you may not use this file except in compliance
with the License. You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing,
software distributed under the License is distributed on an
"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
KIND, either express or implied. See the License for the
specific language governing permissions and limitations
under the License.
====================================================================
-->
<metadata xsi:schemaLocation="http://maven.apache.org/METADATA/1.0.0 http://maven.apache.org/xsd/metadata-1.0.0.xsd" xmlns="http://maven.apache.org/METADATA/1.0.0" <metadata xsi:schemaLocation="http://maven.apache.org/METADATA/1.0.0 http://maven.apache.org/xsd/metadata-1.0.0.xsd" xmlns="http://maven.apache.org/METADATA/1.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<groupId>org.jclouds</groupId> <groupId>org.jclouds</groupId>

View File

@ -1,4 +1,29 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<!--
Copyright (C) 2009 Adrian Cole <adrian@jclouds.org>
====================================================================
Licensed to the Apache Software Foundation (ASF) under one
or more contributor license agreements. See the NOTICE file
distributed with this work for additional information
regarding copyright ownership. The ASF licenses this file
to you under the Apache License, Version 2.0 (the
"License"); you may not use this file except in compliance
with the License. You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing,
software distributed under the License is distributed on an
"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
KIND, either express or implied. See the License for the
specific language governing permissions and limitations
under the License.
====================================================================
-->
<metadata xsi:schemaLocation="http://maven.apache.org/METADATA/1.0.0 http://maven.apache.org/xsd/metadata-1.0.0.xsd" xmlns="http://maven.apache.org/METADATA/1.0.0" <metadata xsi:schemaLocation="http://maven.apache.org/METADATA/1.0.0 http://maven.apache.org/xsd/metadata-1.0.0.xsd" xmlns="http://maven.apache.org/METADATA/1.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<groupId>org.jclouds</groupId> <groupId>org.jclouds</groupId>

View File

@ -1,4 +1,29 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<!--
Copyright (C) 2009 Adrian Cole <adrian@jclouds.org>
====================================================================
Licensed to the Apache Software Foundation (ASF) under one
or more contributor license agreements. See the NOTICE file
distributed with this work for additional information
regarding copyright ownership. The ASF licenses this file
to you under the Apache License, Version 2.0 (the
"License"); you may not use this file except in compliance
with the License. You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing,
software distributed under the License is distributed on an
"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
KIND, either express or implied. See the License for the
specific language governing permissions and limitations
under the License.
====================================================================
-->
<metadata xsi:schemaLocation="http://maven.apache.org/METADATA/1.0.0 http://maven.apache.org/xsd/metadata-1.0.0.xsd" xmlns="http://maven.apache.org/METADATA/1.0.0" <metadata xsi:schemaLocation="http://maven.apache.org/METADATA/1.0.0 http://maven.apache.org/xsd/metadata-1.0.0.xsd" xmlns="http://maven.apache.org/METADATA/1.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<groupId>org.jclouds</groupId> <groupId>org.jclouds</groupId>

View File

@ -1,4 +1,29 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<!--
Copyright (C) 2009 Adrian Cole <adrian@jclouds.org>
====================================================================
Licensed to the Apache Software Foundation (ASF) under one
or more contributor license agreements. See the NOTICE file
distributed with this work for additional information
regarding copyright ownership. The ASF licenses this file
to you under the Apache License, Version 2.0 (the
"License"); you may not use this file except in compliance
with the License. You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing,
software distributed under the License is distributed on an
"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
KIND, either express or implied. See the License for the
specific language governing permissions and limitations
under the License.
====================================================================
-->
<metadata xsi:schemaLocation="http://maven.apache.org/METADATA/1.0.0 http://maven.apache.org/xsd/metadata-1.0.0.xsd" xmlns="http://maven.apache.org/METADATA/1.0.0" <metadata xsi:schemaLocation="http://maven.apache.org/METADATA/1.0.0 http://maven.apache.org/xsd/metadata-1.0.0.xsd" xmlns="http://maven.apache.org/METADATA/1.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<groupId>org.jclouds</groupId> <groupId>org.jclouds</groupId>

View File

@ -1,4 +1,29 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<!--
Copyright (C) 2009 Adrian Cole <adrian@jclouds.org>
====================================================================
Licensed to the Apache Software Foundation (ASF) under one
or more contributor license agreements. See the NOTICE file
distributed with this work for additional information
regarding copyright ownership. The ASF licenses this file
to you under the Apache License, Version 2.0 (the
"License"); you may not use this file except in compliance
with the License. You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing,
software distributed under the License is distributed on an
"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
KIND, either express or implied. See the License for the
specific language governing permissions and limitations
under the License.
====================================================================
-->
<metadata xsi:schemaLocation="http://maven.apache.org/METADATA/1.0.0 http://maven.apache.org/xsd/metadata-1.0.0.xsd" xmlns="http://maven.apache.org/METADATA/1.0.0" <metadata xsi:schemaLocation="http://maven.apache.org/METADATA/1.0.0 http://maven.apache.org/xsd/metadata-1.0.0.xsd" xmlns="http://maven.apache.org/METADATA/1.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<groupId>org.jclouds</groupId> <groupId>org.jclouds</groupId>

View File

@ -1,4 +1,29 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<!--
Copyright (C) 2009 Adrian Cole <adrian@jclouds.org>
====================================================================
Licensed to the Apache Software Foundation (ASF) under one
or more contributor license agreements. See the NOTICE file
distributed with this work for additional information
regarding copyright ownership. The ASF licenses this file
to you under the Apache License, Version 2.0 (the
"License"); you may not use this file except in compliance
with the License. You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing,
software distributed under the License is distributed on an
"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
KIND, either express or implied. See the License for the
specific language governing permissions and limitations
under the License.
====================================================================
-->
<metadata xsi:schemaLocation="http://maven.apache.org/METADATA/1.0.0 http://maven.apache.org/xsd/metadata-1.0.0.xsd" xmlns="http://maven.apache.org/METADATA/1.0.0" <metadata xsi:schemaLocation="http://maven.apache.org/METADATA/1.0.0 http://maven.apache.org/xsd/metadata-1.0.0.xsd" xmlns="http://maven.apache.org/METADATA/1.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<groupId>org.jclouds</groupId> <groupId>org.jclouds</groupId>

View File

@ -1,4 +1,29 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<!--
Copyright (C) 2009 Adrian Cole <adrian@jclouds.org>
====================================================================
Licensed to the Apache Software Foundation (ASF) under one
or more contributor license agreements. See the NOTICE file
distributed with this work for additional information
regarding copyright ownership. The ASF licenses this file
to you under the Apache License, Version 2.0 (the
"License"); you may not use this file except in compliance
with the License. You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing,
software distributed under the License is distributed on an
"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
KIND, either express or implied. See the License for the
specific language governing permissions and limitations
under the License.
====================================================================
-->
<metadata xsi:schemaLocation="http://maven.apache.org/METADATA/1.0.0 http://maven.apache.org/xsd/metadata-1.0.0.xsd" xmlns="http://maven.apache.org/METADATA/1.0.0" <metadata xsi:schemaLocation="http://maven.apache.org/METADATA/1.0.0 http://maven.apache.org/xsd/metadata-1.0.0.xsd" xmlns="http://maven.apache.org/METADATA/1.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<groupId>org.jclouds</groupId> <groupId>org.jclouds</groupId>

View File

@ -1,4 +1,29 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<!--
Copyright (C) 2009 Adrian Cole <adrian@jclouds.org>
====================================================================
Licensed to the Apache Software Foundation (ASF) under one
or more contributor license agreements. See the NOTICE file
distributed with this work for additional information
regarding copyright ownership. The ASF licenses this file
to you under the Apache License, Version 2.0 (the
"License"); you may not use this file except in compliance
with the License. You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing,
software distributed under the License is distributed on an
"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
KIND, either express or implied. See the License for the
specific language governing permissions and limitations
under the License.
====================================================================
-->
<metadata xsi:schemaLocation="http://maven.apache.org/METADATA/1.0.0 http://maven.apache.org/xsd/metadata-1.0.0.xsd" xmlns="http://maven.apache.org/METADATA/1.0.0" <metadata xsi:schemaLocation="http://maven.apache.org/METADATA/1.0.0 http://maven.apache.org/xsd/metadata-1.0.0.xsd" xmlns="http://maven.apache.org/METADATA/1.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<groupId>org.jclouds</groupId> <groupId>org.jclouds</groupId>

View File

@ -26,6 +26,7 @@ package org.jclouds.aws.s3;
import java.util.List; import java.util.List;
import java.util.concurrent.Future; import java.util.concurrent.Future;
import org.jclouds.aws.s3.commands.options.GetBucketOptions;
import org.jclouds.aws.s3.commands.options.PutBucketOptions; import org.jclouds.aws.s3.commands.options.PutBucketOptions;
import org.jclouds.aws.s3.domain.S3Bucket; import org.jclouds.aws.s3.domain.S3Bucket;
import org.jclouds.aws.s3.domain.S3Object; import org.jclouds.aws.s3.domain.S3Object;
@ -132,5 +133,7 @@ public interface S3Connection {
*/ */
Future<S3Bucket> getBucket(String name); Future<S3Bucket> getBucket(String name);
Future<S3Bucket> getBucket(String name, GetBucketOptions options);
Future<List<S3Bucket.MetaData>> getMetaDataOfOwnedBuckets(); Future<List<S3Bucket.MetaData>> getMetaDataOfOwnedBuckets();
} }

View File

@ -23,6 +23,7 @@
*/ */
package org.jclouds.aws.s3.commands; package org.jclouds.aws.s3.commands;
import org.jclouds.aws.s3.commands.options.GetBucketOptions;
import org.jclouds.aws.s3.domain.S3Bucket; import org.jclouds.aws.s3.domain.S3Bucket;
import org.jclouds.aws.s3.xml.ListBucketHandler; import org.jclouds.aws.s3.xml.ListBucketHandler;
import org.jclouds.http.commands.callables.xml.ParseSax; import org.jclouds.http.commands.callables.xml.ParseSax;
@ -36,9 +37,18 @@ public class GetBucket extends S3FutureCommand<S3Bucket> {
@Inject @Inject
public GetBucket(@Named("jclouds.http.address") String amazonHost, public GetBucket(@Named("jclouds.http.address") String amazonHost,
ParseSax<S3Bucket> callable, @Assisted String bucket) { ParseSax<S3Bucket> bucketParser, @Assisted String bucket) {
super("GET", "/", callable, amazonHost, bucket); this(amazonHost, bucketParser, bucket, new GetBucketOptions());
ListBucketHandler handler = (ListBucketHandler) callable.getHandler(); }
@Inject
public GetBucket(@Named("jclouds.http.address") String amazonHost,
ParseSax<S3Bucket> bucketParser, @Assisted String bucket,
@Assisted GetBucketOptions options) {
super("GET", "/" + options.toQueryString(), bucketParser, amazonHost,
bucket);
ListBucketHandler handler = (ListBucketHandler) bucketParser
.getHandler();
handler.setBucketName(bucket); handler.setBucketName(bucket);
} }
} }

View File

@ -23,6 +23,7 @@
*/ */
package org.jclouds.aws.s3.commands; package org.jclouds.aws.s3.commands;
import org.jclouds.aws.s3.commands.options.GetBucketOptions;
import org.jclouds.aws.s3.commands.options.PutBucketOptions; import org.jclouds.aws.s3.commands.options.PutBucketOptions;
import org.jclouds.aws.s3.domain.S3Object; import org.jclouds.aws.s3.domain.S3Object;
import org.jclouds.aws.s3.xml.S3ParserFactory; import org.jclouds.aws.s3.xml.S3ParserFactory;
@ -145,6 +146,11 @@ public class S3CommandFactory {
parserFactory.createListBucketParser(), bucket); parserFactory.createListBucketParser(), bucket);
} }
public GetBucket createGetBucket(String bucket, GetBucketOptions options) {
return new GetBucket(amazonHost,
parserFactory.createListBucketParser(), bucket, options);
}
public CopyObject createCopyObject(String sourceBucket, public CopyObject createCopyObject(String sourceBucket,
String sourceObject, String destinationBucket, String sourceObject, String destinationBucket,
String destinationObject) { String destinationObject) {
@ -153,4 +159,6 @@ public class S3CommandFactory {
destinationBucket, destinationObject); destinationBucket, destinationObject);
} }
} }

View File

@ -26,6 +26,8 @@ package org.jclouds.aws.s3.commands.options;
import static com.google.common.base.Preconditions.checkNotNull; import static com.google.common.base.Preconditions.checkNotNull;
import static com.google.common.base.Preconditions.checkState; import static com.google.common.base.Preconditions.checkState;
import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
import java.util.HashMap; import java.util.HashMap;
import java.util.Iterator; import java.util.Iterator;
import java.util.Map; import java.util.Map;
@ -72,16 +74,21 @@ public class GetBucketOptions {
builder.append("&"); builder.append("&");
} }
} }
return builder.toString(); String returnVal = builder.toString();
return returnVal;
} }
/** /**
* Limits the response to keys which begin with the indicated prefix. You * Limits the response to keys which begin with the indicated prefix. You
* can use prefixes to separate a bucket into different sets of keys in a * can use prefixes to separate a bucket into different sets of keys in a
* way similar to how a file system uses folders. * way similar to how a file system uses folders.
*
* @throws UnsupportedEncodingException
*/ */
public GetBucketOptions prefix(String prefix) { public GetBucketOptions prefix(String prefix)
options.put("prefix", checkNotNull(prefix, "prefix")); throws UnsupportedEncodingException {
options.put("prefix", URLEncoder.encode(checkNotNull(prefix, "prefix"),
"UTF-8"));
return this; return this;
} }
@ -97,9 +104,13 @@ public class GetBucketOptions {
* include keys that occur lexicographically after marker. This is * include keys that occur lexicographically after marker. This is
* convenient for pagination: To get the next page of results use the last * convenient for pagination: To get the next page of results use the last
* key of the current page as the marker. * key of the current page as the marker.
*
* @throws UnsupportedEncodingException
*/ */
public GetBucketOptions marker(String marker) { public GetBucketOptions marker(String marker)
options.put("marker", checkNotNull(marker, "marker")); throws UnsupportedEncodingException {
options.put("marker", URLEncoder.encode(checkNotNull(marker, "marker"),
"UTF-8"));
return this; return this;
} }
@ -132,9 +143,13 @@ public class GetBucketOptions {
* occurrence of the delimiter to be rolled up into a single result element * occurrence of the delimiter to be rolled up into a single result element
* in the CommonPrefixes collection. These rolled-up keys are not returned * in the CommonPrefixes collection. These rolled-up keys are not returned
* elsewhere in the response. * elsewhere in the response.
*
* @throws UnsupportedEncodingException
*/ */
public GetBucketOptions delimiter(String delimiter) { public GetBucketOptions delimiter(String delimiter)
options.put("delimiter", checkNotNull(delimiter, "delimiter")); throws UnsupportedEncodingException {
options.put("delimiter", URLEncoder.encode(checkNotNull(delimiter,
"delimiter"), "UTF-8"));
return this; return this;
} }
@ -148,17 +163,21 @@ public class GetBucketOptions {
public static class Builder { public static class Builder {
/** /**
* @throws UnsupportedEncodingException
* @see GetBucketOptions#prefix * @see GetBucketOptions#prefix
*/ */
public static GetBucketOptions prefix(String prefix) { public static GetBucketOptions prefix(String prefix)
throws UnsupportedEncodingException {
GetBucketOptions options = new GetBucketOptions(); GetBucketOptions options = new GetBucketOptions();
return options.prefix(prefix); return options.prefix(prefix);
} }
/** /**
* @throws UnsupportedEncodingException
* @see GetBucketOptions#marker * @see GetBucketOptions#marker
*/ */
public static GetBucketOptions marker(String marker) { public static GetBucketOptions marker(String marker)
throws UnsupportedEncodingException {
GetBucketOptions options = new GetBucketOptions(); GetBucketOptions options = new GetBucketOptions();
return options.marker(marker); return options.marker(marker);
} }
@ -172,9 +191,11 @@ public class GetBucketOptions {
} }
/** /**
* @throws UnsupportedEncodingException
* @see GetBucketOptions#delimiter * @see GetBucketOptions#delimiter
*/ */
public static GetBucketOptions delimiter(String delimiter) { public static GetBucketOptions delimiter(String delimiter)
throws UnsupportedEncodingException {
GetBucketOptions options = new GetBucketOptions(); GetBucketOptions options = new GetBucketOptions();
return options.delimiter(delimiter); return options.delimiter(delimiter);
} }

View File

@ -49,14 +49,20 @@ public class S3Bucket {
@Override @Override
public boolean equals(Object o) { public boolean equals(Object o) {
if (this == o) return true; if (this == o)
if (!(o instanceof S3Bucket)) return false; return true;
if (!(o instanceof S3Bucket))
return false;
S3Bucket s3Bucket = (S3Bucket) o; S3Bucket s3Bucket = (S3Bucket) o;
if (isComplete != s3Bucket.isComplete) return false; if (isComplete != s3Bucket.isComplete)
if (!metaData.equals(s3Bucket.metaData)) return false; return false;
if (objects != null ? !objects.equals(s3Bucket.objects) : s3Bucket.objects != null) return false; if (!metaData.equals(s3Bucket.metaData))
return false;
if (objects != null ? !objects.equals(s3Bucket.objects)
: s3Bucket.objects != null)
return false;
return true; return true;
} }
@ -84,17 +90,25 @@ public class S3Bucket {
@Override @Override
public boolean equals(Object o) { public boolean equals(Object o) {
if (this == o) return true; if (this == o)
if (!(o instanceof MetaData)) return false; return true;
if (!(o instanceof MetaData))
return false;
MetaData metaData = (MetaData) o; MetaData metaData = (MetaData) o;
if (canonicalUser != null ? !canonicalUser.equals(metaData.canonicalUser) : metaData.canonicalUser != null) if (canonicalUser != null ? !canonicalUser
.equals(metaData.canonicalUser)
: metaData.canonicalUser != null)
return false; return false;
if (creationDate != null ? !creationDate.equals(metaData.creationDate) : metaData.creationDate != null) if (creationDate != null ? !creationDate
.equals(metaData.creationDate)
: metaData.creationDate != null)
return false;
if (locationConstraint != metaData.locationConstraint)
return false;
if (!name.equals(metaData.name))
return false; return false;
if (locationConstraint != metaData.locationConstraint) return false;
if (!name.equals(metaData.name)) return false;
return true; return true;
} }
@ -102,9 +116,14 @@ public class S3Bucket {
@Override @Override
public int hashCode() { public int hashCode() {
int result = name.hashCode(); int result = name.hashCode();
result = 31 * result + (creationDate != null ? creationDate.hashCode() : 0); result = 31 * result
result = 31 * result + (canonicalUser != null ? canonicalUser.hashCode() : 0); + (creationDate != null ? creationDate.hashCode() : 0);
result = 31 * result + (locationConstraint != null ? locationConstraint.hashCode() : 0); result = 31 * result
+ (canonicalUser != null ? canonicalUser.hashCode() : 0);
result = 31
* result
+ (locationConstraint != null ? locationConstraint
.hashCode() : 0);
return result; return result;
} }
@ -153,6 +172,11 @@ public class S3Bucket {
public static final S3Bucket NOT_FOUND = new S3Bucket("NOT_FOUND"); public static final S3Bucket NOT_FOUND = new S3Bucket("NOT_FOUND");
private Set<S3Object.MetaData> objects = new HashSet<S3Object.MetaData>(); private Set<S3Object.MetaData> objects = new HashSet<S3Object.MetaData>();
private Set<String> commonPrefixes = new HashSet<String>();
private String prefix;
private String marker;
private String delimiter;
private long maxKeys;
private final MetaData metaData; private final MetaData metaData;
private boolean isComplete; private boolean isComplete;
@ -189,4 +213,44 @@ public class S3Bucket {
return metaData; return metaData;
} }
public void setCommonPrefixes(Set<String> commonPrefixes) {
this.commonPrefixes = commonPrefixes;
}
public Set<String> getCommonPrefixes() {
return commonPrefixes;
}
public void setPrefix(String prefix) {
this.prefix = prefix;
}
public String getPrefix() {
return prefix;
}
public void setMaxKeys(long maxKeys) {
this.maxKeys = maxKeys;
}
public long getMaxKeys() {
return maxKeys;
}
public void setMarker(String marker) {
this.marker = marker;
}
public String getMarker() {
return marker;
}
public void setDelimiter(String delimiter) {
this.delimiter = delimiter;
}
public String getDelimiter() {
return delimiter;
}
} }

View File

@ -23,7 +23,7 @@
*/ */
package org.jclouds.aws.s3.domain; package org.jclouds.aws.s3.domain;
import static com.google.common.base.Preconditions.checkNotNull; import static com.google.common.base.Preconditions.*;
import org.joda.time.DateTime; import org.joda.time.DateTime;
import java.util.Arrays; import java.util.Arrays;
@ -47,13 +47,17 @@ public class S3Object {
@Override @Override
public boolean equals(Object o) { public boolean equals(Object o) {
if (this == o) return true; if (this == o)
if (!(o instanceof S3Object)) return false; return true;
if (!(o instanceof S3Object))
return false;
S3Object s3Object = (S3Object) o; S3Object s3Object = (S3Object) o;
if (data != null ? !data.equals(s3Object.data) : s3Object.data != null) return false; if (data != null ? !data.equals(s3Object.data) : s3Object.data != null)
if (!metaData.equals(s3Object.metaData)) return false; return false;
if (!metaData.equals(s3Object.metaData))
return false;
return true; return true;
} }
@ -75,7 +79,9 @@ public class S3Object {
sb.append("MetaData"); sb.append("MetaData");
sb.append("{key='").append(key).append('\''); sb.append("{key='").append(key).append('\'');
sb.append(", lastModified=").append(lastModified); sb.append(", lastModified=").append(lastModified);
sb.append(", md5=").append(getMd5() == null ? "null" : Arrays.asList(getMd5()).toString()); sb.append(", md5=").append(
getMd5() == null ? "null" : Arrays.asList(getMd5())
.toString());
sb.append(", size=").append(size); sb.append(", size=").append(size);
sb.append(", owner=").append(owner); sb.append(", owner=").append(owner);
sb.append(", contentType='").append(contentType).append('\''); sb.append(", contentType='").append(contentType).append('\'');
@ -91,19 +97,29 @@ public class S3Object {
@Override @Override
public boolean equals(Object o) { public boolean equals(Object o) {
if (this == o) return true; if (this == o)
if (!(o instanceof MetaData)) return false; return true;
if (!(o instanceof MetaData))
return false;
MetaData metaData = (MetaData) o; MetaData metaData = (MetaData) o;
if (size != metaData.size) return false; if (size != metaData.size)
if (contentType != null ? !contentType.equals(metaData.contentType) : metaData.contentType != null)
return false; return false;
if (!key.equals(metaData.key)) return false; if (contentType != null ? !contentType.equals(metaData.contentType)
if (lastModified != null ? !lastModified.equals(metaData.lastModified) : metaData.lastModified != null) : metaData.contentType != null)
return false;
if (!key.equals(metaData.key))
return false;
if (lastModified != null ? !lastModified
.equals(metaData.lastModified)
: metaData.lastModified != null)
return false;
if (!Arrays.equals(getMd5(), metaData.getMd5()))
return false;
if (owner != null ? !owner.equals(metaData.owner)
: metaData.owner != null)
return false; return false;
if (!Arrays.equals(getMd5(), metaData.getMd5())) return false;
if (owner != null ? !owner.equals(metaData.owner) : metaData.owner != null) return false;
return true; return true;
} }
@ -111,11 +127,14 @@ public class S3Object {
@Override @Override
public int hashCode() { public int hashCode() {
int result = key.hashCode(); int result = key.hashCode();
result = 31 * result + (lastModified != null ? lastModified.hashCode() : 0); result = 31 * result
result = 31 * result + (getMd5() != null ? Arrays.hashCode(getMd5()) : 0); + (lastModified != null ? lastModified.hashCode() : 0);
result = 31 * result
+ (getMd5() != null ? Arrays.hashCode(getMd5()) : 0);
result = 31 * result + (int) (size ^ (size >>> 32)); result = 31 * result + (int) (size ^ (size >>> 32));
result = 31 * result + (owner != null ? owner.hashCode() : 0); result = 31 * result + (owner != null ? owner.hashCode() : 0);
result = 31 * result + (contentType != null ? contentType.hashCode() : 0); result = 31 * result
+ (contentType != null ? contentType.hashCode() : 0);
return result; return result;
} }
@ -126,7 +145,9 @@ public class S3Object {
private String server; private String server;
public MetaData(String key) { public MetaData(String key) {
this.key = checkNotNull(key, "key"); checkNotNull(key, "key");
checkArgument(!key.startsWith("/"), "keys cannot start with /");
this.key = key;
} }
public String getKey() { public String getKey() {
@ -206,6 +227,11 @@ public class S3Object {
this.data = data; this.data = data;
} }
public S3Object(String key, Object data) {
this(key);
this.data = data;
}
public String getKey() { public String getKey() {
return metaData.getKey(); return metaData.getKey();
} }

View File

@ -38,6 +38,7 @@ import org.jclouds.aws.s3.commands.HeadMetaData;
import org.jclouds.aws.s3.commands.PutBucket; import org.jclouds.aws.s3.commands.PutBucket;
import org.jclouds.aws.s3.commands.PutObject; import org.jclouds.aws.s3.commands.PutObject;
import org.jclouds.aws.s3.commands.S3CommandFactory; import org.jclouds.aws.s3.commands.S3CommandFactory;
import org.jclouds.aws.s3.commands.options.GetBucketOptions;
import org.jclouds.aws.s3.commands.options.PutBucketOptions; import org.jclouds.aws.s3.commands.options.PutBucketOptions;
import org.jclouds.aws.s3.domain.S3Bucket; import org.jclouds.aws.s3.domain.S3Bucket;
import org.jclouds.aws.s3.domain.S3Object; import org.jclouds.aws.s3.domain.S3Object;
@ -183,6 +184,17 @@ public class LiveS3Connection implements S3Connection {
return getBucket; return getBucket;
} }
/**
* {@inheritDoc}
*
* @see GetBucket
*/
public Future<S3Bucket> getBucket(String s3Bucket, GetBucketOptions options) {
GetBucket getBucket = factory.createGetBucket(s3Bucket, options);
client.submit(getBucket);
return getBucket;
}
/** /**
* {@inheritDoc} * {@inheritDoc}
*/ */

View File

@ -57,11 +57,13 @@ public class ListBucketHandler extends ParseSax.HandlerWithResult<S3Bucket> {
private StringBuilder currentText = new StringBuilder(); private StringBuilder currentText = new StringBuilder();
@Inject @Inject
private DateService dateParser; private DateService dateParser;
private boolean inCommonPrefixes;
@Override @Override
public void startDocument() throws SAXException { public void startDocument() throws SAXException {
checkNotNull(s3Bucket, "s3Bucket"); checkNotNull(s3Bucket, "s3Bucket");
s3Bucket.getContents().clear(); s3Bucket.getContents().clear();
s3Bucket.getCommonPrefixes().clear();
super.startDocument(); super.startDocument();
} }
@ -70,6 +72,8 @@ public class ListBucketHandler extends ParseSax.HandlerWithResult<S3Bucket> {
if (qName.equals("Contents")) { if (qName.equals("Contents")) {
} else if (qName.equals("Owner")) { } else if (qName.equals("Owner")) {
currentOwner = new S3Owner(); currentOwner = new S3Owner();
} else if (qName.equals("CommonPrefixes")) {
inCommonPrefixes = true;
} }
} }
@ -98,12 +102,20 @@ public class ListBucketHandler extends ParseSax.HandlerWithResult<S3Bucket> {
} else if (qName.equals("Contents")) { } else if (qName.equals("Contents")) {
s3Bucket.getContents().add(currentObjectMetaData); s3Bucket.getContents().add(currentObjectMetaData);
} else if (qName.equals("Name")) {// bucket stuff last, as least likely } else if (qName.equals("Name")) {// bucket stuff last, as least likely
// } else if (qName.equals("Prefix")) { } else if (qName.equals("Prefix")) {
// // no-op String prefix = currentText.toString().trim();
// } else if (qName.equals("Marker")) { if (inCommonPrefixes)
// // no-op s3Bucket.getCommonPrefixes().add(prefix);
// } else if (qName.equals("MaxKeys")) { else
// // no-op s3Bucket.setPrefix(prefix);
} else if (qName.equals("Delimiter")) {
if (!currentText.toString().equals(""))
s3Bucket.setDelimiter(currentText.toString().trim());
} else if (qName.equals("Marker")) {
if (!currentText.toString().equals(""))
s3Bucket.setMarker(currentText.toString());
} else if (qName.equals("MaxKeys")) {
s3Bucket.setMaxKeys(Long.parseLong(currentText.toString()));
} else if (qName.equals("IsTruncated")) { } else if (qName.equals("IsTruncated")) {
boolean isTruncated = Boolean.parseBoolean(currentText.toString()); boolean isTruncated = Boolean.parseBoolean(currentText.toString());
s3Bucket.setComplete(!isTruncated); s3Bucket.setComplete(!isTruncated);

View File

@ -29,10 +29,15 @@ import static org.testng.Assert.assertNotNull;
import java.io.File; import java.io.File;
import java.io.FileInputStream; import java.io.FileInputStream;
import java.io.IOException; import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.util.List; import java.util.List;
import java.util.Properties;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeUnit;
import java.util.concurrent.TimeoutException;
import org.apache.commons.io.IOUtils; import org.apache.commons.io.IOUtils;
import static org.jclouds.aws.s3.commands.options.GetBucketOptions.Builder.*;
import org.jclouds.aws.s3.domain.S3Bucket; import org.jclouds.aws.s3.domain.S3Bucket;
import org.jclouds.aws.s3.domain.S3Object; import org.jclouds.aws.s3.domain.S3Object;
import org.testng.annotations.DataProvider; import org.testng.annotations.DataProvider;
@ -75,25 +80,25 @@ public class AmazonS3Test extends S3IntegrationTest {
@Test(dataProvider = "putTests") @Test(dataProvider = "putTests")
void testPutObject(String key, String type, Object content, void testPutObject(String key, String type, Object content,
Object realObject) throws Exception { Object realObject) throws Exception {
String s3Bucket = bucketPrefix + "filetestsforadrian"; String bucketName = bucketPrefix + "filetestsforadrian";
client.createBucketIfNotExists(s3Bucket).get(10, TimeUnit.SECONDS); client.createBucketIfNotExists(bucketName).get(10, TimeUnit.SECONDS);
context.createS3ObjectMap(s3Bucket).clear(); context.createS3ObjectMap(bucketName).clear();
assertEquals(client.getBucket(s3Bucket).get(10, TimeUnit.SECONDS) assertEquals(client.getBucket(bucketName).get(10, TimeUnit.SECONDS)
.getContents().size(), 0); .getContents().size(), 0);
S3Object object = new S3Object(key); S3Object object = new S3Object(key);
object.getMetaData().setContentType(type); object.getMetaData().setContentType(type);
object.setData(content); object.setData(content);
assertNotNull(client.addObject(s3Bucket, object).get(10, assertNotNull(client.addObject(bucketName, object).get(10,
TimeUnit.SECONDS)); TimeUnit.SECONDS));
object = client.getObject(s3Bucket, object.getKey()).get(10, object = client.getObject(bucketName, object.getKey()).get(10,
TimeUnit.SECONDS); TimeUnit.SECONDS);
returnedString = S3Utils.getContentAsStringAndClose(object); returnedString = S3Utils.getContentAsStringAndClose(object);
assertEquals(returnedString, realObject); assertEquals(returnedString, realObject);
assertEquals(client.getBucket(s3Bucket).get(10, TimeUnit.SECONDS) assertEquals(client.getBucket(bucketName).get(10, TimeUnit.SECONDS)
.getContents().size(), 1); .getContents().size(), 1);
} }
@Test @Test()
void testCopyObject() throws Exception { void testCopyObject() throws Exception {
String realObject = IOUtils.toString(new FileInputStream("pom.xml")); String realObject = IOUtils.toString(new FileInputStream("pom.xml"));
@ -136,40 +141,111 @@ public class AmazonS3Test extends S3IntegrationTest {
} }
S3Object.MetaData headObject() throws Exception { S3Object.MetaData headObject() throws Exception {
String s3Bucket = bucketPrefix + "adrianjbosstest"; String bucketName = bucketPrefix + "adrianjbosstest";
return client.getObjectMetaData(s3Bucket, "3366").get(10, return client.getObjectMetaData(bucketName, "3366").get(10,
TimeUnit.SECONDS); TimeUnit.SECONDS);
} }
@Test @Test()
void bucketExists() throws Exception { void testGetBucketDelimiter() throws InterruptedException,
String s3Bucket = bucketPrefix + "needstoexist"; ExecutionException, TimeoutException, UnsupportedEncodingException {
assert !client.bucketExists(s3Bucket).get(10, TimeUnit.SECONDS); String bucketName = bucketPrefix + "delimiter";
assert client.createBucketIfNotExists(s3Bucket).get(10, assert client.createBucketIfNotExists(bucketName).get(10,
TimeUnit.SECONDS); TimeUnit.SECONDS);
assert client.bucketExists(s3Bucket).get(10, TimeUnit.SECONDS); String prefix = "apps";
addTenObjectsUnderPrefix(bucketName, prefix);
add15UnderRoot(bucketName);
S3Bucket bucket = client.getBucket(bucketName, delimiter("/")).get(10,
TimeUnit.SECONDS);
assertEquals(bucket.getDelimiter(), "/");
assertEquals(bucket.getContents().size(), 15);
assertEquals(bucket.getCommonPrefixes().size(), 1);
}
private void addAlphabetUnderRoot(String bucketName)
throws InterruptedException, ExecutionException, TimeoutException {
for (char letter = 'a'; letter <= 'z'; letter++) {
client.addObject(bucketName,
new S3Object(letter + "", letter + "content")).get(10,
TimeUnit.SECONDS);
}
}
@Test
void testGetBucketMarker() throws InterruptedException, ExecutionException,
TimeoutException, UnsupportedEncodingException {
String bucketName = bucketPrefix + "marker";
assert client.createBucketIfNotExists(bucketName).get(10,
TimeUnit.SECONDS);
addAlphabetUnderRoot(bucketName);
S3Bucket bucket = client.getBucket(bucketName, marker("y")).get(10,
TimeUnit.SECONDS);
assertEquals(bucket.getMarker(), "y");
assertEquals(bucket.getContents().size(), 1);
}
@Test()
void testGetBucketPrefix() throws InterruptedException, ExecutionException,
TimeoutException, UnsupportedEncodingException {
String bucketName = bucketPrefix + "prefix";
assert client.createBucketIfNotExists(bucketName).get(10,
TimeUnit.SECONDS);
String prefix = "apps";
addTenObjectsUnderPrefix(bucketName, prefix);
add15UnderRoot(bucketName);
S3Bucket bucket = client.getBucket(bucketName, prefix("apps/")).get(10,
TimeUnit.SECONDS);
assertEquals(bucket.getContents().size(), 10);
assertEquals(bucket.getPrefix(), "apps/");
}
private void add15UnderRoot(String bucketName) throws InterruptedException,
ExecutionException, TimeoutException {
for (int i = 0; i < 15; i++)
client.addObject(bucketName, new S3Object(i + "", i + "content"))
.get(10, TimeUnit.SECONDS);
}
private void addTenObjectsUnderPrefix(String bucketName, String prefix)
throws InterruptedException, ExecutionException, TimeoutException {
for (int i = 0; i < 10; i++)
client.addObject(bucketName,
new S3Object(prefix + "/" + i, i + "content")).get(10,
TimeUnit.SECONDS);
}
@Test()
void bucketExists() throws Exception {
String bucketName = bucketPrefix + "needstoexist";
assert !client.bucketExists(bucketName).get(10, TimeUnit.SECONDS);
assert client.createBucketIfNotExists(bucketName).get(10,
TimeUnit.SECONDS);
assert client.bucketExists(bucketName).get(10, TimeUnit.SECONDS);
} }
Boolean deleteBucket() throws Exception { Boolean deleteBucket() throws Exception {
String s3Bucket = bucketPrefix + "adrianjbosstest"; String bucketName = bucketPrefix + "adrianjbosstest";
return client.deleteBucketIfEmpty(s3Bucket).get(10, TimeUnit.SECONDS); return client.deleteBucketIfEmpty(bucketName).get(10, TimeUnit.SECONDS);
} }
Boolean deleteObject() throws Exception { Boolean deleteObject() throws Exception {
String s3Bucket = bucketPrefix + "adrianjbosstest"; String bucketName = bucketPrefix + "adrianjbosstest";
return client.deleteObject(s3Bucket, "3366").get(10, TimeUnit.SECONDS); return client.deleteObject(bucketName, "3366")
.get(10, TimeUnit.SECONDS);
} }
Boolean createBucketIfNotExists() throws Exception { Boolean createBucketIfNotExists() throws Exception {
String s3Bucket = bucketPrefix + "adrianjbosstest"; String bucketName = bucketPrefix + "adrianjbosstest";
return client.createBucketIfNotExists(s3Bucket).get(10, return client.createBucketIfNotExists(bucketName).get(10,
TimeUnit.SECONDS); TimeUnit.SECONDS);
} }
S3Bucket getBucket() throws Exception { S3Bucket getBucket() throws Exception {
String s3Bucket = bucketPrefix + "adrianjbosstest"; String bucketName = bucketPrefix + "adrianjbosstest";
return client.getBucket(s3Bucket).get(10, TimeUnit.SECONDS); return client.getBucket(bucketName).get(10, TimeUnit.SECONDS);
} }
} }

View File

@ -34,6 +34,7 @@ import java.util.concurrent.Future;
import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeUnit;
import java.util.concurrent.TimeoutException; import java.util.concurrent.TimeoutException;
import org.jclouds.aws.s3.commands.options.GetBucketOptions;
import org.jclouds.aws.s3.commands.options.PutBucketOptions; import org.jclouds.aws.s3.commands.options.PutBucketOptions;
import org.jclouds.aws.s3.domain.S3Bucket; import org.jclouds.aws.s3.domain.S3Bucket;
import org.jclouds.aws.s3.domain.S3Object; import org.jclouds.aws.s3.domain.S3Object;
@ -218,4 +219,8 @@ public class StubS3Connection implements S3Connection {
throw new UnsupportedOperationException("todo"); throw new UnsupportedOperationException("todo");
} }
public Future<S3Bucket> getBucket(String name, GetBucketOptions options) {
throw new UnsupportedOperationException("todo");
}
} }

View File

@ -17,7 +17,7 @@
* software distributed under the License is distributed on an * software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the * KIND, either express or implied. See the License for the
* specifSourceic language governing permissions and limitations * specific language governing permissions and limitations
* under the License. * under the License.
* ==================================================================== * ====================================================================
*/ */

View File

@ -23,6 +23,7 @@
*/ */
package org.jclouds.aws.s3.commands.options; package org.jclouds.aws.s3.commands.options;
import static com.google.common.base.Preconditions.checkNotNull;
import static org.jclouds.aws.s3.commands.options.GetBucketOptions.Builder.delimiter; import static org.jclouds.aws.s3.commands.options.GetBucketOptions.Builder.delimiter;
import static org.jclouds.aws.s3.commands.options.GetBucketOptions.Builder.marker; import static org.jclouds.aws.s3.commands.options.GetBucketOptions.Builder.marker;
import static org.jclouds.aws.s3.commands.options.GetBucketOptions.Builder.maxKeys; import static org.jclouds.aws.s3.commands.options.GetBucketOptions.Builder.maxKeys;
@ -30,6 +31,8 @@ import static org.jclouds.aws.s3.commands.options.GetBucketOptions.Builder.prefi
import static org.testng.Assert.assertEquals; import static org.testng.Assert.assertEquals;
import static org.testng.Assert.assertNull; import static org.testng.Assert.assertNull;
import java.io.UnsupportedEncodingException;
import org.testng.annotations.Test; import org.testng.annotations.Test;
/** /**
@ -40,7 +43,7 @@ import org.testng.annotations.Test;
public class GetBucketOptionsTest { public class GetBucketOptionsTest {
@Test @Test
public void testPrefix() { public void testPrefix() throws UnsupportedEncodingException {
GetBucketOptions options = new GetBucketOptions(); GetBucketOptions options = new GetBucketOptions();
options.prefix("test"); options.prefix("test");
assertEquals(options.getPrefix(), "test"); assertEquals(options.getPrefix(), "test");
@ -53,22 +56,47 @@ public class GetBucketOptionsTest {
} }
@Test @Test
public void testOneOptionQueryString() { public void testOneOptionQueryString() throws UnsupportedEncodingException {
GetBucketOptions options = new GetBucketOptions(); GetBucketOptions options = new GetBucketOptions();
options.prefix("test"); options.prefix("test");
assertEquals(options.toQueryString(), "?prefix=test"); assertEquals(options.toQueryString(), "?prefix=test");
} }
@Test @Test
public void testTwoOptionQueryString() { public void testTwoOptionQueryString() throws UnsupportedEncodingException {
GetBucketOptions options = new GetBucketOptions(); GetBucketOptions options = new GetBucketOptions();
options.prefix("test").maxKeys(1); options.prefix("test").maxKeys(1);
try { String query = options.toQueryString();
assertEquals(options.toQueryString(), "?prefix=test&max-keys=1"); checkQuery(query);
} catch (AssertionError e) { checkQuery(checkNotNull(query));
assertEquals(options.toQueryString(), "?max-keys=1&prefix=test");
} }
private void checkQuery(String query) {
try {
assertEquals(query, "?prefix=test&max-keys=1");
} catch (AssertionError e) {
assertEquals(query, "?max-keys=1&prefix=test");
}
}
@Test
public void testPrefixAndDelimiterUrlEncodingQueryString()
throws UnsupportedEncodingException {
GetBucketOptions options = new GetBucketOptions();
options.prefix("/test").delimiter("/");
String query = options.toQueryString();
checkEncodedQuery(query);
checkEncodedQuery(checkNotNull(query));
}
private void checkEncodedQuery(String query) {
try {
assertEquals(query, "?prefix=%2Ftest&delimiter=%2F");
} catch (AssertionError e) {
assertEquals(query, "?delimiter=%2F&prefix=%2Ftest");
}
} }
@Test @Test
@ -78,18 +106,18 @@ public class GetBucketOptionsTest {
} }
@Test @Test
public void testPrefixStatic() { public void testPrefixStatic() throws UnsupportedEncodingException {
GetBucketOptions options = prefix("test"); GetBucketOptions options = prefix("test");
assertEquals(options.getPrefix(), "test"); assertEquals(options.getPrefix(), "test");
} }
@Test(expectedExceptions = NullPointerException.class) @Test(expectedExceptions = NullPointerException.class)
public void testPrefixNPE() { public void testPrefixNPE() throws UnsupportedEncodingException {
prefix(null); prefix(null);
} }
@Test @Test
public void testMarker() { public void testMarker() throws UnsupportedEncodingException {
GetBucketOptions options = new GetBucketOptions(); GetBucketOptions options = new GetBucketOptions();
options.marker("test"); options.marker("test");
assertEquals(options.getMarker(), "test"); assertEquals(options.getMarker(), "test");
@ -102,13 +130,13 @@ public class GetBucketOptionsTest {
} }
@Test @Test
public void testMarkerStatic() { public void testMarkerStatic() throws UnsupportedEncodingException {
GetBucketOptions options = marker("test"); GetBucketOptions options = marker("test");
assertEquals(options.getMarker(), "test"); assertEquals(options.getMarker(), "test");
} }
@Test(expectedExceptions = NullPointerException.class) @Test(expectedExceptions = NullPointerException.class)
public void testMarkerNPE() { public void testMarkerNPE() throws UnsupportedEncodingException {
marker(null); marker(null);
} }
@ -137,7 +165,7 @@ public class GetBucketOptionsTest {
} }
@Test @Test
public void testDelimiter() { public void testDelimiter() throws UnsupportedEncodingException {
GetBucketOptions options = new GetBucketOptions(); GetBucketOptions options = new GetBucketOptions();
options.delimiter("test"); options.delimiter("test");
assertEquals(options.getDelimiter(), "test"); assertEquals(options.getDelimiter(), "test");
@ -150,13 +178,13 @@ public class GetBucketOptionsTest {
} }
@Test @Test
public void testDelimiterStatic() { public void testDelimiterStatic() throws UnsupportedEncodingException {
GetBucketOptions options = delimiter("test"); GetBucketOptions options = delimiter("test");
assertEquals(options.getDelimiter(), "test"); assertEquals(options.getDelimiter(), "test");
} }
@Test(expectedExceptions = NullPointerException.class) @Test(expectedExceptions = NullPointerException.class)
public void testDelimiterNPE() { public void testDelimiterNPE() throws UnsupportedEncodingException {
delimiter(null); delimiter(null);
} }
} }

View File

@ -0,0 +1,55 @@
/**
*
* Copyright (C) 2009 Adrian Cole <adrian@jclouds.org>
*
* ====================================================================
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
* ====================================================================
*/
package org.jclouds.aws.s3.xml;
import org.jclouds.aws.s3.xml.config.S3ParserModule;
import org.testng.annotations.AfterMethod;
import org.testng.annotations.BeforeMethod;
import com.google.inject.Guice;
import com.google.inject.Injector;
public class BaseHandlerTest {
protected S3ParserFactory parserFactory = null;
private Injector injector;
public BaseHandlerTest() {
super();
}
@BeforeMethod
protected void setUpInjector() {
injector = Guice.createInjector(new S3ParserModule());
parserFactory = injector.getInstance(S3ParserFactory.class);
assert parserFactory != null;
}
@AfterMethod
protected void tearDownInjector() {
parserFactory = null;
injector = null;
}
}

View File

@ -27,34 +27,13 @@ import static org.testng.Assert.*;
import org.apache.commons.io.IOUtils; import org.apache.commons.io.IOUtils;
import org.jclouds.aws.s3.domain.S3Error; import org.jclouds.aws.s3.domain.S3Error;
import org.jclouds.aws.s3.xml.config.S3ParserModule;
import org.jclouds.http.HttpException; import org.jclouds.http.HttpException;
import org.jclouds.http.commands.callables.xml.ParseSax; import org.jclouds.http.commands.callables.xml.ParseSax;
import org.testng.annotations.AfterMethod;
import org.testng.annotations.BeforeMethod;
import org.testng.annotations.Test; import org.testng.annotations.Test;
import com.google.inject.Guice;
import com.google.inject.Injector;
@Test @Test
public class ErrorHandlerTest { public class ErrorHandlerTest extends BaseHandlerTest {
private S3ParserFactory parserFactory = null;
private Injector injector;
@BeforeMethod
protected void setUpInjector() {
injector = Guice.createInjector(new S3ParserModule());
parserFactory = injector.getInstance(S3ParserFactory.class);
assert parserFactory != null;
}
@AfterMethod
protected void tearDownInjector() {
parserFactory = null;
injector = null;
}
public static final String errorFromAmazonIfYouDontRemoveTransferEncodingHeader = "<Error><Code>NotImplemented</Code><Message>A header you provided implies functionality that is not implemented</Message><Header>Transfer-Encoding</Header><RequestId>7C59925D75D15561</RequestId><HostId>fbskVU51OZJg2yZS/wNIxoE2PmCf0ZqFd0iH6Vrzw0uKG3KmokswBytL/Bfp/GWb</HostId></Error>"; public static final String errorFromAmazonIfYouDontRemoveTransferEncodingHeader = "<Error><Code>NotImplemented</Code><Message>A header you provided implies functionality that is not implemented</Message><Header>Transfer-Encoding</Header><RequestId>7C59925D75D15561</RequestId><HostId>fbskVU51OZJg2yZS/wNIxoE2PmCf0ZqFd0iH6Vrzw0uKG3KmokswBytL/Bfp/GWb</HostId></Error>";
@Test @Test

View File

@ -0,0 +1,69 @@
/**
*
* Copyright (C) 2009 Adrian Cole <adrian@jclouds.org>
*
* ====================================================================
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
* ====================================================================
*/
package org.jclouds.aws.s3.xml;
import static org.testng.Assert.assertEquals;
import org.apache.commons.io.IOUtils;
import org.jclouds.aws.s3.domain.S3Bucket;
import org.jclouds.http.HttpException;
import org.jclouds.http.commands.callables.xml.ParseSax;
import org.testng.annotations.BeforeMethod;
import org.testng.annotations.Test;
@Test
public class ListBucketHandlerTest extends BaseHandlerTest {
public static final String listBucketWithPrefixAppsSlash = "<ListBucketResult xmlns=\"http://s3.amazonaws.com/doc/2006-03-01/\"><Name>adriancole.org.jclouds.aws.s3.amazons3testdelimiter</Name><Prefix>apps/</Prefix><Marker></Marker><MaxKeys>1000</MaxKeys><IsTruncated>false</IsTruncated><Contents><Key>apps/0</Key><LastModified>2009-05-07T18:27:08.000Z</LastModified><ETag>&quot;c82e6a0025c31c5de5947fda62ac51ab&quot;</ETag><Size>8</Size><Owner><ID>e1a5f66a480ca99a4fdfe8e318c3020446c9989d7004e7778029fbcc5d990fa0</ID><DisplayName>ferncam</DisplayName></Owner><StorageClass>STANDARD</StorageClass></Contents><Contents><Key>apps/1</Key><LastModified>2009-05-07T18:27:09.000Z</LastModified><ETag>&quot;944fab2c5a9a6bacf07db5e688310d7a&quot;</ETag><Size>8</Size><Owner><ID>e1a5f66a480ca99a4fdfe8e318c3020446c9989d7004e7778029fbcc5d990fa0</ID><DisplayName>ferncam</DisplayName></Owner><StorageClass>STANDARD</StorageClass></Contents><Contents><Key>apps/2</Key><LastModified>2009-05-07T18:27:09.000Z</LastModified><ETag>&quot;a227b8888045c8fd159fb495214000f0&quot;</ETag><Size>8</Size><Owner><ID>e1a5f66a480ca99a4fdfe8e318c3020446c9989d7004e7778029fbcc5d990fa0</ID><DisplayName>ferncam</DisplayName></Owner><StorageClass>STANDARD</StorageClass></Contents><Contents><Key>apps/3</Key><LastModified>2009-05-07T18:27:09.000Z</LastModified><ETag>&quot;c9caa76c3dec53e2a192608ce73eef03&quot;</ETag><Size>8</Size><Owner><ID>e1a5f66a480ca99a4fdfe8e318c3020446c9989d7004e7778029fbcc5d990fa0</ID><DisplayName>ferncam</DisplayName></Owner><StorageClass>STANDARD</StorageClass></Contents><Contents><Key>apps/4</Key><LastModified>2009-05-07T18:27:09.000Z</LastModified><ETag>&quot;1ce5d0dcc6154a647ea90c7bdf82a224&quot;</ETag><Size>8</Size><Owner><ID>e1a5f66a480ca99a4fdfe8e318c3020446c9989d7004e7778029fbcc5d990fa0</ID><DisplayName>ferncam</DisplayName></Owner><StorageClass>STANDARD</StorageClass></Contents><Contents><Key>apps/5</Key><LastModified>2009-05-07T18:27:09.000Z</LastModified><ETag>&quot;79433524d87462ee05708a8ef894ed55&quot;</ETag><Size>8</Size><Owner><ID>e1a5f66a480ca99a4fdfe8e318c3020446c9989d7004e7778029fbcc5d990fa0</ID><DisplayName>ferncam</DisplayName></Owner><StorageClass>STANDARD</StorageClass></Contents><Contents><Key>apps/6</Key><LastModified>2009-05-07T18:27:10.000Z</LastModified><ETag>&quot;dd00a060b28ddca8bc5a21a49e306f67&quot;</ETag><Size>8</Size><Owner><ID>e1a5f66a480ca99a4fdfe8e318c3020446c9989d7004e7778029fbcc5d990fa0</ID><DisplayName>ferncam</DisplayName></Owner><StorageClass>STANDARD</StorageClass></Contents><Contents><Key>apps/7</Key><LastModified>2009-05-07T18:27:10.000Z</LastModified><ETag>&quot;8cd06eca6e819a927b07a285d750b100&quot;</ETag><Size>8</Size><Owner><ID>e1a5f66a480ca99a4fdfe8e318c3020446c9989d7004e7778029fbcc5d990fa0</ID><DisplayName>ferncam</DisplayName></Owner><StorageClass>STANDARD</StorageClass></Contents><Contents><Key>apps/8</Key><LastModified>2009-05-07T18:27:10.000Z</LastModified><ETag>&quot;174495094d0633b92cbe46603eee6bad&quot;</ETag><Size>8</Size><Owner><ID>e1a5f66a480ca99a4fdfe8e318c3020446c9989d7004e7778029fbcc5d990fa0</ID><DisplayName>ferncam</DisplayName></Owner><StorageClass>STANDARD</StorageClass></Contents><Contents><Key>apps/9</Key><LastModified>2009-05-07T18:27:10.000Z</LastModified><ETag>&quot;cd8a19b26fea8a827276df0ad11c580d&quot;</ETag><Size>8</Size><Owner><ID>e1a5f66a480ca99a4fdfe8e318c3020446c9989d7004e7778029fbcc5d990fa0</ID><DisplayName>ferncam</DisplayName></Owner><StorageClass>STANDARD</StorageClass></Contents></ListBucketResult>";
public static final String listBucketWithSlashDelimiterAndCommonPrefixApps = "<ListBucketResult xmlns=\"http://s3.amazonaws.com/doc/2006-03-01/\"> <Delimiter>/</Delimiter> <CommonPrefixes><Prefix>apps/</Prefix></CommonPrefixes></ListBucketResult>";
ParseSax<S3Bucket> parser;
@BeforeMethod
void setUpParser() {
parser = parserFactory.createListBucketParser();
((ListBucketHandler) parser.getHandler()).setBucketName("test");
}
@Test
public void testListMyBucketsWithDelimiterSlashAndCommonPrefixesAppsSlash()
throws HttpException {
S3Bucket bucket = parser.parse(IOUtils
.toInputStream(listBucketWithSlashDelimiterAndCommonPrefixApps));
assertEquals(bucket.getCommonPrefixes().iterator().next(), "apps/");
assertEquals(bucket.getDelimiter(), "/");
assert bucket.getMarker() == null;
}
@Test
public void testListMyBucketsWithPrefixAppsSlash() throws HttpException {
S3Bucket bucket = parser.parse(IOUtils
.toInputStream(listBucketWithPrefixAppsSlash));
assertEquals(bucket.getPrefix(), "apps/");
assertEquals(bucket.getMaxKeys(), 1000);
assert bucket.getMarker() == null;
}
}