From 3e79f7cb5e87c0ea42c14049c0fbd1ce695f91da Mon Sep 17 00:00:00 2001 From: aozarov Date: Fri, 22 May 2015 16:01:32 -0700 Subject: [PATCH 1/5] initial work on modules --- RobustaSettings.xml | 2 - gcloud-java-core/README.md | 55 ++ gcloud-java-core/pom.xml | 94 ++++ .../com/google/gcloud/AuthCredentials.java | 0 .../java/com/google/gcloud/BaseService.java | 0 .../com/google/gcloud/ExceptionHandler.java | 0 .../java/com/google/gcloud/RetryHelper.java | 0 .../java/com/google/gcloud/RetryParams.java | 0 .../main/java/com/google/gcloud/Service.java | 0 .../com/google/gcloud/ServiceOptions.java | 0 .../google/gcloud/spi/ServiceRpcFactory.java | 0 .../google/gcloud/spi/ServiceRpcProvider.java | 32 ++ .../google/gcloud/ExceptionHandlerTest.java | 0 .../com/google/gcloud/RetryHelperTest.java | 0 .../com/google/gcloud/RetryParamsTest.java | 0 gcloud-java-datastore/README.md | 106 ++++ gcloud-java-datastore/pom.xml | 44 ++ .../datastore/BaseDatastoreBatchWriter.java | 0 .../google/gcloud/datastore/BaseEntity.java | 0 .../com/google/gcloud/datastore/BaseKey.java | 0 .../com/google/gcloud/datastore/Batch.java | 0 .../google/gcloud/datastore/BatchImpl.java | 0 .../google/gcloud/datastore/BatchOption.java | 0 .../com/google/gcloud/datastore/Blob.java | 0 .../google/gcloud/datastore/BlobValue.java | 0 .../google/gcloud/datastore/BooleanValue.java | 0 .../com/google/gcloud/datastore/Cursor.java | 0 .../datastore/DatastoreBatchWriter.java | 0 .../gcloud/datastore/DatastoreHelper.java | 0 .../gcloud/datastore/DatastoreReader.java | 0 .../datastore/DatastoreReaderWriter.java | 0 .../gcloud/datastore/DatastoreService.java | 0 .../datastore/DatastoreServiceException.java | 0 .../datastore/DatastoreServiceFactory.java | 0 .../datastore/DatastoreServiceImpl.java | 0 .../datastore/DatastoreServiceOptions.java | 7 +- .../gcloud/datastore/DatastoreWriter.java | 0 .../com/google/gcloud/datastore/DateTime.java | 0 .../gcloud/datastore/DateTimeValue.java | 0 .../google/gcloud/datastore/DoubleValue.java | 0 .../com/google/gcloud/datastore/Entity.java | 0 .../google/gcloud/datastore/EntityValue.java | 0 .../google/gcloud/datastore/FullEntity.java | 0 .../com/google/gcloud/datastore/GqlQuery.java | 0 .../gcloud/datastore/IncompleteKey.java | 0 .../java/com/google/gcloud/datastore/Key.java | 0 .../google/gcloud/datastore/KeyFactory.java | 0 .../com/google/gcloud/datastore/KeyValue.java | 0 .../google/gcloud/datastore/ListValue.java | 0 .../google/gcloud/datastore/LongValue.java | 0 .../google/gcloud/datastore/NullValue.java | 0 .../google/gcloud/datastore/PathElement.java | 0 .../gcloud/datastore/ProjectionEntity.java | 0 .../com/google/gcloud/datastore/Query.java | 0 .../google/gcloud/datastore/QueryResults.java | 0 .../gcloud/datastore/QueryResultsImpl.java | 0 .../com/google/gcloud/datastore/RawValue.java | 0 .../google/gcloud/datastore/Serializable.java | 0 .../google/gcloud/datastore/StringValue.java | 0 .../gcloud/datastore/StructuredQuery.java | 0 .../google/gcloud/datastore/Transaction.java | 0 .../gcloud/datastore/TransactionImpl.java | 0 .../gcloud/datastore/TransactionOption.java | 0 .../google/gcloud/datastore/Validator.java | 0 .../com/google/gcloud/datastore/Value.java | 0 .../google/gcloud/datastore/ValueBuilder.java | 0 .../gcloud/datastore/ValueMarshaller.java | 0 .../google/gcloud/datastore/ValueType.java | 0 .../google/gcloud/datastore/package-info.java | 0 .../com/google/gcloud/spi/DatastoreRpc.java | 0 .../gcloud/spi/DatastoreRpcFactory.java | 24 + .../gcloud/spi/DefaultDatastoreRpc.java | 151 +++++ .../BaseDatastoreBatchWriterTest.java | 0 .../gcloud/datastore/BaseEntityTest.java | 0 .../google/gcloud/datastore/BaseKeyTest.java | 0 .../com/google/gcloud/datastore/BlobTest.java | 0 .../gcloud/datastore/BlobValueTest.java | 0 .../gcloud/datastore/BooleanValueTest.java | 0 .../google/gcloud/datastore/CursorTest.java | 0 .../gcloud/datastore/DatastoreHelperTest.java | 0 .../DatastoreServiceExceptionTest.java | 0 .../DatastoreServiceOptionsTest.java | 0 .../datastore/DatastoreServiceTest.java | 0 .../google/gcloud/datastore/DateTimeTest.java | 0 .../gcloud/datastore/DateTimeValueTest.java | 0 .../gcloud/datastore/DoubleValueTest.java | 0 .../google/gcloud/datastore/EntityTest.java | 0 .../gcloud/datastore/EntityValueTest.java | 0 .../gcloud/datastore/FullEntityTest.java | 0 .../gcloud/datastore/IncompleteKeyTest.java | 0 .../gcloud/datastore/KeyFactoryTest.java | 0 .../com/google/gcloud/datastore/KeyTest.java | 0 .../google/gcloud/datastore/KeyValueTest.java | 0 .../gcloud/datastore/ListValueTest.java | 0 .../gcloud/datastore/LocalGcdHelper.java | 0 .../gcloud/datastore/LongValueTest.java | 0 .../gcloud/datastore/NullValueTest.java | 0 .../gcloud/datastore/PathElementTest.java | 0 .../datastore/ProjectionEntityTest.java | 0 .../google/gcloud/datastore/RawValueTest.java | 0 .../gcloud/datastore/SerializationTest.java | 0 .../gcloud/datastore/StringValueTest.java | 0 .../google/gcloud/datastore/ValueTest.java | 0 .../src}/test/resources/gcd-head.zip | Bin gcloud-java-examples/README.md | 55 ++ gcloud-java-examples/pom.xml | 37 ++ .../gcloud/examples/DatastoreExample.java | 0 .../gcloud/examples/StorageExample.java | 0 gcloud-java-storage/README.md | 63 +++ gcloud-java-storage/pom.xml | 39 ++ .../google/gcloud/spi/DefaultStorageRpc.java | 525 ++++++++++++++++++ .../com/google/gcloud/spi/StorageRpc.java | 0 .../google/gcloud/spi/StorageRpcFactory.java | 23 + .../java/com/google/gcloud/storage/Acl.java | 0 .../google/gcloud/storage/BatchRequest.java | 0 .../google/gcloud/storage/BatchResponse.java | 0 .../java/com/google/gcloud/storage/Blob.java | 0 .../gcloud/storage/BlobReadChannel.java | 0 .../gcloud/storage/BlobReadChannelImpl.java | 0 .../gcloud/storage/BlobWriteChannel.java | 0 .../gcloud/storage/BlobWriterChannelImpl.java | 0 .../com/google/gcloud/storage/Bucket.java | 0 .../java/com/google/gcloud/storage/Cors.java | 0 .../com/google/gcloud/storage/ListResult.java | 0 .../com/google/gcloud/storage/Option.java | 0 .../google/gcloud/storage/StorageService.java | 0 .../storage/StorageServiceException.java | 0 .../gcloud/storage/StorageServiceFactory.java | 0 .../gcloud/storage/StorageServiceImpl.java | 0 .../gcloud/storage/StorageServiceOptions.java | 7 +- .../google/gcloud/storage/package-info.java | 0 .../com/google/gcloud/storage/AclTest.java | 0 .../gcloud/storage/BatchRequestTest.java | 0 .../gcloud/storage/BatchResponseTest.java | 0 .../com/google/gcloud/storage/BlobTest.java | 0 .../com/google/gcloud/storage/BucketTest.java | 0 .../com/google/gcloud/storage/CorsTest.java | 0 .../google/gcloud/storage/ListResultTest.java | 0 .../com/google/gcloud/storage/OptionTest.java | 0 .../gcloud/storage/SerializationTest.java | 0 gcloud-java/README.md | 73 +++ gcloud-java/pom.xml | 47 ++ pom.xml | 195 ++----- .../gcloud/spi/DatastoreRpcFactory.java | 1 - .../gcloud/spi/DefaultDatastoreRpc.java | 1 - .../google/gcloud/spi/DefaultStorageRpc.java | 1 - .../google/gcloud/spi/ServiceRpcProvider.java | 1 - .../google/gcloud/spi/StorageRpcFactory.java | 1 - src/site/apt/index.apt | 4 +- src/site/site.xml | 4 +- 150 files changed, 1440 insertions(+), 152 deletions(-) delete mode 100644 RobustaSettings.xml create mode 100644 gcloud-java-core/README.md create mode 100644 gcloud-java-core/pom.xml rename {src => gcloud-java-core/src}/main/java/com/google/gcloud/AuthCredentials.java (100%) rename {src => gcloud-java-core/src}/main/java/com/google/gcloud/BaseService.java (100%) rename {src => gcloud-java-core/src}/main/java/com/google/gcloud/ExceptionHandler.java (100%) rename {src => gcloud-java-core/src}/main/java/com/google/gcloud/RetryHelper.java (100%) rename {src => gcloud-java-core/src}/main/java/com/google/gcloud/RetryParams.java (100%) rename {src => gcloud-java-core/src}/main/java/com/google/gcloud/Service.java (100%) rename {src => gcloud-java-core/src}/main/java/com/google/gcloud/ServiceOptions.java (100%) rename {src => gcloud-java-core/src}/main/java/com/google/gcloud/spi/ServiceRpcFactory.java (100%) create mode 100644 gcloud-java-core/src/main/java/com/google/gcloud/spi/ServiceRpcProvider.java rename {src => gcloud-java-core/src}/test/java/com/google/gcloud/ExceptionHandlerTest.java (100%) rename {src => gcloud-java-core/src}/test/java/com/google/gcloud/RetryHelperTest.java (100%) rename {src => gcloud-java-core/src}/test/java/com/google/gcloud/RetryParamsTest.java (100%) create mode 100644 gcloud-java-datastore/README.md create mode 100644 gcloud-java-datastore/pom.xml rename {src => gcloud-java-datastore/src}/main/java/com/google/gcloud/datastore/BaseDatastoreBatchWriter.java (100%) rename {src => gcloud-java-datastore/src}/main/java/com/google/gcloud/datastore/BaseEntity.java (100%) rename {src => gcloud-java-datastore/src}/main/java/com/google/gcloud/datastore/BaseKey.java (100%) rename {src => gcloud-java-datastore/src}/main/java/com/google/gcloud/datastore/Batch.java (100%) rename {src => gcloud-java-datastore/src}/main/java/com/google/gcloud/datastore/BatchImpl.java (100%) rename {src => gcloud-java-datastore/src}/main/java/com/google/gcloud/datastore/BatchOption.java (100%) rename {src => gcloud-java-datastore/src}/main/java/com/google/gcloud/datastore/Blob.java (100%) rename {src => gcloud-java-datastore/src}/main/java/com/google/gcloud/datastore/BlobValue.java (100%) rename {src => gcloud-java-datastore/src}/main/java/com/google/gcloud/datastore/BooleanValue.java (100%) rename {src => gcloud-java-datastore/src}/main/java/com/google/gcloud/datastore/Cursor.java (100%) rename {src => gcloud-java-datastore/src}/main/java/com/google/gcloud/datastore/DatastoreBatchWriter.java (100%) rename {src => gcloud-java-datastore/src}/main/java/com/google/gcloud/datastore/DatastoreHelper.java (100%) rename {src => gcloud-java-datastore/src}/main/java/com/google/gcloud/datastore/DatastoreReader.java (100%) rename {src => gcloud-java-datastore/src}/main/java/com/google/gcloud/datastore/DatastoreReaderWriter.java (100%) rename {src => gcloud-java-datastore/src}/main/java/com/google/gcloud/datastore/DatastoreService.java (100%) rename {src => gcloud-java-datastore/src}/main/java/com/google/gcloud/datastore/DatastoreServiceException.java (100%) rename {src => gcloud-java-datastore/src}/main/java/com/google/gcloud/datastore/DatastoreServiceFactory.java (100%) rename {src => gcloud-java-datastore/src}/main/java/com/google/gcloud/datastore/DatastoreServiceImpl.java (100%) rename {src => gcloud-java-datastore/src}/main/java/com/google/gcloud/datastore/DatastoreServiceOptions.java (95%) rename {src => gcloud-java-datastore/src}/main/java/com/google/gcloud/datastore/DatastoreWriter.java (100%) rename {src => gcloud-java-datastore/src}/main/java/com/google/gcloud/datastore/DateTime.java (100%) rename {src => gcloud-java-datastore/src}/main/java/com/google/gcloud/datastore/DateTimeValue.java (100%) rename {src => gcloud-java-datastore/src}/main/java/com/google/gcloud/datastore/DoubleValue.java (100%) rename {src => gcloud-java-datastore/src}/main/java/com/google/gcloud/datastore/Entity.java (100%) rename {src => gcloud-java-datastore/src}/main/java/com/google/gcloud/datastore/EntityValue.java (100%) rename {src => gcloud-java-datastore/src}/main/java/com/google/gcloud/datastore/FullEntity.java (100%) rename {src => gcloud-java-datastore/src}/main/java/com/google/gcloud/datastore/GqlQuery.java (100%) rename {src => gcloud-java-datastore/src}/main/java/com/google/gcloud/datastore/IncompleteKey.java (100%) rename {src => gcloud-java-datastore/src}/main/java/com/google/gcloud/datastore/Key.java (100%) rename {src => gcloud-java-datastore/src}/main/java/com/google/gcloud/datastore/KeyFactory.java (100%) rename {src => gcloud-java-datastore/src}/main/java/com/google/gcloud/datastore/KeyValue.java (100%) rename {src => gcloud-java-datastore/src}/main/java/com/google/gcloud/datastore/ListValue.java (100%) rename {src => gcloud-java-datastore/src}/main/java/com/google/gcloud/datastore/LongValue.java (100%) rename {src => gcloud-java-datastore/src}/main/java/com/google/gcloud/datastore/NullValue.java (100%) rename {src => gcloud-java-datastore/src}/main/java/com/google/gcloud/datastore/PathElement.java (100%) rename {src => gcloud-java-datastore/src}/main/java/com/google/gcloud/datastore/ProjectionEntity.java (100%) rename {src => gcloud-java-datastore/src}/main/java/com/google/gcloud/datastore/Query.java (100%) rename {src => gcloud-java-datastore/src}/main/java/com/google/gcloud/datastore/QueryResults.java (100%) rename {src => gcloud-java-datastore/src}/main/java/com/google/gcloud/datastore/QueryResultsImpl.java (100%) rename {src => gcloud-java-datastore/src}/main/java/com/google/gcloud/datastore/RawValue.java (100%) rename {src => gcloud-java-datastore/src}/main/java/com/google/gcloud/datastore/Serializable.java (100%) rename {src => gcloud-java-datastore/src}/main/java/com/google/gcloud/datastore/StringValue.java (100%) rename {src => gcloud-java-datastore/src}/main/java/com/google/gcloud/datastore/StructuredQuery.java (100%) rename {src => gcloud-java-datastore/src}/main/java/com/google/gcloud/datastore/Transaction.java (100%) rename {src => gcloud-java-datastore/src}/main/java/com/google/gcloud/datastore/TransactionImpl.java (100%) rename {src => gcloud-java-datastore/src}/main/java/com/google/gcloud/datastore/TransactionOption.java (100%) rename {src => gcloud-java-datastore/src}/main/java/com/google/gcloud/datastore/Validator.java (100%) rename {src => gcloud-java-datastore/src}/main/java/com/google/gcloud/datastore/Value.java (100%) rename {src => gcloud-java-datastore/src}/main/java/com/google/gcloud/datastore/ValueBuilder.java (100%) rename {src => gcloud-java-datastore/src}/main/java/com/google/gcloud/datastore/ValueMarshaller.java (100%) rename {src => gcloud-java-datastore/src}/main/java/com/google/gcloud/datastore/ValueType.java (100%) rename {src => gcloud-java-datastore/src}/main/java/com/google/gcloud/datastore/package-info.java (100%) rename {src => gcloud-java-datastore/src}/main/java/com/google/gcloud/spi/DatastoreRpc.java (100%) create mode 100644 gcloud-java-datastore/src/main/java/com/google/gcloud/spi/DatastoreRpcFactory.java create mode 100644 gcloud-java-datastore/src/main/java/com/google/gcloud/spi/DefaultDatastoreRpc.java rename {src => gcloud-java-datastore/src}/test/java/com/google/gcloud/datastore/BaseDatastoreBatchWriterTest.java (100%) rename {src => gcloud-java-datastore/src}/test/java/com/google/gcloud/datastore/BaseEntityTest.java (100%) rename {src => gcloud-java-datastore/src}/test/java/com/google/gcloud/datastore/BaseKeyTest.java (100%) rename {src => gcloud-java-datastore/src}/test/java/com/google/gcloud/datastore/BlobTest.java (100%) rename {src => gcloud-java-datastore/src}/test/java/com/google/gcloud/datastore/BlobValueTest.java (100%) rename {src => gcloud-java-datastore/src}/test/java/com/google/gcloud/datastore/BooleanValueTest.java (100%) rename {src => gcloud-java-datastore/src}/test/java/com/google/gcloud/datastore/CursorTest.java (100%) rename {src => gcloud-java-datastore/src}/test/java/com/google/gcloud/datastore/DatastoreHelperTest.java (100%) rename {src => gcloud-java-datastore/src}/test/java/com/google/gcloud/datastore/DatastoreServiceExceptionTest.java (100%) rename {src => gcloud-java-datastore/src}/test/java/com/google/gcloud/datastore/DatastoreServiceOptionsTest.java (100%) rename {src => gcloud-java-datastore/src}/test/java/com/google/gcloud/datastore/DatastoreServiceTest.java (100%) rename {src => gcloud-java-datastore/src}/test/java/com/google/gcloud/datastore/DateTimeTest.java (100%) rename {src => gcloud-java-datastore/src}/test/java/com/google/gcloud/datastore/DateTimeValueTest.java (100%) rename {src => gcloud-java-datastore/src}/test/java/com/google/gcloud/datastore/DoubleValueTest.java (100%) rename {src => gcloud-java-datastore/src}/test/java/com/google/gcloud/datastore/EntityTest.java (100%) rename {src => gcloud-java-datastore/src}/test/java/com/google/gcloud/datastore/EntityValueTest.java (100%) rename {src => gcloud-java-datastore/src}/test/java/com/google/gcloud/datastore/FullEntityTest.java (100%) rename {src => gcloud-java-datastore/src}/test/java/com/google/gcloud/datastore/IncompleteKeyTest.java (100%) rename {src => gcloud-java-datastore/src}/test/java/com/google/gcloud/datastore/KeyFactoryTest.java (100%) rename {src => gcloud-java-datastore/src}/test/java/com/google/gcloud/datastore/KeyTest.java (100%) rename {src => gcloud-java-datastore/src}/test/java/com/google/gcloud/datastore/KeyValueTest.java (100%) rename {src => gcloud-java-datastore/src}/test/java/com/google/gcloud/datastore/ListValueTest.java (100%) rename {src => gcloud-java-datastore/src}/test/java/com/google/gcloud/datastore/LocalGcdHelper.java (100%) rename {src => gcloud-java-datastore/src}/test/java/com/google/gcloud/datastore/LongValueTest.java (100%) rename {src => gcloud-java-datastore/src}/test/java/com/google/gcloud/datastore/NullValueTest.java (100%) rename {src => gcloud-java-datastore/src}/test/java/com/google/gcloud/datastore/PathElementTest.java (100%) rename {src => gcloud-java-datastore/src}/test/java/com/google/gcloud/datastore/ProjectionEntityTest.java (100%) rename {src => gcloud-java-datastore/src}/test/java/com/google/gcloud/datastore/RawValueTest.java (100%) rename {src => gcloud-java-datastore/src}/test/java/com/google/gcloud/datastore/SerializationTest.java (100%) rename {src => gcloud-java-datastore/src}/test/java/com/google/gcloud/datastore/StringValueTest.java (100%) rename {src => gcloud-java-datastore/src}/test/java/com/google/gcloud/datastore/ValueTest.java (100%) rename {src => gcloud-java-datastore/src}/test/resources/gcd-head.zip (100%) create mode 100644 gcloud-java-examples/README.md create mode 100644 gcloud-java-examples/pom.xml rename {src => gcloud-java-examples/src}/main/java/com/google/gcloud/examples/DatastoreExample.java (100%) rename {src => gcloud-java-examples/src}/main/java/com/google/gcloud/examples/StorageExample.java (100%) create mode 100644 gcloud-java-storage/README.md create mode 100644 gcloud-java-storage/pom.xml create mode 100644 gcloud-java-storage/src/main/java/com/google/gcloud/spi/DefaultStorageRpc.java rename {src => gcloud-java-storage/src}/main/java/com/google/gcloud/spi/StorageRpc.java (100%) create mode 100644 gcloud-java-storage/src/main/java/com/google/gcloud/spi/StorageRpcFactory.java rename {src => gcloud-java-storage/src}/main/java/com/google/gcloud/storage/Acl.java (100%) rename {src => gcloud-java-storage/src}/main/java/com/google/gcloud/storage/BatchRequest.java (100%) rename {src => gcloud-java-storage/src}/main/java/com/google/gcloud/storage/BatchResponse.java (100%) rename {src => gcloud-java-storage/src}/main/java/com/google/gcloud/storage/Blob.java (100%) rename {src => gcloud-java-storage/src}/main/java/com/google/gcloud/storage/BlobReadChannel.java (100%) rename {src => gcloud-java-storage/src}/main/java/com/google/gcloud/storage/BlobReadChannelImpl.java (100%) rename {src => gcloud-java-storage/src}/main/java/com/google/gcloud/storage/BlobWriteChannel.java (100%) rename {src => gcloud-java-storage/src}/main/java/com/google/gcloud/storage/BlobWriterChannelImpl.java (100%) rename {src => gcloud-java-storage/src}/main/java/com/google/gcloud/storage/Bucket.java (100%) rename {src => gcloud-java-storage/src}/main/java/com/google/gcloud/storage/Cors.java (100%) rename {src => gcloud-java-storage/src}/main/java/com/google/gcloud/storage/ListResult.java (100%) rename {src => gcloud-java-storage/src}/main/java/com/google/gcloud/storage/Option.java (100%) rename {src => gcloud-java-storage/src}/main/java/com/google/gcloud/storage/StorageService.java (100%) rename {src => gcloud-java-storage/src}/main/java/com/google/gcloud/storage/StorageServiceException.java (100%) rename {src => gcloud-java-storage/src}/main/java/com/google/gcloud/storage/StorageServiceFactory.java (100%) rename {src => gcloud-java-storage/src}/main/java/com/google/gcloud/storage/StorageServiceImpl.java (100%) rename {src => gcloud-java-storage/src}/main/java/com/google/gcloud/storage/StorageServiceOptions.java (92%) rename {src => gcloud-java-storage/src}/main/java/com/google/gcloud/storage/package-info.java (100%) rename {src => gcloud-java-storage/src}/test/java/com/google/gcloud/storage/AclTest.java (100%) rename {src => gcloud-java-storage/src}/test/java/com/google/gcloud/storage/BatchRequestTest.java (100%) rename {src => gcloud-java-storage/src}/test/java/com/google/gcloud/storage/BatchResponseTest.java (100%) rename {src => gcloud-java-storage/src}/test/java/com/google/gcloud/storage/BlobTest.java (100%) rename {src => gcloud-java-storage/src}/test/java/com/google/gcloud/storage/BucketTest.java (100%) rename {src => gcloud-java-storage/src}/test/java/com/google/gcloud/storage/CorsTest.java (100%) rename {src => gcloud-java-storage/src}/test/java/com/google/gcloud/storage/ListResultTest.java (100%) rename {src => gcloud-java-storage/src}/test/java/com/google/gcloud/storage/OptionTest.java (100%) rename {src => gcloud-java-storage/src}/test/java/com/google/gcloud/storage/SerializationTest.java (100%) create mode 100644 gcloud-java/README.md create mode 100644 gcloud-java/pom.xml delete mode 100644 src/main/java/com/google/gcloud/spi/DatastoreRpcFactory.java delete mode 100644 src/main/java/com/google/gcloud/spi/DefaultDatastoreRpc.java delete mode 100644 src/main/java/com/google/gcloud/spi/DefaultStorageRpc.java delete mode 100644 src/main/java/com/google/gcloud/spi/ServiceRpcProvider.java delete mode 100644 src/main/java/com/google/gcloud/spi/StorageRpcFactory.java diff --git a/RobustaSettings.xml b/RobustaSettings.xml deleted file mode 100644 index 8c664c57feb7..000000000000 --- a/RobustaSettings.xml +++ /dev/null @@ -1,2 +0,0 @@ - - diff --git a/gcloud-java-core/README.md b/gcloud-java-core/README.md new file mode 100644 index 000000000000..e22b159d216f --- /dev/null +++ b/gcloud-java-core/README.md @@ -0,0 +1,55 @@ +Google Cloud Java Client +========================== + +Java idiomatic client for [Google Cloud Platform][cloud-platform] services. + +[![Build Status](https://travis-ci.org/GoogleCloudPlatform/gcloud-java.svg?branch=master)](https://travis-ci.org/GoogleCloudPlatform/gcloud-java) +[![Coverage Status](https://coveralls.io/repos/GoogleCloudPlatform/gcloud-java/badge.svg?branch=master)](https://coveralls.io/r/GoogleCloudPlatform/gcloud-java?branch=master) + +- [Homepage] (https://googlecloudplatform.github.io/gcloud-java/) +- [API Documentation] (http://googlecloudplatform.github.io/gcloud-java/apidocs) +- [Examples] (http://googlecloudplatform.github.io/gcloud-java/apidocs/index.html?com/google/gcloud/examples/package-summary.html) + +This moudle provides common functionality and is required by the other service specific modules. + +Quickstart +---------- +Add this to your pom.xml file +```xml + + com.google.gcloud + gcloud-java-core + LATEST + +``` + +Contributing +------------ + +Contributions to this library are always welcome and highly encouraged. + +See [CONTRIBUTING] for more information on how to get started. + +Java Versions +------------- + +Java 7 or above is required for using this client. + +Versioning +---------- + +This library follows [Semantic Versioning] (http://semver.org/). + +It is currently in major version zero (``0.y.z``), which means that anything +may change at any time and the public API should not be considered +stable. + +License +------- + +Apache 2.0 - See [LICENSE] for more information. + + +[CONTRIBUTING]:https://github.com/GoogleCloudPlatform/gcloud-java/blob/master/CONTRIBUTING.md +[LICENSE]: https://github.com/GoogleCloudPlatform/gcloud-java/blob/master/LICENSE +[cloud-platform]: https://cloud.google.com/ diff --git a/gcloud-java-core/pom.xml b/gcloud-java-core/pom.xml new file mode 100644 index 000000000000..7fbbe7dad21d --- /dev/null +++ b/gcloud-java-core/pom.xml @@ -0,0 +1,94 @@ + + + 4.0.0 + com.google.gcloud + gcloud-java-core + jar + GCloud Java core + https://github.com/GoogleCloudPlatform/gcloud-java + + Java idiomatic client for Google Cloud Platform services. + + + com.google.gcloud + gcloud-java-pom + 0.0.5 + + + + com.google.auth + google-auth-library-credentials + 0.1.0 + + + com.google.auth + google-auth-library-oauth2-http + 0.1.0 + + + com.google.http-client + google-http-client + 1.19.0 + compile + + + com.google.oauth-client + google-oauth-client + 1.19.0 + compile + + + com.google.guava + guava + 18.0 + + + com.google.api-client + google-api-client-appengine + 1.20.0 + compile + + + guava-jdk5 + com.google.guava + + + + + com.google.http-client + google-http-client-jackson + 1.20.0 + compile + + + guava-jdk5 + com.google.guava + + + + + junit + junit + 4.12 + test + + + joda-time + joda-time + RELEASE + compile + + + org.json + json + 20090211 + compile + + + org.easymock + easymock + 3.3 + test + + + diff --git a/src/main/java/com/google/gcloud/AuthCredentials.java b/gcloud-java-core/src/main/java/com/google/gcloud/AuthCredentials.java similarity index 100% rename from src/main/java/com/google/gcloud/AuthCredentials.java rename to gcloud-java-core/src/main/java/com/google/gcloud/AuthCredentials.java diff --git a/src/main/java/com/google/gcloud/BaseService.java b/gcloud-java-core/src/main/java/com/google/gcloud/BaseService.java similarity index 100% rename from src/main/java/com/google/gcloud/BaseService.java rename to gcloud-java-core/src/main/java/com/google/gcloud/BaseService.java diff --git a/src/main/java/com/google/gcloud/ExceptionHandler.java b/gcloud-java-core/src/main/java/com/google/gcloud/ExceptionHandler.java similarity index 100% rename from src/main/java/com/google/gcloud/ExceptionHandler.java rename to gcloud-java-core/src/main/java/com/google/gcloud/ExceptionHandler.java diff --git a/src/main/java/com/google/gcloud/RetryHelper.java b/gcloud-java-core/src/main/java/com/google/gcloud/RetryHelper.java similarity index 100% rename from src/main/java/com/google/gcloud/RetryHelper.java rename to gcloud-java-core/src/main/java/com/google/gcloud/RetryHelper.java diff --git a/src/main/java/com/google/gcloud/RetryParams.java b/gcloud-java-core/src/main/java/com/google/gcloud/RetryParams.java similarity index 100% rename from src/main/java/com/google/gcloud/RetryParams.java rename to gcloud-java-core/src/main/java/com/google/gcloud/RetryParams.java diff --git a/src/main/java/com/google/gcloud/Service.java b/gcloud-java-core/src/main/java/com/google/gcloud/Service.java similarity index 100% rename from src/main/java/com/google/gcloud/Service.java rename to gcloud-java-core/src/main/java/com/google/gcloud/Service.java diff --git a/src/main/java/com/google/gcloud/ServiceOptions.java b/gcloud-java-core/src/main/java/com/google/gcloud/ServiceOptions.java similarity index 100% rename from src/main/java/com/google/gcloud/ServiceOptions.java rename to gcloud-java-core/src/main/java/com/google/gcloud/ServiceOptions.java diff --git a/src/main/java/com/google/gcloud/spi/ServiceRpcFactory.java b/gcloud-java-core/src/main/java/com/google/gcloud/spi/ServiceRpcFactory.java similarity index 100% rename from src/main/java/com/google/gcloud/spi/ServiceRpcFactory.java rename to gcloud-java-core/src/main/java/com/google/gcloud/spi/ServiceRpcFactory.java diff --git a/gcloud-java-core/src/main/java/com/google/gcloud/spi/ServiceRpcProvider.java b/gcloud-java-core/src/main/java/com/google/gcloud/spi/ServiceRpcProvider.java new file mode 100644 index 000000000000..41a2bf2d5848 --- /dev/null +++ b/gcloud-java-core/src/main/java/com/google/gcloud/spi/ServiceRpcProvider.java @@ -0,0 +1,32 @@ +/* + * 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.common.collect.Iterables; +import com.google.gcloud.ServiceOptions; + +import java.util.ServiceLoader; + +public class ServiceRpcProvider { + + public static > R get(O options, + Class> factoryClass) { + ServiceRpcFactory factory = Iterables.getFirst(ServiceLoader.load(factoryClass), null); + return factory == null ? null : factory.create(options); + } +} + diff --git a/src/test/java/com/google/gcloud/ExceptionHandlerTest.java b/gcloud-java-core/src/test/java/com/google/gcloud/ExceptionHandlerTest.java similarity index 100% rename from src/test/java/com/google/gcloud/ExceptionHandlerTest.java rename to gcloud-java-core/src/test/java/com/google/gcloud/ExceptionHandlerTest.java diff --git a/src/test/java/com/google/gcloud/RetryHelperTest.java b/gcloud-java-core/src/test/java/com/google/gcloud/RetryHelperTest.java similarity index 100% rename from src/test/java/com/google/gcloud/RetryHelperTest.java rename to gcloud-java-core/src/test/java/com/google/gcloud/RetryHelperTest.java diff --git a/src/test/java/com/google/gcloud/RetryParamsTest.java b/gcloud-java-core/src/test/java/com/google/gcloud/RetryParamsTest.java similarity index 100% rename from src/test/java/com/google/gcloud/RetryParamsTest.java rename to gcloud-java-core/src/test/java/com/google/gcloud/RetryParamsTest.java diff --git a/gcloud-java-datastore/README.md b/gcloud-java-datastore/README.md new file mode 100644 index 000000000000..96d8075706e9 --- /dev/null +++ b/gcloud-java-datastore/README.md @@ -0,0 +1,106 @@ +Google Cloud Java Client +========================== + +Java idiomatic client for [Google Cloud Platform][cloud-platform] services. + +[![Build Status](https://travis-ci.org/GoogleCloudPlatform/gcloud-java.svg?branch=master)](https://travis-ci.org/GoogleCloudPlatform/gcloud-java) +[![Coverage Status](https://coveralls.io/repos/GoogleCloudPlatform/gcloud-java/badge.svg?branch=master)](https://coveralls.io/r/GoogleCloudPlatform/gcloud-java?branch=master) + +- [Homepage] (https://googlecloudplatform.github.io/gcloud-java/) +- [API Documentation] (http://googlecloudplatform.github.io/gcloud-java/apidocs) +- [Examples] (http://googlecloudplatform.github.io/gcloud-java/apidocs/index.html?com/google/gcloud/examples/package-summary.html) + +This client supports [Google Cloud Datastore] (https://cloud.google.com/datastore/) + + +> Note: This client is a work-in-progress, and may occasionally +> make backwards-incompatible changes. + +Quickstart +---------- +Add this to your pom.xml file +```xml + + com.google.gcloud + gcloud-java-datastore + LATEST + +``` + +Google [Cloud Datastore][cloud-datastore] is a fully managed, schemaless database for +storing non-relational data. Cloud Datastore automatically scales with +your users and supports ACID transactions, high availability of reads and +writes, strong consistency for reads and ancestor queries, and eventual +consistency for all other queries. + +See the [Google Cloud Datastore docs][cloud-datastore-activation] for more details on how to activate +Cloud Datastore for your project. + +See the ``gcloud-java`` API [datastore documentation][datastore-api] to learn how to interact +with the Cloud Datastore using this Client Library. + +```java +import com.google.gcloud.datastore.DatastoreService; +import com.google.gcloud.datastore.DatastoreServiceFactory; +import com.google.gcloud.datastore.DatastoreServiceOptions; +import com.google.gcloud.datastore.DateTime; +import com.google.gcloud.datastore.Entity; +import com.google.gcloud.datastore.Key; +import com.google.gcloud.datastore.KeyFactory; + +DatastoreServiceOptions options = DatastoreServiceOptions.builder().projectId(PROJECT_ID).build(); +DatastoreService datastore = DatastoreServiceFactory.instance().get(options); +KeyFactory keyFactory = datastore.newKeyFactory().kind(KIND); +Key key = keyFactory.newKey(keyName); +Entity entity = datastore.get(key); +if (entity == null) { + entity = Entity.builder(key) + .set("name", "John Do") + .set("age", 30) + .set("access_time", DateTime.now()) + .build(); + datastore.put(entity); +} else { + System.out.println("Updating access_time for " + entity.getString("name")); + entity = Entity.builder(entity) + .set("access_time", DateTime.now()) + .build(); + datastore.update(entity); +} +``` + +Contributing +------------ + +Contributions to this library are always welcome and highly encouraged. + +See [CONTRIBUTING] for more information on how to get started. + +Java Versions +------------- + +Java 7 or above is required for using this client. + +Versioning +---------- + +This library follows [Semantic Versioning] (http://semver.org/). + +It is currently in major version zero (``0.y.z``), which means that anything +may change at any time and the public API should not be considered +stable. + +License +------- + +Apache 2.0 - See [LICENSE] for more information. + + +[CONTRIBUTING]:https://github.com/GoogleCloudPlatform/gcloud-java/blob/master/CONTRIBUTING.md +[LICENSE]: https://github.com/GoogleCloudPlatform/gcloud-java/blob/master/LICENSE +[cloud-platform]: https://cloud.google.com/ +[cloud-datastore]: https://cloud.google.com/datastore/docs +[cloud-datastore-docs]: https://cloud.google.com/datastore/docs +[cloud-datastore-activation]: https://cloud.google.com/datastore/docs/activate +[datastore-api]: http://googlecloudplatform.github.io/gcloud-java/apidocs/index.html?com/google/gcloud/datastore/package-summary.html + diff --git a/gcloud-java-datastore/pom.xml b/gcloud-java-datastore/pom.xml new file mode 100644 index 000000000000..0217e9cad58c --- /dev/null +++ b/gcloud-java-datastore/pom.xml @@ -0,0 +1,44 @@ + + + 4.0.0 + com.google.gcloud + gcloud-java-datastore + jar + GCloud Java datastore + https://github.com/GoogleCloudPlatform/gcloud-java + + com.google.gcloud + gcloud-java-pom + 0.0.5 + + + + ${project.groupId} + gcloud-java-core + ${project.version} + + + com.google.apis + google-api-services-datastore-protobuf + v1beta2-rev1-2.1.2 + compile + + + com.google.apis + google-api-services-datastore + v1beta2-rev23-1.19.0 + + + junit + junit + 4.12 + test + + + org.easymock + easymock + 3.3 + test + + + diff --git a/src/main/java/com/google/gcloud/datastore/BaseDatastoreBatchWriter.java b/gcloud-java-datastore/src/main/java/com/google/gcloud/datastore/BaseDatastoreBatchWriter.java similarity index 100% rename from src/main/java/com/google/gcloud/datastore/BaseDatastoreBatchWriter.java rename to gcloud-java-datastore/src/main/java/com/google/gcloud/datastore/BaseDatastoreBatchWriter.java diff --git a/src/main/java/com/google/gcloud/datastore/BaseEntity.java b/gcloud-java-datastore/src/main/java/com/google/gcloud/datastore/BaseEntity.java similarity index 100% rename from src/main/java/com/google/gcloud/datastore/BaseEntity.java rename to gcloud-java-datastore/src/main/java/com/google/gcloud/datastore/BaseEntity.java diff --git a/src/main/java/com/google/gcloud/datastore/BaseKey.java b/gcloud-java-datastore/src/main/java/com/google/gcloud/datastore/BaseKey.java similarity index 100% rename from src/main/java/com/google/gcloud/datastore/BaseKey.java rename to gcloud-java-datastore/src/main/java/com/google/gcloud/datastore/BaseKey.java diff --git a/src/main/java/com/google/gcloud/datastore/Batch.java b/gcloud-java-datastore/src/main/java/com/google/gcloud/datastore/Batch.java similarity index 100% rename from src/main/java/com/google/gcloud/datastore/Batch.java rename to gcloud-java-datastore/src/main/java/com/google/gcloud/datastore/Batch.java diff --git a/src/main/java/com/google/gcloud/datastore/BatchImpl.java b/gcloud-java-datastore/src/main/java/com/google/gcloud/datastore/BatchImpl.java similarity index 100% rename from src/main/java/com/google/gcloud/datastore/BatchImpl.java rename to gcloud-java-datastore/src/main/java/com/google/gcloud/datastore/BatchImpl.java diff --git a/src/main/java/com/google/gcloud/datastore/BatchOption.java b/gcloud-java-datastore/src/main/java/com/google/gcloud/datastore/BatchOption.java similarity index 100% rename from src/main/java/com/google/gcloud/datastore/BatchOption.java rename to gcloud-java-datastore/src/main/java/com/google/gcloud/datastore/BatchOption.java diff --git a/src/main/java/com/google/gcloud/datastore/Blob.java b/gcloud-java-datastore/src/main/java/com/google/gcloud/datastore/Blob.java similarity index 100% rename from src/main/java/com/google/gcloud/datastore/Blob.java rename to gcloud-java-datastore/src/main/java/com/google/gcloud/datastore/Blob.java diff --git a/src/main/java/com/google/gcloud/datastore/BlobValue.java b/gcloud-java-datastore/src/main/java/com/google/gcloud/datastore/BlobValue.java similarity index 100% rename from src/main/java/com/google/gcloud/datastore/BlobValue.java rename to gcloud-java-datastore/src/main/java/com/google/gcloud/datastore/BlobValue.java diff --git a/src/main/java/com/google/gcloud/datastore/BooleanValue.java b/gcloud-java-datastore/src/main/java/com/google/gcloud/datastore/BooleanValue.java similarity index 100% rename from src/main/java/com/google/gcloud/datastore/BooleanValue.java rename to gcloud-java-datastore/src/main/java/com/google/gcloud/datastore/BooleanValue.java diff --git a/src/main/java/com/google/gcloud/datastore/Cursor.java b/gcloud-java-datastore/src/main/java/com/google/gcloud/datastore/Cursor.java similarity index 100% rename from src/main/java/com/google/gcloud/datastore/Cursor.java rename to gcloud-java-datastore/src/main/java/com/google/gcloud/datastore/Cursor.java diff --git a/src/main/java/com/google/gcloud/datastore/DatastoreBatchWriter.java b/gcloud-java-datastore/src/main/java/com/google/gcloud/datastore/DatastoreBatchWriter.java similarity index 100% rename from src/main/java/com/google/gcloud/datastore/DatastoreBatchWriter.java rename to gcloud-java-datastore/src/main/java/com/google/gcloud/datastore/DatastoreBatchWriter.java diff --git a/src/main/java/com/google/gcloud/datastore/DatastoreHelper.java b/gcloud-java-datastore/src/main/java/com/google/gcloud/datastore/DatastoreHelper.java similarity index 100% rename from src/main/java/com/google/gcloud/datastore/DatastoreHelper.java rename to gcloud-java-datastore/src/main/java/com/google/gcloud/datastore/DatastoreHelper.java diff --git a/src/main/java/com/google/gcloud/datastore/DatastoreReader.java b/gcloud-java-datastore/src/main/java/com/google/gcloud/datastore/DatastoreReader.java similarity index 100% rename from src/main/java/com/google/gcloud/datastore/DatastoreReader.java rename to gcloud-java-datastore/src/main/java/com/google/gcloud/datastore/DatastoreReader.java diff --git a/src/main/java/com/google/gcloud/datastore/DatastoreReaderWriter.java b/gcloud-java-datastore/src/main/java/com/google/gcloud/datastore/DatastoreReaderWriter.java similarity index 100% rename from src/main/java/com/google/gcloud/datastore/DatastoreReaderWriter.java rename to gcloud-java-datastore/src/main/java/com/google/gcloud/datastore/DatastoreReaderWriter.java diff --git a/src/main/java/com/google/gcloud/datastore/DatastoreService.java b/gcloud-java-datastore/src/main/java/com/google/gcloud/datastore/DatastoreService.java similarity index 100% rename from src/main/java/com/google/gcloud/datastore/DatastoreService.java rename to gcloud-java-datastore/src/main/java/com/google/gcloud/datastore/DatastoreService.java diff --git a/src/main/java/com/google/gcloud/datastore/DatastoreServiceException.java b/gcloud-java-datastore/src/main/java/com/google/gcloud/datastore/DatastoreServiceException.java similarity index 100% rename from src/main/java/com/google/gcloud/datastore/DatastoreServiceException.java rename to gcloud-java-datastore/src/main/java/com/google/gcloud/datastore/DatastoreServiceException.java diff --git a/src/main/java/com/google/gcloud/datastore/DatastoreServiceFactory.java b/gcloud-java-datastore/src/main/java/com/google/gcloud/datastore/DatastoreServiceFactory.java similarity index 100% rename from src/main/java/com/google/gcloud/datastore/DatastoreServiceFactory.java rename to gcloud-java-datastore/src/main/java/com/google/gcloud/datastore/DatastoreServiceFactory.java diff --git a/src/main/java/com/google/gcloud/datastore/DatastoreServiceImpl.java b/gcloud-java-datastore/src/main/java/com/google/gcloud/datastore/DatastoreServiceImpl.java similarity index 100% rename from src/main/java/com/google/gcloud/datastore/DatastoreServiceImpl.java rename to gcloud-java-datastore/src/main/java/com/google/gcloud/datastore/DatastoreServiceImpl.java diff --git a/src/main/java/com/google/gcloud/datastore/DatastoreServiceOptions.java b/gcloud-java-datastore/src/main/java/com/google/gcloud/datastore/DatastoreServiceOptions.java similarity index 95% rename from src/main/java/com/google/gcloud/datastore/DatastoreServiceOptions.java rename to gcloud-java-datastore/src/main/java/com/google/gcloud/datastore/DatastoreServiceOptions.java index f7b1965d0b29..1dc0855baded 100644 --- a/src/main/java/com/google/gcloud/datastore/DatastoreServiceOptions.java +++ b/gcloud-java-datastore/src/main/java/com/google/gcloud/datastore/DatastoreServiceOptions.java @@ -26,6 +26,8 @@ import com.google.gcloud.ServiceOptions; import com.google.gcloud.spi.DatastoreRpc; import com.google.gcloud.spi.DatastoreRpc.DatastoreRpcException; +import com.google.gcloud.spi.DatastoreRpcFactory; +import com.google.gcloud.spi.DefaultDatastoreRpc; import com.google.gcloud.spi.ServiceRpcProvider; import java.lang.reflect.Method; @@ -185,7 +187,10 @@ DatastoreRpc datastoreRpc() { if (serviceRpcFactory() != null) { datastoreRpc = serviceRpcFactory().create(this); } else { - datastoreRpc = ServiceRpcProvider.datastore(this); + datastoreRpc = ServiceRpcProvider.get(this, DatastoreRpcFactory.class); + if (datastoreRpc == null) { + datastoreRpc = new DefaultDatastoreRpc(this); + } } return datastoreRpc; } diff --git a/src/main/java/com/google/gcloud/datastore/DatastoreWriter.java b/gcloud-java-datastore/src/main/java/com/google/gcloud/datastore/DatastoreWriter.java similarity index 100% rename from src/main/java/com/google/gcloud/datastore/DatastoreWriter.java rename to gcloud-java-datastore/src/main/java/com/google/gcloud/datastore/DatastoreWriter.java diff --git a/src/main/java/com/google/gcloud/datastore/DateTime.java b/gcloud-java-datastore/src/main/java/com/google/gcloud/datastore/DateTime.java similarity index 100% rename from src/main/java/com/google/gcloud/datastore/DateTime.java rename to gcloud-java-datastore/src/main/java/com/google/gcloud/datastore/DateTime.java diff --git a/src/main/java/com/google/gcloud/datastore/DateTimeValue.java b/gcloud-java-datastore/src/main/java/com/google/gcloud/datastore/DateTimeValue.java similarity index 100% rename from src/main/java/com/google/gcloud/datastore/DateTimeValue.java rename to gcloud-java-datastore/src/main/java/com/google/gcloud/datastore/DateTimeValue.java diff --git a/src/main/java/com/google/gcloud/datastore/DoubleValue.java b/gcloud-java-datastore/src/main/java/com/google/gcloud/datastore/DoubleValue.java similarity index 100% rename from src/main/java/com/google/gcloud/datastore/DoubleValue.java rename to gcloud-java-datastore/src/main/java/com/google/gcloud/datastore/DoubleValue.java diff --git a/src/main/java/com/google/gcloud/datastore/Entity.java b/gcloud-java-datastore/src/main/java/com/google/gcloud/datastore/Entity.java similarity index 100% rename from src/main/java/com/google/gcloud/datastore/Entity.java rename to gcloud-java-datastore/src/main/java/com/google/gcloud/datastore/Entity.java diff --git a/src/main/java/com/google/gcloud/datastore/EntityValue.java b/gcloud-java-datastore/src/main/java/com/google/gcloud/datastore/EntityValue.java similarity index 100% rename from src/main/java/com/google/gcloud/datastore/EntityValue.java rename to gcloud-java-datastore/src/main/java/com/google/gcloud/datastore/EntityValue.java diff --git a/src/main/java/com/google/gcloud/datastore/FullEntity.java b/gcloud-java-datastore/src/main/java/com/google/gcloud/datastore/FullEntity.java similarity index 100% rename from src/main/java/com/google/gcloud/datastore/FullEntity.java rename to gcloud-java-datastore/src/main/java/com/google/gcloud/datastore/FullEntity.java diff --git a/src/main/java/com/google/gcloud/datastore/GqlQuery.java b/gcloud-java-datastore/src/main/java/com/google/gcloud/datastore/GqlQuery.java similarity index 100% rename from src/main/java/com/google/gcloud/datastore/GqlQuery.java rename to gcloud-java-datastore/src/main/java/com/google/gcloud/datastore/GqlQuery.java diff --git a/src/main/java/com/google/gcloud/datastore/IncompleteKey.java b/gcloud-java-datastore/src/main/java/com/google/gcloud/datastore/IncompleteKey.java similarity index 100% rename from src/main/java/com/google/gcloud/datastore/IncompleteKey.java rename to gcloud-java-datastore/src/main/java/com/google/gcloud/datastore/IncompleteKey.java diff --git a/src/main/java/com/google/gcloud/datastore/Key.java b/gcloud-java-datastore/src/main/java/com/google/gcloud/datastore/Key.java similarity index 100% rename from src/main/java/com/google/gcloud/datastore/Key.java rename to gcloud-java-datastore/src/main/java/com/google/gcloud/datastore/Key.java diff --git a/src/main/java/com/google/gcloud/datastore/KeyFactory.java b/gcloud-java-datastore/src/main/java/com/google/gcloud/datastore/KeyFactory.java similarity index 100% rename from src/main/java/com/google/gcloud/datastore/KeyFactory.java rename to gcloud-java-datastore/src/main/java/com/google/gcloud/datastore/KeyFactory.java diff --git a/src/main/java/com/google/gcloud/datastore/KeyValue.java b/gcloud-java-datastore/src/main/java/com/google/gcloud/datastore/KeyValue.java similarity index 100% rename from src/main/java/com/google/gcloud/datastore/KeyValue.java rename to gcloud-java-datastore/src/main/java/com/google/gcloud/datastore/KeyValue.java diff --git a/src/main/java/com/google/gcloud/datastore/ListValue.java b/gcloud-java-datastore/src/main/java/com/google/gcloud/datastore/ListValue.java similarity index 100% rename from src/main/java/com/google/gcloud/datastore/ListValue.java rename to gcloud-java-datastore/src/main/java/com/google/gcloud/datastore/ListValue.java diff --git a/src/main/java/com/google/gcloud/datastore/LongValue.java b/gcloud-java-datastore/src/main/java/com/google/gcloud/datastore/LongValue.java similarity index 100% rename from src/main/java/com/google/gcloud/datastore/LongValue.java rename to gcloud-java-datastore/src/main/java/com/google/gcloud/datastore/LongValue.java diff --git a/src/main/java/com/google/gcloud/datastore/NullValue.java b/gcloud-java-datastore/src/main/java/com/google/gcloud/datastore/NullValue.java similarity index 100% rename from src/main/java/com/google/gcloud/datastore/NullValue.java rename to gcloud-java-datastore/src/main/java/com/google/gcloud/datastore/NullValue.java diff --git a/src/main/java/com/google/gcloud/datastore/PathElement.java b/gcloud-java-datastore/src/main/java/com/google/gcloud/datastore/PathElement.java similarity index 100% rename from src/main/java/com/google/gcloud/datastore/PathElement.java rename to gcloud-java-datastore/src/main/java/com/google/gcloud/datastore/PathElement.java diff --git a/src/main/java/com/google/gcloud/datastore/ProjectionEntity.java b/gcloud-java-datastore/src/main/java/com/google/gcloud/datastore/ProjectionEntity.java similarity index 100% rename from src/main/java/com/google/gcloud/datastore/ProjectionEntity.java rename to gcloud-java-datastore/src/main/java/com/google/gcloud/datastore/ProjectionEntity.java diff --git a/src/main/java/com/google/gcloud/datastore/Query.java b/gcloud-java-datastore/src/main/java/com/google/gcloud/datastore/Query.java similarity index 100% rename from src/main/java/com/google/gcloud/datastore/Query.java rename to gcloud-java-datastore/src/main/java/com/google/gcloud/datastore/Query.java diff --git a/src/main/java/com/google/gcloud/datastore/QueryResults.java b/gcloud-java-datastore/src/main/java/com/google/gcloud/datastore/QueryResults.java similarity index 100% rename from src/main/java/com/google/gcloud/datastore/QueryResults.java rename to gcloud-java-datastore/src/main/java/com/google/gcloud/datastore/QueryResults.java diff --git a/src/main/java/com/google/gcloud/datastore/QueryResultsImpl.java b/gcloud-java-datastore/src/main/java/com/google/gcloud/datastore/QueryResultsImpl.java similarity index 100% rename from src/main/java/com/google/gcloud/datastore/QueryResultsImpl.java rename to gcloud-java-datastore/src/main/java/com/google/gcloud/datastore/QueryResultsImpl.java diff --git a/src/main/java/com/google/gcloud/datastore/RawValue.java b/gcloud-java-datastore/src/main/java/com/google/gcloud/datastore/RawValue.java similarity index 100% rename from src/main/java/com/google/gcloud/datastore/RawValue.java rename to gcloud-java-datastore/src/main/java/com/google/gcloud/datastore/RawValue.java diff --git a/src/main/java/com/google/gcloud/datastore/Serializable.java b/gcloud-java-datastore/src/main/java/com/google/gcloud/datastore/Serializable.java similarity index 100% rename from src/main/java/com/google/gcloud/datastore/Serializable.java rename to gcloud-java-datastore/src/main/java/com/google/gcloud/datastore/Serializable.java diff --git a/src/main/java/com/google/gcloud/datastore/StringValue.java b/gcloud-java-datastore/src/main/java/com/google/gcloud/datastore/StringValue.java similarity index 100% rename from src/main/java/com/google/gcloud/datastore/StringValue.java rename to gcloud-java-datastore/src/main/java/com/google/gcloud/datastore/StringValue.java diff --git a/src/main/java/com/google/gcloud/datastore/StructuredQuery.java b/gcloud-java-datastore/src/main/java/com/google/gcloud/datastore/StructuredQuery.java similarity index 100% rename from src/main/java/com/google/gcloud/datastore/StructuredQuery.java rename to gcloud-java-datastore/src/main/java/com/google/gcloud/datastore/StructuredQuery.java diff --git a/src/main/java/com/google/gcloud/datastore/Transaction.java b/gcloud-java-datastore/src/main/java/com/google/gcloud/datastore/Transaction.java similarity index 100% rename from src/main/java/com/google/gcloud/datastore/Transaction.java rename to gcloud-java-datastore/src/main/java/com/google/gcloud/datastore/Transaction.java diff --git a/src/main/java/com/google/gcloud/datastore/TransactionImpl.java b/gcloud-java-datastore/src/main/java/com/google/gcloud/datastore/TransactionImpl.java similarity index 100% rename from src/main/java/com/google/gcloud/datastore/TransactionImpl.java rename to gcloud-java-datastore/src/main/java/com/google/gcloud/datastore/TransactionImpl.java diff --git a/src/main/java/com/google/gcloud/datastore/TransactionOption.java b/gcloud-java-datastore/src/main/java/com/google/gcloud/datastore/TransactionOption.java similarity index 100% rename from src/main/java/com/google/gcloud/datastore/TransactionOption.java rename to gcloud-java-datastore/src/main/java/com/google/gcloud/datastore/TransactionOption.java diff --git a/src/main/java/com/google/gcloud/datastore/Validator.java b/gcloud-java-datastore/src/main/java/com/google/gcloud/datastore/Validator.java similarity index 100% rename from src/main/java/com/google/gcloud/datastore/Validator.java rename to gcloud-java-datastore/src/main/java/com/google/gcloud/datastore/Validator.java diff --git a/src/main/java/com/google/gcloud/datastore/Value.java b/gcloud-java-datastore/src/main/java/com/google/gcloud/datastore/Value.java similarity index 100% rename from src/main/java/com/google/gcloud/datastore/Value.java rename to gcloud-java-datastore/src/main/java/com/google/gcloud/datastore/Value.java diff --git a/src/main/java/com/google/gcloud/datastore/ValueBuilder.java b/gcloud-java-datastore/src/main/java/com/google/gcloud/datastore/ValueBuilder.java similarity index 100% rename from src/main/java/com/google/gcloud/datastore/ValueBuilder.java rename to gcloud-java-datastore/src/main/java/com/google/gcloud/datastore/ValueBuilder.java diff --git a/src/main/java/com/google/gcloud/datastore/ValueMarshaller.java b/gcloud-java-datastore/src/main/java/com/google/gcloud/datastore/ValueMarshaller.java similarity index 100% rename from src/main/java/com/google/gcloud/datastore/ValueMarshaller.java rename to gcloud-java-datastore/src/main/java/com/google/gcloud/datastore/ValueMarshaller.java diff --git a/src/main/java/com/google/gcloud/datastore/ValueType.java b/gcloud-java-datastore/src/main/java/com/google/gcloud/datastore/ValueType.java similarity index 100% rename from src/main/java/com/google/gcloud/datastore/ValueType.java rename to gcloud-java-datastore/src/main/java/com/google/gcloud/datastore/ValueType.java diff --git a/src/main/java/com/google/gcloud/datastore/package-info.java b/gcloud-java-datastore/src/main/java/com/google/gcloud/datastore/package-info.java similarity index 100% rename from src/main/java/com/google/gcloud/datastore/package-info.java rename to gcloud-java-datastore/src/main/java/com/google/gcloud/datastore/package-info.java diff --git a/src/main/java/com/google/gcloud/spi/DatastoreRpc.java b/gcloud-java-datastore/src/main/java/com/google/gcloud/spi/DatastoreRpc.java similarity index 100% rename from src/main/java/com/google/gcloud/spi/DatastoreRpc.java rename to gcloud-java-datastore/src/main/java/com/google/gcloud/spi/DatastoreRpc.java diff --git a/gcloud-java-datastore/src/main/java/com/google/gcloud/spi/DatastoreRpcFactory.java b/gcloud-java-datastore/src/main/java/com/google/gcloud/spi/DatastoreRpcFactory.java new file mode 100644 index 000000000000..de9e87e4fa2e --- /dev/null +++ b/gcloud-java-datastore/src/main/java/com/google/gcloud/spi/DatastoreRpcFactory.java @@ -0,0 +1,24 @@ +/* + * 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.gcloud.datastore.DatastoreServiceOptions; + +public interface DatastoreRpcFactory extends + ServiceRpcFactory { +} + diff --git a/gcloud-java-datastore/src/main/java/com/google/gcloud/spi/DefaultDatastoreRpc.java b/gcloud-java-datastore/src/main/java/com/google/gcloud/spi/DefaultDatastoreRpc.java new file mode 100644 index 000000000000..3d909d368bc0 --- /dev/null +++ b/gcloud-java-datastore/src/main/java/com/google/gcloud/spi/DefaultDatastoreRpc.java @@ -0,0 +1,151 @@ +/* + * 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.services.datastore.DatastoreV1.AllocateIdsRequest; +import com.google.api.services.datastore.DatastoreV1.AllocateIdsResponse; +import com.google.api.services.datastore.DatastoreV1.BeginTransactionRequest; +import com.google.api.services.datastore.DatastoreV1.BeginTransactionResponse; +import com.google.api.services.datastore.DatastoreV1.CommitRequest; +import com.google.api.services.datastore.DatastoreV1.CommitResponse; +import com.google.api.services.datastore.DatastoreV1.LookupRequest; +import com.google.api.services.datastore.DatastoreV1.LookupResponse; +import com.google.api.services.datastore.DatastoreV1.RollbackRequest; +import com.google.api.services.datastore.DatastoreV1.RollbackResponse; +import com.google.api.services.datastore.DatastoreV1.RunQueryRequest; +import com.google.api.services.datastore.DatastoreV1.RunQueryResponse; +import com.google.api.services.datastore.client.Datastore; +import com.google.api.services.datastore.client.DatastoreException; +import com.google.api.services.datastore.client.DatastoreFactory; +import com.google.api.services.datastore.client.DatastoreOptions.Builder; +import com.google.common.collect.ImmutableMap; +import com.google.gcloud.datastore.DatastoreServiceOptions; +import com.google.gcloud.spi.DatastoreRpc.DatastoreRpcException.Reason; + +import org.json.JSONException; +import org.json.JSONObject; +import org.json.JSONTokener; + +import java.util.HashMap; +import java.util.Map; + +public class DefaultDatastoreRpc implements DatastoreRpc { + + private final Datastore client; + + private static final ImmutableMap STR_TO_REASON; + private static final ImmutableMap HTTP_STATUS_TO_REASON; + + static { + ImmutableMap.Builder builder = ImmutableMap.builder(); + Map httpCodes = new HashMap<>(); + for (Reason reason : Reason.values()) { + builder.put(reason.name(), reason); + httpCodes.put(reason.httpStatus(), reason); + } + STR_TO_REASON = builder.build(); + HTTP_STATUS_TO_REASON = ImmutableMap.copyOf(httpCodes); + } + + public DefaultDatastoreRpc(DatastoreServiceOptions options) { + client = DatastoreFactory.get().create( + new Builder() + .dataset(options.projectId()) + .host(options.host()) + .initializer(options.httpRequestInitializer()) + .build()); + } + + private static DatastoreRpcException translate(DatastoreException exception) { + String message = exception.getMessage(); + String reasonStr = ""; + if (message != null) { + try { + JSONObject json = new JSONObject(new JSONTokener(message)); + JSONObject error = json.getJSONObject("error").getJSONArray("errors").getJSONObject(0); + reasonStr = error.getString("reason"); + message = error.getString("message"); + } catch (JSONException ignore) { + // ignore - will be converted to unknown + } + } + Reason reason = STR_TO_REASON.get(reasonStr); + if (reason == null) { + reason = HTTP_STATUS_TO_REASON.get(exception.getCode()); + } + return reason != null + ? new DatastoreRpcException(reason) + : new DatastoreRpcException("Unknown", exception.getCode(), false, message); + } + + @Override + public AllocateIdsResponse allocateIds(AllocateIdsRequest request) + throws DatastoreRpcException { + try { + return client.allocateIds(request); + } catch (DatastoreException ex) { + throw translate(ex); + } + } + + @Override + public BeginTransactionResponse beginTransaction(BeginTransactionRequest request) + throws DatastoreRpcException { + try { + return client.beginTransaction(request); + } catch (DatastoreException ex) { + throw translate(ex); + } + } + + @Override + public CommitResponse commit(CommitRequest request) throws DatastoreRpcException { + try { + return client.commit(request); + } catch (DatastoreException ex) { + throw translate(ex); + } + } + + @Override + public LookupResponse lookup(LookupRequest request) throws DatastoreRpcException { + try { + return client.lookup(request); + } catch (DatastoreException ex) { + throw translate(ex); + } + } + + @Override + public RollbackResponse rollback(RollbackRequest request) throws DatastoreRpcException { + try { + return client.rollback(request); + } catch (DatastoreException ex) { + throw translate(ex); + } + } + + @Override + public RunQueryResponse runQuery(RunQueryRequest request) throws DatastoreRpcException { + try { + return client.runQuery(request); + } catch (DatastoreException ex) { + throw translate(ex); + } + } +} + diff --git a/src/test/java/com/google/gcloud/datastore/BaseDatastoreBatchWriterTest.java b/gcloud-java-datastore/src/test/java/com/google/gcloud/datastore/BaseDatastoreBatchWriterTest.java similarity index 100% rename from src/test/java/com/google/gcloud/datastore/BaseDatastoreBatchWriterTest.java rename to gcloud-java-datastore/src/test/java/com/google/gcloud/datastore/BaseDatastoreBatchWriterTest.java diff --git a/src/test/java/com/google/gcloud/datastore/BaseEntityTest.java b/gcloud-java-datastore/src/test/java/com/google/gcloud/datastore/BaseEntityTest.java similarity index 100% rename from src/test/java/com/google/gcloud/datastore/BaseEntityTest.java rename to gcloud-java-datastore/src/test/java/com/google/gcloud/datastore/BaseEntityTest.java diff --git a/src/test/java/com/google/gcloud/datastore/BaseKeyTest.java b/gcloud-java-datastore/src/test/java/com/google/gcloud/datastore/BaseKeyTest.java similarity index 100% rename from src/test/java/com/google/gcloud/datastore/BaseKeyTest.java rename to gcloud-java-datastore/src/test/java/com/google/gcloud/datastore/BaseKeyTest.java diff --git a/src/test/java/com/google/gcloud/datastore/BlobTest.java b/gcloud-java-datastore/src/test/java/com/google/gcloud/datastore/BlobTest.java similarity index 100% rename from src/test/java/com/google/gcloud/datastore/BlobTest.java rename to gcloud-java-datastore/src/test/java/com/google/gcloud/datastore/BlobTest.java diff --git a/src/test/java/com/google/gcloud/datastore/BlobValueTest.java b/gcloud-java-datastore/src/test/java/com/google/gcloud/datastore/BlobValueTest.java similarity index 100% rename from src/test/java/com/google/gcloud/datastore/BlobValueTest.java rename to gcloud-java-datastore/src/test/java/com/google/gcloud/datastore/BlobValueTest.java diff --git a/src/test/java/com/google/gcloud/datastore/BooleanValueTest.java b/gcloud-java-datastore/src/test/java/com/google/gcloud/datastore/BooleanValueTest.java similarity index 100% rename from src/test/java/com/google/gcloud/datastore/BooleanValueTest.java rename to gcloud-java-datastore/src/test/java/com/google/gcloud/datastore/BooleanValueTest.java diff --git a/src/test/java/com/google/gcloud/datastore/CursorTest.java b/gcloud-java-datastore/src/test/java/com/google/gcloud/datastore/CursorTest.java similarity index 100% rename from src/test/java/com/google/gcloud/datastore/CursorTest.java rename to gcloud-java-datastore/src/test/java/com/google/gcloud/datastore/CursorTest.java diff --git a/src/test/java/com/google/gcloud/datastore/DatastoreHelperTest.java b/gcloud-java-datastore/src/test/java/com/google/gcloud/datastore/DatastoreHelperTest.java similarity index 100% rename from src/test/java/com/google/gcloud/datastore/DatastoreHelperTest.java rename to gcloud-java-datastore/src/test/java/com/google/gcloud/datastore/DatastoreHelperTest.java diff --git a/src/test/java/com/google/gcloud/datastore/DatastoreServiceExceptionTest.java b/gcloud-java-datastore/src/test/java/com/google/gcloud/datastore/DatastoreServiceExceptionTest.java similarity index 100% rename from src/test/java/com/google/gcloud/datastore/DatastoreServiceExceptionTest.java rename to gcloud-java-datastore/src/test/java/com/google/gcloud/datastore/DatastoreServiceExceptionTest.java diff --git a/src/test/java/com/google/gcloud/datastore/DatastoreServiceOptionsTest.java b/gcloud-java-datastore/src/test/java/com/google/gcloud/datastore/DatastoreServiceOptionsTest.java similarity index 100% rename from src/test/java/com/google/gcloud/datastore/DatastoreServiceOptionsTest.java rename to gcloud-java-datastore/src/test/java/com/google/gcloud/datastore/DatastoreServiceOptionsTest.java diff --git a/src/test/java/com/google/gcloud/datastore/DatastoreServiceTest.java b/gcloud-java-datastore/src/test/java/com/google/gcloud/datastore/DatastoreServiceTest.java similarity index 100% rename from src/test/java/com/google/gcloud/datastore/DatastoreServiceTest.java rename to gcloud-java-datastore/src/test/java/com/google/gcloud/datastore/DatastoreServiceTest.java diff --git a/src/test/java/com/google/gcloud/datastore/DateTimeTest.java b/gcloud-java-datastore/src/test/java/com/google/gcloud/datastore/DateTimeTest.java similarity index 100% rename from src/test/java/com/google/gcloud/datastore/DateTimeTest.java rename to gcloud-java-datastore/src/test/java/com/google/gcloud/datastore/DateTimeTest.java diff --git a/src/test/java/com/google/gcloud/datastore/DateTimeValueTest.java b/gcloud-java-datastore/src/test/java/com/google/gcloud/datastore/DateTimeValueTest.java similarity index 100% rename from src/test/java/com/google/gcloud/datastore/DateTimeValueTest.java rename to gcloud-java-datastore/src/test/java/com/google/gcloud/datastore/DateTimeValueTest.java diff --git a/src/test/java/com/google/gcloud/datastore/DoubleValueTest.java b/gcloud-java-datastore/src/test/java/com/google/gcloud/datastore/DoubleValueTest.java similarity index 100% rename from src/test/java/com/google/gcloud/datastore/DoubleValueTest.java rename to gcloud-java-datastore/src/test/java/com/google/gcloud/datastore/DoubleValueTest.java diff --git a/src/test/java/com/google/gcloud/datastore/EntityTest.java b/gcloud-java-datastore/src/test/java/com/google/gcloud/datastore/EntityTest.java similarity index 100% rename from src/test/java/com/google/gcloud/datastore/EntityTest.java rename to gcloud-java-datastore/src/test/java/com/google/gcloud/datastore/EntityTest.java diff --git a/src/test/java/com/google/gcloud/datastore/EntityValueTest.java b/gcloud-java-datastore/src/test/java/com/google/gcloud/datastore/EntityValueTest.java similarity index 100% rename from src/test/java/com/google/gcloud/datastore/EntityValueTest.java rename to gcloud-java-datastore/src/test/java/com/google/gcloud/datastore/EntityValueTest.java diff --git a/src/test/java/com/google/gcloud/datastore/FullEntityTest.java b/gcloud-java-datastore/src/test/java/com/google/gcloud/datastore/FullEntityTest.java similarity index 100% rename from src/test/java/com/google/gcloud/datastore/FullEntityTest.java rename to gcloud-java-datastore/src/test/java/com/google/gcloud/datastore/FullEntityTest.java diff --git a/src/test/java/com/google/gcloud/datastore/IncompleteKeyTest.java b/gcloud-java-datastore/src/test/java/com/google/gcloud/datastore/IncompleteKeyTest.java similarity index 100% rename from src/test/java/com/google/gcloud/datastore/IncompleteKeyTest.java rename to gcloud-java-datastore/src/test/java/com/google/gcloud/datastore/IncompleteKeyTest.java diff --git a/src/test/java/com/google/gcloud/datastore/KeyFactoryTest.java b/gcloud-java-datastore/src/test/java/com/google/gcloud/datastore/KeyFactoryTest.java similarity index 100% rename from src/test/java/com/google/gcloud/datastore/KeyFactoryTest.java rename to gcloud-java-datastore/src/test/java/com/google/gcloud/datastore/KeyFactoryTest.java diff --git a/src/test/java/com/google/gcloud/datastore/KeyTest.java b/gcloud-java-datastore/src/test/java/com/google/gcloud/datastore/KeyTest.java similarity index 100% rename from src/test/java/com/google/gcloud/datastore/KeyTest.java rename to gcloud-java-datastore/src/test/java/com/google/gcloud/datastore/KeyTest.java diff --git a/src/test/java/com/google/gcloud/datastore/KeyValueTest.java b/gcloud-java-datastore/src/test/java/com/google/gcloud/datastore/KeyValueTest.java similarity index 100% rename from src/test/java/com/google/gcloud/datastore/KeyValueTest.java rename to gcloud-java-datastore/src/test/java/com/google/gcloud/datastore/KeyValueTest.java diff --git a/src/test/java/com/google/gcloud/datastore/ListValueTest.java b/gcloud-java-datastore/src/test/java/com/google/gcloud/datastore/ListValueTest.java similarity index 100% rename from src/test/java/com/google/gcloud/datastore/ListValueTest.java rename to gcloud-java-datastore/src/test/java/com/google/gcloud/datastore/ListValueTest.java diff --git a/src/test/java/com/google/gcloud/datastore/LocalGcdHelper.java b/gcloud-java-datastore/src/test/java/com/google/gcloud/datastore/LocalGcdHelper.java similarity index 100% rename from src/test/java/com/google/gcloud/datastore/LocalGcdHelper.java rename to gcloud-java-datastore/src/test/java/com/google/gcloud/datastore/LocalGcdHelper.java diff --git a/src/test/java/com/google/gcloud/datastore/LongValueTest.java b/gcloud-java-datastore/src/test/java/com/google/gcloud/datastore/LongValueTest.java similarity index 100% rename from src/test/java/com/google/gcloud/datastore/LongValueTest.java rename to gcloud-java-datastore/src/test/java/com/google/gcloud/datastore/LongValueTest.java diff --git a/src/test/java/com/google/gcloud/datastore/NullValueTest.java b/gcloud-java-datastore/src/test/java/com/google/gcloud/datastore/NullValueTest.java similarity index 100% rename from src/test/java/com/google/gcloud/datastore/NullValueTest.java rename to gcloud-java-datastore/src/test/java/com/google/gcloud/datastore/NullValueTest.java diff --git a/src/test/java/com/google/gcloud/datastore/PathElementTest.java b/gcloud-java-datastore/src/test/java/com/google/gcloud/datastore/PathElementTest.java similarity index 100% rename from src/test/java/com/google/gcloud/datastore/PathElementTest.java rename to gcloud-java-datastore/src/test/java/com/google/gcloud/datastore/PathElementTest.java diff --git a/src/test/java/com/google/gcloud/datastore/ProjectionEntityTest.java b/gcloud-java-datastore/src/test/java/com/google/gcloud/datastore/ProjectionEntityTest.java similarity index 100% rename from src/test/java/com/google/gcloud/datastore/ProjectionEntityTest.java rename to gcloud-java-datastore/src/test/java/com/google/gcloud/datastore/ProjectionEntityTest.java diff --git a/src/test/java/com/google/gcloud/datastore/RawValueTest.java b/gcloud-java-datastore/src/test/java/com/google/gcloud/datastore/RawValueTest.java similarity index 100% rename from src/test/java/com/google/gcloud/datastore/RawValueTest.java rename to gcloud-java-datastore/src/test/java/com/google/gcloud/datastore/RawValueTest.java diff --git a/src/test/java/com/google/gcloud/datastore/SerializationTest.java b/gcloud-java-datastore/src/test/java/com/google/gcloud/datastore/SerializationTest.java similarity index 100% rename from src/test/java/com/google/gcloud/datastore/SerializationTest.java rename to gcloud-java-datastore/src/test/java/com/google/gcloud/datastore/SerializationTest.java diff --git a/src/test/java/com/google/gcloud/datastore/StringValueTest.java b/gcloud-java-datastore/src/test/java/com/google/gcloud/datastore/StringValueTest.java similarity index 100% rename from src/test/java/com/google/gcloud/datastore/StringValueTest.java rename to gcloud-java-datastore/src/test/java/com/google/gcloud/datastore/StringValueTest.java diff --git a/src/test/java/com/google/gcloud/datastore/ValueTest.java b/gcloud-java-datastore/src/test/java/com/google/gcloud/datastore/ValueTest.java similarity index 100% rename from src/test/java/com/google/gcloud/datastore/ValueTest.java rename to gcloud-java-datastore/src/test/java/com/google/gcloud/datastore/ValueTest.java diff --git a/src/test/resources/gcd-head.zip b/gcloud-java-datastore/src/test/resources/gcd-head.zip similarity index 100% rename from src/test/resources/gcd-head.zip rename to gcloud-java-datastore/src/test/resources/gcd-head.zip diff --git a/gcloud-java-examples/README.md b/gcloud-java-examples/README.md new file mode 100644 index 000000000000..59df6ced388f --- /dev/null +++ b/gcloud-java-examples/README.md @@ -0,0 +1,55 @@ +Google Cloud Java Client Examples +================================= + +Examples for gcloud-java (Java idiomatic client for [Google Cloud Platform][cloud-platform] services). + +[![Build Status](https://travis-ci.org/GoogleCloudPlatform/gcloud-java.svg?branch=master)](https://travis-ci.org/GoogleCloudPlatform/gcloud-java) +[![Coverage Status](https://coveralls.io/repos/GoogleCloudPlatform/gcloud-java/badge.svg?branch=master)](https://coveralls.io/r/GoogleCloudPlatform/gcloud-java?branch=master) + +- [Homepage] (https://googlecloudplatform.github.io/gcloud-java/) +- [API Documentation] (http://googlecloudplatform.github.io/gcloud-java/apidocs) +- [Examples] (http://googlecloudplatform.github.io/gcloud-java/apidocs/index.html?com/google/gcloud/examples/package-summary.html) + + +Quickstart +---------- +Add this to your pom.xml file +```xml + + com.google.gcloud + gcloud-java-examples + LATEST + +``` + + +Contributing +------------ + +Contributions to this library are always welcome and highly encouraged. + +See [CONTRIBUTING] for more information on how to get started. + +Java Versions +------------- + +Java 7 or above is required for using this client. + +Versioning +---------- + +This library follows [Semantic Versioning] (http://semver.org/). + +It is currently in major version zero (``0.y.z``), which means that anything +may change at any time and the public API should not be considered +stable. + +License +------- + +Apache 2.0 - See [LICENSE] for more information. + + +[CONTRIBUTING]:https://github.com/GoogleCloudPlatform/gcloud-java/blob/master/CONTRIBUTING.md +[LICENSE]: https://github.com/GoogleCloudPlatform/gcloud-java/blob/master/LICENSE +[cloud-platform]: https://cloud.google.com/ diff --git a/gcloud-java-examples/pom.xml b/gcloud-java-examples/pom.xml new file mode 100644 index 000000000000..ac1ef9f667cb --- /dev/null +++ b/gcloud-java-examples/pom.xml @@ -0,0 +1,37 @@ + + + 4.0.0 + com.google.gcloud + gcloud-java-examples + jar + GCloud Java examples + https://github.com/GoogleCloudPlatform/gcloud-java + + Examples for gcloud-java. + + + com.google.gcloud + gcloud-java-pom + 0.0.5 + + + + ${project.groupId} + gcloud-java + ${project.version} + + + + + + org.apache.maven.plugins + maven-site-plugin + 3.1 + + true + true + + + + + diff --git a/src/main/java/com/google/gcloud/examples/DatastoreExample.java b/gcloud-java-examples/src/main/java/com/google/gcloud/examples/DatastoreExample.java similarity index 100% rename from src/main/java/com/google/gcloud/examples/DatastoreExample.java rename to gcloud-java-examples/src/main/java/com/google/gcloud/examples/DatastoreExample.java diff --git a/src/main/java/com/google/gcloud/examples/StorageExample.java b/gcloud-java-examples/src/main/java/com/google/gcloud/examples/StorageExample.java similarity index 100% rename from src/main/java/com/google/gcloud/examples/StorageExample.java rename to gcloud-java-examples/src/main/java/com/google/gcloud/examples/StorageExample.java diff --git a/gcloud-java-storage/README.md b/gcloud-java-storage/README.md new file mode 100644 index 000000000000..aa090743f5ce --- /dev/null +++ b/gcloud-java-storage/README.md @@ -0,0 +1,63 @@ +Google Cloud Java Client +========================== + +Java idiomatic client for [Google Cloud Platform][cloud-platform] services. + +[![Build Status](https://travis-ci.org/GoogleCloudPlatform/gcloud-java.svg?branch=master)](https://travis-ci.org/GoogleCloudPlatform/gcloud-java) +[![Coverage Status](https://coveralls.io/repos/GoogleCloudPlatform/gcloud-java/badge.svg?branch=master)](https://coveralls.io/r/GoogleCloudPlatform/gcloud-java?branch=master) + +- [Homepage] (https://googlecloudplatform.github.io/gcloud-java/) +- [API Documentation] (http://googlecloudplatform.github.io/gcloud-java/apidocs) +- [Examples] (http://googlecloudplatform.github.io/gcloud-java/apidocs/index.html?com/google/gcloud/examples/package-summary.html) + +This client supports the [Google Cloud Storage] (https://cloud.google.com/storage/) + +> Note: This client is a work-in-progress, and may occasionally +> make backwards-incompatible changes. + +Quickstart +---------- +Add this to your pom.xml file +```xml + + com.google.gcloud + gcloud-java-storage + LATEST + +``` + + +Contributing +------------ + +Contributions to this library are always welcome and highly encouraged. + +See [CONTRIBUTING] for more information on how to get started. + +Java Versions +------------- + +Java 7 or above is required for using this client. + +Versioning +---------- + +This library follows [Semantic Versioning] (http://semver.org/). + +It is currently in major version zero (``0.y.z``), which means that anything +may change at any time and the public API should not be considered +stable. + +License +------- + +Apache 2.0 - See [LICENSE] for more information. + + +[CONTRIBUTING]:https://github.com/GoogleCloudPlatform/gcloud-java/blob/master/CONTRIBUTING.md +[LICENSE]: https://github.com/GoogleCloudPlatform/gcloud-java/blob/master/LICENSE +[cloud-platform]: https://cloud.google.com/ + +[cloud-storage]: https://cloud.google.com/storage/ +[cloud-storage-docs]: https://cloud.google.com/storage/docs/overview +[cloud-storage-create-bucket]: https://cloud.google.com/storage/docs/cloud-console#_creatingbuckets diff --git a/gcloud-java-storage/pom.xml b/gcloud-java-storage/pom.xml new file mode 100644 index 000000000000..29731998eeca --- /dev/null +++ b/gcloud-java-storage/pom.xml @@ -0,0 +1,39 @@ + + + 4.0.0 + com.google.gcloud + gcloud-java-storage + jar + GCloud Java storage + https://github.com/GoogleCloudPlatform/gcloud-java + + com.google.gcloud + gcloud-java-pom + 0.0.5 + + + + ${project.groupId} + gcloud-java-core + ${project.version} + + + com.google.apis + google-api-services-storage + v1-rev33-1.20.0 + compile + + + junit + junit + 4.12 + test + + + org.easymock + easymock + 3.3 + test + + + diff --git a/gcloud-java-storage/src/main/java/com/google/gcloud/spi/DefaultStorageRpc.java b/gcloud-java-storage/src/main/java/com/google/gcloud/spi/DefaultStorageRpc.java new file mode 100644 index 000000000000..e27d837d7173 --- /dev/null +++ b/gcloud-java-storage/src/main/java/com/google/gcloud/spi/DefaultStorageRpc.java @@ -0,0 +1,525 @@ +/* + * 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 static com.google.gcloud.spi.StorageRpc.Option.DELIMITER; +import static com.google.gcloud.spi.StorageRpc.Option.IF_GENERATION_MATCH; +import static com.google.gcloud.spi.StorageRpc.Option.IF_GENERATION_NOT_MATCH; +import static com.google.gcloud.spi.StorageRpc.Option.IF_METAGENERATION_MATCH; +import static com.google.gcloud.spi.StorageRpc.Option.IF_METAGENERATION_NOT_MATCH; +import static com.google.gcloud.spi.StorageRpc.Option.IF_SOURCE_GENERATION_MATCH; +import static com.google.gcloud.spi.StorageRpc.Option.IF_SOURCE_GENERATION_NOT_MATCH; +import static com.google.gcloud.spi.StorageRpc.Option.IF_SOURCE_METAGENERATION_MATCH; +import static com.google.gcloud.spi.StorageRpc.Option.IF_SOURCE_METAGENERATION_NOT_MATCH; +import static com.google.gcloud.spi.StorageRpc.Option.MAX_RESULTS; +import static com.google.gcloud.spi.StorageRpc.Option.PAGE_TOKEN; +import static com.google.gcloud.spi.StorageRpc.Option.PREDEFINED_ACL; +import static com.google.gcloud.spi.StorageRpc.Option.PREDEFINED_DEFAULT_OBJECT_ACL; +import static com.google.gcloud.spi.StorageRpc.Option.PREFIX; +import static com.google.gcloud.spi.StorageRpc.Option.VERSIONS; + +import com.google.api.client.googleapis.batch.json.JsonBatchCallback; +import com.google.api.client.googleapis.json.GoogleJsonError; +import com.google.api.client.googleapis.json.GoogleJsonResponseException; +import com.google.api.client.googleapis.media.MediaHttpDownloader; +import com.google.api.client.http.ByteArrayContent; +import com.google.api.client.http.GenericUrl; +import com.google.api.client.http.HttpHeaders; +import com.google.api.client.http.HttpRequest; +import com.google.api.client.http.HttpRequestFactory; +import com.google.api.client.http.HttpRequestInitializer; +import com.google.api.client.http.HttpResponse; +import com.google.api.client.http.HttpResponseException; +import com.google.api.client.http.HttpTransport; +import com.google.api.client.http.json.JsonHttpContent; +import com.google.api.client.json.JsonFactory; +import com.google.api.client.json.jackson.JacksonFactory; +import com.google.api.services.storage.Storage; +import com.google.api.services.storage.Storage.Objects.Get; +import com.google.api.services.storage.Storage.Objects.Insert; +import com.google.api.services.storage.model.Bucket; +import com.google.api.services.storage.model.Buckets; +import com.google.api.services.storage.model.ComposeRequest; +import com.google.api.services.storage.model.ComposeRequest.SourceObjects.ObjectPreconditions; +import com.google.api.services.storage.model.Objects; +import com.google.api.services.storage.model.StorageObject; +import com.google.common.base.MoreObjects; +import com.google.common.collect.ImmutableSet; +import com.google.common.collect.Maps; +import com.google.gcloud.storage.StorageServiceException; +import com.google.gcloud.storage.StorageServiceOptions; + +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.Set; + +public class DefaultStorageRpc implements StorageRpc { + + public static final String DEFAULT_PROJECTION = "full"; + private final StorageServiceOptions options; + private final Storage storage; + + // see: https://cloud.google.com/storage/docs/concepts-techniques#practices + private static final Set RETRYABLE_CODES = ImmutableSet.of(504, 503, 502, 500, 408); + + public DefaultStorageRpc(StorageServiceOptions options) { + HttpTransport transport = options.httpTransportFactory().create(); + HttpRequestInitializer initializer = options.httpRequestInitializer(); + this.options = options; + storage = new Storage.Builder(transport, new JacksonFactory(), initializer) + .setApplicationName("gcloud-java") + .build(); + // Todo: make sure nulls are being used as Data.asNull() + } + + private static StorageServiceException translate(IOException exception) { + StorageServiceException translated; + if (exception instanceof GoogleJsonResponseException) { + translated = translate(((GoogleJsonResponseException) exception).getDetails()); + } else { + translated = new StorageServiceException(0, exception.getMessage(), false); + } + translated.initCause(exception); + return translated; + } + + private static StorageServiceException translate(GoogleJsonError exception) { + boolean retryable = RETRYABLE_CODES.contains(exception.getCode()) + || "InternalError".equals(exception.getMessage()); + return new StorageServiceException(exception.getCode(), exception.getMessage(), retryable); + } + + @Override + public Bucket create(Bucket bucket, Map options) throws StorageServiceException { + try { + return storage.buckets() + .insert(this.options.projectId(), bucket) + .setProjection(DEFAULT_PROJECTION) + .setPredefinedAcl(PREDEFINED_ACL.getString(options)) + .setPredefinedDefaultObjectAcl(PREDEFINED_DEFAULT_OBJECT_ACL.getString(options)) + .execute(); + } catch (IOException ex) { + throw translate(ex); + } + } + + @Override + public StorageObject create(StorageObject storageObject, final byte[] content, + Map options) throws StorageServiceException { + try { + return storage.objects() + .insert(storageObject.getBucket(), storageObject, + new ByteArrayContent(storageObject.getContentType(), content)) + .setProjection(DEFAULT_PROJECTION) + .setPredefinedAcl(PREDEFINED_ACL.getString(options)) + .setIfMetagenerationMatch(IF_METAGENERATION_MATCH.getLong(options)) + .setIfMetagenerationNotMatch(IF_METAGENERATION_NOT_MATCH.getLong(options)) + .setIfGenerationMatch(IF_GENERATION_MATCH.getLong(options)) + .setIfGenerationNotMatch(IF_GENERATION_NOT_MATCH.getLong(options)) + .execute(); + } catch (IOException ex) { + throw translate(ex); + } + } + + @Override + public Tuple> list(Map options) { + try { + Buckets buckets = storage.buckets() + .list(this.options.projectId()) + .setProjection(DEFAULT_PROJECTION) + .setPrefix(PREFIX.getString(options)) + .setMaxResults(MAX_RESULTS.getLong(options)) + .setPageToken(PAGE_TOKEN.getString(options)) + .execute(); + return Tuple.>of(buckets.getNextPageToken(), buckets.getItems()); + } catch (IOException ex) { + throw translate(ex); + } + } + + @Override + public Tuple> list(String bucket, Map options) { + try { + Objects objects = storage.objects() + .list(bucket) + .setProjection(DEFAULT_PROJECTION) + .setVersions(VERSIONS.getBoolean(options)) + .setDelimiter(DELIMITER.getString(options)) + .setPrefix(PREFIX.getString(options)) + .setMaxResults(MAX_RESULTS.getLong(options)) + .setPageToken(PAGE_TOKEN.getString(options)) + .execute(); + return Tuple.>of( + objects.getNextPageToken(), objects.getItems()); + } catch (IOException ex) { + throw translate(ex); + } + } + + @Override + public Bucket get(Bucket bucket, Map options) { + try { + return storage.buckets() + .get(bucket.getName()) + .setProjection(DEFAULT_PROJECTION) + .setIfMetagenerationMatch(IF_METAGENERATION_MATCH.getLong(options)) + .setIfMetagenerationNotMatch(IF_METAGENERATION_NOT_MATCH.getLong(options)) + .execute(); + } catch (IOException ex) { + throw translate(ex); + } + } + + @Override + public StorageObject get(StorageObject object, Map options) { + try { + return getRequest(object, options).execute(); + } catch (IOException ex) { + throw translate(ex); + } + } + + private Storage.Objects.Get getRequest(StorageObject object, Map options) + throws IOException { + return storage.objects() + .get(object.getBucket(), object.getName()) + .setProjection(DEFAULT_PROJECTION) + .setIfMetagenerationMatch(IF_METAGENERATION_MATCH.getLong(options)) + .setIfMetagenerationNotMatch(IF_METAGENERATION_NOT_MATCH.getLong(options)) + .setIfGenerationMatch(IF_GENERATION_MATCH.getLong(options)) + .setIfGenerationNotMatch(IF_GENERATION_NOT_MATCH.getLong(options)); + } + + @Override + public Bucket patch(Bucket bucket, Map options) { + try { + return storage.buckets() + .patch(bucket.getName(), bucket) + .setProjection(DEFAULT_PROJECTION) + .setPredefinedAcl(PREDEFINED_ACL.getString(options)) + .setPredefinedDefaultObjectAcl(PREDEFINED_DEFAULT_OBJECT_ACL.getString(options)) + .setIfMetagenerationMatch(IF_METAGENERATION_MATCH.getLong(options)) + .setIfMetagenerationNotMatch(IF_METAGENERATION_NOT_MATCH.getLong(options)) + .execute(); + } catch (IOException ex) { + throw translate(ex); + } + } + + @Override + public StorageObject patch(StorageObject storageObject, Map options) { + try { + return patchRequest(storageObject, options).execute(); + } catch (IOException ex) { + throw translate(ex); + } + } + + private Storage.Objects.Patch patchRequest(StorageObject storageObject, Map options) + throws IOException { + return storage.objects() + .patch(storageObject.getBucket(), storageObject.getName(), storageObject) + .setProjection(DEFAULT_PROJECTION) + .setPredefinedAcl(PREDEFINED_ACL.getString(options)) + .setIfMetagenerationMatch(IF_METAGENERATION_MATCH.getLong(options)) + .setIfMetagenerationNotMatch(IF_METAGENERATION_NOT_MATCH.getLong(options)) + .setIfGenerationMatch(IF_GENERATION_MATCH.getLong(options)) + .setIfGenerationNotMatch(IF_GENERATION_NOT_MATCH.getLong(options)); + } + + @Override + public boolean delete(Bucket bucket, Map options) { + try { + storage.buckets() + .delete(bucket.getName()) + .setIfMetagenerationMatch(IF_METAGENERATION_MATCH.getLong(options)) + .setIfMetagenerationNotMatch(IF_METAGENERATION_NOT_MATCH.getLong(options)) + .execute(); + return true; + } catch (IOException ex) { + StorageServiceException serviceException = translate(ex); + if (serviceException.code() == 404) { + return false; + } + throw serviceException; + } + } + + @Override + public boolean delete(StorageObject blob, Map options) { + try { + deleteRequest(blob, options).execute(); + return true; + } catch (IOException ex) { + StorageServiceException serviceException = translate(ex); + if (serviceException.code() == 404) { + return false; + } + throw serviceException; + } + } + + private Storage.Objects.Delete deleteRequest(StorageObject blob, Map options) + throws IOException { + return storage.objects() + .delete(blob.getBucket(), blob.getName()) + .setIfMetagenerationMatch(IF_METAGENERATION_MATCH.getLong(options)) + .setIfMetagenerationNotMatch(IF_METAGENERATION_NOT_MATCH.getLong(options)) + .setIfGenerationMatch(IF_GENERATION_MATCH.getLong(options)) + .setIfGenerationMatch(100L) + .setIfGenerationNotMatch(IF_GENERATION_NOT_MATCH.getLong(options)); + } + + @Override + public StorageObject compose(Iterable sources, StorageObject target, + Map targetOptions) throws StorageServiceException { + ComposeRequest request = new ComposeRequest(); + if (target.getContentType() == null) { + // todo: remove once this is no longer requirement (b/20681287). + target.setContentType("application/octet-stream"); + } + request.setDestination(target); + List sourceObjects = new ArrayList<>(); + for (StorageObject source : sources) { + ComposeRequest.SourceObjects sourceObject = new ComposeRequest.SourceObjects(); + sourceObject.setName(source.getName()); + Long generation = source.getGeneration(); + if (generation != null) { + sourceObject.setGeneration(generation); + sourceObject.setObjectPreconditions( + new ObjectPreconditions().setIfGenerationMatch(generation)); + } + sourceObjects.add(sourceObject); + } + request.setSourceObjects(sourceObjects); + try { + // todo: missing setProjection (b/20659000) + return storage.objects() + .compose(target.getBucket(), target.getName(), request) + .setIfMetagenerationMatch(IF_METAGENERATION_MATCH.getLong(targetOptions)) + .setIfGenerationMatch(IF_GENERATION_MATCH.getLong(targetOptions)) + .execute(); + } catch (IOException ex) { + throw translate(ex); + } + } + + @Override + public StorageObject copy(StorageObject source, Map sourceOptions, + StorageObject target, Map targetOptions) throws StorageServiceException { + try { + return storage + .objects() + .copy(source.getBucket(), source.getName(), target.getBucket(), target.getName(), + target.getContentType() != null ? target : null) + .setProjection(DEFAULT_PROJECTION) + .setIfMetagenerationMatch(IF_SOURCE_METAGENERATION_MATCH.getLong(sourceOptions)) + .setIfMetagenerationNotMatch(IF_SOURCE_METAGENERATION_NOT_MATCH.getLong(sourceOptions)) + .setIfGenerationMatch(IF_SOURCE_GENERATION_MATCH.getLong(sourceOptions)) + .setIfGenerationNotMatch(IF_SOURCE_GENERATION_NOT_MATCH.getLong(sourceOptions)) + .setIfMetagenerationMatch(IF_METAGENERATION_MATCH.getLong(targetOptions)) + .setIfMetagenerationNotMatch(IF_METAGENERATION_NOT_MATCH.getLong(targetOptions)) + .setIfGenerationMatch(IF_GENERATION_MATCH.getLong(targetOptions)) + .setIfGenerationNotMatch(IF_GENERATION_NOT_MATCH.getLong(targetOptions)) + .execute(); + } catch (IOException ex) { + throw translate(ex); + } + } + + @Override + public byte[] load(StorageObject from, Map options) + throws StorageServiceException { + try { + Storage.Objects.Get getRequest = storage.objects() + .get(from.getBucket(), from.getName()) + .setIfMetagenerationMatch(IF_METAGENERATION_MATCH.getLong(options)) + .setIfMetagenerationNotMatch(IF_METAGENERATION_NOT_MATCH.getLong(options)) + .setIfGenerationMatch(IF_GENERATION_MATCH.getLong(options)) + .setIfGenerationNotMatch(IF_GENERATION_NOT_MATCH.getLong(options)); + ByteArrayOutputStream out = new ByteArrayOutputStream(); + getRequest.getMediaHttpDownloader().setDirectDownloadEnabled(true); + getRequest.executeMediaAndDownloadTo(out); + return out.toByteArray(); + } catch (IOException ex) { + throw translate(ex); + } + } + + @Override + public BatchResponse batch(BatchRequest request) throws StorageServiceException { + com.google.api.client.googleapis.batch.BatchRequest batch = storage.batch(); + final Map> deletes = + Maps.newConcurrentMap(); + final Map> updates = + Maps.newConcurrentMap(); + final Map> gets = + Maps.newConcurrentMap(); + try { + for (final Tuple> tuple : request.toDelete) { + deleteRequest(tuple.x(), tuple.y()).queue(batch, new JsonBatchCallback() { + @Override + public void onSuccess(Void ignore, HttpHeaders responseHeaders) { + deletes.put(tuple.x(), Tuple.of(Boolean.TRUE, null)); + } + + @Override + public void onFailure(GoogleJsonError e, HttpHeaders responseHeaders) { + deletes.put(tuple.x(), Tuple.of(null, translate(e))); + } + }); + } + for (final Tuple> tuple : request.toUpdate) { + patchRequest(tuple.x(), tuple.y()).queue(batch, new JsonBatchCallback() { + @Override + public void onSuccess(StorageObject storageObject, HttpHeaders responseHeaders) { + updates.put(tuple.x(), + Tuple.of(storageObject, null)); + } + + @Override + public void onFailure(GoogleJsonError e, HttpHeaders responseHeaders) { + updates.put(tuple.x(), + Tuple.of(null, translate(e))); + } + }); + } + for (final Tuple> tuple : request.toGet) { + getRequest(tuple.x(), tuple.y()).queue(batch, new JsonBatchCallback() { + @Override + public void onSuccess(StorageObject storageObject, HttpHeaders responseHeaders) { + gets.put(tuple.x(), + Tuple.of(storageObject, null)); + } + + @Override + public void onFailure(GoogleJsonError e, HttpHeaders responseHeaders) { + gets.put(tuple.x(), + Tuple.of(null, translate(e))); + } + }); + } + batch.execute(); + } catch (IOException ex) { + throw translate(ex); + } + return new BatchResponse(deletes, updates, gets); + } + + @Override + public byte[] read(StorageObject from, Map options, long position, int bytes) + throws StorageServiceException { + try { + Get req = storage.objects().get(from.getBucket(), from.getName()); + req.setIfMetagenerationMatch(IF_METAGENERATION_MATCH.getLong(options)) + .setIfMetagenerationNotMatch(IF_METAGENERATION_NOT_MATCH.getLong(options)) + .setIfGenerationMatch(IF_GENERATION_MATCH.getLong(options)) + .setIfGenerationNotMatch(IF_GENERATION_NOT_MATCH.getLong(options)); + MediaHttpDownloader downloader = req.getMediaHttpDownloader(); + // todo: Fix int casting (https://github.com/google/google-api-java-client/issues/937) + downloader.setContentRange(position, (int) position + bytes); + downloader.setDirectDownloadEnabled(true); + ByteArrayOutputStream output = new ByteArrayOutputStream(); + req.executeMediaAndDownloadTo(output); + return output.toByteArray(); + } catch (IOException ex) { + throw translate(ex); + } + } + + @Override + public void write(String uploadId, byte[] toWrite, int toWriteOffset, StorageObject dest, + long destOffset, int length, boolean last) throws StorageServiceException { + try { + GenericUrl url = new GenericUrl(uploadId); + HttpRequest httpRequest = storage.getRequestFactory().buildPostRequest(url, + new ByteArrayContent(null, toWrite, toWriteOffset, length)); + long limit = destOffset + length; + StringBuilder range = new StringBuilder("bytes "); + range.append(destOffset).append('-').append(limit - 1).append('/'); + if (last) { + range.append(limit); + } else { + range.append('*'); + } + httpRequest.getHeaders().setContentRange(range.toString()); + int code; + String message; + IOException exception = null; + try { + HttpResponse response = httpRequest.execute(); + code = response.getStatusCode(); + message = response.getStatusMessage(); + } catch (HttpResponseException ex) { + exception = ex; + code = ex.getStatusCode(); + message = ex.getStatusMessage(); + } + if (!last && code != 308 || last && !(code == 200 || code == 201)) { + if (exception != null) { + throw exception; + } + GoogleJsonError error = new GoogleJsonError(); + error.setCode(code); + error.setMessage(message); + throw translate(error); + } + } catch (IOException ex) { + throw translate(ex); + } + } + + @Override + public String open(StorageObject object, Map options) + throws StorageServiceException { + try { + Insert req = storage.objects().insert(object.getBucket(), object); + GenericUrl url = req.buildHttpRequest().getUrl(); + String scheme = url.getScheme(); + String host = url.getHost(); + String path = "/upload" + url.getRawPath(); + url = new GenericUrl(scheme + "://" + host + path); + url.set("uploadType", "resumable"); + url.set("name", object.getName()); + for (Option option : options.keySet()) { + Object content = option.get(options); + if (content != null) { + url.set(option.value(), content.toString()); + } + } + JsonFactory jsonFactory = storage.getJsonFactory(); + HttpRequestFactory requestFactory = storage.getRequestFactory(); + HttpRequest httpRequest = + requestFactory.buildPostRequest(url, new JsonHttpContent(jsonFactory, object)); + httpRequest.getHeaders().set("X-Upload-Content-Type", + MoreObjects.firstNonNull(object.getContentType(), "application/octet-stream")); + HttpResponse response = httpRequest.execute(); + if (response.getStatusCode() != 200) { + GoogleJsonError error = new GoogleJsonError(); + error.setCode(response.getStatusCode()); + error.setMessage(response.getStatusMessage()); + throw translate(error); + } + return response.getHeaders().getLocation(); + } catch (IOException ex) { + throw translate(ex); + } + } +} + diff --git a/src/main/java/com/google/gcloud/spi/StorageRpc.java b/gcloud-java-storage/src/main/java/com/google/gcloud/spi/StorageRpc.java similarity index 100% rename from src/main/java/com/google/gcloud/spi/StorageRpc.java rename to gcloud-java-storage/src/main/java/com/google/gcloud/spi/StorageRpc.java diff --git a/gcloud-java-storage/src/main/java/com/google/gcloud/spi/StorageRpcFactory.java b/gcloud-java-storage/src/main/java/com/google/gcloud/spi/StorageRpcFactory.java new file mode 100644 index 000000000000..d78e721e2331 --- /dev/null +++ b/gcloud-java-storage/src/main/java/com/google/gcloud/spi/StorageRpcFactory.java @@ -0,0 +1,23 @@ +/* + * 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.gcloud.storage.StorageServiceOptions; + +public interface StorageRpcFactory extends ServiceRpcFactory { +} + diff --git a/src/main/java/com/google/gcloud/storage/Acl.java b/gcloud-java-storage/src/main/java/com/google/gcloud/storage/Acl.java similarity index 100% rename from src/main/java/com/google/gcloud/storage/Acl.java rename to gcloud-java-storage/src/main/java/com/google/gcloud/storage/Acl.java diff --git a/src/main/java/com/google/gcloud/storage/BatchRequest.java b/gcloud-java-storage/src/main/java/com/google/gcloud/storage/BatchRequest.java similarity index 100% rename from src/main/java/com/google/gcloud/storage/BatchRequest.java rename to gcloud-java-storage/src/main/java/com/google/gcloud/storage/BatchRequest.java diff --git a/src/main/java/com/google/gcloud/storage/BatchResponse.java b/gcloud-java-storage/src/main/java/com/google/gcloud/storage/BatchResponse.java similarity index 100% rename from src/main/java/com/google/gcloud/storage/BatchResponse.java rename to gcloud-java-storage/src/main/java/com/google/gcloud/storage/BatchResponse.java diff --git a/src/main/java/com/google/gcloud/storage/Blob.java b/gcloud-java-storage/src/main/java/com/google/gcloud/storage/Blob.java similarity index 100% rename from src/main/java/com/google/gcloud/storage/Blob.java rename to gcloud-java-storage/src/main/java/com/google/gcloud/storage/Blob.java diff --git a/src/main/java/com/google/gcloud/storage/BlobReadChannel.java b/gcloud-java-storage/src/main/java/com/google/gcloud/storage/BlobReadChannel.java similarity index 100% rename from src/main/java/com/google/gcloud/storage/BlobReadChannel.java rename to gcloud-java-storage/src/main/java/com/google/gcloud/storage/BlobReadChannel.java diff --git a/src/main/java/com/google/gcloud/storage/BlobReadChannelImpl.java b/gcloud-java-storage/src/main/java/com/google/gcloud/storage/BlobReadChannelImpl.java similarity index 100% rename from src/main/java/com/google/gcloud/storage/BlobReadChannelImpl.java rename to gcloud-java-storage/src/main/java/com/google/gcloud/storage/BlobReadChannelImpl.java diff --git a/src/main/java/com/google/gcloud/storage/BlobWriteChannel.java b/gcloud-java-storage/src/main/java/com/google/gcloud/storage/BlobWriteChannel.java similarity index 100% rename from src/main/java/com/google/gcloud/storage/BlobWriteChannel.java rename to gcloud-java-storage/src/main/java/com/google/gcloud/storage/BlobWriteChannel.java diff --git a/src/main/java/com/google/gcloud/storage/BlobWriterChannelImpl.java b/gcloud-java-storage/src/main/java/com/google/gcloud/storage/BlobWriterChannelImpl.java similarity index 100% rename from src/main/java/com/google/gcloud/storage/BlobWriterChannelImpl.java rename to gcloud-java-storage/src/main/java/com/google/gcloud/storage/BlobWriterChannelImpl.java diff --git a/src/main/java/com/google/gcloud/storage/Bucket.java b/gcloud-java-storage/src/main/java/com/google/gcloud/storage/Bucket.java similarity index 100% rename from src/main/java/com/google/gcloud/storage/Bucket.java rename to gcloud-java-storage/src/main/java/com/google/gcloud/storage/Bucket.java diff --git a/src/main/java/com/google/gcloud/storage/Cors.java b/gcloud-java-storage/src/main/java/com/google/gcloud/storage/Cors.java similarity index 100% rename from src/main/java/com/google/gcloud/storage/Cors.java rename to gcloud-java-storage/src/main/java/com/google/gcloud/storage/Cors.java diff --git a/src/main/java/com/google/gcloud/storage/ListResult.java b/gcloud-java-storage/src/main/java/com/google/gcloud/storage/ListResult.java similarity index 100% rename from src/main/java/com/google/gcloud/storage/ListResult.java rename to gcloud-java-storage/src/main/java/com/google/gcloud/storage/ListResult.java diff --git a/src/main/java/com/google/gcloud/storage/Option.java b/gcloud-java-storage/src/main/java/com/google/gcloud/storage/Option.java similarity index 100% rename from src/main/java/com/google/gcloud/storage/Option.java rename to gcloud-java-storage/src/main/java/com/google/gcloud/storage/Option.java diff --git a/src/main/java/com/google/gcloud/storage/StorageService.java b/gcloud-java-storage/src/main/java/com/google/gcloud/storage/StorageService.java similarity index 100% rename from src/main/java/com/google/gcloud/storage/StorageService.java rename to gcloud-java-storage/src/main/java/com/google/gcloud/storage/StorageService.java diff --git a/src/main/java/com/google/gcloud/storage/StorageServiceException.java b/gcloud-java-storage/src/main/java/com/google/gcloud/storage/StorageServiceException.java similarity index 100% rename from src/main/java/com/google/gcloud/storage/StorageServiceException.java rename to gcloud-java-storage/src/main/java/com/google/gcloud/storage/StorageServiceException.java diff --git a/src/main/java/com/google/gcloud/storage/StorageServiceFactory.java b/gcloud-java-storage/src/main/java/com/google/gcloud/storage/StorageServiceFactory.java similarity index 100% rename from src/main/java/com/google/gcloud/storage/StorageServiceFactory.java rename to gcloud-java-storage/src/main/java/com/google/gcloud/storage/StorageServiceFactory.java diff --git a/src/main/java/com/google/gcloud/storage/StorageServiceImpl.java b/gcloud-java-storage/src/main/java/com/google/gcloud/storage/StorageServiceImpl.java similarity index 100% rename from src/main/java/com/google/gcloud/storage/StorageServiceImpl.java rename to gcloud-java-storage/src/main/java/com/google/gcloud/storage/StorageServiceImpl.java diff --git a/src/main/java/com/google/gcloud/storage/StorageServiceOptions.java b/gcloud-java-storage/src/main/java/com/google/gcloud/storage/StorageServiceOptions.java similarity index 92% rename from src/main/java/com/google/gcloud/storage/StorageServiceOptions.java rename to gcloud-java-storage/src/main/java/com/google/gcloud/storage/StorageServiceOptions.java index 87cac636fa92..a458692511bd 100644 --- a/src/main/java/com/google/gcloud/storage/StorageServiceOptions.java +++ b/gcloud-java-storage/src/main/java/com/google/gcloud/storage/StorageServiceOptions.java @@ -19,8 +19,10 @@ import com.google.common.base.MoreObjects; import com.google.common.collect.ImmutableSet; import com.google.gcloud.ServiceOptions; +import com.google.gcloud.spi.DefaultStorageRpc; import com.google.gcloud.spi.ServiceRpcProvider; import com.google.gcloud.spi.StorageRpc; +import com.google.gcloud.spi.StorageRpcFactory; import java.util.Objects; import java.util.Set; @@ -75,7 +77,10 @@ StorageRpc storageRpc() { if (serviceRpcFactory() != null) { storageRpc = serviceRpcFactory().create(this); } else { - storageRpc = ServiceRpcProvider.storage(this); + storageRpc = ServiceRpcProvider.get(this, StorageRpcFactory.class); + if (storageRpc == null) { + storageRpc = new DefaultStorageRpc(this); + } } return storageRpc; } diff --git a/src/main/java/com/google/gcloud/storage/package-info.java b/gcloud-java-storage/src/main/java/com/google/gcloud/storage/package-info.java similarity index 100% rename from src/main/java/com/google/gcloud/storage/package-info.java rename to gcloud-java-storage/src/main/java/com/google/gcloud/storage/package-info.java diff --git a/src/test/java/com/google/gcloud/storage/AclTest.java b/gcloud-java-storage/src/test/java/com/google/gcloud/storage/AclTest.java similarity index 100% rename from src/test/java/com/google/gcloud/storage/AclTest.java rename to gcloud-java-storage/src/test/java/com/google/gcloud/storage/AclTest.java diff --git a/src/test/java/com/google/gcloud/storage/BatchRequestTest.java b/gcloud-java-storage/src/test/java/com/google/gcloud/storage/BatchRequestTest.java similarity index 100% rename from src/test/java/com/google/gcloud/storage/BatchRequestTest.java rename to gcloud-java-storage/src/test/java/com/google/gcloud/storage/BatchRequestTest.java diff --git a/src/test/java/com/google/gcloud/storage/BatchResponseTest.java b/gcloud-java-storage/src/test/java/com/google/gcloud/storage/BatchResponseTest.java similarity index 100% rename from src/test/java/com/google/gcloud/storage/BatchResponseTest.java rename to gcloud-java-storage/src/test/java/com/google/gcloud/storage/BatchResponseTest.java diff --git a/src/test/java/com/google/gcloud/storage/BlobTest.java b/gcloud-java-storage/src/test/java/com/google/gcloud/storage/BlobTest.java similarity index 100% rename from src/test/java/com/google/gcloud/storage/BlobTest.java rename to gcloud-java-storage/src/test/java/com/google/gcloud/storage/BlobTest.java diff --git a/src/test/java/com/google/gcloud/storage/BucketTest.java b/gcloud-java-storage/src/test/java/com/google/gcloud/storage/BucketTest.java similarity index 100% rename from src/test/java/com/google/gcloud/storage/BucketTest.java rename to gcloud-java-storage/src/test/java/com/google/gcloud/storage/BucketTest.java diff --git a/src/test/java/com/google/gcloud/storage/CorsTest.java b/gcloud-java-storage/src/test/java/com/google/gcloud/storage/CorsTest.java similarity index 100% rename from src/test/java/com/google/gcloud/storage/CorsTest.java rename to gcloud-java-storage/src/test/java/com/google/gcloud/storage/CorsTest.java diff --git a/src/test/java/com/google/gcloud/storage/ListResultTest.java b/gcloud-java-storage/src/test/java/com/google/gcloud/storage/ListResultTest.java similarity index 100% rename from src/test/java/com/google/gcloud/storage/ListResultTest.java rename to gcloud-java-storage/src/test/java/com/google/gcloud/storage/ListResultTest.java diff --git a/src/test/java/com/google/gcloud/storage/OptionTest.java b/gcloud-java-storage/src/test/java/com/google/gcloud/storage/OptionTest.java similarity index 100% rename from src/test/java/com/google/gcloud/storage/OptionTest.java rename to gcloud-java-storage/src/test/java/com/google/gcloud/storage/OptionTest.java diff --git a/src/test/java/com/google/gcloud/storage/SerializationTest.java b/gcloud-java-storage/src/test/java/com/google/gcloud/storage/SerializationTest.java similarity index 100% rename from src/test/java/com/google/gcloud/storage/SerializationTest.java rename to gcloud-java-storage/src/test/java/com/google/gcloud/storage/SerializationTest.java diff --git a/gcloud-java/README.md b/gcloud-java/README.md new file mode 100644 index 000000000000..2286627662fb --- /dev/null +++ b/gcloud-java/README.md @@ -0,0 +1,73 @@ +Google Cloud Java Client +========================== + +Java idiomatic client for [Google Cloud Platform][cloud-platform] services. + +[![Build Status](https://travis-ci.org/GoogleCloudPlatform/gcloud-java.svg?branch=master)](https://travis-ci.org/GoogleCloudPlatform/gcloud-java) +[![Coverage Status](https://coveralls.io/repos/GoogleCloudPlatform/gcloud-java/badge.svg?branch=master)](https://coveralls.io/r/GoogleCloudPlatform/gcloud-java?branch=master) + +- [Homepage] (https://googlecloudplatform.github.io/gcloud-java/) +- [API Documentation] (http://googlecloudplatform.github.io/gcloud-java/apidocs) +- [Examples] (http://googlecloudplatform.github.io/gcloud-java/apidocs/index.html?com/google/gcloud/examples/package-summary.html) + +This client supports the following Google Cloud Platform services: + +- [Google Cloud Datastore] (https://cloud.google.com/datastore/) [datastore documentation][datastore-api] +- [Google Cloud Storage] (https://cloud.google.com/storage/) [storage documentation][storage-api] + +> Note: This client is a work-in-progress, and may occasionally +> make backwards-incompatible changes. + +Quickstart +---------- +Add this to your pom.xml file +```xml + + com.google.gcloud + gcloud-java + LATEST + +``` + +Contributing +------------ + +Contributions to this library are always welcome and highly encouraged. + +See [CONTRIBUTING] for more information on how to get started. + +Java Versions +------------- + +Java 7 or above is required for using this client. + +Versioning +---------- + +This library follows [Semantic Versioning] (http://semver.org/). + +It is currently in major version zero (``0.y.z``), which means that anything +may change at any time and the public API should not be considered +stable. + +License +------- + +Apache 2.0 - See [LICENSE] for more information. + + +[CONTRIBUTING]:https://github.com/GoogleCloudPlatform/gcloud-java/blob/master/CONTRIBUTING.md +[LICENSE]: https://github.com/GoogleCloudPlatform/gcloud-java/blob/master/LICENSE +[cloud-platform]: https://cloud.google.com/ +[cloud-datastore]: https://cloud.google.com/datastore/docs +[cloud-datastore-docs]: https://cloud.google.com/datastore/docs +[cloud-datastore-activation]: https://cloud.google.com/datastore/docs/activate +[datastore-api]: http://googlecloudplatform.github.io/gcloud-java/apidocs/index.html?com/google/gcloud/datastore/package-summary.html + +[cloud-pubsub]: https://cloud.google.com/pubsub/ +[cloud-pubsub-docs]: https://cloud.google.com/pubsub/docs + +[cloud-storage]: https://cloud.google.com/storage/ +[cloud-storage-docs]: https://cloud.google.com/storage/docs/overview +[cloud-storage-create-bucket]: https://cloud.google.com/storage/docs/cloud-console#_creatingbuckets +[storage-api]: http://googlecloudplatform.github.io/gcloud-java/apidocs/index.html?com/google/gcloud/storage/package-summary.html diff --git a/gcloud-java/pom.xml b/gcloud-java/pom.xml new file mode 100644 index 000000000000..a70763d2b1bd --- /dev/null +++ b/gcloud-java/pom.xml @@ -0,0 +1,47 @@ + + + 4.0.0 + com.google.gcloud + gcloud-java + jar + GCloud Java assembly + https://github.com/GoogleCloudPlatform/gcloud-java + + Java idiomatic client for Google Cloud Platform services. + + + com.google.gcloud + gcloud-java-pom + 0.0.5 + + + + ${project.groupId} + gcloud-java-core + ${project.version} + + + ${project.groupId} + gcloud-java-datastore + ${project.version} + + + ${project.groupId} + gcloud-java-storage + ${project.version} + + + + + + org.apache.maven.plugins + maven-site-plugin + 3.1 + + true + true + + + + + diff --git a/pom.xml b/pom.xml index db7388fb7ae1..a00e0d641b30 100644 --- a/pom.xml +++ b/pom.xml @@ -2,9 +2,9 @@ 4.0.0 com.google.gcloud - gcloud-java - jar - 0.0.4 + gcloud-java-pom + pom + 0.0.5 GCloud Java https://github.com/GoogleCloudPlatform/gcloud-java @@ -47,99 +47,12 @@ sonatype-nexus-staging https://oss.sonatype.org/service/local/staging/deploy/maven2/ + + github-pages-site + Deployment through GitHub's site deployment plugin + http://googlecloudplatform.github.io/gcloud-java/ + - - - com.google.auth - google-auth-library-credentials - 0.1.0 - - - com.google.auth - google-auth-library-oauth2-http - 0.1.0 - - - com.google.http-client - google-http-client - 1.19.0 - compile - - - com.google.oauth-client - google-oauth-client - 1.19.0 - compile - - - com.google.guava - guava - 18.0 - - - com.google.apis - google-api-services-datastore-protobuf - v1beta2-rev1-2.1.2 - compile - - - com.google.api-client - google-api-client-appengine - 1.19.0 - compile - - - guava-jdk5 - com.google.guava - - - - - junit - junit - 4.12 - test - - - joda-time - joda-time - RELEASE - compile - - - org.json - json - 20090211 - compile - - - com.google.apis - google-api-services-storage - v1-rev33-1.20.0 - compile - - - com.google.apis - google-api-services-datastore - v1beta2-rev23-1.19.0 - - - org.easymock - easymock - 3.3 - test - - - - - - false - - central - Central Repository - http://repo.maven.apache.org/maven2 - - GCloud Java Software License @@ -151,6 +64,13 @@ UTF-8 github + + gcloud-java-core + gcloud-java-datastore + gcloud-java-storage + gcloud-java + gcloud-java-examples + @@ -178,11 +98,10 @@ - + -1 @@ -289,22 +208,22 @@ org.codehaus.mojo cobertura-maven-plugin 2.6 - - - xml - html - - true - - true - - com/google/gcloud/**/*.class - - - com/google/gcloud/examples/**/*.class - - - + + + xml + html + + true + + true + + com/google/gcloud/**/*.class + + + com/google/gcloud/examples/**/*.class + + + 256m @@ -320,11 +239,12 @@ - + org.apache.maven.plugins maven-site-plugin 3.4 + true org.apache.maven.plugins @@ -338,6 +258,7 @@ + index dependencies project-team mailing-list @@ -351,11 +272,21 @@ + true true true true + + org.apache.maven.plugins + maven-dependency-plugin + 2.10 + + true + ${project.build.directory}/dependencies + + org.apache.maven.plugins maven-javadoc-plugin @@ -369,6 +300,7 @@ + true protected true ${project.build.directory}/javadoc @@ -392,6 +324,9 @@ org.codehaus.mojo cobertura-maven-plugin 2.6 + + true + @@ -402,34 +337,16 @@ 0.10 Creating site for ${project.artifactId} ${project.version} + ${project.distributionManagement.site.url} + true + github-site site - site - - - - - org.apache.maven.plugins - maven-assembly-plugin - 2.4.1 - - - - jar-with-dependencies - - - - - make-assembly - - package - - single - + site-deploy diff --git a/src/main/java/com/google/gcloud/spi/DatastoreRpcFactory.java b/src/main/java/com/google/gcloud/spi/DatastoreRpcFactory.java deleted file mode 100644 index c25a22aae717..000000000000 --- a/src/main/java/com/google/gcloud/spi/DatastoreRpcFactory.java +++ /dev/null @@ -1 +0,0 @@ -/* * 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.gcloud.datastore.DatastoreServiceOptions; public interface DatastoreRpcFactory extends ServiceRpcFactory { } \ No newline at end of file diff --git a/src/main/java/com/google/gcloud/spi/DefaultDatastoreRpc.java b/src/main/java/com/google/gcloud/spi/DefaultDatastoreRpc.java deleted file mode 100644 index 20bd911b3782..000000000000 --- a/src/main/java/com/google/gcloud/spi/DefaultDatastoreRpc.java +++ /dev/null @@ -1 +0,0 @@ -/* * 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.services.datastore.DatastoreV1.AllocateIdsRequest; import com.google.api.services.datastore.DatastoreV1.AllocateIdsResponse; import com.google.api.services.datastore.DatastoreV1.BeginTransactionRequest; import com.google.api.services.datastore.DatastoreV1.BeginTransactionResponse; import com.google.api.services.datastore.DatastoreV1.CommitRequest; import com.google.api.services.datastore.DatastoreV1.CommitResponse; import com.google.api.services.datastore.DatastoreV1.LookupRequest; import com.google.api.services.datastore.DatastoreV1.LookupResponse; import com.google.api.services.datastore.DatastoreV1.RollbackRequest; import com.google.api.services.datastore.DatastoreV1.RollbackResponse; import com.google.api.services.datastore.DatastoreV1.RunQueryRequest; import com.google.api.services.datastore.DatastoreV1.RunQueryResponse; import com.google.api.services.datastore.client.Datastore; import com.google.api.services.datastore.client.DatastoreException; import com.google.api.services.datastore.client.DatastoreFactory; import com.google.api.services.datastore.client.DatastoreOptions.Builder; import com.google.common.collect.ImmutableMap; import com.google.gcloud.datastore.DatastoreServiceOptions; import com.google.gcloud.spi.DatastoreRpc.DatastoreRpcException.Reason; import org.json.JSONException; import org.json.JSONObject; import org.json.JSONTokener; import java.util.HashMap; import java.util.Map; class DefaultDatastoreRpc implements DatastoreRpc { private final Datastore client; private static final ImmutableMap STR_TO_REASON; private static final ImmutableMap HTTP_STATUS_TO_REASON; static { ImmutableMap.Builder builder = ImmutableMap.builder(); Map httpCodes = new HashMap<>(); for (Reason reason : Reason.values()) { builder.put(reason.name(), reason); httpCodes.put(reason.httpStatus(), reason); } STR_TO_REASON = builder.build(); HTTP_STATUS_TO_REASON = ImmutableMap.copyOf(httpCodes); } public DefaultDatastoreRpc(DatastoreServiceOptions options) { client = DatastoreFactory.get().create( new Builder() .dataset(options.projectId()) .host(options.host()) .initializer(options.httpRequestInitializer()) .build()); } private static DatastoreRpcException translate(DatastoreException exception) { String message = exception.getMessage(); String reasonStr = ""; if (message != null) { try { JSONObject json = new JSONObject(new JSONTokener(message)); JSONObject error = json.getJSONObject("error").getJSONArray("errors").getJSONObject(0); reasonStr = error.getString("reason"); message = error.getString("message"); } catch (JSONException ignore) { // ignore - will be converted to unknown } } Reason reason = STR_TO_REASON.get(reasonStr); if (reason == null) { reason = HTTP_STATUS_TO_REASON.get(exception.getCode()); } return reason != null ? new DatastoreRpcException(reason) : new DatastoreRpcException("Unknown", exception.getCode(), false, message); } @Override public AllocateIdsResponse allocateIds(AllocateIdsRequest request) throws DatastoreRpcException { try { return client.allocateIds(request); } catch (DatastoreException ex) { throw translate(ex); } } @Override public BeginTransactionResponse beginTransaction(BeginTransactionRequest request) throws DatastoreRpcException { try { return client.beginTransaction(request); } catch (DatastoreException ex) { throw translate(ex); } } @Override public CommitResponse commit(CommitRequest request) throws DatastoreRpcException { try { return client.commit(request); } catch (DatastoreException ex) { throw translate(ex); } } @Override public LookupResponse lookup(LookupRequest request) throws DatastoreRpcException { try { return client.lookup(request); } catch (DatastoreException ex) { throw translate(ex); } } @Override public RollbackResponse rollback(RollbackRequest request) throws DatastoreRpcException { try { return client.rollback(request); } catch (DatastoreException ex) { throw translate(ex); } } @Override public RunQueryResponse runQuery(RunQueryRequest request) throws DatastoreRpcException { try { return client.runQuery(request); } catch (DatastoreException ex) { throw translate(ex); } } } \ No newline at end of file diff --git a/src/main/java/com/google/gcloud/spi/DefaultStorageRpc.java b/src/main/java/com/google/gcloud/spi/DefaultStorageRpc.java deleted file mode 100644 index 455624f79b65..000000000000 --- a/src/main/java/com/google/gcloud/spi/DefaultStorageRpc.java +++ /dev/null @@ -1 +0,0 @@ -/* * 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 static com.google.gcloud.spi.StorageRpc.Option.DELIMITER; import static com.google.gcloud.spi.StorageRpc.Option.IF_GENERATION_MATCH; import static com.google.gcloud.spi.StorageRpc.Option.IF_GENERATION_NOT_MATCH; import static com.google.gcloud.spi.StorageRpc.Option.IF_METAGENERATION_MATCH; import static com.google.gcloud.spi.StorageRpc.Option.IF_METAGENERATION_NOT_MATCH; import static com.google.gcloud.spi.StorageRpc.Option.IF_SOURCE_GENERATION_MATCH; import static com.google.gcloud.spi.StorageRpc.Option.IF_SOURCE_GENERATION_NOT_MATCH; import static com.google.gcloud.spi.StorageRpc.Option.IF_SOURCE_METAGENERATION_MATCH; import static com.google.gcloud.spi.StorageRpc.Option.IF_SOURCE_METAGENERATION_NOT_MATCH; import static com.google.gcloud.spi.StorageRpc.Option.MAX_RESULTS; import static com.google.gcloud.spi.StorageRpc.Option.PAGE_TOKEN; import static com.google.gcloud.spi.StorageRpc.Option.PREDEFINED_ACL; import static com.google.gcloud.spi.StorageRpc.Option.PREDEFINED_DEFAULT_OBJECT_ACL; import static com.google.gcloud.spi.StorageRpc.Option.PREFIX; import static com.google.gcloud.spi.StorageRpc.Option.VERSIONS; import com.google.api.client.googleapis.batch.json.JsonBatchCallback; import com.google.api.client.googleapis.json.GoogleJsonError; import com.google.api.client.googleapis.json.GoogleJsonResponseException; import com.google.api.client.googleapis.media.MediaHttpDownloader; import com.google.api.client.http.ByteArrayContent; import com.google.api.client.http.GenericUrl; import com.google.api.client.http.HttpHeaders; import com.google.api.client.http.HttpRequest; import com.google.api.client.http.HttpRequestFactory; import com.google.api.client.http.HttpRequestInitializer; import com.google.api.client.http.HttpResponse; import com.google.api.client.http.HttpResponseException; import com.google.api.client.http.HttpTransport; import com.google.api.client.http.json.JsonHttpContent; import com.google.api.client.json.JsonFactory; import com.google.api.client.json.jackson.JacksonFactory; import com.google.api.services.storage.Storage; import com.google.api.services.storage.Storage.Objects.Get; import com.google.api.services.storage.Storage.Objects.Insert; import com.google.api.services.storage.model.Bucket; import com.google.api.services.storage.model.Buckets; import com.google.api.services.storage.model.ComposeRequest; import com.google.api.services.storage.model.ComposeRequest.SourceObjects.ObjectPreconditions; import com.google.api.services.storage.model.Objects; import com.google.api.services.storage.model.StorageObject; import com.google.common.base.MoreObjects; import com.google.common.collect.ImmutableSet; import com.google.common.collect.Maps; import com.google.gcloud.storage.StorageServiceException; import com.google.gcloud.storage.StorageServiceOptions; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.util.ArrayList; import java.util.List; import java.util.Map; import java.util.Set; public class DefaultStorageRpc implements StorageRpc { public static final String DEFAULT_PROJECTION = "full"; private final StorageServiceOptions options; private final Storage storage; // see: https://cloud.google.com/storage/docs/concepts-techniques#practices private static final Set RETRYABLE_CODES = ImmutableSet.of(504, 503, 502, 500, 408); public DefaultStorageRpc(StorageServiceOptions options) { HttpTransport transport = options.httpTransportFactory().create(); HttpRequestInitializer initializer = options.httpRequestInitializer(); this.options = options; storage = new Storage.Builder(transport, new JacksonFactory(), initializer) .setApplicationName("gcloud-java") .build(); // Todo: make sure nulls are being used as Data.asNull() } private static StorageServiceException translate(IOException exception) { StorageServiceException translated; if (exception instanceof GoogleJsonResponseException) { translated = translate(((GoogleJsonResponseException) exception).getDetails()); } else { translated = new StorageServiceException(0, exception.getMessage(), false); } translated.initCause(exception); return translated; } private static StorageServiceException translate(GoogleJsonError exception) { boolean retryable = RETRYABLE_CODES.contains(exception.getCode()) || "InternalError".equals(exception.getMessage()); return new StorageServiceException(exception.getCode(), exception.getMessage(), retryable); } @Override public Bucket create(Bucket bucket, Map options) throws StorageServiceException { try { return storage.buckets() .insert(this.options.projectId(), bucket) .setProjection(DEFAULT_PROJECTION) .setPredefinedAcl(PREDEFINED_ACL.getString(options)) .setPredefinedDefaultObjectAcl(PREDEFINED_DEFAULT_OBJECT_ACL.getString(options)) .execute(); } catch (IOException ex) { throw translate(ex); } } @Override public StorageObject create(StorageObject storageObject, final byte[] content, Map options) throws StorageServiceException { try { return storage.objects() .insert(storageObject.getBucket(), storageObject, new ByteArrayContent(storageObject.getContentType(), content)) .setProjection(DEFAULT_PROJECTION) .setPredefinedAcl(PREDEFINED_ACL.getString(options)) .setIfMetagenerationMatch(IF_METAGENERATION_MATCH.getLong(options)) .setIfMetagenerationNotMatch(IF_METAGENERATION_NOT_MATCH.getLong(options)) .setIfGenerationMatch(IF_GENERATION_MATCH.getLong(options)) .setIfGenerationNotMatch(IF_GENERATION_NOT_MATCH.getLong(options)) .execute(); } catch (IOException ex) { throw translate(ex); } } @Override public Tuple> list(Map options) { try { Buckets buckets = storage.buckets() .list(this.options.projectId()) .setProjection(DEFAULT_PROJECTION) .setPrefix(PREFIX.getString(options)) .setMaxResults(MAX_RESULTS.getLong(options)) .setPageToken(PAGE_TOKEN.getString(options)) .execute(); return Tuple.>of(buckets.getNextPageToken(), buckets.getItems()); } catch (IOException ex) { throw translate(ex); } } @Override public Tuple> list(String bucket, Map options) { try { Objects objects = storage.objects() .list(bucket) .setProjection(DEFAULT_PROJECTION) .setVersions(VERSIONS.getBoolean(options)) .setDelimiter(DELIMITER.getString(options)) .setPrefix(PREFIX.getString(options)) .setMaxResults(MAX_RESULTS.getLong(options)) .setPageToken(PAGE_TOKEN.getString(options)) .execute(); return Tuple.>of( objects.getNextPageToken(), objects.getItems()); } catch (IOException ex) { throw translate(ex); } } @Override public Bucket get(Bucket bucket, Map options) { try { return storage.buckets() .get(bucket.getName()) .setProjection(DEFAULT_PROJECTION) .setIfMetagenerationMatch(IF_METAGENERATION_MATCH.getLong(options)) .setIfMetagenerationNotMatch(IF_METAGENERATION_NOT_MATCH.getLong(options)) .execute(); } catch (IOException ex) { throw translate(ex); } } @Override public StorageObject get(StorageObject object, Map options) { try { return getRequest(object, options).execute(); } catch (IOException ex) { throw translate(ex); } } private Storage.Objects.Get getRequest(StorageObject object, Map options) throws IOException { return storage.objects() .get(object.getBucket(), object.getName()) .setProjection(DEFAULT_PROJECTION) .setIfMetagenerationMatch(IF_METAGENERATION_MATCH.getLong(options)) .setIfMetagenerationNotMatch(IF_METAGENERATION_NOT_MATCH.getLong(options)) .setIfGenerationMatch(IF_GENERATION_MATCH.getLong(options)) .setIfGenerationNotMatch(IF_GENERATION_NOT_MATCH.getLong(options)); } @Override public Bucket patch(Bucket bucket, Map options) { try { return storage.buckets() .patch(bucket.getName(), bucket) .setProjection(DEFAULT_PROJECTION) .setPredefinedAcl(PREDEFINED_ACL.getString(options)) .setPredefinedDefaultObjectAcl(PREDEFINED_DEFAULT_OBJECT_ACL.getString(options)) .setIfMetagenerationMatch(IF_METAGENERATION_MATCH.getLong(options)) .setIfMetagenerationNotMatch(IF_METAGENERATION_NOT_MATCH.getLong(options)) .execute(); } catch (IOException ex) { throw translate(ex); } } @Override public StorageObject patch(StorageObject storageObject, Map options) { try { return patchRequest(storageObject, options).execute(); } catch (IOException ex) { throw translate(ex); } } private Storage.Objects.Patch patchRequest(StorageObject storageObject, Map options) throws IOException { return storage.objects() .patch(storageObject.getBucket(), storageObject.getName(), storageObject) .setProjection(DEFAULT_PROJECTION) .setPredefinedAcl(PREDEFINED_ACL.getString(options)) .setIfMetagenerationMatch(IF_METAGENERATION_MATCH.getLong(options)) .setIfMetagenerationNotMatch(IF_METAGENERATION_NOT_MATCH.getLong(options)) .setIfGenerationMatch(IF_GENERATION_MATCH.getLong(options)) .setIfGenerationNotMatch(IF_GENERATION_NOT_MATCH.getLong(options)); } @Override public boolean delete(Bucket bucket, Map options) { try { storage.buckets() .delete(bucket.getName()) .setIfMetagenerationMatch(IF_METAGENERATION_MATCH.getLong(options)) .setIfMetagenerationNotMatch(IF_METAGENERATION_NOT_MATCH.getLong(options)) .execute(); return true; } catch (IOException ex) { StorageServiceException serviceException = translate(ex); if (serviceException.code() == 404) { return false; } throw serviceException; } } @Override public boolean delete(StorageObject blob, Map options) { try { deleteRequest(blob, options).execute(); return true; } catch (IOException ex) { StorageServiceException serviceException = translate(ex); if (serviceException.code() == 404) { return false; } throw serviceException; } } private Storage.Objects.Delete deleteRequest(StorageObject blob, Map options) throws IOException { return storage.objects() .delete(blob.getBucket(), blob.getName()) .setIfMetagenerationMatch(IF_METAGENERATION_MATCH.getLong(options)) .setIfMetagenerationNotMatch(IF_METAGENERATION_NOT_MATCH.getLong(options)) .setIfGenerationMatch(IF_GENERATION_MATCH.getLong(options)) .setIfGenerationMatch(100L) .setIfGenerationNotMatch(IF_GENERATION_NOT_MATCH.getLong(options)); } @Override public StorageObject compose(Iterable sources, StorageObject target, Map targetOptions) throws StorageServiceException { ComposeRequest request = new ComposeRequest(); if (target.getContentType() == null) { // todo: remove once this is no longer requirement (b/20681287). target.setContentType("application/octet-stream"); } request.setDestination(target); List sourceObjects = new ArrayList<>(); for (StorageObject source : sources) { ComposeRequest.SourceObjects sourceObject = new ComposeRequest.SourceObjects(); sourceObject.setName(source.getName()); Long generation = source.getGeneration(); if (generation != null) { sourceObject.setGeneration(generation); sourceObject.setObjectPreconditions( new ObjectPreconditions().setIfGenerationMatch(generation)); } sourceObjects.add(sourceObject); } request.setSourceObjects(sourceObjects); try { // todo: missing setProjection (b/20659000) return storage.objects() .compose(target.getBucket(), target.getName(), request) .setIfMetagenerationMatch(IF_METAGENERATION_MATCH.getLong(targetOptions)) .setIfGenerationMatch(IF_GENERATION_MATCH.getLong(targetOptions)) .execute(); } catch (IOException ex) { throw translate(ex); } } @Override public StorageObject copy(StorageObject source, Map sourceOptions, StorageObject target, Map targetOptions) throws StorageServiceException { try { return storage .objects() .copy(source.getBucket(), source.getName(), target.getBucket(), target.getName(), target.getContentType() != null ? target : null) .setProjection(DEFAULT_PROJECTION) .setIfMetagenerationMatch(IF_SOURCE_METAGENERATION_MATCH.getLong(sourceOptions)) .setIfMetagenerationNotMatch(IF_SOURCE_METAGENERATION_NOT_MATCH.getLong(sourceOptions)) .setIfGenerationMatch(IF_SOURCE_GENERATION_MATCH.getLong(sourceOptions)) .setIfGenerationNotMatch(IF_SOURCE_GENERATION_NOT_MATCH.getLong(sourceOptions)) .setIfMetagenerationMatch(IF_METAGENERATION_MATCH.getLong(targetOptions)) .setIfMetagenerationNotMatch(IF_METAGENERATION_NOT_MATCH.getLong(targetOptions)) .setIfGenerationMatch(IF_GENERATION_MATCH.getLong(targetOptions)) .setIfGenerationNotMatch(IF_GENERATION_NOT_MATCH.getLong(targetOptions)) .execute(); } catch (IOException ex) { throw translate(ex); } } @Override public byte[] load(StorageObject from, Map options) throws StorageServiceException { try { Storage.Objects.Get getRequest = storage.objects() .get(from.getBucket(), from.getName()) .setIfMetagenerationMatch(IF_METAGENERATION_MATCH.getLong(options)) .setIfMetagenerationNotMatch(IF_METAGENERATION_NOT_MATCH.getLong(options)) .setIfGenerationMatch(IF_GENERATION_MATCH.getLong(options)) .setIfGenerationNotMatch(IF_GENERATION_NOT_MATCH.getLong(options)); ByteArrayOutputStream out = new ByteArrayOutputStream(); getRequest.getMediaHttpDownloader().setDirectDownloadEnabled(true); getRequest.executeMediaAndDownloadTo(out); return out.toByteArray(); } catch (IOException ex) { throw translate(ex); } } @Override public BatchResponse batch(BatchRequest request) throws StorageServiceException { com.google.api.client.googleapis.batch.BatchRequest batch = storage.batch(); final Map> deletes = Maps.newConcurrentMap(); final Map> updates = Maps.newConcurrentMap(); final Map> gets = Maps.newConcurrentMap(); try { for (final Tuple> tuple : request.toDelete) { deleteRequest(tuple.x(), tuple.y()).queue(batch, new JsonBatchCallback() { @Override public void onSuccess(Void ignore, HttpHeaders responseHeaders) { deletes.put(tuple.x(), Tuple.of(Boolean.TRUE, null)); } @Override public void onFailure(GoogleJsonError e, HttpHeaders responseHeaders) { deletes.put(tuple.x(), Tuple.of(null, translate(e))); } }); } for (final Tuple> tuple : request.toUpdate) { patchRequest(tuple.x(), tuple.y()).queue(batch, new JsonBatchCallback() { @Override public void onSuccess(StorageObject storageObject, HttpHeaders responseHeaders) { updates.put(tuple.x(), Tuple.of(storageObject, null)); } @Override public void onFailure(GoogleJsonError e, HttpHeaders responseHeaders) { updates.put(tuple.x(), Tuple.of(null, translate(e))); } }); } for (final Tuple> tuple : request.toGet) { getRequest(tuple.x(), tuple.y()).queue(batch, new JsonBatchCallback() { @Override public void onSuccess(StorageObject storageObject, HttpHeaders responseHeaders) { gets.put(tuple.x(), Tuple.of(storageObject, null)); } @Override public void onFailure(GoogleJsonError e, HttpHeaders responseHeaders) { gets.put(tuple.x(), Tuple.of(null, translate(e))); } }); } batch.execute(); } catch (IOException ex) { throw translate(ex); } return new BatchResponse(deletes, updates, gets); } @Override public byte[] read(StorageObject from, Map options, long position, int bytes) throws StorageServiceException { try { Get req = storage.objects().get(from.getBucket(), from.getName()); req.setIfMetagenerationMatch(IF_METAGENERATION_MATCH.getLong(options)) .setIfMetagenerationNotMatch(IF_METAGENERATION_NOT_MATCH.getLong(options)) .setIfGenerationMatch(IF_GENERATION_MATCH.getLong(options)) .setIfGenerationNotMatch(IF_GENERATION_NOT_MATCH.getLong(options)); MediaHttpDownloader downloader = req.getMediaHttpDownloader(); // todo: Fix int casting (https://github.com/google/google-api-java-client/issues/937) downloader.setContentRange(position, (int) position + bytes); downloader.setDirectDownloadEnabled(true); ByteArrayOutputStream output = new ByteArrayOutputStream(); req.executeMediaAndDownloadTo(output); return output.toByteArray(); } catch (IOException ex) { throw translate(ex); } } @Override public void write(String uploadId, byte[] toWrite, int toWriteOffset, StorageObject dest, long destOffset, int length, boolean last) throws StorageServiceException { try { GenericUrl url = new GenericUrl(uploadId); HttpRequest httpRequest = storage.getRequestFactory().buildPostRequest(url, new ByteArrayContent(null, toWrite, toWriteOffset, length)); long limit = destOffset + length; StringBuilder range = new StringBuilder("bytes "); range.append(destOffset).append('-').append(limit - 1).append('/'); if (last) { range.append(limit); } else { range.append('*'); } httpRequest.getHeaders().setContentRange(range.toString()); int code; String message; IOException exception = null; try { HttpResponse response = httpRequest.execute(); code = response.getStatusCode(); message = response.getStatusMessage(); } catch (HttpResponseException ex) { exception = ex; code = ex.getStatusCode(); message = ex.getStatusMessage(); } if (!last && code != 308 || last && !(code == 200 || code == 201)) { if (exception != null) { throw exception; } GoogleJsonError error = new GoogleJsonError(); error.setCode(code); error.setMessage(message); throw translate(error); } } catch (IOException ex) { throw translate(ex); } } @Override public String open(StorageObject object, Map options) throws StorageServiceException { try { Insert req = storage.objects().insert(object.getBucket(), object); GenericUrl url = req.buildHttpRequest().getUrl(); String scheme = url.getScheme(); String host = url.getHost(); String path = "/upload" + url.getRawPath(); url = new GenericUrl(scheme + "://" + host + path); url.set("uploadType", "resumable"); url.set("name", object.getName()); for (Option option : options.keySet()) { Object content = option.get(options); if (content != null) { url.set(option.value(), content.toString()); } } JsonFactory jsonFactory = storage.getJsonFactory(); HttpRequestFactory requestFactory = storage.getRequestFactory(); HttpRequest httpRequest = requestFactory.buildPostRequest(url, new JsonHttpContent(jsonFactory, object)); httpRequest.getHeaders().set("X-Upload-Content-Type", MoreObjects.firstNonNull(object.getContentType(), "application/octet-stream")); HttpResponse response = httpRequest.execute(); if (response.getStatusCode() != 200) { GoogleJsonError error = new GoogleJsonError(); error.setCode(response.getStatusCode()); error.setMessage(response.getStatusMessage()); throw translate(error); } return response.getHeaders().getLocation(); } catch (IOException ex) { throw translate(ex); } } } \ No newline at end of file diff --git a/src/main/java/com/google/gcloud/spi/ServiceRpcProvider.java b/src/main/java/com/google/gcloud/spi/ServiceRpcProvider.java deleted file mode 100644 index a9882ee231b7..000000000000 --- a/src/main/java/com/google/gcloud/spi/ServiceRpcProvider.java +++ /dev/null @@ -1 +0,0 @@ -/* * 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.common.collect.Iterables; import com.google.gcloud.datastore.DatastoreServiceOptions; import com.google.gcloud.storage.StorageServiceOptions; import java.util.ServiceLoader; public class ServiceRpcProvider { public static DatastoreRpc datastore(DatastoreServiceOptions options) { DatastoreRpcFactory factory = Iterables.getFirst(ServiceLoader.load(DatastoreRpcFactory.class), null); return factory == null ? new DefaultDatastoreRpc(options) : factory.create(options); } public static StorageRpc storage(StorageServiceOptions options) { StorageRpcFactory factory = Iterables.getFirst(ServiceLoader.load(StorageRpcFactory.class), null); return factory == null ? new DefaultStorageRpc(options) : factory.create(options); } } \ No newline at end of file diff --git a/src/main/java/com/google/gcloud/spi/StorageRpcFactory.java b/src/main/java/com/google/gcloud/spi/StorageRpcFactory.java deleted file mode 100644 index 75b618f607ae..000000000000 --- a/src/main/java/com/google/gcloud/spi/StorageRpcFactory.java +++ /dev/null @@ -1 +0,0 @@ -/* * 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.gcloud.storage.StorageServiceOptions; public interface StorageRpcFactory extends ServiceRpcFactory { } \ No newline at end of file diff --git a/src/site/apt/index.apt b/src/site/apt/index.apt index 0d4999bb7764..275ad92934a8 100644 --- a/src/site/apt/index.apt +++ b/src/site/apt/index.apt @@ -12,9 +12,7 @@ GCloud Java: Idiomatic Java Client for Google Cloud Platform services. * {{{https://github.com/GoogleCloudPlatform/gcloud-java}GitHub repository}} - * {{{http://GoogleCloudPlatform.github.io/gcloud-java/apidocs/index.html}Javadocs}} - - * {{{http://GoogleCloudPlatform.github.io/gcloud-java/dependencies.html}Dependencies}} + * {{./apidocs/index.html}Javadocs}} * {{{https://travis-ci.org/GoogleCloudPlatform/gcloud-java} Continous Integration System (Travis-CI)}} diff --git a/src/site/site.xml b/src/site/site.xml index ec2726d99cde..0b23edfd7575 100644 --- a/src/site/site.xml +++ b/src/site/site.xml @@ -24,6 +24,8 @@ - + + + From 6d361df3abb77741dbcab21cae1874acd201869e Mon Sep 17 00:00:00 2001 From: ozarov Date: Mon, 25 May 2015 22:23:43 -0700 Subject: [PATCH 2/5] fix index.apt --- src/site/apt/index.apt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/site/apt/index.apt b/src/site/apt/index.apt index 275ad92934a8..395bfe7a65e0 100644 --- a/src/site/apt/index.apt +++ b/src/site/apt/index.apt @@ -12,7 +12,7 @@ GCloud Java: Idiomatic Java Client for Google Cloud Platform services. * {{{https://github.com/GoogleCloudPlatform/gcloud-java}GitHub repository}} - * {{./apidocs/index.html}Javadocs}} + * {{{./apidocs/index.html}Javadocs}} * {{{https://travis-ci.org/GoogleCloudPlatform/gcloud-java} Continous Integration System (Travis-CI)}} From 2d84ef2ccecf376995104cb6c2469c14e7ae06ba Mon Sep 17 00:00:00 2001 From: aozarov Date: Tue, 26 May 2015 12:52:02 -0700 Subject: [PATCH 3/5] update pom descriptions --- gcloud-java-core/pom.xml | 2 +- gcloud-java-datastore/pom.xml | 3 +++ gcloud-java-examples/pom.xml | 13 ------------- gcloud-java-storage/pom.xml | 3 +++ gcloud-java/pom.xml | 15 +-------------- pom.xml | 15 ++++++++++----- src/site/site.xml | 2 +- 7 files changed, 19 insertions(+), 34 deletions(-) diff --git a/gcloud-java-core/pom.xml b/gcloud-java-core/pom.xml index 7fbbe7dad21d..78baf824c080 100644 --- a/gcloud-java-core/pom.xml +++ b/gcloud-java-core/pom.xml @@ -7,7 +7,7 @@ GCloud Java core https://github.com/GoogleCloudPlatform/gcloud-java - Java idiomatic client for Google Cloud Platform services. + Core module for the gcloud-java. com.google.gcloud diff --git a/gcloud-java-datastore/pom.xml b/gcloud-java-datastore/pom.xml index 0217e9cad58c..b890e6d2b755 100644 --- a/gcloud-java-datastore/pom.xml +++ b/gcloud-java-datastore/pom.xml @@ -6,6 +6,9 @@ jar GCloud Java datastore https://github.com/GoogleCloudPlatform/gcloud-java + + Java idiomatic client for Google Cloud Datastore. + com.google.gcloud gcloud-java-pom diff --git a/gcloud-java-examples/pom.xml b/gcloud-java-examples/pom.xml index ac1ef9f667cb..66d9fc9c93e3 100644 --- a/gcloud-java-examples/pom.xml +++ b/gcloud-java-examples/pom.xml @@ -21,17 +21,4 @@ ${project.version} - - - - org.apache.maven.plugins - maven-site-plugin - 3.1 - - true - true - - - - diff --git a/gcloud-java-storage/pom.xml b/gcloud-java-storage/pom.xml index 29731998eeca..11cc0f02c6ac 100644 --- a/gcloud-java-storage/pom.xml +++ b/gcloud-java-storage/pom.xml @@ -6,6 +6,9 @@ jar GCloud Java storage https://github.com/GoogleCloudPlatform/gcloud-java + + Java idiomatic client for Google Cloud Storage. + com.google.gcloud gcloud-java-pom diff --git a/gcloud-java/pom.xml b/gcloud-java/pom.xml index a70763d2b1bd..fb1226a23d5e 100644 --- a/gcloud-java/pom.xml +++ b/gcloud-java/pom.xml @@ -4,7 +4,7 @@ com.google.gcloud gcloud-java jar - GCloud Java assembly + GCloud Java https://github.com/GoogleCloudPlatform/gcloud-java Java idiomatic client for Google Cloud Platform services. @@ -31,17 +31,4 @@ ${project.version} - - - - org.apache.maven.plugins - maven-site-plugin - 3.1 - - true - true - - - - diff --git a/pom.xml b/pom.xml index a00e0d641b30..e6fafbe5e7c2 100644 --- a/pom.xml +++ b/pom.xml @@ -203,12 +203,18 @@ org.eluder.coveralls coveralls-maven-plugin 3.0.1 + + + ${basedir}/target/coverage.xml + + org.codehaus.mojo cobertura-maven-plugin 2.6 + ${basedir}/target xml html @@ -223,7 +229,6 @@ com/google/gcloud/examples/**/*.class - 256m @@ -259,15 +264,19 @@ index + dependency-info dependencies + dependency-convergence project-team mailing-list cim issue-tracking license scm + dependency-management distribution-management summary + modules @@ -282,10 +291,6 @@ org.apache.maven.plugins maven-dependency-plugin 2.10 - - true - ${project.build.directory}/dependencies - org.apache.maven.plugins diff --git a/src/site/site.xml b/src/site/site.xml index 0b23edfd7575..55047ce85c54 100644 --- a/src/site/site.xml +++ b/src/site/site.xml @@ -25,7 +25,7 @@ - + From 25f86f39f1731836ab95540e81bcd6723b88f9b1 Mon Sep 17 00:00:00 2001 From: aozarov Date: Tue, 26 May 2015 14:23:42 -0700 Subject: [PATCH 4/5] remove StorageRpcProvider and add Javadoc to RPC factory interfaces --- .../com/google/gcloud/ServiceOptions.java | 11 +++++++ .../google/gcloud/spi/ServiceRpcFactory.java | 2 +- .../google/gcloud/spi/ServiceRpcProvider.java | 32 ------------------- .../datastore/DatastoreServiceOptions.java | 3 +- .../gcloud/spi/DatastoreRpcFactory.java | 4 +++ .../google/gcloud/spi/StorageRpcFactory.java | 4 +++ .../gcloud/storage/StorageServiceOptions.java | 3 +- 7 files changed, 22 insertions(+), 37 deletions(-) delete mode 100644 gcloud-java-core/src/main/java/com/google/gcloud/spi/ServiceRpcProvider.java diff --git a/gcloud-java-core/src/main/java/com/google/gcloud/ServiceOptions.java b/gcloud-java-core/src/main/java/com/google/gcloud/ServiceOptions.java index 448b617372b0..a974a1f1912a 100644 --- a/gcloud-java-core/src/main/java/com/google/gcloud/ServiceOptions.java +++ b/gcloud-java-core/src/main/java/com/google/gcloud/ServiceOptions.java @@ -25,6 +25,7 @@ import com.google.api.client.http.HttpRequestInitializer; import com.google.api.client.http.HttpTransport; import com.google.api.client.http.javanet.NetHttpTransport; +import com.google.common.collect.Iterables; import com.google.gcloud.spi.ServiceRpcFactory; import java.io.BufferedReader; @@ -39,6 +40,7 @@ import java.net.URL; import java.util.Locale; import java.util.Objects; +import java.util.ServiceLoader; import java.util.Set; import java.util.regex.Matcher; import java.util.regex.Pattern; @@ -311,4 +313,13 @@ protected boolean isEquals(ServiceOptions other) { } public abstract Builder toBuilder(); + + /** + * Creates a service RPC using a factory loaded by {@link ServiceLoader}. + */ + protected static > R createRpc(O options, + Class> factoryClass) { + ServiceRpcFactory factory = Iterables.getFirst(ServiceLoader.load(factoryClass), null); + return factory == null ? null : factory.create(options); + } } diff --git a/gcloud-java-core/src/main/java/com/google/gcloud/spi/ServiceRpcFactory.java b/gcloud-java-core/src/main/java/com/google/gcloud/spi/ServiceRpcFactory.java index a16d11217bb1..e8e67615305d 100644 --- a/gcloud-java-core/src/main/java/com/google/gcloud/spi/ServiceRpcFactory.java +++ b/gcloud-java-core/src/main/java/com/google/gcloud/spi/ServiceRpcFactory.java @@ -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.gcloud.ServiceOptions; import java.io.Serializable; public interface ServiceRpcFactory extends Serializable { S create(O options); } \ No newline at end of file +/* * 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.gcloud.ServiceOptions; import java.io.Serializable; /** * A base interface for all service RPC factories. * Loading of a factory implementation is done via {@link java.util.ServiceLoader}. */ public interface ServiceRpcFactory extends Serializable { S create(O options); } \ No newline at end of file diff --git a/gcloud-java-core/src/main/java/com/google/gcloud/spi/ServiceRpcProvider.java b/gcloud-java-core/src/main/java/com/google/gcloud/spi/ServiceRpcProvider.java deleted file mode 100644 index 41a2bf2d5848..000000000000 --- a/gcloud-java-core/src/main/java/com/google/gcloud/spi/ServiceRpcProvider.java +++ /dev/null @@ -1,32 +0,0 @@ -/* - * 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.common.collect.Iterables; -import com.google.gcloud.ServiceOptions; - -import java.util.ServiceLoader; - -public class ServiceRpcProvider { - - public static > R get(O options, - Class> factoryClass) { - ServiceRpcFactory factory = Iterables.getFirst(ServiceLoader.load(factoryClass), null); - return factory == null ? null : factory.create(options); - } -} - diff --git a/gcloud-java-datastore/src/main/java/com/google/gcloud/datastore/DatastoreServiceOptions.java b/gcloud-java-datastore/src/main/java/com/google/gcloud/datastore/DatastoreServiceOptions.java index 1dc0855baded..e0dba7b7a982 100644 --- a/gcloud-java-datastore/src/main/java/com/google/gcloud/datastore/DatastoreServiceOptions.java +++ b/gcloud-java-datastore/src/main/java/com/google/gcloud/datastore/DatastoreServiceOptions.java @@ -28,7 +28,6 @@ import com.google.gcloud.spi.DatastoreRpc.DatastoreRpcException; import com.google.gcloud.spi.DatastoreRpcFactory; import com.google.gcloud.spi.DefaultDatastoreRpc; -import com.google.gcloud.spi.ServiceRpcProvider; import java.lang.reflect.Method; import java.util.Iterator; @@ -187,7 +186,7 @@ DatastoreRpc datastoreRpc() { if (serviceRpcFactory() != null) { datastoreRpc = serviceRpcFactory().create(this); } else { - datastoreRpc = ServiceRpcProvider.get(this, DatastoreRpcFactory.class); + datastoreRpc = createRpc(this, DatastoreRpcFactory.class); if (datastoreRpc == null) { datastoreRpc = new DefaultDatastoreRpc(this); } diff --git a/gcloud-java-datastore/src/main/java/com/google/gcloud/spi/DatastoreRpcFactory.java b/gcloud-java-datastore/src/main/java/com/google/gcloud/spi/DatastoreRpcFactory.java index de9e87e4fa2e..952114788f01 100644 --- a/gcloud-java-datastore/src/main/java/com/google/gcloud/spi/DatastoreRpcFactory.java +++ b/gcloud-java-datastore/src/main/java/com/google/gcloud/spi/DatastoreRpcFactory.java @@ -18,6 +18,10 @@ import com.google.gcloud.datastore.DatastoreServiceOptions; +/** + * An interface for Datastore RPC factory. + * Implementation will be loaded via {@link java.util.ServiceLoader}. + */ public interface DatastoreRpcFactory extends ServiceRpcFactory { } diff --git a/gcloud-java-storage/src/main/java/com/google/gcloud/spi/StorageRpcFactory.java b/gcloud-java-storage/src/main/java/com/google/gcloud/spi/StorageRpcFactory.java index d78e721e2331..f693e63018ce 100644 --- a/gcloud-java-storage/src/main/java/com/google/gcloud/spi/StorageRpcFactory.java +++ b/gcloud-java-storage/src/main/java/com/google/gcloud/spi/StorageRpcFactory.java @@ -18,6 +18,10 @@ import com.google.gcloud.storage.StorageServiceOptions; +/** + * An interface for Storage RPC factory. + * Implementation will be loaded via {@link java.util.ServiceLoader}. + */ public interface StorageRpcFactory extends ServiceRpcFactory { } diff --git a/gcloud-java-storage/src/main/java/com/google/gcloud/storage/StorageServiceOptions.java b/gcloud-java-storage/src/main/java/com/google/gcloud/storage/StorageServiceOptions.java index a458692511bd..1bb10743de68 100644 --- a/gcloud-java-storage/src/main/java/com/google/gcloud/storage/StorageServiceOptions.java +++ b/gcloud-java-storage/src/main/java/com/google/gcloud/storage/StorageServiceOptions.java @@ -20,7 +20,6 @@ import com.google.common.collect.ImmutableSet; import com.google.gcloud.ServiceOptions; import com.google.gcloud.spi.DefaultStorageRpc; -import com.google.gcloud.spi.ServiceRpcProvider; import com.google.gcloud.spi.StorageRpc; import com.google.gcloud.spi.StorageRpcFactory; @@ -77,7 +76,7 @@ StorageRpc storageRpc() { if (serviceRpcFactory() != null) { storageRpc = serviceRpcFactory().create(this); } else { - storageRpc = ServiceRpcProvider.get(this, StorageRpcFactory.class); + storageRpc = createRpc(this, StorageRpcFactory.class); if (storageRpc == null) { storageRpc = new DefaultStorageRpc(this); } From 55936ee5a56d1af663f4b0187ec5afedcb2fb953 Mon Sep 17 00:00:00 2001 From: aozarov Date: Tue, 26 May 2015 14:32:10 -0700 Subject: [PATCH 5/5] fix typo --- gcloud-java-core/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gcloud-java-core/README.md b/gcloud-java-core/README.md index e22b159d216f..aa8d4304f1fb 100644 --- a/gcloud-java-core/README.md +++ b/gcloud-java-core/README.md @@ -10,7 +10,7 @@ Java idiomatic client for [Google Cloud Platform][cloud-platform] services. - [API Documentation] (http://googlecloudplatform.github.io/gcloud-java/apidocs) - [Examples] (http://googlecloudplatform.github.io/gcloud-java/apidocs/index.html?com/google/gcloud/examples/package-summary.html) -This moudle provides common functionality and is required by the other service specific modules. +This module provides common functionality and is required by the other service specific modules. Quickstart ----------