Skip to content

Commit cdec697

Browse files
committed
Merge pull request #614 from ajkannan/storage-merge-objects
Make storage functional objects subclasses of metadata objects.
2 parents 8ba9230 + 288c993 commit cdec697

21 files changed

Lines changed: 1536 additions & 1125 deletions

File tree

README.md

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -250,6 +250,7 @@ Here is a code snippet showing a simple usage example from within Compute/App En
250250
import static java.nio.charset.StandardCharsets.UTF_8;
251251
252252
import com.google.gcloud.storage.Blob;
253+
import com.google.gcloud.storage.BlobInfo;
253254
import com.google.gcloud.storage.BlobId;
254255
import com.google.gcloud.storage.Storage;
255256
import com.google.gcloud.storage.StorageOptions;
@@ -259,7 +260,7 @@ import java.nio.channels.WritableByteChannel;
259260
260261
Storage storage = StorageOptions.defaultInstance().service();
261262
BlobId blobId = BlobId.of("bucket", "blob_name");
262-
Blob blob = Blob.get(storage, blobId);
263+
Blob blob = storage.get(blobId);
263264
if (blob == null) {
264265
BlobInfo blobInfo = BlobInfo.builder(blobId).contentType("text/plain").build();
265266
storage.create(blobInfo, "Hello, Cloud Storage!".getBytes(UTF_8));

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

Lines changed: 20 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,6 @@
2525
import com.google.gcloud.storage.BlobId;
2626
import com.google.gcloud.storage.BlobInfo;
2727
import com.google.gcloud.storage.Bucket;
28-
import com.google.gcloud.storage.BucketInfo;
2928
import com.google.gcloud.storage.CopyWriter;
3029
import com.google.gcloud.storage.Storage;
3130
import com.google.gcloud.storage.Storage.ComposeRequest;
@@ -133,27 +132,27 @@ public void run(Storage storage, BlobId... blobIds) {
133132
if (blobIds.length == 1) {
134133
if (blobIds[0].name().isEmpty()) {
135134
// get Bucket
136-
Bucket bucket = Bucket.get(storage, blobIds[0].bucket());
135+
Bucket bucket = storage.get(blobIds[0].bucket());
137136
if (bucket == null) {
138137
System.out.println("No such bucket");
139138
return;
140139
}
141-
System.out.println("Bucket info: " + bucket.info());
140+
System.out.println("Bucket info: " + bucket);
142141
} else {
143142
// get Blob
144-
Blob blob = Blob.get(storage, blobIds[0]);
143+
Blob blob = storage.get(blobIds[0]);
145144
if (blob == null) {
146145
System.out.println("No such object");
147146
return;
148147
}
149-
System.out.println("Blob info: " + blob.info());
148+
System.out.println("Blob info: " + blob);
150149
}
151150
} else {
152151
// use batch to get multiple blobs.
153-
List<Blob> blobs = Blob.get(storage, Arrays.asList(blobIds));
152+
List<Blob> blobs = storage.get(blobIds);
154153
for (Blob blob : blobs) {
155154
if (blob != null) {
156-
System.out.println(blob.info());
155+
System.out.println(blob);
157156
}
158157
}
159158
}
@@ -184,7 +183,7 @@ private static class DeleteAction extends BlobsAction {
184183
@Override
185184
public void run(Storage storage, BlobId... blobIds) {
186185
// use batch operation
187-
List<Boolean> deleteResults = Blob.delete(storage, blobIds);
186+
List<Boolean> deleteResults = storage.delete(blobIds);
188187
int index = 0;
189188
for (Boolean deleted : deleteResults) {
190189
if (deleted) {
@@ -218,20 +217,20 @@ String parse(String... args) {
218217
public void run(Storage storage, String bucketName) {
219218
if (bucketName == null) {
220219
// list buckets
221-
Iterator<BucketInfo> bucketInfoIterator = storage.list().iterateAll();
222-
while (bucketInfoIterator.hasNext()) {
223-
System.out.println(bucketInfoIterator.next());
220+
Iterator<Bucket> bucketIterator = storage.list().iterateAll();
221+
while (bucketIterator.hasNext()) {
222+
System.out.println(bucketIterator.next());
224223
}
225224
} else {
226225
// list a bucket's blobs
227-
Bucket bucket = Bucket.get(storage, bucketName);
226+
Bucket bucket = storage.get(bucketName);
228227
if (bucket == null) {
229228
System.out.println("No such bucket");
230229
return;
231230
}
232231
Iterator<Blob> blobIterator = bucket.list().iterateAll();
233232
while (blobIterator.hasNext()) {
234-
System.out.println(blobIterator.next().info());
233+
System.out.println(blobIterator.next());
235234
}
236235
}
237236
}
@@ -257,8 +256,7 @@ private void run(Storage storage, Path uploadFrom, BlobInfo blobInfo) throws IOE
257256
if (Files.size(uploadFrom) > 1_000_000) {
258257
// When content is not available or large (1MB or more) it is recommended
259258
// to write it in chunks via the blob's channel writer.
260-
Blob blob = new Blob(storage, blobInfo);
261-
try (WriteChannel writer = blob.writer()) {
259+
try (WriteChannel writer = storage.writer(blobInfo)) {
262260
byte[] buffer = new byte[1024];
263261
try (InputStream input = Files.newInputStream(uploadFrom)) {
264262
int limit;
@@ -311,7 +309,7 @@ public void run(Storage storage, Tuple<BlobId, Path> tuple) throws IOException {
311309
}
312310

313311
private void run(Storage storage, BlobId blobId, Path downloadTo) throws IOException {
314-
Blob blob = Blob.get(storage, blobId);
312+
Blob blob = storage.get(blobId);
315313
if (blob == null) {
316314
System.out.println("No such object");
317315
return;
@@ -320,7 +318,7 @@ private void run(Storage storage, BlobId blobId, Path downloadTo) throws IOExcep
320318
if (downloadTo != null) {
321319
writeTo = new PrintStream(new FileOutputStream(downloadTo.toFile()));
322320
}
323-
if (blob.info().size() < 1_000_000) {
321+
if (blob.size() < 1_000_000) {
324322
// Blob is small read all its content in one request
325323
byte[] content = blob.content();
326324
writeTo.write(content);
@@ -438,13 +436,13 @@ public void run(Storage storage, Tuple<BlobId, Map<String, String>> tuple)
438436
}
439437

440438
private void run(Storage storage, BlobId blobId, Map<String, String> metadata) {
441-
Blob blob = Blob.get(storage, blobId);
439+
Blob blob = storage.get(blobId);
442440
if (blob == null) {
443441
System.out.println("No such object");
444442
return;
445443
}
446-
Blob updateBlob = blob.update(blob.info().toBuilder().metadata(metadata).build());
447-
System.out.println("Updated " + updateBlob.info());
444+
Blob updateBlob = blob.toBuilder().metadata(metadata).build().update();
445+
System.out.println("Updated " + updateBlob);
448446
}
449447

450448
@Override
@@ -488,9 +486,8 @@ public void run(Storage storage, Tuple<ServiceAccountAuthCredentials, BlobInfo>
488486
run(storage, tuple.x(), tuple.y());
489487
}
490488

491-
private void run(Storage storage, ServiceAccountAuthCredentials cred, BlobInfo blobInfo)
492-
throws IOException {
493-
Blob blob = new Blob(storage, blobInfo);
489+
private void run(Storage storage, ServiceAccountAuthCredentials cred, BlobInfo blobInfo) {
490+
Blob blob = storage.get(blobInfo.blobId());
494491
System.out.println("Signed URL: "
495492
+ blob.signUrl(1, TimeUnit.DAYS, SignUrlOption.serviceAccount(cred)));
496493
}

gcloud-java-resourcemanager/src/main/java/com/google/gcloud/resourcemanager/Project.java

Lines changed: 6 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -38,14 +38,12 @@ public class Project extends ProjectInfo {
3838
private final ResourceManagerOptions options;
3939
private transient ResourceManager resourceManager;
4040

41+
/**
42+
* Builder for {@code Project}.
43+
*/
4144
public static class Builder extends ProjectInfo.Builder {
4245
private final ResourceManager resourceManager;
43-
private ProjectInfo.BuilderImpl infoBuilder;
44-
45-
Builder(ResourceManager resourceManager) {
46-
this.resourceManager = resourceManager;
47-
this.infoBuilder = new ProjectInfo.BuilderImpl();
48-
}
46+
private final ProjectInfo.BuilderImpl infoBuilder;
4947

5048
Builder(Project project) {
5149
this.resourceManager = project.resourceManager;
@@ -124,16 +122,6 @@ public Project build() {
124122
this.options = resourceManager.options();
125123
}
126124

127-
/**
128-
* Constructs a Project object that contains project information got from the server.
129-
*
130-
* @return Project object containing the project's metadata or {@code null} if not found
131-
* @throws ResourceManagerException upon failure
132-
*/
133-
public static Project get(ResourceManager resourceManager, String projectId) {
134-
return resourceManager.get(projectId);
135-
}
136-
137125
/**
138126
* Returns the {@link ResourceManager} service object associated with this Project.
139127
*/
@@ -142,14 +130,14 @@ public ResourceManager resourceManager() {
142130
}
143131

144132
/**
145-
* Fetches the current project's latest information. Returns {@code null} if the job does not
133+
* Fetches the project's latest information. Returns {@code null} if the project does not
146134
* exist.
147135
*
148136
* @return Project containing the project's updated metadata or {@code null} if not found
149137
* @throws ResourceManagerException upon failure
150138
*/
151139
public Project reload() {
152-
return Project.get(resourceManager, projectId());
140+
return resourceManager.get(projectId());
153141
}
154142

155143
/**
@@ -210,10 +198,6 @@ public Project replace() {
210198
return resourceManager.replace(this);
211199
}
212200

213-
static Builder builder(ResourceManager resourceManager, String projectId) {
214-
return new Builder(resourceManager).projectId(projectId);
215-
}
216-
217201
@Override
218202
public Builder toBuilder() {
219203
return new Builder(this);

gcloud-java-resourcemanager/src/main/java/com/google/gcloud/resourcemanager/ProjectInfo.java

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -115,7 +115,10 @@ static ResourceId fromPb(
115115
}
116116
}
117117

118-
public static abstract class Builder {
118+
/**
119+
* Builder for {@code ProjectInfo}.
120+
*/
121+
public abstract static class Builder {
119122

120123
/**
121124
* Set the user-assigned name of the project.
@@ -184,7 +187,9 @@ static class BuilderImpl extends Builder {
184187
private Long createTimeMillis;
185188
private ResourceId parent;
186189

187-
BuilderImpl() {}
190+
BuilderImpl(String projectId) {
191+
this.projectId = projectId;
192+
}
188193

189194
BuilderImpl(ProjectInfo info) {
190195
this.name = info.name;
@@ -331,7 +336,7 @@ public Long createTimeMillis() {
331336

332337
@Override
333338
public boolean equals(Object obj) {
334-
return obj.getClass().equals(ProjectInfo.class)
339+
return obj != null && obj.getClass().equals(ProjectInfo.class)
335340
&& Objects.equals(toPb(), ((ProjectInfo) obj).toPb());
336341
}
337342

@@ -341,7 +346,7 @@ public int hashCode() {
341346
}
342347

343348
public static Builder builder(String id) {
344-
return new BuilderImpl().projectId(id);
349+
return new BuilderImpl(id);
345350
}
346351

347352
public Builder toBuilder() {

gcloud-java-resourcemanager/src/test/java/com/google/gcloud/resourcemanager/ProjectTest.java

Lines changed: 27 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -24,11 +24,11 @@
2424
import static org.easymock.EasyMock.verify;
2525
import static org.junit.Assert.assertEquals;
2626
import static org.junit.Assert.assertNull;
27-
import static org.junit.Assert.assertSame;
2827

2928
import com.google.common.collect.ImmutableMap;
3029

3130
import org.junit.After;
31+
import org.junit.Before;
3232
import org.junit.Test;
3333

3434
import java.util.Map;
@@ -54,6 +54,11 @@ public class ProjectTest {
5454
private Project expectedProject;
5555
private Project project;
5656

57+
@Before
58+
public void setUp() {
59+
resourceManager = createStrictMock(ResourceManager.class);
60+
}
61+
5762
@After
5863
public void tearDown() throws Exception {
5964
verify(resourceManager);
@@ -62,7 +67,6 @@ public void tearDown() throws Exception {
6267
private void initializeExpectedProject(int optionsCalls) {
6368
expect(serviceMockReturnsOptions.options()).andReturn(mockOptions).times(optionsCalls);
6469
replay(serviceMockReturnsOptions);
65-
resourceManager = createStrictMock(ResourceManager.class);
6670
expectedProject =
6771
new Project(serviceMockReturnsOptions, new ProjectInfo.BuilderImpl(PROJECT_INFO));
6872
}
@@ -71,39 +75,41 @@ private void initializeProject() {
7175
project = new Project(resourceManager, new ProjectInfo.BuilderImpl(PROJECT_INFO));
7276
}
7377

78+
@Test
79+
public void testToBuilder() {
80+
initializeExpectedProject(4);
81+
replay(resourceManager);
82+
compareProjects(expectedProject, expectedProject.toBuilder().build());
83+
}
84+
7485
@Test
7586
public void testBuilder() {
76-
initializeExpectedProject(2);
87+
initializeExpectedProject(4);
88+
expect(resourceManager.options()).andReturn(mockOptions).times(4);
7789
replay(resourceManager);
78-
Project builtProject = Project.builder(serviceMockReturnsOptions, PROJECT_ID)
79-
.name(NAME)
90+
Project.Builder builder =
91+
new Project.Builder(new Project(resourceManager, new ProjectInfo.BuilderImpl(PROJECT_ID)));
92+
Project project = builder.name(NAME)
8093
.labels(LABELS)
8194
.projectNumber(PROJECT_NUMBER)
8295
.createTimeMillis(CREATE_TIME_MILLIS)
8396
.state(STATE)
8497
.build();
85-
assertEquals(PROJECT_ID, builtProject.projectId());
86-
assertEquals(NAME, builtProject.name());
87-
assertEquals(LABELS, builtProject.labels());
88-
assertEquals(PROJECT_NUMBER, builtProject.projectNumber());
89-
assertEquals(CREATE_TIME_MILLIS, builtProject.createTimeMillis());
90-
assertEquals(STATE, builtProject.state());
91-
assertSame(serviceMockReturnsOptions, builtProject.resourceManager());
92-
}
93-
94-
@Test
95-
public void testToBuilder() {
96-
initializeExpectedProject(4);
97-
replay(resourceManager);
98-
compareProjects(expectedProject, expectedProject.toBuilder().build());
98+
assertEquals(PROJECT_ID, project.projectId());
99+
assertEquals(NAME, project.name());
100+
assertEquals(LABELS, project.labels());
101+
assertEquals(PROJECT_NUMBER, project.projectNumber());
102+
assertEquals(CREATE_TIME_MILLIS, project.createTimeMillis());
103+
assertEquals(STATE, project.state());
104+
assertEquals(resourceManager.options(), project.resourceManager().options());
99105
}
100106

101107
@Test
102108
public void testGet() {
103109
initializeExpectedProject(1);
104110
expect(resourceManager.get(PROJECT_INFO.projectId())).andReturn(expectedProject);
105111
replay(resourceManager);
106-
Project loadedProject = Project.get(resourceManager, PROJECT_INFO.projectId());
112+
Project loadedProject = resourceManager.get(PROJECT_INFO.projectId());
107113
assertEquals(expectedProject, loadedProject);
108114
}
109115

@@ -126,7 +132,7 @@ public void testLoadNull() {
126132
initializeExpectedProject(1);
127133
expect(resourceManager.get(PROJECT_INFO.projectId())).andReturn(null);
128134
replay(resourceManager);
129-
assertNull(Project.get(resourceManager, PROJECT_INFO.projectId()));
135+
assertNull(resourceManager.get(PROJECT_INFO.projectId()));
130136
}
131137

132138
@Test

0 commit comments

Comments
 (0)