diff --git a/google-cloud-storage-control/src/main/java/com/google/storage/control/v2/StorageControlClient.java b/google-cloud-storage-control/src/main/java/com/google/storage/control/v2/StorageControlClient.java
index 46840a92d..ac92b5907 100644
--- a/google-cloud-storage-control/src/main/java/com/google/storage/control/v2/StorageControlClient.java
+++ b/google-cloud-storage-control/src/main/java/com/google/storage/control/v2/StorageControlClient.java
@@ -18,7 +18,9 @@
import com.google.api.core.ApiFuture;
import com.google.api.core.ApiFutures;
+import com.google.api.core.BetaApi;
import com.google.api.gax.core.BackgroundResource;
+import com.google.api.gax.httpjson.longrunning.OperationsClient;
import com.google.api.gax.longrunning.OperationFuture;
import com.google.api.gax.paging.AbstractFixedSizeCollection;
import com.google.api.gax.paging.AbstractPage;
@@ -28,7 +30,6 @@
import com.google.api.gax.rpc.UnaryCallable;
import com.google.common.util.concurrent.MoreExecutors;
import com.google.longrunning.Operation;
-import com.google.longrunning.OperationsClient;
import com.google.protobuf.Empty;
import com.google.protobuf.FieldMask;
import com.google.storage.control.v2.stub.StorageControlStub;
@@ -547,13 +548,28 @@
* StorageControlClient storageControlClient = StorageControlClient.create(storageControlSettings);
* }
*
+ * To use REST (HTTP1.1/JSON) transport (instead of gRPC) for sending and receiving requests over
+ * the wire:
+ *
+ *
{@code
+ * // This snippet has been automatically generated and should be regarded as a code template only.
+ * // It will require modifications to work:
+ * // - It may require correct/in-range values for request initialization.
+ * // - It may require specifying regional endpoints when creating the service client as shown in
+ * // https://cloud.google.com/java/docs/setup#configure_endpoints_for_the_client_library
+ * StorageControlSettings storageControlSettings =
+ * StorageControlSettings.newHttpJsonBuilder().build();
+ * StorageControlClient storageControlClient = StorageControlClient.create(storageControlSettings);
+ * }
+ *
* Please refer to the GitHub repository's samples for more quickstart code snippets.
*/
@Generated("by gapic-generator-java")
public class StorageControlClient implements BackgroundResource {
private final StorageControlSettings settings;
private final StorageControlStub stub;
- private final OperationsClient operationsClient;
+ private final OperationsClient httpJsonOperationsClient;
+ private final com.google.longrunning.OperationsClient operationsClient;
/** Constructs an instance of StorageControlClient with default settings. */
public static final StorageControlClient create() throws IOException {
@@ -585,13 +601,17 @@ public static final StorageControlClient create(StorageControlStub stub) {
protected StorageControlClient(StorageControlSettings settings) throws IOException {
this.settings = settings;
this.stub = ((StorageControlStubSettings) settings.getStubSettings()).createStub();
- this.operationsClient = OperationsClient.create(this.stub.getOperationsStub());
+ this.operationsClient =
+ com.google.longrunning.OperationsClient.create(this.stub.getOperationsStub());
+ this.httpJsonOperationsClient = OperationsClient.create(this.stub.getHttpJsonOperationsStub());
}
protected StorageControlClient(StorageControlStub stub) {
this.settings = null;
this.stub = stub;
- this.operationsClient = OperationsClient.create(this.stub.getOperationsStub());
+ this.operationsClient =
+ com.google.longrunning.OperationsClient.create(this.stub.getOperationsStub());
+ this.httpJsonOperationsClient = OperationsClient.create(this.stub.getHttpJsonOperationsStub());
}
public final StorageControlSettings getSettings() {
@@ -606,10 +626,19 @@ public StorageControlStub getStub() {
* Returns the OperationsClient that can be used to query the status of a long-running operation
* returned by another API method call.
*/
- public final OperationsClient getOperationsClient() {
+ public final com.google.longrunning.OperationsClient getOperationsClient() {
return operationsClient;
}
+ /**
+ * Returns the OperationsClient that can be used to query the status of a long-running operation
+ * returned by another API method call.
+ */
+ @BetaApi
+ public final OperationsClient getHttpJsonOperationsClient() {
+ return httpJsonOperationsClient;
+ }
+
// AUTO-GENERATED DOCUMENTATION AND METHOD.
/**
* Creates a new folder. This operation is only applicable to a hierarchical namespace enabled
diff --git a/google-cloud-storage-control/src/main/java/com/google/storage/control/v2/StorageControlSettings.java b/google-cloud-storage-control/src/main/java/com/google/storage/control/v2/StorageControlSettings.java
index a7bee17da..286869bcc 100644
--- a/google-cloud-storage-control/src/main/java/com/google/storage/control/v2/StorageControlSettings.java
+++ b/google-cloud-storage-control/src/main/java/com/google/storage/control/v2/StorageControlSettings.java
@@ -21,9 +21,11 @@
import static com.google.storage.control.v2.StorageControlClient.ListManagedFoldersPagedResponse;
import com.google.api.core.ApiFunction;
+import com.google.api.core.BetaApi;
import com.google.api.gax.core.GoogleCredentialsProvider;
import com.google.api.gax.core.InstantiatingExecutorProvider;
import com.google.api.gax.grpc.InstantiatingGrpcChannelProvider;
+import com.google.api.gax.httpjson.InstantiatingHttpJsonChannelProvider;
import com.google.api.gax.rpc.ApiClientHeaderProvider;
import com.google.api.gax.rpc.ClientContext;
import com.google.api.gax.rpc.ClientSettings;
@@ -297,11 +299,18 @@ public static GoogleCredentialsProvider.Builder defaultCredentialsProviderBuilde
return StorageControlStubSettings.defaultCredentialsProviderBuilder();
}
- /** Returns a builder for the default ChannelProvider for this service. */
+ /** Returns a builder for the default gRPC ChannelProvider for this service. */
public static InstantiatingGrpcChannelProvider.Builder defaultGrpcTransportProviderBuilder() {
return StorageControlStubSettings.defaultGrpcTransportProviderBuilder();
}
+ /** Returns a builder for the default REST ChannelProvider for this service. */
+ @BetaApi
+ public static InstantiatingHttpJsonChannelProvider.Builder
+ defaultHttpJsonTransportProviderBuilder() {
+ return StorageControlStubSettings.defaultHttpJsonTransportProviderBuilder();
+ }
+
public static TransportChannelProvider defaultTransportChannelProvider() {
return StorageControlStubSettings.defaultTransportChannelProvider();
}
@@ -310,11 +319,16 @@ public static ApiClientHeaderProvider.Builder defaultApiClientHeaderProviderBuil
return StorageControlStubSettings.defaultApiClientHeaderProviderBuilder();
}
- /** Returns a new builder for this class. */
+ /** Returns a new gRPC builder for this class. */
public static Builder newBuilder() {
return Builder.createDefault();
}
+ /** Returns a new REST builder for this class. */
+ public static Builder newHttpJsonBuilder() {
+ return Builder.createHttpJsonDefault();
+ }
+
/** Returns a new builder for this class. */
public static Builder newBuilder(ClientContext clientContext) {
return new Builder(clientContext);
@@ -352,6 +366,10 @@ private static Builder createDefault() {
return new Builder(StorageControlStubSettings.newBuilder());
}
+ private static Builder createHttpJsonDefault() {
+ return new Builder(StorageControlStubSettings.newHttpJsonBuilder());
+ }
+
public StorageControlStubSettings.Builder getStubSettingsBuilder() {
return ((StorageControlStubSettings.Builder) getStubSettings());
}
diff --git a/google-cloud-storage-control/src/main/java/com/google/storage/control/v2/stub/HttpJsonStorageControlCallableFactory.java b/google-cloud-storage-control/src/main/java/com/google/storage/control/v2/stub/HttpJsonStorageControlCallableFactory.java
new file mode 100644
index 000000000..dac9e0655
--- /dev/null
+++ b/google-cloud-storage-control/src/main/java/com/google/storage/control/v2/stub/HttpJsonStorageControlCallableFactory.java
@@ -0,0 +1,101 @@
+/*
+ * Copyright 2025 Google LLC
+ *
+ * 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
+ *
+ * https://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.storage.control.v2.stub;
+
+import com.google.api.gax.httpjson.HttpJsonCallSettings;
+import com.google.api.gax.httpjson.HttpJsonCallableFactory;
+import com.google.api.gax.httpjson.HttpJsonOperationSnapshotCallable;
+import com.google.api.gax.httpjson.HttpJsonStubCallableFactory;
+import com.google.api.gax.httpjson.longrunning.stub.OperationsStub;
+import com.google.api.gax.rpc.BatchingCallSettings;
+import com.google.api.gax.rpc.ClientContext;
+import com.google.api.gax.rpc.OperationCallSettings;
+import com.google.api.gax.rpc.OperationCallable;
+import com.google.api.gax.rpc.PagedCallSettings;
+import com.google.api.gax.rpc.ServerStreamingCallSettings;
+import com.google.api.gax.rpc.ServerStreamingCallable;
+import com.google.api.gax.rpc.UnaryCallSettings;
+import com.google.api.gax.rpc.UnaryCallable;
+import com.google.longrunning.Operation;
+import javax.annotation.Generated;
+
+// AUTO-GENERATED DOCUMENTATION AND CLASS.
+/**
+ * REST callable factory implementation for the StorageControl service API.
+ *
+ *
This class is for advanced usage.
+ */
+@Generated("by gapic-generator-java")
+public class HttpJsonStorageControlCallableFactory
+ implements HttpJsonStubCallableFactory {
+
+ @Override
+ public UnaryCallable createUnaryCallable(
+ HttpJsonCallSettings httpJsonCallSettings,
+ UnaryCallSettings callSettings,
+ ClientContext clientContext) {
+ return HttpJsonCallableFactory.createUnaryCallable(
+ httpJsonCallSettings, callSettings, clientContext);
+ }
+
+ @Override
+ public
+ UnaryCallable createPagedCallable(
+ HttpJsonCallSettings httpJsonCallSettings,
+ PagedCallSettings callSettings,
+ ClientContext clientContext) {
+ return HttpJsonCallableFactory.createPagedCallable(
+ httpJsonCallSettings, callSettings, clientContext);
+ }
+
+ @Override
+ public UnaryCallable createBatchingCallable(
+ HttpJsonCallSettings httpJsonCallSettings,
+ BatchingCallSettings callSettings,
+ ClientContext clientContext) {
+ return HttpJsonCallableFactory.createBatchingCallable(
+ httpJsonCallSettings, callSettings, clientContext);
+ }
+
+ @Override
+ public
+ OperationCallable createOperationCallable(
+ HttpJsonCallSettings httpJsonCallSettings,
+ OperationCallSettings callSettings,
+ ClientContext clientContext,
+ OperationsStub operationsStub) {
+ UnaryCallable innerCallable =
+ HttpJsonCallableFactory.createBaseUnaryCallable(
+ httpJsonCallSettings, callSettings.getInitialCallSettings(), clientContext);
+ HttpJsonOperationSnapshotCallable initialCallable =
+ new HttpJsonOperationSnapshotCallable(
+ innerCallable,
+ httpJsonCallSettings.getMethodDescriptor().getOperationSnapshotFactory());
+ return HttpJsonCallableFactory.createOperationCallable(
+ callSettings, clientContext, operationsStub.longRunningClient(), initialCallable);
+ }
+
+ @Override
+ public
+ ServerStreamingCallable createServerStreamingCallable(
+ HttpJsonCallSettings httpJsonCallSettings,
+ ServerStreamingCallSettings callSettings,
+ ClientContext clientContext) {
+ return HttpJsonCallableFactory.createServerStreamingCallable(
+ httpJsonCallSettings, callSettings, clientContext);
+ }
+}
diff --git a/google-cloud-storage-control/src/main/java/com/google/storage/control/v2/stub/HttpJsonStorageControlStub.java b/google-cloud-storage-control/src/main/java/com/google/storage/control/v2/stub/HttpJsonStorageControlStub.java
new file mode 100644
index 000000000..9aed10cfc
--- /dev/null
+++ b/google-cloud-storage-control/src/main/java/com/google/storage/control/v2/stub/HttpJsonStorageControlStub.java
@@ -0,0 +1,727 @@
+/*
+ * Copyright 2025 Google LLC
+ *
+ * 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
+ *
+ * https://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.storage.control.v2.stub;
+
+import com.google.api.core.InternalApi;
+import com.google.api.gax.core.BackgroundResource;
+import com.google.api.gax.core.BackgroundResourceAggregation;
+import com.google.api.gax.httpjson.ApiMethodDescriptor;
+import com.google.api.gax.httpjson.HttpJsonCallSettings;
+import com.google.api.gax.httpjson.HttpJsonStubCallableFactory;
+import com.google.api.gax.httpjson.ProtoMessageRequestFormatter;
+import com.google.api.gax.httpjson.ProtoMessageResponseParser;
+import com.google.api.gax.httpjson.ProtoRestSerializer;
+import com.google.api.gax.httpjson.longrunning.stub.HttpJsonOperationsStub;
+import com.google.api.gax.rpc.ClientContext;
+import com.google.api.gax.rpc.RequestParamsBuilder;
+import com.google.api.gax.rpc.UnaryCallable;
+import com.google.longrunning.Operation;
+import com.google.protobuf.Empty;
+import com.google.protobuf.TypeRegistry;
+import com.google.storage.control.v2.AnywhereCache;
+import com.google.storage.control.v2.CreateAnywhereCacheMetadata;
+import com.google.storage.control.v2.CreateAnywhereCacheRequest;
+import com.google.storage.control.v2.CreateFolderRequest;
+import com.google.storage.control.v2.CreateManagedFolderRequest;
+import com.google.storage.control.v2.DeleteFolderRequest;
+import com.google.storage.control.v2.DeleteManagedFolderRequest;
+import com.google.storage.control.v2.DisableAnywhereCacheRequest;
+import com.google.storage.control.v2.Folder;
+import com.google.storage.control.v2.GetAnywhereCacheRequest;
+import com.google.storage.control.v2.GetFolderIntelligenceConfigRequest;
+import com.google.storage.control.v2.GetFolderRequest;
+import com.google.storage.control.v2.GetManagedFolderRequest;
+import com.google.storage.control.v2.GetOrganizationIntelligenceConfigRequest;
+import com.google.storage.control.v2.GetProjectIntelligenceConfigRequest;
+import com.google.storage.control.v2.GetStorageLayoutRequest;
+import com.google.storage.control.v2.IntelligenceConfig;
+import com.google.storage.control.v2.ListAnywhereCachesRequest;
+import com.google.storage.control.v2.ListAnywhereCachesResponse;
+import com.google.storage.control.v2.ListFoldersRequest;
+import com.google.storage.control.v2.ListFoldersResponse;
+import com.google.storage.control.v2.ListManagedFoldersRequest;
+import com.google.storage.control.v2.ListManagedFoldersResponse;
+import com.google.storage.control.v2.ManagedFolder;
+import com.google.storage.control.v2.PauseAnywhereCacheRequest;
+import com.google.storage.control.v2.RenameFolderMetadata;
+import com.google.storage.control.v2.RenameFolderRequest;
+import com.google.storage.control.v2.ResumeAnywhereCacheRequest;
+import com.google.storage.control.v2.StorageLayout;
+import com.google.storage.control.v2.UpdateAnywhereCacheMetadata;
+import com.google.storage.control.v2.UpdateAnywhereCacheRequest;
+import com.google.storage.control.v2.UpdateFolderIntelligenceConfigRequest;
+import com.google.storage.control.v2.UpdateOrganizationIntelligenceConfigRequest;
+import com.google.storage.control.v2.UpdateProjectIntelligenceConfigRequest;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.concurrent.TimeUnit;
+import javax.annotation.Generated;
+
+// AUTO-GENERATED DOCUMENTATION AND CLASS.
+/**
+ * REST stub implementation for the StorageControl service API.
+ *
+ * This class is for advanced usage and reflects the underlying API directly.
+ */
+@Generated("by gapic-generator-java")
+public class HttpJsonStorageControlStub extends StorageControlStub {
+ private static final TypeRegistry typeRegistry =
+ TypeRegistry.newBuilder()
+ .add(RenameFolderMetadata.getDescriptor())
+ .add(Folder.getDescriptor())
+ .add(AnywhereCache.getDescriptor())
+ .add(UpdateAnywhereCacheMetadata.getDescriptor())
+ .add(CreateAnywhereCacheMetadata.getDescriptor())
+ .build();
+
+ private static final ApiMethodDescriptor
+ getProjectIntelligenceConfigMethodDescriptor =
+ ApiMethodDescriptor.newBuilder()
+ .setFullMethodName(
+ "google.storage.control.v2.StorageControl/GetProjectIntelligenceConfig")
+ .setHttpMethod("GET")
+ .setType(ApiMethodDescriptor.MethodType.UNARY)
+ .setRequestFormatter(
+ ProtoMessageRequestFormatter.newBuilder()
+ .setPath(
+ "/v2/{name=projects/*/locations/*/intelligenceConfig}",
+ request -> {
+ Map fields = new HashMap<>();
+ ProtoRestSerializer serializer =
+ ProtoRestSerializer.create();
+ serializer.putPathParam(fields, "name", request.getName());
+ return fields;
+ })
+ .setQueryParamsExtractor(
+ request -> {
+ Map> fields = new HashMap<>();
+ ProtoRestSerializer serializer =
+ ProtoRestSerializer.create();
+ serializer.putQueryParam(fields, "$alt", "json;enum-encoding=int");
+ return fields;
+ })
+ .setRequestBodyExtractor(request -> null)
+ .build())
+ .setResponseParser(
+ ProtoMessageResponseParser.newBuilder()
+ .setDefaultInstance(IntelligenceConfig.getDefaultInstance())
+ .setDefaultTypeRegistry(typeRegistry)
+ .build())
+ .build();
+
+ private static final ApiMethodDescriptor<
+ UpdateProjectIntelligenceConfigRequest, IntelligenceConfig>
+ updateProjectIntelligenceConfigMethodDescriptor =
+ ApiMethodDescriptor
+ .newBuilder()
+ .setFullMethodName(
+ "google.storage.control.v2.StorageControl/UpdateProjectIntelligenceConfig")
+ .setHttpMethod("PATCH")
+ .setType(ApiMethodDescriptor.MethodType.UNARY)
+ .setRequestFormatter(
+ ProtoMessageRequestFormatter.newBuilder()
+ .setPath(
+ "/v2/{intelligenceConfig.name=projects/*/locations/*/intelligenceConfig}",
+ request -> {
+ Map fields = new HashMap<>();
+ ProtoRestSerializer serializer =
+ ProtoRestSerializer.create();
+ serializer.putPathParam(
+ fields,
+ "intelligenceConfig.name",
+ request.getIntelligenceConfig().getName());
+ return fields;
+ })
+ .setQueryParamsExtractor(
+ request -> {
+ Map> fields = new HashMap<>();
+ ProtoRestSerializer serializer =
+ ProtoRestSerializer.create();
+ serializer.putQueryParam(fields, "requestId", request.getRequestId());
+ serializer.putQueryParam(fields, "updateMask", request.getUpdateMask());
+ serializer.putQueryParam(fields, "$alt", "json;enum-encoding=int");
+ return fields;
+ })
+ .setRequestBodyExtractor(
+ request ->
+ ProtoRestSerializer.create()
+ .toBody(
+ "intelligenceConfig", request.getIntelligenceConfig(), true))
+ .build())
+ .setResponseParser(
+ ProtoMessageResponseParser.newBuilder()
+ .setDefaultInstance(IntelligenceConfig.getDefaultInstance())
+ .setDefaultTypeRegistry(typeRegistry)
+ .build())
+ .build();
+
+ private static final ApiMethodDescriptor
+ getFolderIntelligenceConfigMethodDescriptor =
+ ApiMethodDescriptor.newBuilder()
+ .setFullMethodName(
+ "google.storage.control.v2.StorageControl/GetFolderIntelligenceConfig")
+ .setHttpMethod("GET")
+ .setType(ApiMethodDescriptor.MethodType.UNARY)
+ .setRequestFormatter(
+ ProtoMessageRequestFormatter.newBuilder()
+ .setPath(
+ "/v2/{name=folders/*/locations/*/intelligenceConfig}",
+ request -> {
+ Map fields = new HashMap<>();
+ ProtoRestSerializer serializer =
+ ProtoRestSerializer.create();
+ serializer.putPathParam(fields, "name", request.getName());
+ return fields;
+ })
+ .setQueryParamsExtractor(
+ request -> {
+ Map> fields = new HashMap<>();
+ ProtoRestSerializer serializer =
+ ProtoRestSerializer.create();
+ serializer.putQueryParam(fields, "$alt", "json;enum-encoding=int");
+ return fields;
+ })
+ .setRequestBodyExtractor(request -> null)
+ .build())
+ .setResponseParser(
+ ProtoMessageResponseParser.newBuilder()
+ .setDefaultInstance(IntelligenceConfig.getDefaultInstance())
+ .setDefaultTypeRegistry(typeRegistry)
+ .build())
+ .build();
+
+ private static final ApiMethodDescriptor<
+ UpdateFolderIntelligenceConfigRequest, IntelligenceConfig>
+ updateFolderIntelligenceConfigMethodDescriptor =
+ ApiMethodDescriptor
+ .newBuilder()
+ .setFullMethodName(
+ "google.storage.control.v2.StorageControl/UpdateFolderIntelligenceConfig")
+ .setHttpMethod("PATCH")
+ .setType(ApiMethodDescriptor.MethodType.UNARY)
+ .setRequestFormatter(
+ ProtoMessageRequestFormatter.newBuilder()
+ .setPath(
+ "/v2/{intelligenceConfig.name=folders/*/locations/*/intelligenceConfig}",
+ request -> {
+ Map fields = new HashMap<>();
+ ProtoRestSerializer serializer =
+ ProtoRestSerializer.create();
+ serializer.putPathParam(
+ fields,
+ "intelligenceConfig.name",
+ request.getIntelligenceConfig().getName());
+ return fields;
+ })
+ .setQueryParamsExtractor(
+ request -> {
+ Map> fields = new HashMap<>();
+ ProtoRestSerializer serializer =
+ ProtoRestSerializer.create();
+ serializer.putQueryParam(fields, "requestId", request.getRequestId());
+ serializer.putQueryParam(fields, "updateMask", request.getUpdateMask());
+ serializer.putQueryParam(fields, "$alt", "json;enum-encoding=int");
+ return fields;
+ })
+ .setRequestBodyExtractor(
+ request ->
+ ProtoRestSerializer.create()
+ .toBody(
+ "intelligenceConfig", request.getIntelligenceConfig(), true))
+ .build())
+ .setResponseParser(
+ ProtoMessageResponseParser.newBuilder()
+ .setDefaultInstance(IntelligenceConfig.getDefaultInstance())
+ .setDefaultTypeRegistry(typeRegistry)
+ .build())
+ .build();
+
+ private static final ApiMethodDescriptor<
+ GetOrganizationIntelligenceConfigRequest, IntelligenceConfig>
+ getOrganizationIntelligenceConfigMethodDescriptor =
+ ApiMethodDescriptor
+ .newBuilder()
+ .setFullMethodName(
+ "google.storage.control.v2.StorageControl/GetOrganizationIntelligenceConfig")
+ .setHttpMethod("GET")
+ .setType(ApiMethodDescriptor.MethodType.UNARY)
+ .setRequestFormatter(
+ ProtoMessageRequestFormatter
+ .newBuilder()
+ .setPath(
+ "/v2/{name=organizations/*/locations/*/intelligenceConfig}",
+ request -> {
+ Map fields = new HashMap<>();
+ ProtoRestSerializer
+ serializer = ProtoRestSerializer.create();
+ serializer.putPathParam(fields, "name", request.getName());
+ return fields;
+ })
+ .setQueryParamsExtractor(
+ request -> {
+ Map> fields = new HashMap<>();
+ ProtoRestSerializer
+ serializer = ProtoRestSerializer.create();
+ serializer.putQueryParam(fields, "$alt", "json;enum-encoding=int");
+ return fields;
+ })
+ .setRequestBodyExtractor(request -> null)
+ .build())
+ .setResponseParser(
+ ProtoMessageResponseParser.newBuilder()
+ .setDefaultInstance(IntelligenceConfig.getDefaultInstance())
+ .setDefaultTypeRegistry(typeRegistry)
+ .build())
+ .build();
+
+ private static final ApiMethodDescriptor<
+ UpdateOrganizationIntelligenceConfigRequest, IntelligenceConfig>
+ updateOrganizationIntelligenceConfigMethodDescriptor =
+ ApiMethodDescriptor
+ .newBuilder()
+ .setFullMethodName(
+ "google.storage.control.v2.StorageControl/UpdateOrganizationIntelligenceConfig")
+ .setHttpMethod("PATCH")
+ .setType(ApiMethodDescriptor.MethodType.UNARY)
+ .setRequestFormatter(
+ ProtoMessageRequestFormatter
+ .newBuilder()
+ .setPath(
+ "/v2/{intelligenceConfig.name=organizations/*/locations/*/intelligenceConfig}",
+ request -> {
+ Map fields = new HashMap<>();
+ ProtoRestSerializer
+ serializer = ProtoRestSerializer.create();
+ serializer.putPathParam(
+ fields,
+ "intelligenceConfig.name",
+ request.getIntelligenceConfig().getName());
+ return fields;
+ })
+ .setQueryParamsExtractor(
+ request -> {
+ Map> fields = new HashMap<>();
+ ProtoRestSerializer
+ serializer = ProtoRestSerializer.create();
+ serializer.putQueryParam(fields, "requestId", request.getRequestId());
+ serializer.putQueryParam(fields, "updateMask", request.getUpdateMask());
+ serializer.putQueryParam(fields, "$alt", "json;enum-encoding=int");
+ return fields;
+ })
+ .setRequestBodyExtractor(
+ request ->
+ ProtoRestSerializer.create()
+ .toBody(
+ "intelligenceConfig", request.getIntelligenceConfig(), true))
+ .build())
+ .setResponseParser(
+ ProtoMessageResponseParser.newBuilder()
+ .setDefaultInstance(IntelligenceConfig.getDefaultInstance())
+ .setDefaultTypeRegistry(typeRegistry)
+ .build())
+ .build();
+
+ private final UnaryCallable
+ getProjectIntelligenceConfigCallable;
+ private final UnaryCallable
+ updateProjectIntelligenceConfigCallable;
+ private final UnaryCallable
+ getFolderIntelligenceConfigCallable;
+ private final UnaryCallable
+ updateFolderIntelligenceConfigCallable;
+ private final UnaryCallable
+ getOrganizationIntelligenceConfigCallable;
+ private final UnaryCallable
+ updateOrganizationIntelligenceConfigCallable;
+
+ private final BackgroundResource backgroundResources;
+ private final HttpJsonOperationsStub httpJsonOperationsStub;
+ private final HttpJsonStubCallableFactory callableFactory;
+
+ public static final HttpJsonStorageControlStub create(StorageControlStubSettings settings)
+ throws IOException {
+ return new HttpJsonStorageControlStub(settings, ClientContext.create(settings));
+ }
+
+ public static final HttpJsonStorageControlStub create(ClientContext clientContext)
+ throws IOException {
+ return new HttpJsonStorageControlStub(
+ StorageControlStubSettings.newHttpJsonBuilder().build(), clientContext);
+ }
+
+ public static final HttpJsonStorageControlStub create(
+ ClientContext clientContext, HttpJsonStubCallableFactory callableFactory) throws IOException {
+ return new HttpJsonStorageControlStub(
+ StorageControlStubSettings.newHttpJsonBuilder().build(), clientContext, callableFactory);
+ }
+
+ /**
+ * Constructs an instance of HttpJsonStorageControlStub, using the given settings. This is
+ * protected so that it is easy to make a subclass, but otherwise, the static factory methods
+ * should be preferred.
+ */
+ protected HttpJsonStorageControlStub(
+ StorageControlStubSettings settings, ClientContext clientContext) throws IOException {
+ this(settings, clientContext, new HttpJsonStorageControlCallableFactory());
+ }
+
+ /**
+ * Constructs an instance of HttpJsonStorageControlStub, using the given settings. This is
+ * protected so that it is easy to make a subclass, but otherwise, the static factory methods
+ * should be preferred.
+ */
+ protected HttpJsonStorageControlStub(
+ StorageControlStubSettings settings,
+ ClientContext clientContext,
+ HttpJsonStubCallableFactory callableFactory)
+ throws IOException {
+ this.callableFactory = callableFactory;
+ this.httpJsonOperationsStub =
+ HttpJsonOperationsStub.create(clientContext, callableFactory, typeRegistry);
+
+ HttpJsonCallSettings
+ getProjectIntelligenceConfigTransportSettings =
+ HttpJsonCallSettings
+ .newBuilder()
+ .setMethodDescriptor(getProjectIntelligenceConfigMethodDescriptor)
+ .setTypeRegistry(typeRegistry)
+ .setParamsExtractor(
+ request -> {
+ RequestParamsBuilder builder = RequestParamsBuilder.create();
+ builder.add("name", String.valueOf(request.getName()));
+ return builder.build();
+ })
+ .build();
+ HttpJsonCallSettings
+ updateProjectIntelligenceConfigTransportSettings =
+ HttpJsonCallSettings
+ .newBuilder()
+ .setMethodDescriptor(updateProjectIntelligenceConfigMethodDescriptor)
+ .setTypeRegistry(typeRegistry)
+ .setParamsExtractor(
+ request -> {
+ RequestParamsBuilder builder = RequestParamsBuilder.create();
+ builder.add(
+ "intelligence_config.name",
+ String.valueOf(request.getIntelligenceConfig().getName()));
+ return builder.build();
+ })
+ .build();
+ HttpJsonCallSettings
+ getFolderIntelligenceConfigTransportSettings =
+ HttpJsonCallSettings
+ .newBuilder()
+ .setMethodDescriptor(getFolderIntelligenceConfigMethodDescriptor)
+ .setTypeRegistry(typeRegistry)
+ .setParamsExtractor(
+ request -> {
+ RequestParamsBuilder builder = RequestParamsBuilder.create();
+ builder.add("name", String.valueOf(request.getName()));
+ return builder.build();
+ })
+ .build();
+ HttpJsonCallSettings
+ updateFolderIntelligenceConfigTransportSettings =
+ HttpJsonCallSettings
+ .newBuilder()
+ .setMethodDescriptor(updateFolderIntelligenceConfigMethodDescriptor)
+ .setTypeRegistry(typeRegistry)
+ .setParamsExtractor(
+ request -> {
+ RequestParamsBuilder builder = RequestParamsBuilder.create();
+ builder.add(
+ "intelligence_config.name",
+ String.valueOf(request.getIntelligenceConfig().getName()));
+ return builder.build();
+ })
+ .build();
+ HttpJsonCallSettings
+ getOrganizationIntelligenceConfigTransportSettings =
+ HttpJsonCallSettings
+ .newBuilder()
+ .setMethodDescriptor(getOrganizationIntelligenceConfigMethodDescriptor)
+ .setTypeRegistry(typeRegistry)
+ .setParamsExtractor(
+ request -> {
+ RequestParamsBuilder builder = RequestParamsBuilder.create();
+ builder.add("name", String.valueOf(request.getName()));
+ return builder.build();
+ })
+ .build();
+ HttpJsonCallSettings
+ updateOrganizationIntelligenceConfigTransportSettings =
+ HttpJsonCallSettings
+ .newBuilder()
+ .setMethodDescriptor(updateOrganizationIntelligenceConfigMethodDescriptor)
+ .setTypeRegistry(typeRegistry)
+ .setParamsExtractor(
+ request -> {
+ RequestParamsBuilder builder = RequestParamsBuilder.create();
+ builder.add(
+ "intelligence_config.name",
+ String.valueOf(request.getIntelligenceConfig().getName()));
+ return builder.build();
+ })
+ .build();
+
+ this.getProjectIntelligenceConfigCallable =
+ callableFactory.createUnaryCallable(
+ getProjectIntelligenceConfigTransportSettings,
+ settings.getProjectIntelligenceConfigSettings(),
+ clientContext);
+ this.updateProjectIntelligenceConfigCallable =
+ callableFactory.createUnaryCallable(
+ updateProjectIntelligenceConfigTransportSettings,
+ settings.updateProjectIntelligenceConfigSettings(),
+ clientContext);
+ this.getFolderIntelligenceConfigCallable =
+ callableFactory.createUnaryCallable(
+ getFolderIntelligenceConfigTransportSettings,
+ settings.getFolderIntelligenceConfigSettings(),
+ clientContext);
+ this.updateFolderIntelligenceConfigCallable =
+ callableFactory.createUnaryCallable(
+ updateFolderIntelligenceConfigTransportSettings,
+ settings.updateFolderIntelligenceConfigSettings(),
+ clientContext);
+ this.getOrganizationIntelligenceConfigCallable =
+ callableFactory.createUnaryCallable(
+ getOrganizationIntelligenceConfigTransportSettings,
+ settings.getOrganizationIntelligenceConfigSettings(),
+ clientContext);
+ this.updateOrganizationIntelligenceConfigCallable =
+ callableFactory.createUnaryCallable(
+ updateOrganizationIntelligenceConfigTransportSettings,
+ settings.updateOrganizationIntelligenceConfigSettings(),
+ clientContext);
+
+ this.backgroundResources =
+ new BackgroundResourceAggregation(clientContext.getBackgroundResources());
+ }
+
+ @InternalApi
+ public static List getMethodDescriptors() {
+ List methodDescriptors = new ArrayList<>();
+ methodDescriptors.add(getProjectIntelligenceConfigMethodDescriptor);
+ methodDescriptors.add(updateProjectIntelligenceConfigMethodDescriptor);
+ methodDescriptors.add(getFolderIntelligenceConfigMethodDescriptor);
+ methodDescriptors.add(updateFolderIntelligenceConfigMethodDescriptor);
+ methodDescriptors.add(getOrganizationIntelligenceConfigMethodDescriptor);
+ methodDescriptors.add(updateOrganizationIntelligenceConfigMethodDescriptor);
+ return methodDescriptors;
+ }
+
+ public HttpJsonOperationsStub getHttpJsonOperationsStub() {
+ return httpJsonOperationsStub;
+ }
+
+ @Override
+ public UnaryCallable
+ getProjectIntelligenceConfigCallable() {
+ return getProjectIntelligenceConfigCallable;
+ }
+
+ @Override
+ public UnaryCallable
+ updateProjectIntelligenceConfigCallable() {
+ return updateProjectIntelligenceConfigCallable;
+ }
+
+ @Override
+ public UnaryCallable
+ getFolderIntelligenceConfigCallable() {
+ return getFolderIntelligenceConfigCallable;
+ }
+
+ @Override
+ public UnaryCallable
+ updateFolderIntelligenceConfigCallable() {
+ return updateFolderIntelligenceConfigCallable;
+ }
+
+ @Override
+ public UnaryCallable
+ getOrganizationIntelligenceConfigCallable() {
+ return getOrganizationIntelligenceConfigCallable;
+ }
+
+ @Override
+ public UnaryCallable
+ updateOrganizationIntelligenceConfigCallable() {
+ return updateOrganizationIntelligenceConfigCallable;
+ }
+
+ @Override
+ public UnaryCallable createFolderCallable() {
+ throw new UnsupportedOperationException(
+ "Not implemented: createFolderCallable(). REST transport is not implemented for this method"
+ + " yet.");
+ }
+
+ @Override
+ public UnaryCallable deleteFolderCallable() {
+ throw new UnsupportedOperationException(
+ "Not implemented: deleteFolderCallable(). REST transport is not implemented for this method"
+ + " yet.");
+ }
+
+ @Override
+ public UnaryCallable getFolderCallable() {
+ throw new UnsupportedOperationException(
+ "Not implemented: getFolderCallable(). REST transport is not implemented for this method"
+ + " yet.");
+ }
+
+ @Override
+ public UnaryCallable listFoldersCallable() {
+ throw new UnsupportedOperationException(
+ "Not implemented: listFoldersCallable(). REST transport is not implemented for this method"
+ + " yet.");
+ }
+
+ @Override
+ public UnaryCallable renameFolderCallable() {
+ throw new UnsupportedOperationException(
+ "Not implemented: renameFolderCallable(). REST transport is not implemented for this method"
+ + " yet.");
+ }
+
+ @Override
+ public UnaryCallable getStorageLayoutCallable() {
+ throw new UnsupportedOperationException(
+ "Not implemented: getStorageLayoutCallable(). REST transport is not implemented for this"
+ + " method yet.");
+ }
+
+ @Override
+ public UnaryCallable createManagedFolderCallable() {
+ throw new UnsupportedOperationException(
+ "Not implemented: createManagedFolderCallable(). REST transport is not implemented for this"
+ + " method yet.");
+ }
+
+ @Override
+ public UnaryCallable deleteManagedFolderCallable() {
+ throw new UnsupportedOperationException(
+ "Not implemented: deleteManagedFolderCallable(). REST transport is not implemented for this"
+ + " method yet.");
+ }
+
+ @Override
+ public UnaryCallable getManagedFolderCallable() {
+ throw new UnsupportedOperationException(
+ "Not implemented: getManagedFolderCallable(). REST transport is not implemented for this"
+ + " method yet.");
+ }
+
+ @Override
+ public UnaryCallable
+ listManagedFoldersCallable() {
+ throw new UnsupportedOperationException(
+ "Not implemented: listManagedFoldersCallable(). REST transport is not implemented for this"
+ + " method yet.");
+ }
+
+ @Override
+ public UnaryCallable createAnywhereCacheCallable() {
+ throw new UnsupportedOperationException(
+ "Not implemented: createAnywhereCacheCallable(). REST transport is not implemented for this"
+ + " method yet.");
+ }
+
+ @Override
+ public UnaryCallable updateAnywhereCacheCallable() {
+ throw new UnsupportedOperationException(
+ "Not implemented: updateAnywhereCacheCallable(). REST transport is not implemented for this"
+ + " method yet.");
+ }
+
+ @Override
+ public UnaryCallable disableAnywhereCacheCallable() {
+ throw new UnsupportedOperationException(
+ "Not implemented: disableAnywhereCacheCallable(). REST transport is not implemented for"
+ + " this method yet.");
+ }
+
+ @Override
+ public UnaryCallable pauseAnywhereCacheCallable() {
+ throw new UnsupportedOperationException(
+ "Not implemented: pauseAnywhereCacheCallable(). REST transport is not implemented for this"
+ + " method yet.");
+ }
+
+ @Override
+ public UnaryCallable resumeAnywhereCacheCallable() {
+ throw new UnsupportedOperationException(
+ "Not implemented: resumeAnywhereCacheCallable(). REST transport is not implemented for this"
+ + " method yet.");
+ }
+
+ @Override
+ public UnaryCallable getAnywhereCacheCallable() {
+ throw new UnsupportedOperationException(
+ "Not implemented: getAnywhereCacheCallable(). REST transport is not implemented for this"
+ + " method yet.");
+ }
+
+ @Override
+ public UnaryCallable
+ listAnywhereCachesCallable() {
+ throw new UnsupportedOperationException(
+ "Not implemented: listAnywhereCachesCallable(). REST transport is not implemented for this"
+ + " method yet.");
+ }
+
+ @Override
+ public final void close() {
+ try {
+ backgroundResources.close();
+ } catch (RuntimeException e) {
+ throw e;
+ } catch (Exception e) {
+ throw new IllegalStateException("Failed to close resource", e);
+ }
+ }
+
+ @Override
+ public void shutdown() {
+ backgroundResources.shutdown();
+ }
+
+ @Override
+ public boolean isShutdown() {
+ return backgroundResources.isShutdown();
+ }
+
+ @Override
+ public boolean isTerminated() {
+ return backgroundResources.isTerminated();
+ }
+
+ @Override
+ public void shutdownNow() {
+ backgroundResources.shutdownNow();
+ }
+
+ @Override
+ public boolean awaitTermination(long duration, TimeUnit unit) throws InterruptedException {
+ return backgroundResources.awaitTermination(duration, unit);
+ }
+}
diff --git a/google-cloud-storage-control/src/main/java/com/google/storage/control/v2/stub/StorageControlStub.java b/google-cloud-storage-control/src/main/java/com/google/storage/control/v2/stub/StorageControlStub.java
index 30efedc18..5bab8877f 100644
--- a/google-cloud-storage-control/src/main/java/com/google/storage/control/v2/stub/StorageControlStub.java
+++ b/google-cloud-storage-control/src/main/java/com/google/storage/control/v2/stub/StorageControlStub.java
@@ -72,7 +72,11 @@
public abstract class StorageControlStub implements BackgroundResource {
public OperationsStub getOperationsStub() {
- throw new UnsupportedOperationException("Not implemented: getOperationsStub()");
+ return null;
+ }
+
+ public com.google.api.gax.httpjson.longrunning.stub.OperationsStub getHttpJsonOperationsStub() {
+ return null;
}
public UnaryCallable createFolderCallable() {
diff --git a/google-cloud-storage-control/src/main/java/com/google/storage/control/v2/stub/StorageControlStubSettings.java b/google-cloud-storage-control/src/main/java/com/google/storage/control/v2/stub/StorageControlStubSettings.java
index 629353b74..d0191ad46 100644
--- a/google-cloud-storage-control/src/main/java/com/google/storage/control/v2/stub/StorageControlStubSettings.java
+++ b/google-cloud-storage-control/src/main/java/com/google/storage/control/v2/stub/StorageControlStubSettings.java
@@ -22,6 +22,7 @@
import com.google.api.core.ApiFunction;
import com.google.api.core.ApiFuture;
+import com.google.api.core.BetaApi;
import com.google.api.core.ObsoleteApi;
import com.google.api.gax.core.GaxProperties;
import com.google.api.gax.core.GoogleCredentialsProvider;
@@ -30,6 +31,9 @@
import com.google.api.gax.grpc.GrpcTransportChannel;
import com.google.api.gax.grpc.InstantiatingGrpcChannelProvider;
import com.google.api.gax.grpc.ProtoOperationTransformers;
+import com.google.api.gax.httpjson.GaxHttpJsonProperties;
+import com.google.api.gax.httpjson.HttpJsonTransportChannel;
+import com.google.api.gax.httpjson.InstantiatingHttpJsonChannelProvider;
import com.google.api.gax.longrunning.OperationSnapshot;
import com.google.api.gax.longrunning.OperationTimedPollAlgorithm;
import com.google.api.gax.retrying.RetrySettings;
@@ -554,6 +558,11 @@ public StorageControlStub createStub() throws IOException {
.equals(GrpcTransportChannel.getGrpcTransportName())) {
return GrpcStorageControlStub.create(this);
}
+ if (getTransportChannelProvider()
+ .getTransportName()
+ .equals(HttpJsonTransportChannel.getHttpJsonTransportName())) {
+ return HttpJsonStorageControlStub.create(this);
+ }
throw new UnsupportedOperationException(
String.format(
"Transport not supported: %s", getTransportChannelProvider().getTransportName()));
@@ -593,17 +602,24 @@ public static GoogleCredentialsProvider.Builder defaultCredentialsProviderBuilde
.setUseJwtAccessWithScope(true);
}
- /** Returns a builder for the default ChannelProvider for this service. */
+ /** Returns a builder for the default gRPC ChannelProvider for this service. */
public static InstantiatingGrpcChannelProvider.Builder defaultGrpcTransportProviderBuilder() {
return InstantiatingGrpcChannelProvider.newBuilder()
.setMaxInboundMessageSize(Integer.MAX_VALUE);
}
+ /** Returns a builder for the default REST ChannelProvider for this service. */
+ @BetaApi
+ public static InstantiatingHttpJsonChannelProvider.Builder
+ defaultHttpJsonTransportProviderBuilder() {
+ return InstantiatingHttpJsonChannelProvider.newBuilder();
+ }
+
public static TransportChannelProvider defaultTransportChannelProvider() {
return defaultGrpcTransportProviderBuilder().build();
}
- public static ApiClientHeaderProvider.Builder defaultApiClientHeaderProviderBuilder() {
+ public static ApiClientHeaderProvider.Builder defaultGrpcApiClientHeaderProviderBuilder() {
return ApiClientHeaderProvider.newBuilder()
.setGeneratedLibToken(
"gapic", GaxProperties.getLibraryVersion(StorageControlStubSettings.class))
@@ -611,11 +627,29 @@ public static ApiClientHeaderProvider.Builder defaultApiClientHeaderProviderBuil
GaxGrpcProperties.getGrpcTokenName(), GaxGrpcProperties.getGrpcVersion());
}
- /** Returns a new builder for this class. */
+ public static ApiClientHeaderProvider.Builder defaultHttpJsonApiClientHeaderProviderBuilder() {
+ return ApiClientHeaderProvider.newBuilder()
+ .setGeneratedLibToken(
+ "gapic", GaxProperties.getLibraryVersion(StorageControlStubSettings.class))
+ .setTransportToken(
+ GaxHttpJsonProperties.getHttpJsonTokenName(),
+ GaxHttpJsonProperties.getHttpJsonVersion());
+ }
+
+ public static ApiClientHeaderProvider.Builder defaultApiClientHeaderProviderBuilder() {
+ return StorageControlStubSettings.defaultGrpcApiClientHeaderProviderBuilder();
+ }
+
+ /** Returns a new gRPC builder for this class. */
public static Builder newBuilder() {
return Builder.createDefault();
}
+ /** Returns a new REST builder for this class. */
+ public static Builder newHttpJsonBuilder() {
+ return Builder.createHttpJsonDefault();
+ }
+
/** Returns a new builder for this class. */
public static Builder newBuilder(ClientContext clientContext) {
return new Builder(clientContext);
@@ -912,6 +946,18 @@ private static Builder createDefault() {
return initDefaults(builder);
}
+ private static Builder createHttpJsonDefault() {
+ Builder builder = new Builder(((ClientContext) null));
+
+ builder.setTransportChannelProvider(defaultHttpJsonTransportProviderBuilder().build());
+ builder.setCredentialsProvider(defaultCredentialsProviderBuilder().build());
+ builder.setInternalHeaderProvider(defaultHttpJsonApiClientHeaderProviderBuilder().build());
+ builder.setMtlsEndpoint(getDefaultMtlsEndpoint());
+ builder.setSwitchToMtlsEndpointAllowed(true);
+
+ return initDefaults(builder);
+ }
+
private static Builder initDefaults(Builder builder) {
builder
.createFolderSettings()
diff --git a/google-cloud-storage-control/src/test/java/com/google/storage/control/v2/StorageControlClientHttpJsonTest.java b/google-cloud-storage-control/src/test/java/com/google/storage/control/v2/StorageControlClientHttpJsonTest.java
new file mode 100644
index 000000000..e2769bba9
--- /dev/null
+++ b/google-cloud-storage-control/src/test/java/com/google/storage/control/v2/StorageControlClientHttpJsonTest.java
@@ -0,0 +1,690 @@
+/*
+ * Copyright 2025 Google LLC
+ *
+ * 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
+ *
+ * https://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.storage.control.v2;
+
+import com.google.api.gax.core.NoCredentialsProvider;
+import com.google.api.gax.httpjson.GaxHttpJsonProperties;
+import com.google.api.gax.httpjson.testing.MockHttpService;
+import com.google.api.gax.rpc.ApiClientHeaderProvider;
+import com.google.api.gax.rpc.ApiException;
+import com.google.api.gax.rpc.ApiExceptionFactory;
+import com.google.api.gax.rpc.InvalidArgumentException;
+import com.google.api.gax.rpc.StatusCode;
+import com.google.api.gax.rpc.testing.FakeStatusCode;
+import com.google.protobuf.FieldMask;
+import com.google.protobuf.Timestamp;
+import com.google.storage.control.v2.stub.HttpJsonStorageControlStub;
+import java.io.IOException;
+import java.util.List;
+import javax.annotation.Generated;
+import org.junit.After;
+import org.junit.AfterClass;
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.BeforeClass;
+import org.junit.Test;
+
+@Generated("by gapic-generator-java")
+public class StorageControlClientHttpJsonTest {
+ private static MockHttpService mockService;
+ private static StorageControlClient client;
+
+ @BeforeClass
+ public static void startStaticServer() throws IOException {
+ mockService =
+ new MockHttpService(
+ HttpJsonStorageControlStub.getMethodDescriptors(),
+ StorageControlSettings.getDefaultEndpoint());
+ StorageControlSettings settings =
+ StorageControlSettings.newHttpJsonBuilder()
+ .setTransportChannelProvider(
+ StorageControlSettings.defaultHttpJsonTransportProviderBuilder()
+ .setHttpTransport(mockService)
+ .build())
+ .setCredentialsProvider(NoCredentialsProvider.create())
+ .build();
+ client = StorageControlClient.create(settings);
+ }
+
+ @AfterClass
+ public static void stopServer() {
+ client.close();
+ }
+
+ @Before
+ public void setUp() {}
+
+ @After
+ public void tearDown() throws Exception {
+ mockService.reset();
+ }
+
+ @Test
+ public void createFolderUnsupportedMethodTest() throws Exception {
+ // The createFolder() method is not supported in REST transport.
+ // This empty test is generated for technical reasons.
+ }
+
+ @Test
+ public void deleteFolderUnsupportedMethodTest() throws Exception {
+ // The deleteFolder() method is not supported in REST transport.
+ // This empty test is generated for technical reasons.
+ }
+
+ @Test
+ public void getFolderUnsupportedMethodTest() throws Exception {
+ // The getFolder() method is not supported in REST transport.
+ // This empty test is generated for technical reasons.
+ }
+
+ @Test
+ public void listFoldersUnsupportedMethodTest() throws Exception {
+ // The listFolders() method is not supported in REST transport.
+ // This empty test is generated for technical reasons.
+ }
+
+ @Test
+ public void renameFolderUnsupportedMethodTest() throws Exception {
+ // The renameFolder() method is not supported in REST transport.
+ // This empty test is generated for technical reasons.
+ }
+
+ @Test
+ public void getStorageLayoutUnsupportedMethodTest() throws Exception {
+ // The getStorageLayout() method is not supported in REST transport.
+ // This empty test is generated for technical reasons.
+ }
+
+ @Test
+ public void createManagedFolderUnsupportedMethodTest() throws Exception {
+ // The createManagedFolder() method is not supported in REST transport.
+ // This empty test is generated for technical reasons.
+ }
+
+ @Test
+ public void deleteManagedFolderUnsupportedMethodTest() throws Exception {
+ // The deleteManagedFolder() method is not supported in REST transport.
+ // This empty test is generated for technical reasons.
+ }
+
+ @Test
+ public void getManagedFolderUnsupportedMethodTest() throws Exception {
+ // The getManagedFolder() method is not supported in REST transport.
+ // This empty test is generated for technical reasons.
+ }
+
+ @Test
+ public void listManagedFoldersUnsupportedMethodTest() throws Exception {
+ // The listManagedFolders() method is not supported in REST transport.
+ // This empty test is generated for technical reasons.
+ }
+
+ @Test
+ public void createAnywhereCacheUnsupportedMethodTest() throws Exception {
+ // The createAnywhereCache() method is not supported in REST transport.
+ // This empty test is generated for technical reasons.
+ }
+
+ @Test
+ public void updateAnywhereCacheUnsupportedMethodTest() throws Exception {
+ // The updateAnywhereCache() method is not supported in REST transport.
+ // This empty test is generated for technical reasons.
+ }
+
+ @Test
+ public void disableAnywhereCacheUnsupportedMethodTest() throws Exception {
+ // The disableAnywhereCache() method is not supported in REST transport.
+ // This empty test is generated for technical reasons.
+ }
+
+ @Test
+ public void pauseAnywhereCacheUnsupportedMethodTest() throws Exception {
+ // The pauseAnywhereCache() method is not supported in REST transport.
+ // This empty test is generated for technical reasons.
+ }
+
+ @Test
+ public void resumeAnywhereCacheUnsupportedMethodTest() throws Exception {
+ // The resumeAnywhereCache() method is not supported in REST transport.
+ // This empty test is generated for technical reasons.
+ }
+
+ @Test
+ public void getAnywhereCacheUnsupportedMethodTest() throws Exception {
+ // The getAnywhereCache() method is not supported in REST transport.
+ // This empty test is generated for technical reasons.
+ }
+
+ @Test
+ public void listAnywhereCachesUnsupportedMethodTest() throws Exception {
+ // The listAnywhereCaches() method is not supported in REST transport.
+ // This empty test is generated for technical reasons.
+ }
+
+ @Test
+ public void getProjectIntelligenceConfigTest() throws Exception {
+ IntelligenceConfig expectedResponse =
+ IntelligenceConfig.newBuilder()
+ .setName(
+ IntelligenceConfigName.ofProjectLocationName("[PROJECT]", "[LOCATION]").toString())
+ .setUpdateTime(Timestamp.newBuilder().build())
+ .setFilter(IntelligenceConfig.Filter.newBuilder().build())
+ .setEffectiveIntelligenceConfig(
+ IntelligenceConfig.EffectiveIntelligenceConfig.newBuilder().build())
+ .setTrialConfig(IntelligenceConfig.TrialConfig.newBuilder().build())
+ .build();
+ mockService.addResponse(expectedResponse);
+
+ IntelligenceConfigName name =
+ IntelligenceConfigName.ofProjectLocationName("[PROJECT]", "[LOCATION]");
+
+ IntelligenceConfig actualResponse = client.getProjectIntelligenceConfig(name);
+ Assert.assertEquals(expectedResponse, actualResponse);
+
+ List actualRequests = mockService.getRequestPaths();
+ Assert.assertEquals(1, actualRequests.size());
+
+ String apiClientHeaderKey =
+ mockService
+ .getRequestHeaders()
+ .get(ApiClientHeaderProvider.getDefaultApiClientHeaderKey())
+ .iterator()
+ .next();
+ Assert.assertTrue(
+ GaxHttpJsonProperties.getDefaultApiClientHeaderPattern()
+ .matcher(apiClientHeaderKey)
+ .matches());
+ }
+
+ @Test
+ public void getProjectIntelligenceConfigExceptionTest() throws Exception {
+ ApiException exception =
+ ApiExceptionFactory.createException(
+ new Exception(), FakeStatusCode.of(StatusCode.Code.INVALID_ARGUMENT), false);
+ mockService.addException(exception);
+
+ try {
+ IntelligenceConfigName name =
+ IntelligenceConfigName.ofProjectLocationName("[PROJECT]", "[LOCATION]");
+ client.getProjectIntelligenceConfig(name);
+ Assert.fail("No exception raised");
+ } catch (InvalidArgumentException e) {
+ // Expected exception.
+ }
+ }
+
+ @Test
+ public void getProjectIntelligenceConfigTest2() throws Exception {
+ IntelligenceConfig expectedResponse =
+ IntelligenceConfig.newBuilder()
+ .setName(
+ IntelligenceConfigName.ofProjectLocationName("[PROJECT]", "[LOCATION]").toString())
+ .setUpdateTime(Timestamp.newBuilder().build())
+ .setFilter(IntelligenceConfig.Filter.newBuilder().build())
+ .setEffectiveIntelligenceConfig(
+ IntelligenceConfig.EffectiveIntelligenceConfig.newBuilder().build())
+ .setTrialConfig(IntelligenceConfig.TrialConfig.newBuilder().build())
+ .build();
+ mockService.addResponse(expectedResponse);
+
+ String name = "projects/project-8842/locations/location-8842/intelligenceConfig";
+
+ IntelligenceConfig actualResponse = client.getProjectIntelligenceConfig(name);
+ Assert.assertEquals(expectedResponse, actualResponse);
+
+ List actualRequests = mockService.getRequestPaths();
+ Assert.assertEquals(1, actualRequests.size());
+
+ String apiClientHeaderKey =
+ mockService
+ .getRequestHeaders()
+ .get(ApiClientHeaderProvider.getDefaultApiClientHeaderKey())
+ .iterator()
+ .next();
+ Assert.assertTrue(
+ GaxHttpJsonProperties.getDefaultApiClientHeaderPattern()
+ .matcher(apiClientHeaderKey)
+ .matches());
+ }
+
+ @Test
+ public void getProjectIntelligenceConfigExceptionTest2() throws Exception {
+ ApiException exception =
+ ApiExceptionFactory.createException(
+ new Exception(), FakeStatusCode.of(StatusCode.Code.INVALID_ARGUMENT), false);
+ mockService.addException(exception);
+
+ try {
+ String name = "projects/project-8842/locations/location-8842/intelligenceConfig";
+ client.getProjectIntelligenceConfig(name);
+ Assert.fail("No exception raised");
+ } catch (InvalidArgumentException e) {
+ // Expected exception.
+ }
+ }
+
+ @Test
+ public void updateProjectIntelligenceConfigTest() throws Exception {
+ IntelligenceConfig expectedResponse =
+ IntelligenceConfig.newBuilder()
+ .setName(
+ IntelligenceConfigName.ofProjectLocationName("[PROJECT]", "[LOCATION]").toString())
+ .setUpdateTime(Timestamp.newBuilder().build())
+ .setFilter(IntelligenceConfig.Filter.newBuilder().build())
+ .setEffectiveIntelligenceConfig(
+ IntelligenceConfig.EffectiveIntelligenceConfig.newBuilder().build())
+ .setTrialConfig(IntelligenceConfig.TrialConfig.newBuilder().build())
+ .build();
+ mockService.addResponse(expectedResponse);
+
+ IntelligenceConfig intelligenceConfig =
+ IntelligenceConfig.newBuilder()
+ .setName(
+ IntelligenceConfigName.ofProjectLocationName("[PROJECT]", "[LOCATION]").toString())
+ .setUpdateTime(Timestamp.newBuilder().build())
+ .setFilter(IntelligenceConfig.Filter.newBuilder().build())
+ .setEffectiveIntelligenceConfig(
+ IntelligenceConfig.EffectiveIntelligenceConfig.newBuilder().build())
+ .setTrialConfig(IntelligenceConfig.TrialConfig.newBuilder().build())
+ .build();
+ FieldMask updateMask = FieldMask.newBuilder().build();
+
+ IntelligenceConfig actualResponse =
+ client.updateProjectIntelligenceConfig(intelligenceConfig, updateMask);
+ Assert.assertEquals(expectedResponse, actualResponse);
+
+ List actualRequests = mockService.getRequestPaths();
+ Assert.assertEquals(1, actualRequests.size());
+
+ String apiClientHeaderKey =
+ mockService
+ .getRequestHeaders()
+ .get(ApiClientHeaderProvider.getDefaultApiClientHeaderKey())
+ .iterator()
+ .next();
+ Assert.assertTrue(
+ GaxHttpJsonProperties.getDefaultApiClientHeaderPattern()
+ .matcher(apiClientHeaderKey)
+ .matches());
+ }
+
+ @Test
+ public void updateProjectIntelligenceConfigExceptionTest() throws Exception {
+ ApiException exception =
+ ApiExceptionFactory.createException(
+ new Exception(), FakeStatusCode.of(StatusCode.Code.INVALID_ARGUMENT), false);
+ mockService.addException(exception);
+
+ try {
+ IntelligenceConfig intelligenceConfig =
+ IntelligenceConfig.newBuilder()
+ .setName(
+ IntelligenceConfigName.ofProjectLocationName("[PROJECT]", "[LOCATION]")
+ .toString())
+ .setUpdateTime(Timestamp.newBuilder().build())
+ .setFilter(IntelligenceConfig.Filter.newBuilder().build())
+ .setEffectiveIntelligenceConfig(
+ IntelligenceConfig.EffectiveIntelligenceConfig.newBuilder().build())
+ .setTrialConfig(IntelligenceConfig.TrialConfig.newBuilder().build())
+ .build();
+ FieldMask updateMask = FieldMask.newBuilder().build();
+ client.updateProjectIntelligenceConfig(intelligenceConfig, updateMask);
+ Assert.fail("No exception raised");
+ } catch (InvalidArgumentException e) {
+ // Expected exception.
+ }
+ }
+
+ @Test
+ public void getFolderIntelligenceConfigTest() throws Exception {
+ IntelligenceConfig expectedResponse =
+ IntelligenceConfig.newBuilder()
+ .setName(
+ IntelligenceConfigName.ofFolderLocationName("[FOLDER]", "[LOCATION]").toString())
+ .setUpdateTime(Timestamp.newBuilder().build())
+ .setFilter(IntelligenceConfig.Filter.newBuilder().build())
+ .setEffectiveIntelligenceConfig(
+ IntelligenceConfig.EffectiveIntelligenceConfig.newBuilder().build())
+ .setTrialConfig(IntelligenceConfig.TrialConfig.newBuilder().build())
+ .build();
+ mockService.addResponse(expectedResponse);
+
+ IntelligenceConfigName name =
+ IntelligenceConfigName.ofFolderLocationName("[FOLDER]", "[LOCATION]");
+
+ IntelligenceConfig actualResponse = client.getFolderIntelligenceConfig(name);
+ Assert.assertEquals(expectedResponse, actualResponse);
+
+ List actualRequests = mockService.getRequestPaths();
+ Assert.assertEquals(1, actualRequests.size());
+
+ String apiClientHeaderKey =
+ mockService
+ .getRequestHeaders()
+ .get(ApiClientHeaderProvider.getDefaultApiClientHeaderKey())
+ .iterator()
+ .next();
+ Assert.assertTrue(
+ GaxHttpJsonProperties.getDefaultApiClientHeaderPattern()
+ .matcher(apiClientHeaderKey)
+ .matches());
+ }
+
+ @Test
+ public void getFolderIntelligenceConfigExceptionTest() throws Exception {
+ ApiException exception =
+ ApiExceptionFactory.createException(
+ new Exception(), FakeStatusCode.of(StatusCode.Code.INVALID_ARGUMENT), false);
+ mockService.addException(exception);
+
+ try {
+ IntelligenceConfigName name =
+ IntelligenceConfigName.ofFolderLocationName("[FOLDER]", "[LOCATION]");
+ client.getFolderIntelligenceConfig(name);
+ Assert.fail("No exception raised");
+ } catch (InvalidArgumentException e) {
+ // Expected exception.
+ }
+ }
+
+ @Test
+ public void getFolderIntelligenceConfigTest2() throws Exception {
+ IntelligenceConfig expectedResponse =
+ IntelligenceConfig.newBuilder()
+ .setName(
+ IntelligenceConfigName.ofFolderLocationName("[FOLDER]", "[LOCATION]").toString())
+ .setUpdateTime(Timestamp.newBuilder().build())
+ .setFilter(IntelligenceConfig.Filter.newBuilder().build())
+ .setEffectiveIntelligenceConfig(
+ IntelligenceConfig.EffectiveIntelligenceConfig.newBuilder().build())
+ .setTrialConfig(IntelligenceConfig.TrialConfig.newBuilder().build())
+ .build();
+ mockService.addResponse(expectedResponse);
+
+ String name = "folders/folder-8383/locations/location-8383/intelligenceConfig";
+
+ IntelligenceConfig actualResponse = client.getFolderIntelligenceConfig(name);
+ Assert.assertEquals(expectedResponse, actualResponse);
+
+ List actualRequests = mockService.getRequestPaths();
+ Assert.assertEquals(1, actualRequests.size());
+
+ String apiClientHeaderKey =
+ mockService
+ .getRequestHeaders()
+ .get(ApiClientHeaderProvider.getDefaultApiClientHeaderKey())
+ .iterator()
+ .next();
+ Assert.assertTrue(
+ GaxHttpJsonProperties.getDefaultApiClientHeaderPattern()
+ .matcher(apiClientHeaderKey)
+ .matches());
+ }
+
+ @Test
+ public void getFolderIntelligenceConfigExceptionTest2() throws Exception {
+ ApiException exception =
+ ApiExceptionFactory.createException(
+ new Exception(), FakeStatusCode.of(StatusCode.Code.INVALID_ARGUMENT), false);
+ mockService.addException(exception);
+
+ try {
+ String name = "folders/folder-8383/locations/location-8383/intelligenceConfig";
+ client.getFolderIntelligenceConfig(name);
+ Assert.fail("No exception raised");
+ } catch (InvalidArgumentException e) {
+ // Expected exception.
+ }
+ }
+
+ @Test
+ public void updateFolderIntelligenceConfigTest() throws Exception {
+ IntelligenceConfig expectedResponse =
+ IntelligenceConfig.newBuilder()
+ .setName(
+ IntelligenceConfigName.ofFolderLocationName("[FOLDER]", "[LOCATION]").toString())
+ .setUpdateTime(Timestamp.newBuilder().build())
+ .setFilter(IntelligenceConfig.Filter.newBuilder().build())
+ .setEffectiveIntelligenceConfig(
+ IntelligenceConfig.EffectiveIntelligenceConfig.newBuilder().build())
+ .setTrialConfig(IntelligenceConfig.TrialConfig.newBuilder().build())
+ .build();
+ mockService.addResponse(expectedResponse);
+
+ IntelligenceConfig intelligenceConfig =
+ IntelligenceConfig.newBuilder()
+ .setName(
+ IntelligenceConfigName.ofFolderLocationName("[FOLDER]", "[LOCATION]").toString())
+ .setUpdateTime(Timestamp.newBuilder().build())
+ .setFilter(IntelligenceConfig.Filter.newBuilder().build())
+ .setEffectiveIntelligenceConfig(
+ IntelligenceConfig.EffectiveIntelligenceConfig.newBuilder().build())
+ .setTrialConfig(IntelligenceConfig.TrialConfig.newBuilder().build())
+ .build();
+ FieldMask updateMask = FieldMask.newBuilder().build();
+
+ IntelligenceConfig actualResponse =
+ client.updateFolderIntelligenceConfig(intelligenceConfig, updateMask);
+ Assert.assertEquals(expectedResponse, actualResponse);
+
+ List actualRequests = mockService.getRequestPaths();
+ Assert.assertEquals(1, actualRequests.size());
+
+ String apiClientHeaderKey =
+ mockService
+ .getRequestHeaders()
+ .get(ApiClientHeaderProvider.getDefaultApiClientHeaderKey())
+ .iterator()
+ .next();
+ Assert.assertTrue(
+ GaxHttpJsonProperties.getDefaultApiClientHeaderPattern()
+ .matcher(apiClientHeaderKey)
+ .matches());
+ }
+
+ @Test
+ public void updateFolderIntelligenceConfigExceptionTest() throws Exception {
+ ApiException exception =
+ ApiExceptionFactory.createException(
+ new Exception(), FakeStatusCode.of(StatusCode.Code.INVALID_ARGUMENT), false);
+ mockService.addException(exception);
+
+ try {
+ IntelligenceConfig intelligenceConfig =
+ IntelligenceConfig.newBuilder()
+ .setName(
+ IntelligenceConfigName.ofFolderLocationName("[FOLDER]", "[LOCATION]").toString())
+ .setUpdateTime(Timestamp.newBuilder().build())
+ .setFilter(IntelligenceConfig.Filter.newBuilder().build())
+ .setEffectiveIntelligenceConfig(
+ IntelligenceConfig.EffectiveIntelligenceConfig.newBuilder().build())
+ .setTrialConfig(IntelligenceConfig.TrialConfig.newBuilder().build())
+ .build();
+ FieldMask updateMask = FieldMask.newBuilder().build();
+ client.updateFolderIntelligenceConfig(intelligenceConfig, updateMask);
+ Assert.fail("No exception raised");
+ } catch (InvalidArgumentException e) {
+ // Expected exception.
+ }
+ }
+
+ @Test
+ public void getOrganizationIntelligenceConfigTest() throws Exception {
+ IntelligenceConfig expectedResponse =
+ IntelligenceConfig.newBuilder()
+ .setName(IntelligenceConfigName.ofOrgLocationName("[ORG]", "[LOCATION]").toString())
+ .setUpdateTime(Timestamp.newBuilder().build())
+ .setFilter(IntelligenceConfig.Filter.newBuilder().build())
+ .setEffectiveIntelligenceConfig(
+ IntelligenceConfig.EffectiveIntelligenceConfig.newBuilder().build())
+ .setTrialConfig(IntelligenceConfig.TrialConfig.newBuilder().build())
+ .build();
+ mockService.addResponse(expectedResponse);
+
+ IntelligenceConfigName name = IntelligenceConfigName.ofOrgLocationName("[ORG]", "[LOCATION]");
+
+ IntelligenceConfig actualResponse = client.getOrganizationIntelligenceConfig(name);
+ Assert.assertEquals(expectedResponse, actualResponse);
+
+ List actualRequests = mockService.getRequestPaths();
+ Assert.assertEquals(1, actualRequests.size());
+
+ String apiClientHeaderKey =
+ mockService
+ .getRequestHeaders()
+ .get(ApiClientHeaderProvider.getDefaultApiClientHeaderKey())
+ .iterator()
+ .next();
+ Assert.assertTrue(
+ GaxHttpJsonProperties.getDefaultApiClientHeaderPattern()
+ .matcher(apiClientHeaderKey)
+ .matches());
+ }
+
+ @Test
+ public void getOrganizationIntelligenceConfigExceptionTest() throws Exception {
+ ApiException exception =
+ ApiExceptionFactory.createException(
+ new Exception(), FakeStatusCode.of(StatusCode.Code.INVALID_ARGUMENT), false);
+ mockService.addException(exception);
+
+ try {
+ IntelligenceConfigName name = IntelligenceConfigName.ofOrgLocationName("[ORG]", "[LOCATION]");
+ client.getOrganizationIntelligenceConfig(name);
+ Assert.fail("No exception raised");
+ } catch (InvalidArgumentException e) {
+ // Expected exception.
+ }
+ }
+
+ @Test
+ public void getOrganizationIntelligenceConfigTest2() throws Exception {
+ IntelligenceConfig expectedResponse =
+ IntelligenceConfig.newBuilder()
+ .setName(IntelligenceConfigName.ofOrgLocationName("[ORG]", "[LOCATION]").toString())
+ .setUpdateTime(Timestamp.newBuilder().build())
+ .setFilter(IntelligenceConfig.Filter.newBuilder().build())
+ .setEffectiveIntelligenceConfig(
+ IntelligenceConfig.EffectiveIntelligenceConfig.newBuilder().build())
+ .setTrialConfig(IntelligenceConfig.TrialConfig.newBuilder().build())
+ .build();
+ mockService.addResponse(expectedResponse);
+
+ String name = "organizations/organization-1958/locations/location-1958/intelligenceConfig";
+
+ IntelligenceConfig actualResponse = client.getOrganizationIntelligenceConfig(name);
+ Assert.assertEquals(expectedResponse, actualResponse);
+
+ List actualRequests = mockService.getRequestPaths();
+ Assert.assertEquals(1, actualRequests.size());
+
+ String apiClientHeaderKey =
+ mockService
+ .getRequestHeaders()
+ .get(ApiClientHeaderProvider.getDefaultApiClientHeaderKey())
+ .iterator()
+ .next();
+ Assert.assertTrue(
+ GaxHttpJsonProperties.getDefaultApiClientHeaderPattern()
+ .matcher(apiClientHeaderKey)
+ .matches());
+ }
+
+ @Test
+ public void getOrganizationIntelligenceConfigExceptionTest2() throws Exception {
+ ApiException exception =
+ ApiExceptionFactory.createException(
+ new Exception(), FakeStatusCode.of(StatusCode.Code.INVALID_ARGUMENT), false);
+ mockService.addException(exception);
+
+ try {
+ String name = "organizations/organization-1958/locations/location-1958/intelligenceConfig";
+ client.getOrganizationIntelligenceConfig(name);
+ Assert.fail("No exception raised");
+ } catch (InvalidArgumentException e) {
+ // Expected exception.
+ }
+ }
+
+ @Test
+ public void updateOrganizationIntelligenceConfigTest() throws Exception {
+ IntelligenceConfig expectedResponse =
+ IntelligenceConfig.newBuilder()
+ .setName(IntelligenceConfigName.ofOrgLocationName("[ORG]", "[LOCATION]").toString())
+ .setUpdateTime(Timestamp.newBuilder().build())
+ .setFilter(IntelligenceConfig.Filter.newBuilder().build())
+ .setEffectiveIntelligenceConfig(
+ IntelligenceConfig.EffectiveIntelligenceConfig.newBuilder().build())
+ .setTrialConfig(IntelligenceConfig.TrialConfig.newBuilder().build())
+ .build();
+ mockService.addResponse(expectedResponse);
+
+ IntelligenceConfig intelligenceConfig =
+ IntelligenceConfig.newBuilder()
+ .setName(IntelligenceConfigName.ofOrgLocationName("[ORG]", "[LOCATION]").toString())
+ .setUpdateTime(Timestamp.newBuilder().build())
+ .setFilter(IntelligenceConfig.Filter.newBuilder().build())
+ .setEffectiveIntelligenceConfig(
+ IntelligenceConfig.EffectiveIntelligenceConfig.newBuilder().build())
+ .setTrialConfig(IntelligenceConfig.TrialConfig.newBuilder().build())
+ .build();
+ FieldMask updateMask = FieldMask.newBuilder().build();
+
+ IntelligenceConfig actualResponse =
+ client.updateOrganizationIntelligenceConfig(intelligenceConfig, updateMask);
+ Assert.assertEquals(expectedResponse, actualResponse);
+
+ List actualRequests = mockService.getRequestPaths();
+ Assert.assertEquals(1, actualRequests.size());
+
+ String apiClientHeaderKey =
+ mockService
+ .getRequestHeaders()
+ .get(ApiClientHeaderProvider.getDefaultApiClientHeaderKey())
+ .iterator()
+ .next();
+ Assert.assertTrue(
+ GaxHttpJsonProperties.getDefaultApiClientHeaderPattern()
+ .matcher(apiClientHeaderKey)
+ .matches());
+ }
+
+ @Test
+ public void updateOrganizationIntelligenceConfigExceptionTest() throws Exception {
+ ApiException exception =
+ ApiExceptionFactory.createException(
+ new Exception(), FakeStatusCode.of(StatusCode.Code.INVALID_ARGUMENT), false);
+ mockService.addException(exception);
+
+ try {
+ IntelligenceConfig intelligenceConfig =
+ IntelligenceConfig.newBuilder()
+ .setName(IntelligenceConfigName.ofOrgLocationName("[ORG]", "[LOCATION]").toString())
+ .setUpdateTime(Timestamp.newBuilder().build())
+ .setFilter(IntelligenceConfig.Filter.newBuilder().build())
+ .setEffectiveIntelligenceConfig(
+ IntelligenceConfig.EffectiveIntelligenceConfig.newBuilder().build())
+ .setTrialConfig(IntelligenceConfig.TrialConfig.newBuilder().build())
+ .build();
+ FieldMask updateMask = FieldMask.newBuilder().build();
+ client.updateOrganizationIntelligenceConfig(intelligenceConfig, updateMask);
+ Assert.fail("No exception raised");
+ } catch (InvalidArgumentException e) {
+ // Expected exception.
+ }
+ }
+}
diff --git a/samples/snippets/src/main/java/com/example/storage/control/v2/AnywhereCacheCreate.java b/samples/snippets/src/main/java/com/example/storage/control/v2/AnywhereCacheCreate.java
index d9736906c..496b4e38a 100644
--- a/samples/snippets/src/main/java/com/example/storage/control/v2/AnywhereCacheCreate.java
+++ b/samples/snippets/src/main/java/com/example/storage/control/v2/AnywhereCacheCreate.java
@@ -32,14 +32,13 @@ public static void anywhereCacheCreate(String bucketName, String cacheName, Stri
throws InterruptedException, ExecutionException, IOException {
try (StorageControlClient storageControl = StorageControlClient.create()) {
- CreateAnywhereCacheRequest request = CreateAnywhereCacheRequest.newBuilder()
- // Set project to "_" to signify globally scoped bucket
- .setParent(BucketName.format("_", bucketName))
- .setAnywhereCache(AnywhereCache.newBuilder()
- .setName(cacheName)
- .setZone(zoneName)
- .build())
- .build();
+ CreateAnywhereCacheRequest request =
+ CreateAnywhereCacheRequest.newBuilder()
+ // Set project to "_" to signify globally scoped bucket
+ .setParent(BucketName.format("_", bucketName))
+ .setAnywhereCache(
+ AnywhereCache.newBuilder().setName(cacheName).setZone(zoneName).build())
+ .build();
// Start a long-running operation (LRO).
OperationFuture operation =
@@ -50,6 +49,5 @@ public static void anywhereCacheCreate(String bucketName, String cacheName, Stri
System.out.printf("Created anywhere cache: %s%n", anywhereCache.getName());
}
}
-
}
// [END storage_control_create_anywhere_cache]
diff --git a/samples/snippets/src/main/java/com/example/storage/control/v2/AnywhereCacheDisable.java b/samples/snippets/src/main/java/com/example/storage/control/v2/AnywhereCacheDisable.java
index c334268aa..272efc91e 100644
--- a/samples/snippets/src/main/java/com/example/storage/control/v2/AnywhereCacheDisable.java
+++ b/samples/snippets/src/main/java/com/example/storage/control/v2/AnywhereCacheDisable.java
@@ -28,15 +28,13 @@ public final class AnywhereCacheDisable {
public static void anywhereCacheDisable(String cacheName) throws IOException {
try (StorageControlClient storageControl = StorageControlClient.create()) {
- DisableAnywhereCacheRequest request = DisableAnywhereCacheRequest.newBuilder()
- .setName(cacheName)
- .build();
+ DisableAnywhereCacheRequest request =
+ DisableAnywhereCacheRequest.newBuilder().setName(cacheName).build();
AnywhereCache anywhereCache = storageControl.disableAnywhereCache(request);
System.out.printf("Disabled anywhere cache: %s%n", anywhereCache.getName());
}
}
-
}
// [END storage_control_disable_anywhere_cache]
diff --git a/samples/snippets/src/main/java/com/example/storage/control/v2/AnywhereCacheGet.java b/samples/snippets/src/main/java/com/example/storage/control/v2/AnywhereCacheGet.java
index 978d56679..917dd3f2c 100644
--- a/samples/snippets/src/main/java/com/example/storage/control/v2/AnywhereCacheGet.java
+++ b/samples/snippets/src/main/java/com/example/storage/control/v2/AnywhereCacheGet.java
@@ -28,15 +28,13 @@ public final class AnywhereCacheGet {
public static void anywhereCacheGet(String cacheName) throws IOException {
try (StorageControlClient storageControl = StorageControlClient.create()) {
- GetAnywhereCacheRequest request = GetAnywhereCacheRequest.newBuilder()
- .setName(cacheName)
- .build();
+ GetAnywhereCacheRequest request =
+ GetAnywhereCacheRequest.newBuilder().setName(cacheName).build();
AnywhereCache anywhereCache = storageControl.getAnywhereCache(request);
System.out.printf("Got anywhere cache: %s%n", anywhereCache.getName());
}
}
-
}
// [END storage_control_get_anywhere_cache]
diff --git a/samples/snippets/src/main/java/com/example/storage/control/v2/AnywhereCacheList.java b/samples/snippets/src/main/java/com/example/storage/control/v2/AnywhereCacheList.java
index 95285f265..70c0f1271 100644
--- a/samples/snippets/src/main/java/com/example/storage/control/v2/AnywhereCacheList.java
+++ b/samples/snippets/src/main/java/com/example/storage/control/v2/AnywhereCacheList.java
@@ -30,9 +30,10 @@ public final class AnywhereCacheList {
public static void anywhereCacheList(String bucketName) throws IOException {
try (StorageControlClient storageControl = StorageControlClient.create()) {
- ListAnywhereCachesRequest request = ListAnywhereCachesRequest.newBuilder()
- .setParent(BucketName.format("_", bucketName))
- .build();
+ ListAnywhereCachesRequest request =
+ ListAnywhereCachesRequest.newBuilder()
+ .setParent(BucketName.format("_", bucketName))
+ .build();
ListAnywhereCachesPagedResponse page = storageControl.listAnywhereCaches(request);
for (AnywhereCache anywhereCache : page.iterateAll()) {
@@ -40,6 +41,5 @@ public static void anywhereCacheList(String bucketName) throws IOException {
}
}
}
-
}
// [END storage_control_list_anywhere_caches]
diff --git a/samples/snippets/src/main/java/com/example/storage/control/v2/AnywhereCachePause.java b/samples/snippets/src/main/java/com/example/storage/control/v2/AnywhereCachePause.java
index 6cea55759..bf4a20d75 100644
--- a/samples/snippets/src/main/java/com/example/storage/control/v2/AnywhereCachePause.java
+++ b/samples/snippets/src/main/java/com/example/storage/control/v2/AnywhereCachePause.java
@@ -28,15 +28,13 @@ public final class AnywhereCachePause {
public static void anywhereCachePause(String cacheName) throws IOException {
try (StorageControlClient storageControl = StorageControlClient.create()) {
- PauseAnywhereCacheRequest request = PauseAnywhereCacheRequest.newBuilder()
- .setName(cacheName)
- .build();
+ PauseAnywhereCacheRequest request =
+ PauseAnywhereCacheRequest.newBuilder().setName(cacheName).build();
AnywhereCache anywhereCache = storageControl.pauseAnywhereCache(request);
System.out.printf("Paused anywhere cache: %s%n", anywhereCache.getName());
}
}
-
}
// [END storage_control_pause_anywhere_cache]
diff --git a/samples/snippets/src/main/java/com/example/storage/control/v2/AnywhereCacheResume.java b/samples/snippets/src/main/java/com/example/storage/control/v2/AnywhereCacheResume.java
index 3a2467466..db02a6f3d 100644
--- a/samples/snippets/src/main/java/com/example/storage/control/v2/AnywhereCacheResume.java
+++ b/samples/snippets/src/main/java/com/example/storage/control/v2/AnywhereCacheResume.java
@@ -28,15 +28,13 @@ public final class AnywhereCacheResume {
public static void anywhereCacheResume(String cacheName) throws IOException {
try (StorageControlClient storageControl = StorageControlClient.create()) {
- ResumeAnywhereCacheRequest request = ResumeAnywhereCacheRequest.newBuilder()
- .setName(cacheName)
- .build();
+ ResumeAnywhereCacheRequest request =
+ ResumeAnywhereCacheRequest.newBuilder().setName(cacheName).build();
AnywhereCache anywhereCache = storageControl.resumeAnywhereCache(request);
System.out.printf("Resumed anywhere cache: %s%n", anywhereCache.getName());
}
}
-
}
// [END storage_control_resume_anywhere_cache]
diff --git a/samples/snippets/src/main/java/com/example/storage/control/v2/AnywhereCacheUpdate.java b/samples/snippets/src/main/java/com/example/storage/control/v2/AnywhereCacheUpdate.java
index 5cb666f29..558d66db6 100644
--- a/samples/snippets/src/main/java/com/example/storage/control/v2/AnywhereCacheUpdate.java
+++ b/samples/snippets/src/main/java/com/example/storage/control/v2/AnywhereCacheUpdate.java
@@ -33,19 +33,14 @@ public static void anywhereCacheUpdate(String cacheName, String admissionPolicy)
throws InterruptedException, ExecutionException, IOException {
try (StorageControlClient storageControl = StorageControlClient.create()) {
- AnywhereCache pendingUpdate = AnywhereCache.newBuilder()
- .setName(cacheName)
- .setAdmissionPolicy(admissionPolicy)
- .build();
-
- UpdateAnywhereCacheRequest request = UpdateAnywhereCacheRequest.newBuilder()
- .setAnywhereCache(pendingUpdate)
- .setUpdateMask(
- FieldMask.newBuilder()
- .addPaths("admission_policy")
- .build()
- )
- .build();
+ AnywhereCache pendingUpdate =
+ AnywhereCache.newBuilder().setName(cacheName).setAdmissionPolicy(admissionPolicy).build();
+
+ UpdateAnywhereCacheRequest request =
+ UpdateAnywhereCacheRequest.newBuilder()
+ .setAnywhereCache(pendingUpdate)
+ .setUpdateMask(FieldMask.newBuilder().addPaths("admission_policy").build())
+ .build();
// Start a long-running operation (LRO).
OperationFuture operation =
@@ -56,6 +51,5 @@ public static void anywhereCacheUpdate(String cacheName, String admissionPolicy)
System.out.printf("Updated anywhere cache: %s%n", updatedAnywhereCache.getName());
}
}
-
}
// [END storage_control_update_anywhere_cache]
From 626499d082224ab8e784f57c6a1a276c5cbfcbc2 Mon Sep 17 00:00:00 2001
From: Diego Marquez
Date: Wed, 25 Jun 2025 17:33:11 -0400
Subject: [PATCH 10/13] chore: manage hermetic_library_generation action
version via Hermetic Build only (#3170)
The fix https://github.com/googleapis/sdk-platform-java/pull/3800 was meant for GraalVM image versions.
The regression in #3169, however, affects the hermetic_library_generation GH action instead, which is not in the sdk-platform-java template, but java-storage does not consume the renovate.json template as per its owlbot.py.
---
renovate.json | 10 ----------
1 file changed, 10 deletions(-)
diff --git a/renovate.json b/renovate.json
index 6ee6e25a9..2ae8e2330 100644
--- a/renovate.json
+++ b/renovate.json
@@ -20,16 +20,6 @@
"matchStrings": ["uses: googleapis/sdk-platform-java/java-shared-dependencies/unmanaged-dependency-check@google-cloud-shared-dependencies/v(?.+?)\\n"],
"depNameTemplate": "com.google.cloud:sdk-platform-java-config",
"datasourceTemplate": "maven"
- },
- {
- "fileMatch": [
- ".github/workflows/hermetic_library_generation.yaml"
- ],
- "matchStrings": [
- "uses: googleapis/sdk-platform-java/.github/scripts@v(?.+?)\\n"
- ],
- "depNameTemplate": "com.google.api:gapic-generator-java",
- "datasourceTemplate": "maven"
}
],
"packageRules": [
From aa6b7cbd2edc999b761237e3a86cf3f0424c5606 Mon Sep 17 00:00:00 2001
From: Mend Renovate
Date: Thu, 26 Jun 2025 00:13:07 +0200
Subject: [PATCH 11/13] test(deps): update dependency
io.github.classgraph:classgraph to v4.8.180 (#3168)
---
google-cloud-storage/pom.xml | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/google-cloud-storage/pom.xml b/google-cloud-storage/pom.xml
index 211a19937..e8464b0ab 100644
--- a/google-cloud-storage/pom.xml
+++ b/google-cloud-storage/pom.xml
@@ -331,7 +331,7 @@
io.github.classgraph
classgraph
- 4.8.179
+ 4.8.180
test
From 895bfbda902a77d16a33fe5238349a6b3d397c10 Mon Sep 17 00:00:00 2001
From: BenWhitehead
Date: Wed, 25 Jun 2025 18:13:59 -0400
Subject: [PATCH 12/13] fix: fix Journaling BlobWriteSessionConfig to properly
handle multiple consecutive retries (#3166)
* Clear copy buffer used to load bytes from the recovery file so, we don't have dangling bytes from a previous retry
* Do not add to the cumulative crc32c when retrying. The bytes have already been added in the first attempt.
---
...ndUploadUnbufferedWritableByteChannel.java | 32 ++-
...fferedWritableByteChannelPropertyTest.java | 208 ++++++++++++++++++
.../storage/it/ChecksummedTestContent.java | 4 +
3 files changed, 236 insertions(+), 8 deletions(-)
diff --git a/google-cloud-storage/src/main/java/com/google/cloud/storage/SyncAndUploadUnbufferedWritableByteChannel.java b/google-cloud-storage/src/main/java/com/google/cloud/storage/SyncAndUploadUnbufferedWritableByteChannel.java
index c07e51f53..7c9451f82 100644
--- a/google-cloud-storage/src/main/java/com/google/cloud/storage/SyncAndUploadUnbufferedWritableByteChannel.java
+++ b/google-cloud-storage/src/main/java/com/google/cloud/storage/SyncAndUploadUnbufferedWritableByteChannel.java
@@ -149,7 +149,7 @@ private GatheringByteChannel openSync() throws IOException {
return sync;
}
- private WriteObjectRequest processSegment(ChunkSegment segment) {
+ private WriteObjectRequest processSegment(ChunkSegment segment, boolean updateCumulativeCrc32c) {
WriteObjectRequest.Builder builder = writeCtx.newRequestBuilder();
if (!first) {
builder.clearUploadId().clearWriteObjectSpec().clearObjectChecksums();
@@ -162,9 +162,11 @@ private WriteObjectRequest processSegment(ChunkSegment segment) {
int contentSize = b.size();
// update ctx state that tracks overall progress
- writeCtx
- .getCumulativeCrc32c()
- .accumulateAndGet(crc32c, chunkSegmenter.getHasher()::nullSafeConcat);
+ if (updateCumulativeCrc32c) {
+ writeCtx
+ .getCumulativeCrc32c()
+ .accumulateAndGet(crc32c, chunkSegmenter.getHasher()::nullSafeConcat);
+ }
// resolve current offset and set next
long offset = writeCtx.getTotalSentBytes().getAndAdd(contentSize);
@@ -202,6 +204,7 @@ private WriteObjectRequest.Builder finishMessage(WriteObjectRequest.Builder b) {
return b;
}
+ @SuppressWarnings("ConstantValue")
private void doUpload(boolean closing, ChunkSegment[] segments, long goalSize) {
AtomicBoolean recover = new AtomicBoolean(false);
retrier.run(
@@ -211,9 +214,16 @@ private void doUpload(boolean closing, ChunkSegment[] segments, long goalSize) {
sync.close();
}
boolean shouldRecover = recover.getAndSet(true);
+ // each ChunkSegment will always have its checksum computed, but if a retry happens, and
+ // we need to rewind and build a new ChunkSegment, we don't want to add it to the
+ // cumulativeCrc32c value because that will make it appear as the bytes are duplicated.
+ // If we send "ABCD", get an error and find only "AB" to have been persisted, we don't
+ // want to add "CD" to the cumulative crc32c as that would be equivalent to "ABCDCD".
+ boolean updateCumulativeCrc32c = !shouldRecover;
if (!shouldRecover) {
for (ChunkSegment segment : segments) {
- WriteObjectRequest writeObjectRequest = processSegment(segment);
+ WriteObjectRequest writeObjectRequest =
+ processSegment(segment, updateCumulativeCrc32c);
stream.onNext(writeObjectRequest);
}
@@ -247,17 +257,22 @@ private void doUpload(boolean closing, ChunkSegment[] segments, long goalSize) {
first = true;
writeCtx.getTotalSentBytes().set(persistedSize);
writeCtx.getConfirmedBytes().set(persistedSize);
- writeCtx.getCumulativeCrc32c().set(null); // todo: can we rewind checksum?
+ // intentionally do not modify the cumulativeCrc32c value
+ // this will stay in the state in sync with what has been written to disk
+ // when we recover, checksum the individual message but not the cumulative
try (SeekableByteChannel reader = rf.reader()) {
reader.position(persistedSize);
ByteBuffer buf = copyBuffer.get();
+ // clear before read, in case an error was thrown before
+ buf.clear();
while (Buffers.fillFrom(buf, reader) != -1) {
buf.flip();
while (buf.hasRemaining()) {
ChunkSegment[] recoverySegments = chunkSegmenter.segmentBuffer(buf);
for (ChunkSegment segment : recoverySegments) {
- WriteObjectRequest writeObjectRequest = processSegment(segment);
+ WriteObjectRequest writeObjectRequest =
+ processSegment(segment, updateCumulativeCrc32c);
stream.onNext(writeObjectRequest);
}
}
@@ -280,7 +295,8 @@ private void doUpload(boolean closing, ChunkSegment[] segments, long goalSize) {
}
}
long newWritten = writeCtx.getTotalSentBytes().get();
- Preconditions.checkState(newWritten == goalSize, "%s == %s", newWritten, goalSize);
+ Preconditions.checkState(
+ newWritten == goalSize, "newWritten == goalSize (%s == %s)", newWritten, goalSize);
return null;
},
Decoder.identity());
diff --git a/google-cloud-storage/src/test/java/com/google/cloud/storage/ITSyncAndUploadUnbufferedWritableByteChannelPropertyTest.java b/google-cloud-storage/src/test/java/com/google/cloud/storage/ITSyncAndUploadUnbufferedWritableByteChannelPropertyTest.java
index 4ed8f25ed..fd4f0fd58 100644
--- a/google-cloud-storage/src/test/java/com/google/cloud/storage/ITSyncAndUploadUnbufferedWritableByteChannelPropertyTest.java
+++ b/google-cloud-storage/src/test/java/com/google/cloud/storage/ITSyncAndUploadUnbufferedWritableByteChannelPropertyTest.java
@@ -16,6 +16,7 @@
package com.google.cloud.storage;
+import static com.google.cloud.storage.TestUtils.apiException;
import static com.google.cloud.storage.TestUtils.assertAll;
import static com.google.cloud.storage.TestUtils.defaultRetryingDeps;
import static com.google.cloud.storage.TestUtils.xxd;
@@ -31,17 +32,23 @@
import com.google.api.gax.rpc.ApiExceptions;
import com.google.api.gax.rpc.UnavailableException;
import com.google.cloud.storage.BufferedWritableByteChannelSession.BufferedWritableByteChannel;
+import com.google.cloud.storage.Conversions.Decoder;
import com.google.cloud.storage.Retrying.DefaultRetrier;
import com.google.cloud.storage.SyncAndUploadUnbufferedWritableByteChannel.Alg;
import com.google.cloud.storage.SyncAndUploadUnbufferedWritableByteChannel.RequestStream;
import com.google.cloud.storage.SyncAndUploadUnbufferedWritableByteChannel.ResponseStream;
import com.google.cloud.storage.UnbufferedWritableByteChannelSession.UnbufferedWritableByteChannel;
import com.google.cloud.storage.UnifiedOpts.Opts;
+import com.google.cloud.storage.it.ChecksummedTestContent;
import com.google.common.base.MoreObjects;
import com.google.common.collect.ImmutableList;
+import com.google.common.collect.ImmutableSet;
import com.google.common.primitives.Ints;
import com.google.protobuf.ByteString;
+import com.google.protobuf.Message;
+import com.google.protobuf.TextFormat;
import com.google.storage.v2.Object;
+import com.google.storage.v2.ObjectChecksums;
import com.google.storage.v2.QueryWriteStatusRequest;
import com.google.storage.v2.QueryWriteStatusResponse;
import com.google.storage.v2.StartResumableWriteRequest;
@@ -50,10 +57,12 @@
import com.google.storage.v2.StorageGrpc.StorageImplBase;
import com.google.storage.v2.WriteObjectRequest;
import com.google.storage.v2.WriteObjectResponse;
+import com.google.storage.v2.WriteObjectSpec;
import io.grpc.Status;
import io.grpc.Status.Code;
import io.grpc.stub.StreamObserver;
import java.io.IOException;
+import java.nio.ByteBuffer;
import java.nio.file.FileVisitResult;
import java.nio.file.Files;
import java.nio.file.Path;
@@ -76,6 +85,7 @@
import java.util.concurrent.Executors;
import java.util.concurrent.Future;
import java.util.concurrent.TimeUnit;
+import java.util.concurrent.atomic.AtomicInteger;
import java.util.function.UnaryOperator;
import java.util.stream.Collectors;
import net.jqwik.api.Arbitraries;
@@ -372,6 +382,204 @@ void testUploads(@ForAll("scenario") Scenario s) throws Exception {
}
}
+ @Example
+ void multipleRetriesAgainstFakeServer() throws Exception {
+ ChecksummedTestContent content =
+ ChecksummedTestContent.of(DataGenerator.base64Characters().genBytes(17));
+
+ String uploadId = UUID.randomUUID().toString();
+ StartResumableWriteRequest reqStart =
+ StartResumableWriteRequest.newBuilder()
+ .setWriteObjectSpec(
+ WriteObjectSpec.newBuilder()
+ .setResource(
+ Object.newBuilder().setBucket("projects/_/buckets/b").setName("o").build())
+ .build())
+ .build();
+ StartResumableWriteResponse resStart =
+ StartResumableWriteResponse.newBuilder().setUploadId(uploadId).build();
+ QueryWriteStatusRequest reqQuery =
+ QueryWriteStatusRequest.newBuilder().setUploadId(uploadId).build();
+ QueryWriteStatusResponse resQuery =
+ QueryWriteStatusResponse.newBuilder().setPersistedSize(8).build();
+ WriteObjectRequest reqWrite0 =
+ WriteObjectRequest.newBuilder()
+ .setUploadId(uploadId)
+ .setWriteOffset(0)
+ .setChecksummedData(content.slice(0, 2).asChecksummedData())
+ .build();
+ WriteObjectRequest reqWrite2 =
+ WriteObjectRequest.newBuilder()
+ .setWriteOffset(2)
+ .setChecksummedData(content.slice(2, 2).asChecksummedData())
+ .build();
+ WriteObjectRequest reqWrite4 =
+ WriteObjectRequest.newBuilder()
+ .setWriteOffset(4)
+ .setChecksummedData(content.slice(4, 2).asChecksummedData())
+ .build();
+ WriteObjectRequest reqWrite6 =
+ WriteObjectRequest.newBuilder()
+ .setWriteOffset(6)
+ .setChecksummedData(content.slice(6, 2).asChecksummedData())
+ .build();
+ WriteObjectRequest reqWrite8 =
+ WriteObjectRequest.newBuilder()
+ .setWriteOffset(8)
+ .setChecksummedData(content.slice(8, 2).asChecksummedData())
+ .build();
+ WriteObjectRequest reqWrite8WithUploadId = reqWrite8.toBuilder().setUploadId(uploadId).build();
+ WriteObjectRequest reqWrite10 =
+ WriteObjectRequest.newBuilder()
+ .setWriteOffset(10)
+ .setChecksummedData(content.slice(10, 2).asChecksummedData())
+ .build();
+ WriteObjectRequest reqWrite12 =
+ WriteObjectRequest.newBuilder()
+ .setWriteOffset(12)
+ .setChecksummedData(content.slice(12, 2).asChecksummedData())
+ .build();
+ WriteObjectRequest reqWrite14 =
+ WriteObjectRequest.newBuilder()
+ .setWriteOffset(14)
+ .setChecksummedData(content.slice(14, 2).asChecksummedData())
+ .build();
+ WriteObjectRequest reqWrite16 =
+ WriteObjectRequest.newBuilder()
+ .setWriteOffset(16)
+ .setChecksummedData(content.slice(16, 1).asChecksummedData())
+ .build();
+ WriteObjectRequest reqFinish =
+ WriteObjectRequest.newBuilder()
+ .setFinishWrite(true)
+ .setObjectChecksums(ObjectChecksums.newBuilder().setCrc32C(content.getCrc32c()).build())
+ .mergeFrom(reqWrite16)
+ .build();
+ WriteObjectResponse resFinish =
+ WriteObjectResponse.newBuilder()
+ .setResource(
+ reqStart.getWriteObjectSpec().getResource().toBuilder()
+ .setGeneration(1)
+ .setSize(17)
+ .setChecksums(
+ ObjectChecksums.newBuilder()
+ .setCrc32C(content.getCrc32c())
+ .setMd5Hash(content.getMd5Bytes())
+ .build())
+ .build())
+ .build();
+ ImmutableSet allReqWrite =
+ ImmutableSet.of(
+ reqWrite0,
+ reqWrite2,
+ reqWrite4,
+ reqWrite6,
+ reqWrite8,
+ reqWrite10,
+ reqWrite12,
+ reqWrite14,
+ reqWrite16);
+
+ AtomicInteger retryCount = new AtomicInteger(0);
+ StorageImplBase service =
+ new StorageImplBase() {
+ @Override
+ public void startResumableWrite(
+ StartResumableWriteRequest req, StreamObserver respond) {
+ if (req.equals(reqStart)) {
+ respond.onNext(resStart);
+ respond.onCompleted();
+ } else {
+ unexpected(respond, req);
+ }
+ }
+
+ @Override
+ public void queryWriteStatus(
+ QueryWriteStatusRequest req, StreamObserver respond) {
+ if (req.equals(reqQuery)) {
+ respond.onNext(resQuery);
+ respond.onCompleted();
+ } else {
+ unexpected(respond, req);
+ }
+ }
+
+ @Override
+ public StreamObserver writeObject(
+ StreamObserver respond) {
+ return new StreamObserver() {
+ @Override
+ public void onNext(WriteObjectRequest value) {
+ if (value.equals(reqFinish)) {
+ respond.onNext(resFinish);
+ respond.onCompleted();
+ } else if (value.equals(reqWrite10)) {
+ int i = retryCount.get();
+ if (i < 2) {
+ respond.onError(apiException(Code.UNAVAILABLE, "{Unavailable}"));
+ }
+ } else if (value.equals(reqWrite8WithUploadId)) {
+ retryCount.incrementAndGet();
+ } else if (allReqWrite.contains(value)) {
+ // do nothing
+ } else {
+ unexpected(respond, value);
+ }
+ }
+
+ @Override
+ public void onError(Throwable t) {}
+
+ @Override
+ public void onCompleted() {}
+ };
+ }
+
+ private void unexpected(StreamObserver> respond, Message msg) {
+ respond.onError(
+ apiException(
+ Code.UNIMPLEMENTED,
+ "Unexpected request { " + TextFormat.printer().shortDebugString(msg) + " }"));
+ }
+ };
+ try (FakeServer fakeServer = FakeServer.of(service);
+ GrpcStorageImpl storage =
+ (GrpcStorageImpl) fakeServer.getGrpcStorageOptions().getService()) {
+
+ BlobInfo info = BlobInfo.newBuilder("b", "o").build();
+ SettableApiFuture resultFuture = SettableApiFuture.create();
+ BufferHandle recoverBufferHandle = BufferHandle.allocate(2);
+ SyncAndUploadUnbufferedWritableByteChannel syncAndUpload =
+ new SyncAndUploadUnbufferedWritableByteChannel(
+ storage.storageClient.writeObjectCallable(),
+ storage.storageClient.queryWriteStatusCallable(),
+ resultFuture,
+ new ChunkSegmenter(Hasher.enabled(), ByteStringStrategy.copy(), 2, 2),
+ new DefaultRetrier(UnaryOperator.identity(), storage.getOptions()),
+ StorageRetryStrategy.getDefaultStorageRetryStrategy().getIdempotentHandler(),
+ new WriteCtx<>(
+ new ResumableWrite(
+ reqStart,
+ resStart,
+ id -> reqWrite0.toBuilder().clearWriteObjectSpec().setUploadId(id).build())),
+ recoveryFileManager.newRecoveryFile(info),
+ recoverBufferHandle);
+ try (BufferedWritableByteChannel w =
+ StorageByteChannels.writable()
+ .createSynchronized(
+ new DefaultBufferedWritableByteChannel(recoverBufferHandle, syncAndUpload))) {
+ w.write(ByteBuffer.wrap(content.getBytes()));
+ }
+
+ Decoder decoder =
+ Conversions.grpc().blobInfo().compose(WriteObjectResponse::getResource);
+ BlobInfo actual = decoder.decode(resultFuture.get(3, TimeUnit.SECONDS));
+ assertThat(actual.getSize()).isEqualTo(content.getBytes().length);
+ assertThat(actual.getCrc32c()).isEqualTo(content.getCrc32cBase64());
+ }
+ }
+
static List dataFrames(long length, int segmentLength) {
// todo: rethink this
Random rand = new Random(length);
diff --git a/google-cloud-storage/src/test/java/com/google/cloud/storage/it/ChecksummedTestContent.java b/google-cloud-storage/src/test/java/com/google/cloud/storage/it/ChecksummedTestContent.java
index 0f40cd930..aa87e6478 100644
--- a/google-cloud-storage/src/test/java/com/google/cloud/storage/it/ChecksummedTestContent.java
+++ b/google-cloud-storage/src/test/java/com/google/cloud/storage/it/ChecksummedTestContent.java
@@ -96,6 +96,10 @@ public ChecksummedData asChecksummedData() {
.build();
}
+ public ChecksummedTestContent slice(int begin, int length) {
+ return of(bytes, begin, Math.min(length, bytes.length - begin));
+ }
+
@Override
public String toString() {
return MoreObjects.toStringHelper(this)
From f456cc0c8f1df14513a8878e20e789afcae6f85f Mon Sep 17 00:00:00 2001
From: "release-please[bot]"
<55107282+release-please[bot]@users.noreply.github.com>
Date: Thu, 26 Jun 2025 11:20:09 -0400
Subject: [PATCH 13/13] chore(main): release 2.53.2 (#3163)
* chore(main): release 2.53.2
* chore: generate libraries at Wed Jun 25 22:14:47 UTC 2025
---------
Co-authored-by: release-please[bot] <55107282+release-please[bot]@users.noreply.github.com>
Co-authored-by: cloud-java-bot
---
CHANGELOG.md | 13 +++++++++++++
README.md | 6 +++---
gapic-google-cloud-storage-v2/pom.xml | 4 ++--
google-cloud-storage-bom/pom.xml | 16 ++++++++--------
google-cloud-storage-control/pom.xml | 4 ++--
google-cloud-storage/pom.xml | 4 ++--
grpc-google-cloud-storage-control-v2/pom.xml | 4 ++--
grpc-google-cloud-storage-v2/pom.xml | 4 ++--
pom.xml | 16 ++++++++--------
proto-google-cloud-storage-control-v2/pom.xml | 4 ++--
proto-google-cloud-storage-v2/pom.xml | 4 ++--
samples/snapshot/pom.xml | 6 +++---
storage-shared-benchmarking/pom.xml | 4 ++--
versions.txt | 14 +++++++-------
14 files changed, 58 insertions(+), 45 deletions(-)
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 699c71525..f9cdcf7ae 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,5 +1,18 @@
# Changelog
+## [2.53.2](https://github.com/googleapis/java-storage/compare/v2.53.1...v2.53.2) (2025-06-25)
+
+
+### Bug Fixes
+
+* Fix Journaling BlobWriteSessionConfig to properly handle multiple consecutive retries ([#3166](https://github.com/googleapis/java-storage/issues/3166)) ([895bfbd](https://github.com/googleapis/java-storage/commit/895bfbda902a77d16a33fe5238349a6b3d397c10))
+
+
+### Dependencies
+
+* Update dependency com.google.cloud.opentelemetry:exporter-trace to v0.36.0 ([#3162](https://github.com/googleapis/java-storage/issues/3162)) ([41a1030](https://github.com/googleapis/java-storage/commit/41a1030a2e77036cf961a16d472068b07e624192))
+* Update sdk-platform-java dependencies ([#3164](https://github.com/googleapis/java-storage/issues/3164)) ([c22a131](https://github.com/googleapis/java-storage/commit/c22a1319d8e2d92beeb03abac6bf2af8d09d49ee))
+
## [2.53.1](https://github.com/googleapis/java-storage/compare/v2.53.0...v2.53.1) (2025-06-18)
diff --git a/README.md b/README.md
index 4c618b20e..bb02676de 100644
--- a/README.md
+++ b/README.md
@@ -66,13 +66,13 @@ implementation 'com.google.cloud:google-cloud-storage'
If you are using Gradle without BOM, add this to your dependencies:
```Groovy
-implementation 'com.google.cloud:google-cloud-storage:2.53.1'
+implementation 'com.google.cloud:google-cloud-storage:2.53.2'
```
If you are using SBT, add this to your dependencies:
```Scala
-libraryDependencies += "com.google.cloud" % "google-cloud-storage" % "2.53.1"
+libraryDependencies += "com.google.cloud" % "google-cloud-storage" % "2.53.2"
```
## Authentication
@@ -522,7 +522,7 @@ Java is a registered trademark of Oracle and/or its affiliates.
[kokoro-badge-link-5]: http://storage.googleapis.com/cloud-devrel-public/java/badges/java-storage/java11.html
[stability-image]: https://img.shields.io/badge/stability-stable-green
[maven-version-image]: https://img.shields.io/maven-central/v/com.google.cloud/google-cloud-storage.svg
-[maven-version-link]: https://central.sonatype.com/artifact/com.google.cloud/google-cloud-storage/2.53.1
+[maven-version-link]: https://central.sonatype.com/artifact/com.google.cloud/google-cloud-storage/2.53.2
[authentication]: https://github.com/googleapis/google-cloud-java#authentication
[auth-scopes]: https://developers.google.com/identity/protocols/oauth2/scopes
[predefined-iam-roles]: https://cloud.google.com/iam/docs/understanding-roles#predefined_roles
diff --git a/gapic-google-cloud-storage-v2/pom.xml b/gapic-google-cloud-storage-v2/pom.xml
index 56eca8ee8..db04de301 100644
--- a/gapic-google-cloud-storage-v2/pom.xml
+++ b/gapic-google-cloud-storage-v2/pom.xml
@@ -4,13 +4,13 @@
4.0.0
com.google.api.grpc
gapic-google-cloud-storage-v2
- 2.53.2-SNAPSHOT
+ 2.53.2
gapic-google-cloud-storage-v2
GRPC library for gapic-google-cloud-storage-v2
com.google.cloud
google-cloud-storage-parent
- 2.53.2-SNAPSHOT
+ 2.53.2
diff --git a/google-cloud-storage-bom/pom.xml b/google-cloud-storage-bom/pom.xml
index 45d24d207..e00fa50bb 100644
--- a/google-cloud-storage-bom/pom.xml
+++ b/google-cloud-storage-bom/pom.xml
@@ -19,7 +19,7 @@
4.0.0
com.google.cloud
google-cloud-storage-bom
- 2.53.2-SNAPSHOT
+ 2.53.2
pom
com.google.cloud
@@ -69,37 +69,37 @@
com.google.cloud
google-cloud-storage
- 2.53.2-SNAPSHOT
+ 2.53.2
com.google.api.grpc
gapic-google-cloud-storage-v2
- 2.53.2-SNAPSHOT
+ 2.53.2
com.google.api.grpc
grpc-google-cloud-storage-v2
- 2.53.2-SNAPSHOT
+ 2.53.2
com.google.api.grpc
proto-google-cloud-storage-v2
- 2.53.2-SNAPSHOT
+ 2.53.2
com.google.cloud
google-cloud-storage-control
- 2.53.2-SNAPSHOT
+ 2.53.2
com.google.api.grpc
grpc-google-cloud-storage-control-v2
- 2.53.2-SNAPSHOT
+ 2.53.2
com.google.api.grpc
proto-google-cloud-storage-control-v2
- 2.53.2-SNAPSHOT
+ 2.53.2
diff --git a/google-cloud-storage-control/pom.xml b/google-cloud-storage-control/pom.xml
index e840b72f9..a3125320b 100644
--- a/google-cloud-storage-control/pom.xml
+++ b/google-cloud-storage-control/pom.xml
@@ -5,13 +5,13 @@
4.0.0
com.google.cloud
google-cloud-storage-control
- 2.53.2-SNAPSHOT
+ 2.53.2
google-cloud-storage-control
GRPC library for google-cloud-storage-control
com.google.cloud
google-cloud-storage-parent
- 2.53.2-SNAPSHOT
+ 2.53.2
diff --git a/google-cloud-storage/pom.xml b/google-cloud-storage/pom.xml
index e8464b0ab..30b340094 100644
--- a/google-cloud-storage/pom.xml
+++ b/google-cloud-storage/pom.xml
@@ -2,7 +2,7 @@
4.0.0
google-cloud-storage
- 2.53.2-SNAPSHOT
+ 2.53.2
jar
Google Cloud Storage
https://github.com/googleapis/java-storage
@@ -12,7 +12,7 @@
com.google.cloud
google-cloud-storage-parent
- 2.53.2-SNAPSHOT
+ 2.53.2
google-cloud-storage
diff --git a/grpc-google-cloud-storage-control-v2/pom.xml b/grpc-google-cloud-storage-control-v2/pom.xml
index 088cf1b6f..121d2a91a 100644
--- a/grpc-google-cloud-storage-control-v2/pom.xml
+++ b/grpc-google-cloud-storage-control-v2/pom.xml
@@ -4,13 +4,13 @@
4.0.0
com.google.api.grpc
grpc-google-cloud-storage-control-v2
- 2.53.2-SNAPSHOT
+ 2.53.2
grpc-google-cloud-storage-control-v2
GRPC library for google-cloud-storage
com.google.cloud
google-cloud-storage-parent
- 2.53.2-SNAPSHOT
+ 2.53.2
diff --git a/grpc-google-cloud-storage-v2/pom.xml b/grpc-google-cloud-storage-v2/pom.xml
index ba47c0740..6736c846f 100644
--- a/grpc-google-cloud-storage-v2/pom.xml
+++ b/grpc-google-cloud-storage-v2/pom.xml
@@ -4,13 +4,13 @@
4.0.0
com.google.api.grpc
grpc-google-cloud-storage-v2
- 2.53.2-SNAPSHOT
+ 2.53.2
grpc-google-cloud-storage-v2
GRPC library for grpc-google-cloud-storage-v2
com.google.cloud
google-cloud-storage-parent
- 2.53.2-SNAPSHOT
+ 2.53.2
diff --git a/pom.xml b/pom.xml
index a0a176c59..094779165 100644
--- a/pom.xml
+++ b/pom.xml
@@ -4,7 +4,7 @@
com.google.cloud
google-cloud-storage-parent
pom
- 2.53.2-SNAPSHOT
+ 2.53.2
Storage Parent
https://github.com/googleapis/java-storage
@@ -82,7 +82,7 @@
com.google.cloud
google-cloud-storage
- 2.53.2-SNAPSHOT
+ 2.53.2
com.google.apis
@@ -104,32 +104,32 @@
com.google.api.grpc
proto-google-cloud-storage-v2
- 2.53.2-SNAPSHOT
+ 2.53.2
com.google.api.grpc
grpc-google-cloud-storage-v2
- 2.53.2-SNAPSHOT
+ 2.53.2
com.google.api.grpc
gapic-google-cloud-storage-v2
- 2.53.2-SNAPSHOT
+ 2.53.2
com.google.api.grpc
grpc-google-cloud-storage-control-v2
- 2.53.2-SNAPSHOT
+ 2.53.2
com.google.api.grpc
proto-google-cloud-storage-control-v2
- 2.53.2-SNAPSHOT
+ 2.53.2
com.google.cloud
google-cloud-storage-control
- 2.53.2-SNAPSHOT
+ 2.53.2
com.google.cloud
diff --git a/proto-google-cloud-storage-control-v2/pom.xml b/proto-google-cloud-storage-control-v2/pom.xml
index f6ad8308f..fe4b1006e 100644
--- a/proto-google-cloud-storage-control-v2/pom.xml
+++ b/proto-google-cloud-storage-control-v2/pom.xml
@@ -4,13 +4,13 @@
4.0.0
com.google.api.grpc
proto-google-cloud-storage-control-v2
- 2.53.2-SNAPSHOT
+ 2.53.2
proto-google-cloud-storage-control-v2
Proto library for proto-google-cloud-storage-control-v2
com.google.cloud
google-cloud-storage-parent
- 2.53.2-SNAPSHOT
+ 2.53.2
diff --git a/proto-google-cloud-storage-v2/pom.xml b/proto-google-cloud-storage-v2/pom.xml
index 62bb3bf5b..f0e0aee9b 100644
--- a/proto-google-cloud-storage-v2/pom.xml
+++ b/proto-google-cloud-storage-v2/pom.xml
@@ -4,13 +4,13 @@
4.0.0
com.google.api.grpc
proto-google-cloud-storage-v2
- 2.53.2-SNAPSHOT
+ 2.53.2
proto-google-cloud-storage-v2
PROTO library for proto-google-cloud-storage-v2
com.google.cloud
google-cloud-storage-parent
- 2.53.2-SNAPSHOT
+ 2.53.2
diff --git a/samples/snapshot/pom.xml b/samples/snapshot/pom.xml
index 3c06dad21..da0a23de5 100644
--- a/samples/snapshot/pom.xml
+++ b/samples/snapshot/pom.xml
@@ -28,12 +28,12 @@
com.google.cloud
google-cloud-storage
- 2.53.2-SNAPSHOT
+ 2.53.2
com.google.cloud
google-cloud-storage-control
- 2.53.2-SNAPSHOT
+ 2.53.2
compile
@@ -70,7 +70,7 @@
com.google.cloud
google-cloud-storage
- 2.53.2-SNAPSHOT
+ 2.53.2
tests
test
diff --git a/storage-shared-benchmarking/pom.xml b/storage-shared-benchmarking/pom.xml
index 46956cfd2..113548e6d 100644
--- a/storage-shared-benchmarking/pom.xml
+++ b/storage-shared-benchmarking/pom.xml
@@ -10,7 +10,7 @@
com.google.cloud
google-cloud-storage-parent
- 2.53.2-SNAPSHOT
+ 2.53.2
@@ -31,7 +31,7 @@
com.google.cloud
google-cloud-storage
- 2.53.2-SNAPSHOT
+ 2.53.2
tests
diff --git a/versions.txt b/versions.txt
index c492d1007..70ae88367 100644
--- a/versions.txt
+++ b/versions.txt
@@ -1,10 +1,10 @@
# Format:
# module:released-version:current-version
-google-cloud-storage:2.53.1:2.53.2-SNAPSHOT
-gapic-google-cloud-storage-v2:2.53.1:2.53.2-SNAPSHOT
-grpc-google-cloud-storage-v2:2.53.1:2.53.2-SNAPSHOT
-proto-google-cloud-storage-v2:2.53.1:2.53.2-SNAPSHOT
-google-cloud-storage-control:2.53.1:2.53.2-SNAPSHOT
-proto-google-cloud-storage-control-v2:2.53.1:2.53.2-SNAPSHOT
-grpc-google-cloud-storage-control-v2:2.53.1:2.53.2-SNAPSHOT
+google-cloud-storage:2.53.2:2.53.2
+gapic-google-cloud-storage-v2:2.53.2:2.53.2
+grpc-google-cloud-storage-v2:2.53.2:2.53.2
+proto-google-cloud-storage-v2:2.53.2:2.53.2
+google-cloud-storage-control:2.53.2:2.53.2
+proto-google-cloud-storage-control-v2:2.53.2:2.53.2
+grpc-google-cloud-storage-control-v2:2.53.2:2.53.2