Skip to content

Commit 39004a1

Browse files
committed
---
yaml --- r: 189 b: refs/heads/master c: fcf4cff h: refs/heads/master i: 187: 11c6f4a v: v3
1 parent d0e50e1 commit 39004a1

6 files changed

Lines changed: 88 additions & 23 deletions

File tree

[refs]

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,2 @@
11
---
2-
refs/heads/master: 9edcd316d3fc0dac4cc2e10501eeb558d726e767
2+
refs/heads/master: fcf4cff736d3bb81096e4fe92830e7ccdf647775

trunk/src/main/java/com/google/gcloud/examples/StorageExample.java

Lines changed: 72 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -16,13 +16,11 @@
1616

1717
package com.google.gcloud.examples;
1818

19-
import com.google.gcloud.storage.Blob;
20-
import com.google.gcloud.storage.Bucket;
21-
import com.google.gcloud.storage.ListOptions;
22-
import com.google.gcloud.storage.StorageService;
23-
import com.google.gcloud.storage.StorageServiceFactory;
24-
import com.google.gcloud.storage.StorageServiceOptions;
19+
import com.google.gcloud.storage.*;
2520

21+
import java.nio.file.Files;
22+
import java.nio.file.Path;
23+
import java.nio.file.Paths;
2624
import java.util.Arrays;
2725
import java.util.HashMap;
2826
import java.util.Iterator;
@@ -38,7 +36,7 @@
3836
* <li>compile using maven - {@code mvn compile}</li>
3937
* <li>run using maven - {@code mvn exec:java
4038
* -Dexec.mainClass="com.google.gcloud.examples.StorageExample"
41-
* -Dexec.args="list [<bucket>]|info [<bucket> [<file>]]|get <bucket> <path>|upload <local_file> <bucket> [<path>]|delete <bucket> <path>"}</li>
39+
* -Dexec.args="project_id list [<bucket>]|info [<bucket> [<file>]]|get <bucket> <path>|upload <local_file> <bucket> [<path>]|delete <bucket> <path>"}</li>
4240
* </ol>
4341
*/
4442
public class StorageExample {
@@ -47,15 +45,39 @@ public class StorageExample {
4745

4846
private static abstract class StorageAction<T> {
4947

50-
abstract void run(StorageService storage, T request);
48+
abstract void run(StorageService storage, T request) throws Exception;
5149

52-
abstract T parse(String... args);
50+
abstract T parse(String... args) throws IllegalArgumentException;
5351

5452
protected String params() {
5553
return "";
5654
}
5755
}
5856

57+
private static class Tuple<X, Y> {
58+
59+
private final X x;
60+
private final Y y;
61+
62+
private Tuple(X x, Y y) {
63+
this.x = x;
64+
this.y = y;
65+
}
66+
67+
static <X, Y> Tuple<X, Y> of(X x, Y y) {
68+
return new Tuple<>(x, y);
69+
}
70+
71+
X first() {
72+
return x;
73+
}
74+
75+
Y second() {
76+
return y;
77+
}
78+
}
79+
80+
5981
private static abstract class BlobAction extends StorageAction<Blob> {
6082

6183
@Override
@@ -142,11 +164,39 @@ public String params() {
142164
}
143165
}
144166

167+
private static class UploadAction extends StorageAction<Tuple<Path, Blob>> {
168+
@Override
169+
public void run(StorageService storage, Tuple<Path, Blob> tuple) throws Exception {
170+
if (Files.size(tuple.first()) > 1_000_000) {
171+
// todo upload via streaming API
172+
throw new IllegalArgumentException("file is too big");
173+
} else {
174+
byte[] bytes = Files.readAllBytes(tuple.first());
175+
System.out.println(storage.create(tuple.second(), bytes));
176+
}
177+
}
178+
179+
@Override
180+
Tuple<Path, Blob> parse(String... args) {
181+
if (args.length < 2 || args.length > 3) {
182+
throw new IllegalArgumentException();
183+
}
184+
Path path = Paths.get(args[0]);
185+
String blob = args.length < 3 ? path.getFileName().toString() : args[2];
186+
return Tuple.of(path, Blob.of(args[1], blob));
187+
}
188+
189+
@Override
190+
public String params() {
191+
return "<local_file> <bucket> [<path>]";
192+
}
193+
}
194+
145195
static {
146196
ACTIONS.put("info", new InfoAction());
147197
ACTIONS.put("delete", new DeleteAction());
148198
ACTIONS.put("list", new ListAction());
149-
//ACTIONS.put("upload", new UploadAction());
199+
ACTIONS.put("upload", new UploadAction());
150200
// todo: implement get
151201
}
152202

@@ -165,26 +215,29 @@ public static void printUsage() {
165215
System.out.printf("Usage: %s [%s]%n",
166216
StorageExample.class.getSimpleName(), actionAndParams);
167217
}
168-
public static void main(String... args) {
169-
if (args.length == 0) {
170-
System.out.println("Missing required action");
218+
219+
@SuppressWarnings("unchecked")
220+
public static void main(String... args) throws Exception {
221+
if (args.length < 2) {
222+
System.out.println("Missing required project id and action");
171223
printUsage();
172224
return;
173225
}
174-
StorageAction action = ACTIONS.get(args[0]);
226+
String projectId = args[0];
227+
StorageAction action = ACTIONS.get(args[1]);
175228
if (action == null) {
176-
System.out.println("Unrecognized action '" + args[0] + "'");
229+
System.out.println("Unrecognized action '" + args[1] + "'");
177230
printUsage();
178231
return;
179232
}
180-
StorageService storage =
181-
StorageServiceFactory.instance().get(StorageServiceOptions.builder().build());
182-
args = args.length > 1 ? Arrays.copyOfRange(args, 1, args.length): new String []{};
233+
StorageServiceOptions options = StorageServiceOptions.builder().project(args[0]).build();
234+
StorageService storage = StorageServiceFactory.instance().get(options);
235+
args = args.length > 2 ? Arrays.copyOfRange(args, 2, args.length): new String []{};
183236
Object request;
184237
try {
185238
request = action.parse(args);
186239
} catch (Exception ex) {
187-
System.out.println("Invalid input for action '" + args[0] + "'");
240+
System.out.println("Invalid input for action '" + args[1] + "'");
188241
System.out.println("Expected: " + action.params());
189242
return;
190243
}

trunk/src/main/java/com/google/gcloud/spi/DefaultStorageRpc.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
/* * Copyright 2015 Google Inc. All Rights Reserved. * * Licensed 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 com.google.gcloud.spi;import com.google.api.client.http.AbstractInputStreamContent;import com.google.api.client.http.HttpRequestInitializer;import com.google.api.client.http.HttpTransport;import com.google.api.client.json.jackson.JacksonFactory;import com.google.api.services.storage.Storage;import com.google.api.services.storage.model.Bucket;import com.google.api.services.storage.model.StorageObject;import com.google.gcloud.storage.BlobReadChannel;import com.google.gcloud.storage.BlobWriteChannel;import com.google.gcloud.storage.Option;import com.google.gcloud.storage.StorageServiceException;import com.google.gcloud.storage.StorageServiceOptions;import java.io.ByteArrayInputStream;import java.io.IOException;import java.io.InputStream;import java.util.Iterator;import java.util.List;public class DefaultStorageRpc implements StorageRpc { private final StorageServiceOptions options; private final Storage storage; public DefaultStorageRpc(StorageServiceOptions options) { HttpTransport transport = options.httpTransport(); HttpRequestInitializer initializer = transport.createRequestFactory().getInitializer(); this.options = options; storage = new Storage.Builder(transport, new JacksonFactory(), initializer).build(); // Todo: set projection to full // Todo: make sure nulls are being used as Data.asNull() // TOdo: consider options } private StorageServiceException translate(IOException exception) { StorageServiceException translated = new StorageServiceException(0, exception.getMessage(), false); translated.initCause(exception); return translated; } @Override public Bucket create(Bucket bucket, Option... options) throws StorageServiceException { try { return storage.buckets().insert(this.options.project(), bucket).execute(); } catch (IOException ex) { throw translate(ex); } } @Override public StorageObject create(StorageObject storageObject, final byte[] content, Option... options) throws StorageServiceException { try { return storage.objects().insert(storageObject.getBucket(), storageObject, new AbstractInputStreamContent(storageObject.getContentType()) { @Override public InputStream getInputStream() throws IOException { return new ByteArrayInputStream(content); } @Override public long getLength() throws IOException { return content.length; } @Override public boolean retrySupported() { return true; } }).execute(); } catch (IOException ex) { throw translate(ex); } } @Override public Iterator<Bucket> list() { try { return storage.buckets().list(options.project()).execute().getItems().iterator(); } catch (IOException ex) { throw translate(ex); } } @Override public Iterator<StorageObject> list(String bucket, String prefix, String delimiter, String cursor, boolean includeOlderVersions, int limit) { // todo: implement return null; } @Override public Bucket get(Bucket bucket, Option... options) { try { return storage.buckets().get(bucket.getName()).execute(); } catch (IOException ex) { throw translate(ex); } } @Override public StorageObject get(StorageObject object, Option... options) { try { return storage.objects().get(object.getBucket(), object.getName()).execute(); } catch (IOException ex) { throw translate(ex); } } @Override public Bucket patch(Bucket bucket, Option... options) { try { return storage.buckets().patch(bucket.getName(), bucket).execute(); } catch (IOException ex) { throw translate(ex); } } @Override public StorageObject patch(StorageObject storageObject, Option... options) { try { return storage.objects() .patch(storageObject.getBucket(), storageObject.getName(), storageObject).execute(); } catch (IOException ex) { throw translate(ex); } } @Override public void delete(Bucket bucket, Option... options) { try { storage.buckets().delete(bucket.getName()).execute(); } catch (IOException ex) { throw translate(ex); } } @Override public void delete(StorageObject blob, Option... options) { try { storage.objects().delete(blob.getBucket(), blob.getName()).execute(); } catch (IOException ex) { throw translate(ex); } } @Override public StorageObject compose(Iterable<StorageObject> src, StorageObject destination, List<? extends Option> destinationOptions) throws StorageServiceException { // todo: implement null -> ComposeRequest try { return storage.objects().compose(destination.getBucket(), destination.getName(), null).execute(); } catch (IOException ex) { throw translate(ex); } } @Override public StorageObject copy(StorageObject from, List<? extends Option> blobSourceOptions, StorageObject to, List<? extends Option> blobTargetOptions) throws StorageServiceException { try { return storage.objects() .copy(from.getBucket(), from.getName(), to.getBucket(), to.getName(), to).execute(); } catch (IOException ex) { throw translate(ex); } } @Override public BlobReadChannel reader(StorageObject from, Option... options) throws StorageServiceException { // todo: implement return null; } @Override public BlobWriteChannel writer(StorageObject to, Option... options) throws StorageServiceException { // todo: implement return null; }}
1+
/* * Copyright 2015 Google Inc. All Rights Reserved. * * Licensed 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 com.google.gcloud.spi;import com.google.api.client.googleapis.json.GoogleJsonError;import com.google.api.client.googleapis.json.GoogleJsonResponseException;import com.google.api.client.http.AbstractInputStreamContent;import com.google.api.client.http.HttpRequestInitializer;import com.google.api.client.http.HttpTransport;import com.google.api.client.json.jackson.JacksonFactory;import com.google.api.services.storage.Storage;import com.google.api.services.storage.model.Bucket;import com.google.api.services.storage.model.StorageObject;import com.google.gcloud.storage.*;import java.io.ByteArrayInputStream;import java.io.IOException;import java.io.InputStream;import java.util.Iterator;import java.util.List;public class DefaultStorageRpc implements StorageRpc { private final StorageServiceOptions options; private final Storage storage; public DefaultStorageRpc(StorageServiceOptions options) { HttpTransport transport = options.httpTransport(); HttpRequestInitializer initializer = options.httpRequestInitializer(); this.options = options; storage = new Storage.Builder(transport, new JacksonFactory(), initializer).build(); // Todo: set projection to full // Todo: make sure nulls are being used as Data.asNull() // TOdo: consider options } private StorageServiceException translate(IOException exception) { StorageServiceException translated; if (exception instanceof GoogleJsonResponseException) { GoogleJsonError details = ((GoogleJsonResponseException) exception).getDetails(); // todo: based on code consider if error is retryable translated = new StorageServiceException(details.getCode(), details.getMessage(), false); } else { translated = new StorageServiceException(0, exception.getMessage(), false); } translated.initCause(exception); return translated; } @Override public Bucket create(Bucket bucket, Option... options) throws StorageServiceException { try { return storage.buckets().insert(this.options.project(), bucket).execute(); } catch (IOException ex) { throw translate(ex); } } @Override public StorageObject create(StorageObject storageObject, final byte[] content, Option... options) throws StorageServiceException { try { return storage.objects().insert(storageObject.getBucket(), storageObject, new AbstractInputStreamContent(storageObject.getContentType()) { @Override public InputStream getInputStream() throws IOException { return new ByteArrayInputStream(content); } @Override public long getLength() throws IOException { return content.length; } @Override public boolean retrySupported() { return true; } }).execute(); } catch (IOException ex) { throw translate(ex); } } @Override public Iterator<Bucket> list() { try { return storage.buckets().list(options.project()).execute().getItems().iterator(); } catch (IOException ex) { throw translate(ex); } } @Override public Iterator<StorageObject> list(String bucket, String prefix, String delimiter, String cursor, boolean includeOlderVersions, int limit) { // todo: implement return null; } @Override public Bucket get(Bucket bucket, Option... options) { try { return storage.buckets().get(bucket.getName()).execute(); } catch (IOException ex) { throw translate(ex); } } @Override public StorageObject get(StorageObject object, Option... options) { try { return storage.objects().get(object.getBucket(), object.getName()).execute(); } catch (IOException ex) { throw translate(ex); } } @Override public Bucket patch(Bucket bucket, Option... options) { try { return storage.buckets().patch(bucket.getName(), bucket).execute(); } catch (IOException ex) { throw translate(ex); } } @Override public StorageObject patch(StorageObject storageObject, Option... options) { try { return storage.objects() .patch(storageObject.getBucket(), storageObject.getName(), storageObject).execute(); } catch (IOException ex) { throw translate(ex); } } @Override public void delete(Bucket bucket, Option... options) { try { storage.buckets().delete(bucket.getName()).execute(); } catch (IOException ex) { throw translate(ex); } } @Override public void delete(StorageObject blob, Option... options) { try { storage.objects().delete(blob.getBucket(), blob.getName()).execute(); } catch (IOException ex) { throw translate(ex); } } @Override public StorageObject compose(Iterable<StorageObject> src, StorageObject destination, List<? extends Option> destinationOptions) throws StorageServiceException { // todo: implement null -> ComposeRequest try { return storage.objects().compose(destination.getBucket(), destination.getName(), null).execute(); } catch (IOException ex) { throw translate(ex); } } @Override public StorageObject copy(StorageObject from, List<? extends Option> blobSourceOptions, StorageObject to, List<? extends Option> blobTargetOptions) throws StorageServiceException { try { return storage.objects() .copy(from.getBucket(), from.getName(), to.getBucket(), to.getName(), to).execute(); } catch (IOException ex) { throw translate(ex); } } @Override public BlobReadChannel reader(StorageObject from, Option... options) throws StorageServiceException { // todo: implement return null; } @Override public BlobWriteChannel writer(StorageObject to, Option... options) throws StorageServiceException { // todo: implement return null; }}

trunk/src/main/java/com/google/gcloud/storage/Acl.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -84,8 +84,8 @@ static Entity fromPb(String entity) {
8484
return new Group(entity.substring(6));
8585
}
8686
if (entity.startsWith("project-")) {
87-
int idx = entity.indexOf('-', 9);
88-
String team = entity.substring(9, idx);
87+
int idx = entity.indexOf('-', 8);
88+
String team = entity.substring(8, idx);
8989
String projectId = entity.substring(idx + 1);
9090
return new Project(Project.ProjectRole.valueOf(team.toUpperCase()), projectId);
9191
}

trunk/src/main/java/com/google/gcloud/storage/Blob.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323
import com.google.api.services.storage.model.StorageObject;
2424
import com.google.api.services.storage.model.StorageObject.Owner;
2525
import com.google.common.base.Function;
26+
import com.google.common.base.MoreObjects;
2627
import com.google.common.collect.ImmutableList;
2728
import com.google.common.collect.ImmutableMap;
2829
import com.google.common.collect.Lists;
@@ -356,6 +357,11 @@ public Builder toBuilder() {
356357
.selfLink(selfLink);
357358
}
358359

360+
@Override
361+
public String toString() {
362+
return MoreObjects.toStringHelper(this).add("bucket", bucket).add("name", name).toString();
363+
}
364+
359365
public static Blob of(String bucket, String name) {
360366
return builder(bucket, name).build();
361367
}

trunk/src/main/java/com/google/gcloud/storage/Bucket.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@
2828
import com.google.api.services.storage.model.BucketAccessControl;
2929
import com.google.api.services.storage.model.ObjectAccessControl;
3030
import com.google.common.base.Function;
31+
import com.google.common.base.MoreObjects;
3132
import com.google.common.collect.ImmutableList;
3233
import com.google.common.collect.ImmutableMap;
3334
import com.google.gcloud.storage.Acl.Entity;
@@ -536,6 +537,11 @@ public Builder toBuilder() {
536537
.deleteRules(deleteRules);
537538
}
538539

540+
@Override
541+
public String toString() {
542+
return MoreObjects.toStringHelper(this).add("name", name).toString();
543+
}
544+
539545
public static Bucket of(String name) {
540546
return builder(name).build();
541547
}

0 commit comments

Comments
 (0)