org.slf4j
diff --git a/bmc-objectstorage/bmc-objectstorage-generated/pom.xml b/bmc-objectstorage/bmc-objectstorage-generated/pom.xml
index 081cf4e4ec1..02dcb19a5b1 100644
--- a/bmc-objectstorage/bmc-objectstorage-generated/pom.xml
+++ b/bmc-objectstorage/bmc-objectstorage-generated/pom.xml
@@ -5,7 +5,7 @@
com.oracle.oci.sdk
oci-java-sdk-objectstorage-parent
- 3.97.1
+ 3.97.2
../pom.xml
@@ -19,7 +19,7 @@
com.oracle.oci.sdk
oci-java-sdk-common
- 3.97.1
+ 3.97.2
diff --git a/bmc-objectstorage/pom.xml b/bmc-objectstorage/pom.xml
index b88c87061ee..96e255e77c0 100644
--- a/bmc-objectstorage/pom.xml
+++ b/bmc-objectstorage/pom.xml
@@ -5,7 +5,7 @@
com.oracle.oci.sdk
oci-java-sdk
- 3.97.1
+ 3.97.2
../pom.xml
diff --git a/bmc-oce/pom.xml b/bmc-oce/pom.xml
index fbe7ceb6d31..53b3199d05b 100644
--- a/bmc-oce/pom.xml
+++ b/bmc-oce/pom.xml
@@ -4,7 +4,7 @@
com.oracle.oci.sdk
oci-java-sdk
- 3.97.1
+ 3.97.2
../pom.xml
oci-java-sdk-oce
@@ -15,7 +15,7 @@
com.oracle.oci.sdk
oci-java-sdk-common
- 3.97.1
+ 3.97.2
\ No newline at end of file
diff --git a/bmc-ocicontrolcenter/pom.xml b/bmc-ocicontrolcenter/pom.xml
index 32084e6cf88..3b11b4f87a9 100644
--- a/bmc-ocicontrolcenter/pom.xml
+++ b/bmc-ocicontrolcenter/pom.xml
@@ -4,7 +4,7 @@
com.oracle.oci.sdk
oci-java-sdk
- 3.97.1
+ 3.97.2
../pom.xml
oci-java-sdk-ocicontrolcenter
@@ -15,7 +15,7 @@
com.oracle.oci.sdk
oci-java-sdk-common
- 3.97.1
+ 3.97.2
\ No newline at end of file
diff --git a/bmc-ociproductcatalog/pom.xml b/bmc-ociproductcatalog/pom.xml
new file mode 100644
index 00000000000..0ffebb6c9b7
--- /dev/null
+++ b/bmc-ociproductcatalog/pom.xml
@@ -0,0 +1,21 @@
+
+
+ 4.0.0
+
+ com.oracle.oci.sdk
+ oci-java-sdk
+ 3.97.2
+ ../pom.xml
+
+ oci-java-sdk-ociproductcatalog
+ Oracle Cloud Infrastructure SDK - Oci Product Catalog
+ This project contains the SDK used for Oracle Cloud Infrastructure Oci Product Catalog
+ https://docs.cloud.oracle.com/Content/API/SDKDocs/javasdk.htm
+
+
+ com.oracle.oci.sdk
+ oci-java-sdk-common
+ 3.97.2
+
+
+
\ No newline at end of file
diff --git a/bmc-ociproductcatalog/src/main/java/com/oracle/bmc/ociproductcatalog/Product.java b/bmc-ociproductcatalog/src/main/java/com/oracle/bmc/ociproductcatalog/Product.java
new file mode 100644
index 00000000000..f868d649482
--- /dev/null
+++ b/bmc-ociproductcatalog/src/main/java/com/oracle/bmc/ociproductcatalog/Product.java
@@ -0,0 +1,128 @@
+/**
+ * Copyright (c) 2016, 2026, Oracle and/or its affiliates. All rights reserved.
+ * This software is dual-licensed to you under the Universal Permissive License (UPL) 1.0 as shown at https://oss.oracle.com/licenses/upl or Apache License 2.0 as shown at http://www.apache.org/licenses/LICENSE-2.0. You may choose either license.
+ */
+package com.oracle.bmc.ociproductcatalog;
+
+import com.oracle.bmc.ociproductcatalog.requests.*;
+import com.oracle.bmc.ociproductcatalog.responses.*;
+
+/**
+ * Apis to manage the products used by the OCI service teams This service client uses
+ * CircuitBreakerUtils.DEFAULT_CIRCUIT_BREAKER for all the operations by default if no circuit
+ * breaker configuration is defined by the user.
+ */
+@jakarta.annotation.Generated(value = "OracleSDKGenerator", comments = "API Version: 20250610")
+public interface Product extends AutoCloseable {
+
+ /** Rebuilds the client from scratch. Useful to refresh certificates. */
+ void refreshClient();
+
+ /**
+ * Sets the endpoint to call (ex, https://www.example.com).
+ *
+ * @param endpoint The endpoint of the service.
+ */
+ void setEndpoint(String endpoint);
+
+ /** Gets the set endpoint for REST call (ex, https://www.example.com) */
+ String getEndpoint();
+
+ /**
+ * Sets the region to call (ex, Region.US_PHOENIX_1).
+ *
+ * Note, this will call {@link #setEndpoint(String) setEndpoint} after resolving the
+ * endpoint. If the service is not available in this Region, however, an
+ * IllegalArgumentException will be raised.
+ *
+ * @param region The region of the service.
+ */
+ void setRegion(com.oracle.bmc.Region region);
+
+ /**
+ * Sets the region to call (ex, 'us-phoenix-1').
+ *
+ *
Note, this will first try to map the region ID to a known Region and call {@link
+ * #setRegion(Region) setRegion}.
+ *
+ *
If no known Region could be determined, it will create an endpoint based on the default
+ * endpoint format ({@link com.oracle.bmc.Region#formatDefaultRegionEndpoint(Service, String)}
+ * and then call {@link #setEndpoint(String) setEndpoint}.
+ *
+ * @param regionId The public region ID.
+ */
+ void setRegion(String regionId);
+
+ /**
+ * Determines whether realm specific endpoint should be used or not. Set
+ * realmSpecificEndpointTemplateEnabled to "true" if the user wants to enable use of realm
+ * specific endpoint template, otherwise set it to "false"
+ *
+ * @param realmSpecificEndpointTemplateEnabled flag to enable the use of realm specific endpoint
+ * template
+ */
+ void useRealmSpecificEndpointTemplate(boolean realmSpecificEndpointTemplateEnabled);
+
+ /**
+ * Activate the target Product. Change lifecycleState from INACTIVE to ACTIVE.
+ *
+ * @param request The request object containing the details to send
+ * @return A response object containing details about the completed operation
+ * @throws BmcException when an error occurs. This operation uses
+ * RetryConfiguration.SDK_DEFAULT_RETRY_CONFIGURATION as default if no retry strategy is
+ * provided. The specifics of the default retry strategy are described here
+ * https://docs.oracle.com/en-us/iaas/Content/API/SDKDocs/javasdkconcepts.htm#javasdkconcepts_topic_Retries
+ *
Example: Click here to see how to use ActivateProduct
+ * API.
+ */
+ ActivateProductResponse activateProduct(ActivateProductRequest request);
+
+ /**
+ * Get product by ID
+ *
+ * @param request The request object containing the details to send
+ * @return A response object containing details about the completed operation
+ * @throws BmcException when an error occurs. This operation uses
+ * RetryConfiguration.SDK_DEFAULT_RETRY_CONFIGURATION as default if no retry strategy is
+ * provided. The specifics of the default retry strategy are described here
+ * https://docs.oracle.com/en-us/iaas/Content/API/SDKDocs/javasdkconcepts.htm#javasdkconcepts_topic_Retries
+ *
Example: Click here to see how to use GetProduct API.
+ */
+ GetProductResponse getProduct(GetProductRequest request);
+
+ /**
+ * List products
+ *
+ * @param request The request object containing the details to send
+ * @return A response object containing details about the completed operation
+ * @throws BmcException when an error occurs. This operation uses
+ * RetryConfiguration.SDK_DEFAULT_RETRY_CONFIGURATION as default if no retry strategy is
+ * provided. The specifics of the default retry strategy are described here
+ * https://docs.oracle.com/en-us/iaas/Content/API/SDKDocs/javasdkconcepts.htm#javasdkconcepts_topic_Retries
+ *
Example: Click here to see how to use ListProducts API.
+ */
+ ListProductsResponse listProducts(ListProductsRequest request);
+
+ /**
+ * Gets the pre-configured waiters available for resources for this service.
+ *
+ * @return The service waiters.
+ */
+ ProductWaiters getWaiters();
+
+ /**
+ * Gets the pre-configured paginators available for list operations in this service which may
+ * return multiple pages of data. These paginators provide an {@link java.lang.Iterable}
+ * interface so that service responses, or resources/records, can be iterated through without
+ * having to manually deal with pagination and page tokens.
+ *
+ * @return The service paginators.
+ */
+ ProductPaginators getPaginators();
+}
diff --git a/bmc-ociproductcatalog/src/main/java/com/oracle/bmc/ociproductcatalog/ProductAdmin.java b/bmc-ociproductcatalog/src/main/java/com/oracle/bmc/ociproductcatalog/ProductAdmin.java
new file mode 100644
index 00000000000..3af23df1edb
--- /dev/null
+++ b/bmc-ociproductcatalog/src/main/java/com/oracle/bmc/ociproductcatalog/ProductAdmin.java
@@ -0,0 +1,180 @@
+/**
+ * Copyright (c) 2016, 2026, Oracle and/or its affiliates. All rights reserved.
+ * This software is dual-licensed to you under the Universal Permissive License (UPL) 1.0 as shown at https://oss.oracle.com/licenses/upl or Apache License 2.0 as shown at http://www.apache.org/licenses/LICENSE-2.0. You may choose either license.
+ */
+package com.oracle.bmc.ociproductcatalog;
+
+import com.oracle.bmc.ociproductcatalog.requests.*;
+import com.oracle.bmc.ociproductcatalog.responses.*;
+
+/**
+ * Apis to manage the products used by the OCI service teams This service client uses
+ * CircuitBreakerUtils.DEFAULT_CIRCUIT_BREAKER for all the operations by default if no circuit
+ * breaker configuration is defined by the user.
+ */
+@jakarta.annotation.Generated(value = "OracleSDKGenerator", comments = "API Version: 20250610")
+public interface ProductAdmin extends AutoCloseable {
+
+ /** Rebuilds the client from scratch. Useful to refresh certificates. */
+ void refreshClient();
+
+ /**
+ * Sets the endpoint to call (ex, https://www.example.com).
+ *
+ * @param endpoint The endpoint of the service.
+ */
+ void setEndpoint(String endpoint);
+
+ /** Gets the set endpoint for REST call (ex, https://www.example.com) */
+ String getEndpoint();
+
+ /**
+ * Sets the region to call (ex, Region.US_PHOENIX_1).
+ *
+ *
Note, this will call {@link #setEndpoint(String) setEndpoint} after resolving the
+ * endpoint. If the service is not available in this Region, however, an
+ * IllegalArgumentException will be raised.
+ *
+ * @param region The region of the service.
+ */
+ void setRegion(com.oracle.bmc.Region region);
+
+ /**
+ * Sets the region to call (ex, 'us-phoenix-1').
+ *
+ *
Note, this will first try to map the region ID to a known Region and call {@link
+ * #setRegion(Region) setRegion}.
+ *
+ *
If no known Region could be determined, it will create an endpoint based on the default
+ * endpoint format ({@link com.oracle.bmc.Region#formatDefaultRegionEndpoint(Service, String)}
+ * and then call {@link #setEndpoint(String) setEndpoint}.
+ *
+ * @param regionId The public region ID.
+ */
+ void setRegion(String regionId);
+
+ /**
+ * Determines whether realm specific endpoint should be used or not. Set
+ * realmSpecificEndpointTemplateEnabled to "true" if the user wants to enable use of realm
+ * specific endpoint template, otherwise set it to "false"
+ *
+ * @param realmSpecificEndpointTemplateEnabled flag to enable the use of realm specific endpoint
+ * template
+ */
+ void useRealmSpecificEndpointTemplate(boolean realmSpecificEndpointTemplateEnabled);
+
+ /**
+ * Change product compartment
+ *
+ * @param request The request object containing the details to send
+ * @return A response object containing details about the completed operation
+ * @throws BmcException when an error occurs. This operation uses
+ * RetryConfiguration.SDK_DEFAULT_RETRY_CONFIGURATION as default if no retry strategy is
+ * provided. The specifics of the default retry strategy are described here
+ * https://docs.oracle.com/en-us/iaas/Content/API/SDKDocs/javasdkconcepts.htm#javasdkconcepts_topic_Retries
+ *
Example: Click here to see how to use
+ * ChangeAdminProductCompartment API.
+ */
+ ChangeAdminProductCompartmentResponse changeAdminProductCompartment(
+ ChangeAdminProductCompartmentRequest request);
+
+ /**
+ * Used by the OCI service teams to create a product to control the availability of the relative
+ * resources
+ *
+ * @param request The request object containing the details to send
+ * @return A response object containing details about the completed operation
+ * @throws BmcException when an error occurs. This operation uses
+ * RetryConfiguration.SDK_DEFAULT_RETRY_CONFIGURATION as default if no retry strategy is
+ * provided. The specifics of the default retry strategy are described here
+ * https://docs.oracle.com/en-us/iaas/Content/API/SDKDocs/javasdkconcepts.htm#javasdkconcepts_topic_Retries
+ *
Example: Click here to see how to use CreateAdminProduct
+ * API.
+ */
+ CreateAdminProductResponse createAdminProduct(CreateAdminProductRequest request);
+
+ /**
+ * Delete the product
+ *
+ * @param request The request object containing the details to send
+ * @return A response object containing details about the completed operation
+ * @throws BmcException when an error occurs. This operation uses
+ * RetryConfiguration.SDK_DEFAULT_RETRY_CONFIGURATION as default if no retry strategy is
+ * provided. The specifics of the default retry strategy are described here
+ * https://docs.oracle.com/en-us/iaas/Content/API/SDKDocs/javasdkconcepts.htm#javasdkconcepts_topic_Retries
+ *
Example: Click here to see how to use DeleteAdminProduct
+ * API.
+ */
+ DeleteAdminProductResponse deleteAdminProduct(DeleteAdminProductRequest request);
+
+ /**
+ * Get the product by ID
+ *
+ * @param request The request object containing the details to send
+ * @return A response object containing details about the completed operation
+ * @throws BmcException when an error occurs. This operation uses
+ * RetryConfiguration.SDK_DEFAULT_RETRY_CONFIGURATION as default if no retry strategy is
+ * provided. The specifics of the default retry strategy are described here
+ * https://docs.oracle.com/en-us/iaas/Content/API/SDKDocs/javasdkconcepts.htm#javasdkconcepts_topic_Retries
+ *
Example: Click here to see how to use GetAdminProduct
+ * API.
+ */
+ GetAdminProductResponse getAdminProduct(GetAdminProductRequest request);
+
+ /**
+ * List the products with the filters
+ *
+ * @param request The request object containing the details to send
+ * @return A response object containing details about the completed operation
+ * @throws BmcException when an error occurs. This operation uses
+ * RetryConfiguration.SDK_DEFAULT_RETRY_CONFIGURATION as default if no retry strategy is
+ * provided. The specifics of the default retry strategy are described here
+ * https://docs.oracle.com/en-us/iaas/Content/API/SDKDocs/javasdkconcepts.htm#javasdkconcepts_topic_Retries
+ *
Example: Click here to see how to use ListAdminProducts
+ * API.
+ */
+ ListAdminProductsResponse listAdminProducts(ListAdminProductsRequest request);
+
+ /**
+ * Update the product
+ *
+ * @param request The request object containing the details to send
+ * @return A response object containing details about the completed operation
+ * @throws BmcException when an error occurs. This operation uses
+ * RetryConfiguration.SDK_DEFAULT_RETRY_CONFIGURATION as default if no retry strategy is
+ * provided. The specifics of the default retry strategy are described here
+ * https://docs.oracle.com/en-us/iaas/Content/API/SDKDocs/javasdkconcepts.htm#javasdkconcepts_topic_Retries
+ *
Example: Click here to see how to use UpdateAdminProduct
+ * API.
+ */
+ UpdateAdminProductResponse updateAdminProduct(UpdateAdminProductRequest request);
+
+ /**
+ * Gets the pre-configured waiters available for resources for this service.
+ *
+ * @return The service waiters.
+ */
+ ProductAdminWaiters getWaiters();
+
+ /**
+ * Gets the pre-configured paginators available for list operations in this service which may
+ * return multiple pages of data. These paginators provide an {@link java.lang.Iterable}
+ * interface so that service responses, or resources/records, can be iterated through without
+ * having to manually deal with pagination and page tokens.
+ *
+ * @return The service paginators.
+ */
+ ProductAdminPaginators getPaginators();
+}
diff --git a/bmc-ociproductcatalog/src/main/java/com/oracle/bmc/ociproductcatalog/ProductAdminAsync.java b/bmc-ociproductcatalog/src/main/java/com/oracle/bmc/ociproductcatalog/ProductAdminAsync.java
new file mode 100644
index 00000000000..f930c0e7635
--- /dev/null
+++ b/bmc-ociproductcatalog/src/main/java/com/oracle/bmc/ociproductcatalog/ProductAdminAsync.java
@@ -0,0 +1,159 @@
+/**
+ * Copyright (c) 2016, 2026, Oracle and/or its affiliates. All rights reserved.
+ * This software is dual-licensed to you under the Universal Permissive License (UPL) 1.0 as shown at https://oss.oracle.com/licenses/upl or Apache License 2.0 as shown at http://www.apache.org/licenses/LICENSE-2.0. You may choose either license.
+ */
+package com.oracle.bmc.ociproductcatalog;
+
+import com.oracle.bmc.ociproductcatalog.requests.*;
+import com.oracle.bmc.ociproductcatalog.responses.*;
+
+/** Apis to manage the products used by the OCI service teams */
+@jakarta.annotation.Generated(value = "OracleSDKGenerator", comments = "API Version: 20250610")
+public interface ProductAdminAsync extends AutoCloseable {
+
+ /** Rebuilds the client from scratch. Useful to refresh certificates. */
+ void refreshClient();
+
+ /**
+ * Sets the endpoint to call (ex, https://www.example.com).
+ *
+ * @param endpoint The endpoint of the serice.
+ */
+ void setEndpoint(String endpoint);
+
+ /** Gets the set endpoint for REST call (ex, https://www.example.com) */
+ String getEndpoint();
+
+ /**
+ * Sets the region to call (ex, Region.US_PHOENIX_1).
+ *
+ *
Note, this will call {@link #setEndpoint(String) setEndpoint} after resolving the
+ * endpoint. If the service is not available in this region, however, an
+ * IllegalArgumentException will be raised.
+ *
+ * @param region The region of the service.
+ */
+ void setRegion(com.oracle.bmc.Region region);
+
+ /**
+ * Sets the region to call (ex, 'us-phoenix-1').
+ *
+ *
Note, this will first try to map the region ID to a known Region and call {@link
+ * #setRegion(Region) setRegion}.
+ *
+ *
If no known Region could be determined, it will create an endpoint based on the default
+ * endpoint format ({@link com.oracle.bmc.Region#formatDefaultRegionEndpoint(Service, String)}
+ * and then call {@link #setEndpoint(String) setEndpoint}.
+ *
+ * @param regionId The public region ID.
+ */
+ void setRegion(String regionId);
+
+ /**
+ * Determines whether realm specific endpoint should be used or not. Set
+ * realmSpecificEndpointTemplateEnabled to "true" if the user wants to enable use of realm
+ * specific endpoint template, otherwise set it to "false"
+ *
+ * @param realmSpecificEndpointTemplateEnabled flag to enable the use of realm specific endpoint
+ * template
+ */
+ void useRealmSpecificEndpointTemplate(boolean realmSpecificEndpointTemplateEnabled);
+
+ /**
+ * Change product compartment
+ *
+ * @param request The request object containing the details to send
+ * @param handler The request handler to invoke upon completion, may be null.
+ * @return A Future that can be used to get the response if no AsyncHandler was provided. Note,
+ * if you provide an AsyncHandler and use the Future, some types of responses (like
+ * java.io.InputStream) may not be able to be read in both places as the underlying stream
+ * may only be consumed once.
+ */
+ java.util.concurrent.Future
+ changeAdminProductCompartment(
+ ChangeAdminProductCompartmentRequest request,
+ com.oracle.bmc.responses.AsyncHandler<
+ ChangeAdminProductCompartmentRequest,
+ ChangeAdminProductCompartmentResponse>
+ handler);
+
+ /**
+ * Used by the OCI service teams to create a product to control the availability of the relative
+ * resources
+ *
+ * @param request The request object containing the details to send
+ * @param handler The request handler to invoke upon completion, may be null.
+ * @return A Future that can be used to get the response if no AsyncHandler was provided. Note,
+ * if you provide an AsyncHandler and use the Future, some types of responses (like
+ * java.io.InputStream) may not be able to be read in both places as the underlying stream
+ * may only be consumed once.
+ */
+ java.util.concurrent.Future createAdminProduct(
+ CreateAdminProductRequest request,
+ com.oracle.bmc.responses.AsyncHandler<
+ CreateAdminProductRequest, CreateAdminProductResponse>
+ handler);
+
+ /**
+ * Delete the product
+ *
+ * @param request The request object containing the details to send
+ * @param handler The request handler to invoke upon completion, may be null.
+ * @return A Future that can be used to get the response if no AsyncHandler was provided. Note,
+ * if you provide an AsyncHandler and use the Future, some types of responses (like
+ * java.io.InputStream) may not be able to be read in both places as the underlying stream
+ * may only be consumed once.
+ */
+ java.util.concurrent.Future deleteAdminProduct(
+ DeleteAdminProductRequest request,
+ com.oracle.bmc.responses.AsyncHandler<
+ DeleteAdminProductRequest, DeleteAdminProductResponse>
+ handler);
+
+ /**
+ * Get the product by ID
+ *
+ * @param request The request object containing the details to send
+ * @param handler The request handler to invoke upon completion, may be null.
+ * @return A Future that can be used to get the response if no AsyncHandler was provided. Note,
+ * if you provide an AsyncHandler and use the Future, some types of responses (like
+ * java.io.InputStream) may not be able to be read in both places as the underlying stream
+ * may only be consumed once.
+ */
+ java.util.concurrent.Future getAdminProduct(
+ GetAdminProductRequest request,
+ com.oracle.bmc.responses.AsyncHandler
+ handler);
+
+ /**
+ * List the products with the filters
+ *
+ * @param request The request object containing the details to send
+ * @param handler The request handler to invoke upon completion, may be null.
+ * @return A Future that can be used to get the response if no AsyncHandler was provided. Note,
+ * if you provide an AsyncHandler and use the Future, some types of responses (like
+ * java.io.InputStream) may not be able to be read in both places as the underlying stream
+ * may only be consumed once.
+ */
+ java.util.concurrent.Future listAdminProducts(
+ ListAdminProductsRequest request,
+ com.oracle.bmc.responses.AsyncHandler<
+ ListAdminProductsRequest, ListAdminProductsResponse>
+ handler);
+
+ /**
+ * Update the product
+ *
+ * @param request The request object containing the details to send
+ * @param handler The request handler to invoke upon completion, may be null.
+ * @return A Future that can be used to get the response if no AsyncHandler was provided. Note,
+ * if you provide an AsyncHandler and use the Future, some types of responses (like
+ * java.io.InputStream) may not be able to be read in both places as the underlying stream
+ * may only be consumed once.
+ */
+ java.util.concurrent.Future updateAdminProduct(
+ UpdateAdminProductRequest request,
+ com.oracle.bmc.responses.AsyncHandler<
+ UpdateAdminProductRequest, UpdateAdminProductResponse>
+ handler);
+}
diff --git a/bmc-ociproductcatalog/src/main/java/com/oracle/bmc/ociproductcatalog/ProductAdminAsyncClient.java b/bmc-ociproductcatalog/src/main/java/com/oracle/bmc/ociproductcatalog/ProductAdminAsyncClient.java
new file mode 100644
index 00000000000..e466729fd86
--- /dev/null
+++ b/bmc-ociproductcatalog/src/main/java/com/oracle/bmc/ociproductcatalog/ProductAdminAsyncClient.java
@@ -0,0 +1,449 @@
+/**
+ * Copyright (c) 2016, 2026, Oracle and/or its affiliates. All rights reserved.
+ * This software is dual-licensed to you under the Universal Permissive License (UPL) 1.0 as shown at https://oss.oracle.com/licenses/upl or Apache License 2.0 as shown at http://www.apache.org/licenses/LICENSE-2.0. You may choose either license.
+ */
+package com.oracle.bmc.ociproductcatalog;
+
+import com.oracle.bmc.util.internal.Validate;
+import com.oracle.bmc.ociproductcatalog.requests.*;
+import com.oracle.bmc.ociproductcatalog.responses.*;
+
+import java.util.Objects;
+
+/**
+ * Async client implementation for ProductAdmin service.
+ * There are two ways to use async client: 1. Use AsyncHandler: using AsyncHandler, if the response
+ * to the call is an {@link java.io.InputStream}, like getObject Api in object storage service,
+ * developers need to process the stream in AsyncHandler, and not anywhere else, because the stream
+ * will be closed right after the AsyncHandler is invoked.
+ * 2. Use Java Future: using Java Future, developers need to close the stream after they are done
+ * with the Java Future.
+ * Accessing the result should be done in a mutually exclusive manner, either through the Future or
+ * the AsyncHandler, but not both. If the Future is used, the caller should pass in null as the
+ * AsyncHandler. If the AsyncHandler is used, it is still safe to use the Future to determine
+ * whether or not the request was completed via Future.isDone/isCancelled.
+ * Please refer to
+ * https://github.com/oracle/oci-java-sdk/blob/master/bmc-examples/src/main/java/ResteasyClientWithObjectStorageExample.java
+ */
+@jakarta.annotation.Generated(value = "OracleSDKGenerator", comments = "API Version: 20250610")
+public class ProductAdminAsyncClient extends com.oracle.bmc.http.internal.BaseAsyncClient
+ implements ProductAdminAsync {
+ /** Service instance for ProductAdmin. */
+ public static final com.oracle.bmc.Service SERVICE =
+ com.oracle.bmc.Services.serviceBuilder()
+ .serviceName(ProductAdminClient.class.getName())
+ .serviceEndpointPrefix("")
+ .serviceEndpointTemplate(
+ "https://cp.product-catalog.{region}.oci.{secondLevelDomain}")
+ .build();
+
+ private static final org.slf4j.Logger LOG =
+ org.slf4j.LoggerFactory.getLogger(ProductAdminAsyncClient.class);
+
+ ProductAdminAsyncClient(
+ com.oracle.bmc.common.ClientBuilderBase, ?> builder,
+ com.oracle.bmc.auth.AbstractAuthenticationDetailsProvider
+ authenticationDetailsProvider) {
+ super(builder, authenticationDetailsProvider);
+ }
+
+ /**
+ * Create a builder for this client.
+ *
+ * @return builder
+ */
+ public static Builder builder() {
+ return new Builder(SERVICE);
+ }
+
+ /**
+ * Builder class for this client. The "authenticationDetailsProvider" is required and must be
+ * passed to the {@link #build(AbstractAuthenticationDetailsProvider)} method.
+ */
+ public static class Builder
+ extends com.oracle.bmc.common.RegionalClientBuilder {
+ private Builder(com.oracle.bmc.Service service) {
+ super(service);
+ final String packageName = "ociproductcatalog";
+ com.oracle.bmc.internal.DeveloperToolConfiguration
+ .throwDisabledServiceExceptionIfAppropriate(packageName);
+ requestSignerFactory =
+ new com.oracle.bmc.http.signing.internal.DefaultRequestSignerFactory(
+ com.oracle.bmc.http.signing.SigningStrategy.STANDARD);
+ }
+
+ /**
+ * Build the client.
+ *
+ * @param authenticationDetailsProvider authentication details provider
+ * @return the client
+ */
+ public ProductAdminAsyncClient build(
+ @jakarta.annotation.Nonnull
+ com.oracle.bmc.auth.AbstractAuthenticationDetailsProvider
+ authenticationDetailsProvider) {
+ return new ProductAdminAsyncClient(this, authenticationDetailsProvider);
+ }
+ }
+
+ @Override
+ public void setRegion(com.oracle.bmc.Region region) {
+ super.setRegion(region);
+ }
+
+ @Override
+ public void setRegion(String regionId) {
+ super.setRegion(regionId);
+ }
+
+ @Override
+ public java.util.concurrent.Future
+ changeAdminProductCompartment(
+ ChangeAdminProductCompartmentRequest request,
+ final com.oracle.bmc.responses.AsyncHandler<
+ ChangeAdminProductCompartmentRequest,
+ ChangeAdminProductCompartmentResponse>
+ handler) {
+
+ Validate.notBlank(request.getProductId(), "productId must not be blank");
+ Objects.requireNonNull(
+ request.getChangeProductCompartmentDetails(),
+ "changeProductCompartmentDetails is required");
+
+ return clientCall(request, ChangeAdminProductCompartmentResponse::builder)
+ .logger(LOG, "changeAdminProductCompartment")
+ .serviceDetails("ProductAdmin", "ChangeAdminProductCompartment", "")
+ .method(com.oracle.bmc.http.client.Method.POST)
+ .requestBuilder(ChangeAdminProductCompartmentRequest::builder)
+ .basePath("/20250610")
+ .appendPathParam("internal")
+ .appendPathParam("admin")
+ .appendPathParam("product")
+ .appendPathParam(request.getProductId())
+ .appendPathParam("actions")
+ .appendPathParam("changeCompartment")
+ .accept("application/json")
+ .appendHeader("opc-request-id", request.getOpcRequestId())
+ .appendHeader("opc-retry-token", request.getOpcRetryToken())
+ .appendHeader("if-match", request.getIfMatch())
+ .hasBody()
+ .handleResponseHeaderString(
+ "opc-request-id",
+ ChangeAdminProductCompartmentResponse.Builder::opcRequestId)
+ .callAsync(handler);
+ }
+
+ @Override
+ public java.util.concurrent.Future createAdminProduct(
+ CreateAdminProductRequest request,
+ final com.oracle.bmc.responses.AsyncHandler<
+ CreateAdminProductRequest, CreateAdminProductResponse>
+ handler) {
+ Objects.requireNonNull(
+ request.getCreateProductDetails(), "createProductDetails is required");
+
+ return clientCall(request, CreateAdminProductResponse::builder)
+ .logger(LOG, "createAdminProduct")
+ .serviceDetails("ProductAdmin", "CreateAdminProduct", "")
+ .method(com.oracle.bmc.http.client.Method.POST)
+ .requestBuilder(CreateAdminProductRequest::builder)
+ .basePath("/20250610")
+ .appendPathParam("internal")
+ .appendPathParam("admin")
+ .appendPathParam("product")
+ .accept("application/json")
+ .appendHeader("opc-retry-token", request.getOpcRetryToken())
+ .appendHeader("opc-request-id", request.getOpcRequestId())
+ .hasBody()
+ .handleBody(
+ com.oracle.bmc.ociproductcatalog.model.Product.class,
+ CreateAdminProductResponse.Builder::product)
+ .handleResponseHeaderString(
+ "opc-request-id", CreateAdminProductResponse.Builder::opcRequestId)
+ .handleResponseHeaderString("etag", CreateAdminProductResponse.Builder::etag)
+ .callAsync(handler);
+ }
+
+ @Override
+ public java.util.concurrent.Future deleteAdminProduct(
+ DeleteAdminProductRequest request,
+ final com.oracle.bmc.responses.AsyncHandler<
+ DeleteAdminProductRequest, DeleteAdminProductResponse>
+ handler) {
+
+ Validate.notBlank(request.getProductId(), "productId must not be blank");
+
+ return clientCall(request, DeleteAdminProductResponse::builder)
+ .logger(LOG, "deleteAdminProduct")
+ .serviceDetails("ProductAdmin", "DeleteAdminProduct", "")
+ .method(com.oracle.bmc.http.client.Method.DELETE)
+ .requestBuilder(DeleteAdminProductRequest::builder)
+ .basePath("/20250610")
+ .appendPathParam("internal")
+ .appendPathParam("admin")
+ .appendPathParam("product")
+ .appendPathParam(request.getProductId())
+ .accept("application/json")
+ .appendHeader("opc-request-id", request.getOpcRequestId())
+ .appendHeader("if-match", request.getIfMatch())
+ .handleResponseHeaderString(
+ "opc-request-id", DeleteAdminProductResponse.Builder::opcRequestId)
+ .callAsync(handler);
+ }
+
+ @Override
+ public java.util.concurrent.Future getAdminProduct(
+ GetAdminProductRequest request,
+ final com.oracle.bmc.responses.AsyncHandler<
+ GetAdminProductRequest, GetAdminProductResponse>
+ handler) {
+
+ Validate.notBlank(request.getProductId(), "productId must not be blank");
+
+ return clientCall(request, GetAdminProductResponse::builder)
+ .logger(LOG, "getAdminProduct")
+ .serviceDetails("ProductAdmin", "GetAdminProduct", "")
+ .method(com.oracle.bmc.http.client.Method.GET)
+ .requestBuilder(GetAdminProductRequest::builder)
+ .basePath("/20250610")
+ .appendPathParam("internal")
+ .appendPathParam("admin")
+ .appendPathParam("product")
+ .appendPathParam(request.getProductId())
+ .accept("application/json")
+ .appendHeader("opc-request-id", request.getOpcRequestId())
+ .handleBody(
+ com.oracle.bmc.ociproductcatalog.model.AdminProduct.class,
+ GetAdminProductResponse.Builder::adminProduct)
+ .handleResponseHeaderString(
+ "opc-request-id", GetAdminProductResponse.Builder::opcRequestId)
+ .handleResponseHeaderString("etag", GetAdminProductResponse.Builder::etag)
+ .callAsync(handler);
+ }
+
+ @Override
+ public java.util.concurrent.Future listAdminProducts(
+ ListAdminProductsRequest request,
+ final com.oracle.bmc.responses.AsyncHandler<
+ ListAdminProductsRequest, ListAdminProductsResponse>
+ handler) {
+
+ return clientCall(request, ListAdminProductsResponse::builder)
+ .logger(LOG, "listAdminProducts")
+ .serviceDetails("ProductAdmin", "ListAdminProducts", "")
+ .method(com.oracle.bmc.http.client.Method.GET)
+ .requestBuilder(ListAdminProductsRequest::builder)
+ .basePath("/20250610")
+ .appendPathParam("internal")
+ .appendPathParam("admin")
+ .appendPathParam("products")
+ .appendQueryParam("page", request.getPage())
+ .appendQueryParam("limit", request.getLimit())
+ .appendQueryParam("name", request.getName())
+ .appendQueryParam("id", request.getId())
+ .appendQueryParam("compartmentId", request.getCompartmentId())
+ .accept("application/json")
+ .appendHeader("opc-request-id", request.getOpcRequestId())
+ .handleBody(
+ com.oracle.bmc.ociproductcatalog.model.ProductCollection.class,
+ ListAdminProductsResponse.Builder::productCollection)
+ .handleResponseHeaderString(
+ "opc-request-id", ListAdminProductsResponse.Builder::opcRequestId)
+ .handleResponseHeaderString(
+ "opc-next-page", ListAdminProductsResponse.Builder::opcNextPage)
+ .callAsync(handler);
+ }
+
+ @Override
+ public java.util.concurrent.Future updateAdminProduct(
+ UpdateAdminProductRequest request,
+ final com.oracle.bmc.responses.AsyncHandler<
+ UpdateAdminProductRequest, UpdateAdminProductResponse>
+ handler) {
+
+ Validate.notBlank(request.getProductId(), "productId must not be blank");
+ Objects.requireNonNull(
+ request.getUpdateProductDetails(), "updateProductDetails is required");
+
+ return clientCall(request, UpdateAdminProductResponse::builder)
+ .logger(LOG, "updateAdminProduct")
+ .serviceDetails("ProductAdmin", "UpdateAdminProduct", "")
+ .method(com.oracle.bmc.http.client.Method.PUT)
+ .requestBuilder(UpdateAdminProductRequest::builder)
+ .basePath("/20250610")
+ .appendPathParam("internal")
+ .appendPathParam("admin")
+ .appendPathParam("product")
+ .appendPathParam(request.getProductId())
+ .accept("application/json")
+ .appendHeader("opc-request-id", request.getOpcRequestId())
+ .appendHeader("if-match", request.getIfMatch())
+ .hasBody()
+ .handleBody(
+ com.oracle.bmc.ociproductcatalog.model.Product.class,
+ UpdateAdminProductResponse.Builder::product)
+ .handleResponseHeaderString(
+ "opc-request-id", UpdateAdminProductResponse.Builder::opcRequestId)
+ .handleResponseHeaderString("etag", UpdateAdminProductResponse.Builder::etag)
+ .callAsync(handler);
+ }
+
+ /**
+ * Create a new client instance.
+ *
+ * @param authenticationDetailsProvider The authentication details (see {@link Builder#build})
+ * @deprecated Use the {@link #builder() builder} instead.
+ */
+ @Deprecated
+ public ProductAdminAsyncClient(
+ com.oracle.bmc.auth.BasicAuthenticationDetailsProvider authenticationDetailsProvider) {
+ this(builder(), authenticationDetailsProvider);
+ }
+
+ /**
+ * Create a new client instance.
+ *
+ * @param authenticationDetailsProvider The authentication details (see {@link Builder#build})
+ * @param configuration {@link Builder#configuration}
+ * @deprecated Use the {@link #builder() builder} instead.
+ */
+ @Deprecated
+ public ProductAdminAsyncClient(
+ com.oracle.bmc.auth.BasicAuthenticationDetailsProvider authenticationDetailsProvider,
+ com.oracle.bmc.ClientConfiguration configuration) {
+ this(builder().configuration(configuration), authenticationDetailsProvider);
+ }
+
+ /**
+ * Create a new client instance.
+ *
+ * @param authenticationDetailsProvider The authentication details (see {@link Builder#build})
+ * @param configuration {@link Builder#configuration}
+ * @param clientConfigurator {@link Builder#clientConfigurator}
+ * @deprecated Use the {@link #builder() builder} instead.
+ */
+ @Deprecated
+ public ProductAdminAsyncClient(
+ com.oracle.bmc.auth.BasicAuthenticationDetailsProvider authenticationDetailsProvider,
+ com.oracle.bmc.ClientConfiguration configuration,
+ com.oracle.bmc.http.ClientConfigurator clientConfigurator) {
+ this(
+ builder().configuration(configuration).clientConfigurator(clientConfigurator),
+ authenticationDetailsProvider);
+ }
+
+ /**
+ * Create a new client instance.
+ *
+ * @param authenticationDetailsProvider The authentication details (see {@link Builder#build})
+ * @param configuration {@link Builder#configuration}
+ * @param clientConfigurator {@link Builder#clientConfigurator}
+ * @param defaultRequestSignerFactory {@link Builder#requestSignerFactory}
+ * @deprecated Use the {@link #builder() builder} instead.
+ */
+ @Deprecated
+ public ProductAdminAsyncClient(
+ com.oracle.bmc.auth.AbstractAuthenticationDetailsProvider authenticationDetailsProvider,
+ com.oracle.bmc.ClientConfiguration configuration,
+ com.oracle.bmc.http.ClientConfigurator clientConfigurator,
+ com.oracle.bmc.http.signing.RequestSignerFactory defaultRequestSignerFactory) {
+ this(
+ builder()
+ .configuration(configuration)
+ .clientConfigurator(clientConfigurator)
+ .requestSignerFactory(defaultRequestSignerFactory),
+ authenticationDetailsProvider);
+ }
+
+ /**
+ * Create a new client instance.
+ *
+ * @param authenticationDetailsProvider The authentication details (see {@link Builder#build})
+ * @param configuration {@link Builder#configuration}
+ * @param clientConfigurator {@link Builder#clientConfigurator}
+ * @param defaultRequestSignerFactory {@link Builder#requestSignerFactory}
+ * @param additionalClientConfigurators {@link Builder#additionalClientConfigurators}
+ * @deprecated Use the {@link #builder() builder} instead.
+ */
+ @Deprecated
+ public ProductAdminAsyncClient(
+ com.oracle.bmc.auth.AbstractAuthenticationDetailsProvider authenticationDetailsProvider,
+ com.oracle.bmc.ClientConfiguration configuration,
+ com.oracle.bmc.http.ClientConfigurator clientConfigurator,
+ com.oracle.bmc.http.signing.RequestSignerFactory defaultRequestSignerFactory,
+ java.util.List additionalClientConfigurators) {
+ this(
+ builder()
+ .configuration(configuration)
+ .clientConfigurator(clientConfigurator)
+ .requestSignerFactory(defaultRequestSignerFactory)
+ .additionalClientConfigurators(additionalClientConfigurators),
+ authenticationDetailsProvider);
+ }
+
+ /**
+ * Create a new client instance.
+ *
+ * @param authenticationDetailsProvider The authentication details (see {@link Builder#build})
+ * @param configuration {@link Builder#configuration}
+ * @param clientConfigurator {@link Builder#clientConfigurator}
+ * @param defaultRequestSignerFactory {@link Builder#requestSignerFactory}
+ * @param additionalClientConfigurators {@link Builder#additionalClientConfigurators}
+ * @param endpoint {@link Builder#endpoint}
+ * @deprecated Use the {@link #builder() builder} instead.
+ */
+ @Deprecated
+ public ProductAdminAsyncClient(
+ com.oracle.bmc.auth.AbstractAuthenticationDetailsProvider authenticationDetailsProvider,
+ com.oracle.bmc.ClientConfiguration configuration,
+ com.oracle.bmc.http.ClientConfigurator clientConfigurator,
+ com.oracle.bmc.http.signing.RequestSignerFactory defaultRequestSignerFactory,
+ java.util.List additionalClientConfigurators,
+ String endpoint) {
+ this(
+ builder()
+ .configuration(configuration)
+ .clientConfigurator(clientConfigurator)
+ .requestSignerFactory(defaultRequestSignerFactory)
+ .additionalClientConfigurators(additionalClientConfigurators)
+ .endpoint(endpoint),
+ authenticationDetailsProvider);
+ }
+
+ /**
+ * Create a new client instance.
+ *
+ * @param authenticationDetailsProvider The authentication details (see {@link Builder#build})
+ * @param configuration {@link Builder#configuration}
+ * @param clientConfigurator {@link Builder#clientConfigurator}
+ * @param defaultRequestSignerFactory {@link Builder#requestSignerFactory}
+ * @param additionalClientConfigurators {@link Builder#additionalClientConfigurators}
+ * @param endpoint {@link Builder#endpoint}
+ * @param signingStrategyRequestSignerFactories {@link
+ * Builder#signingStrategyRequestSignerFactories}
+ * @deprecated Use the {@link #builder() builder} instead.
+ */
+ @Deprecated
+ public ProductAdminAsyncClient(
+ com.oracle.bmc.auth.AbstractAuthenticationDetailsProvider authenticationDetailsProvider,
+ com.oracle.bmc.ClientConfiguration configuration,
+ com.oracle.bmc.http.ClientConfigurator clientConfigurator,
+ com.oracle.bmc.http.signing.RequestSignerFactory defaultRequestSignerFactory,
+ java.util.Map<
+ com.oracle.bmc.http.signing.SigningStrategy,
+ com.oracle.bmc.http.signing.RequestSignerFactory>
+ signingStrategyRequestSignerFactories,
+ java.util.List additionalClientConfigurators,
+ String endpoint) {
+ this(
+ builder()
+ .configuration(configuration)
+ .clientConfigurator(clientConfigurator)
+ .requestSignerFactory(defaultRequestSignerFactory)
+ .additionalClientConfigurators(additionalClientConfigurators)
+ .endpoint(endpoint)
+ .signingStrategyRequestSignerFactories(
+ signingStrategyRequestSignerFactories),
+ authenticationDetailsProvider);
+ }
+}
diff --git a/bmc-ociproductcatalog/src/main/java/com/oracle/bmc/ociproductcatalog/ProductAdminClient.java b/bmc-ociproductcatalog/src/main/java/com/oracle/bmc/ociproductcatalog/ProductAdminClient.java
new file mode 100644
index 00000000000..9f28a0801f6
--- /dev/null
+++ b/bmc-ociproductcatalog/src/main/java/com/oracle/bmc/ociproductcatalog/ProductAdminClient.java
@@ -0,0 +1,513 @@
+/**
+ * Copyright (c) 2016, 2026, Oracle and/or its affiliates. All rights reserved.
+ * This software is dual-licensed to you under the Universal Permissive License (UPL) 1.0 as shown at https://oss.oracle.com/licenses/upl or Apache License 2.0 as shown at http://www.apache.org/licenses/LICENSE-2.0. You may choose either license.
+ */
+package com.oracle.bmc.ociproductcatalog;
+
+import com.oracle.bmc.util.internal.Validate;
+import com.oracle.bmc.ociproductcatalog.requests.*;
+import com.oracle.bmc.ociproductcatalog.responses.*;
+import com.oracle.bmc.circuitbreaker.CircuitBreakerConfiguration;
+import com.oracle.bmc.util.CircuitBreakerUtils;
+
+import java.util.Objects;
+
+@jakarta.annotation.Generated(value = "OracleSDKGenerator", comments = "API Version: 20250610")
+public class ProductAdminClient extends com.oracle.bmc.http.internal.BaseSyncClient
+ implements ProductAdmin {
+ /** Service instance for ProductAdmin. */
+ public static final com.oracle.bmc.Service SERVICE =
+ com.oracle.bmc.Services.serviceBuilder()
+ .serviceName(ProductAdminClient.class.getName())
+ .serviceEndpointPrefix("")
+ .serviceEndpointTemplate(
+ "https://cp.product-catalog.{region}.oci.{secondLevelDomain}")
+ .build();
+
+ private static final org.slf4j.Logger LOG =
+ org.slf4j.LoggerFactory.getLogger(ProductAdminClient.class);
+
+ private final ProductAdminWaiters waiters;
+
+ private final ProductAdminPaginators paginators;
+
+ ProductAdminClient(
+ com.oracle.bmc.common.ClientBuilderBase, ?> builder,
+ com.oracle.bmc.auth.AbstractAuthenticationDetailsProvider authenticationDetailsProvider,
+ java.util.concurrent.ExecutorService executorService) {
+ super(
+ builder,
+ authenticationDetailsProvider,
+ CircuitBreakerUtils.DEFAULT_CIRCUIT_BREAKER_CONFIGURATION);
+
+ if (executorService == null) {
+ // up to 50 (core) threads, time out after 60s idle, all daemon
+ java.util.concurrent.ThreadPoolExecutor threadPoolExecutor =
+ new java.util.concurrent.ThreadPoolExecutor(
+ 50,
+ 50,
+ 60L,
+ java.util.concurrent.TimeUnit.SECONDS,
+ new java.util.concurrent.LinkedBlockingQueue(),
+ com.oracle.bmc.internal.ClientThreadFactory.builder()
+ .isDaemon(true)
+ .nameFormat("ProductAdmin-waiters-%d")
+ .build());
+ threadPoolExecutor.allowCoreThreadTimeOut(true);
+
+ executorService = threadPoolExecutor;
+ }
+ this.waiters = new ProductAdminWaiters(executorService, this);
+
+ this.paginators = new ProductAdminPaginators(this);
+ }
+
+ /**
+ * Create a builder for this client.
+ *
+ * @return builder
+ */
+ public static Builder builder() {
+ return new Builder(SERVICE);
+ }
+
+ /**
+ * Builder class for this client. The "authenticationDetailsProvider" is required and must be
+ * passed to the {@link #build(AbstractAuthenticationDetailsProvider)} method.
+ */
+ public static class Builder
+ extends com.oracle.bmc.common.RegionalClientBuilder {
+ private java.util.concurrent.ExecutorService executorService;
+
+ private Builder(com.oracle.bmc.Service service) {
+ super(service);
+ final String packageName = "ociproductcatalog";
+ com.oracle.bmc.internal.DeveloperToolConfiguration
+ .throwDisabledServiceExceptionIfAppropriate(packageName);
+ requestSignerFactory =
+ new com.oracle.bmc.http.signing.internal.DefaultRequestSignerFactory(
+ com.oracle.bmc.http.signing.SigningStrategy.STANDARD);
+ }
+
+ /**
+ * Set the ExecutorService for the client to be created.
+ *
+ * @param executorService executorService
+ * @return this builder
+ */
+ public Builder executorService(java.util.concurrent.ExecutorService executorService) {
+ this.executorService = executorService;
+ return this;
+ }
+
+ /**
+ * Build the client.
+ *
+ * @param authenticationDetailsProvider authentication details provider
+ * @return the client
+ */
+ public ProductAdminClient build(
+ @jakarta.annotation.Nonnull
+ com.oracle.bmc.auth.AbstractAuthenticationDetailsProvider
+ authenticationDetailsProvider) {
+ return new ProductAdminClient(this, authenticationDetailsProvider, executorService);
+ }
+ }
+
+ @Override
+ public void setRegion(com.oracle.bmc.Region region) {
+ super.setRegion(region);
+ }
+
+ @Override
+ public void setRegion(String regionId) {
+ super.setRegion(regionId);
+ }
+
+ @Override
+ public ChangeAdminProductCompartmentResponse changeAdminProductCompartment(
+ ChangeAdminProductCompartmentRequest request) {
+
+ Validate.notBlank(request.getProductId(), "productId must not be blank");
+ Objects.requireNonNull(
+ request.getChangeProductCompartmentDetails(),
+ "changeProductCompartmentDetails is required");
+
+ return clientCall(request, ChangeAdminProductCompartmentResponse::builder)
+ .logger(LOG, "changeAdminProductCompartment")
+ .serviceDetails("ProductAdmin", "ChangeAdminProductCompartment", "")
+ .method(com.oracle.bmc.http.client.Method.POST)
+ .requestBuilder(ChangeAdminProductCompartmentRequest::builder)
+ .basePath("/20250610")
+ .appendPathParam("internal")
+ .appendPathParam("admin")
+ .appendPathParam("product")
+ .appendPathParam(request.getProductId())
+ .appendPathParam("actions")
+ .appendPathParam("changeCompartment")
+ .accept("application/json")
+ .appendHeader("opc-request-id", request.getOpcRequestId())
+ .appendHeader("opc-retry-token", request.getOpcRetryToken())
+ .appendHeader("if-match", request.getIfMatch())
+ .operationUsesDefaultRetries()
+ .hasBody()
+ .handleResponseHeaderString(
+ "opc-request-id",
+ ChangeAdminProductCompartmentResponse.Builder::opcRequestId)
+ .callSync();
+ }
+
+ @Override
+ public CreateAdminProductResponse createAdminProduct(CreateAdminProductRequest request) {
+ Objects.requireNonNull(
+ request.getCreateProductDetails(), "createProductDetails is required");
+
+ return clientCall(request, CreateAdminProductResponse::builder)
+ .logger(LOG, "createAdminProduct")
+ .serviceDetails("ProductAdmin", "CreateAdminProduct", "")
+ .method(com.oracle.bmc.http.client.Method.POST)
+ .requestBuilder(CreateAdminProductRequest::builder)
+ .basePath("/20250610")
+ .appendPathParam("internal")
+ .appendPathParam("admin")
+ .appendPathParam("product")
+ .accept("application/json")
+ .appendHeader("opc-retry-token", request.getOpcRetryToken())
+ .appendHeader("opc-request-id", request.getOpcRequestId())
+ .operationUsesDefaultRetries()
+ .hasBody()
+ .handleBody(
+ com.oracle.bmc.ociproductcatalog.model.Product.class,
+ CreateAdminProductResponse.Builder::product)
+ .handleResponseHeaderString(
+ "opc-request-id", CreateAdminProductResponse.Builder::opcRequestId)
+ .handleResponseHeaderString("etag", CreateAdminProductResponse.Builder::etag)
+ .callSync();
+ }
+
+ @Override
+ public DeleteAdminProductResponse deleteAdminProduct(DeleteAdminProductRequest request) {
+
+ Validate.notBlank(request.getProductId(), "productId must not be blank");
+
+ return clientCall(request, DeleteAdminProductResponse::builder)
+ .logger(LOG, "deleteAdminProduct")
+ .serviceDetails("ProductAdmin", "DeleteAdminProduct", "")
+ .method(com.oracle.bmc.http.client.Method.DELETE)
+ .requestBuilder(DeleteAdminProductRequest::builder)
+ .basePath("/20250610")
+ .appendPathParam("internal")
+ .appendPathParam("admin")
+ .appendPathParam("product")
+ .appendPathParam(request.getProductId())
+ .accept("application/json")
+ .appendHeader("opc-request-id", request.getOpcRequestId())
+ .appendHeader("if-match", request.getIfMatch())
+ .operationUsesDefaultRetries()
+ .handleResponseHeaderString(
+ "opc-request-id", DeleteAdminProductResponse.Builder::opcRequestId)
+ .callSync();
+ }
+
+ @Override
+ public GetAdminProductResponse getAdminProduct(GetAdminProductRequest request) {
+
+ Validate.notBlank(request.getProductId(), "productId must not be blank");
+
+ return clientCall(request, GetAdminProductResponse::builder)
+ .logger(LOG, "getAdminProduct")
+ .serviceDetails("ProductAdmin", "GetAdminProduct", "")
+ .method(com.oracle.bmc.http.client.Method.GET)
+ .requestBuilder(GetAdminProductRequest::builder)
+ .basePath("/20250610")
+ .appendPathParam("internal")
+ .appendPathParam("admin")
+ .appendPathParam("product")
+ .appendPathParam(request.getProductId())
+ .accept("application/json")
+ .appendHeader("opc-request-id", request.getOpcRequestId())
+ .operationUsesDefaultRetries()
+ .handleBody(
+ com.oracle.bmc.ociproductcatalog.model.AdminProduct.class,
+ GetAdminProductResponse.Builder::adminProduct)
+ .handleResponseHeaderString(
+ "opc-request-id", GetAdminProductResponse.Builder::opcRequestId)
+ .handleResponseHeaderString("etag", GetAdminProductResponse.Builder::etag)
+ .callSync();
+ }
+
+ @Override
+ public ListAdminProductsResponse listAdminProducts(ListAdminProductsRequest request) {
+
+ return clientCall(request, ListAdminProductsResponse::builder)
+ .logger(LOG, "listAdminProducts")
+ .serviceDetails("ProductAdmin", "ListAdminProducts", "")
+ .method(com.oracle.bmc.http.client.Method.GET)
+ .requestBuilder(ListAdminProductsRequest::builder)
+ .basePath("/20250610")
+ .appendPathParam("internal")
+ .appendPathParam("admin")
+ .appendPathParam("products")
+ .appendQueryParam("page", request.getPage())
+ .appendQueryParam("limit", request.getLimit())
+ .appendQueryParam("name", request.getName())
+ .appendQueryParam("id", request.getId())
+ .appendQueryParam("compartmentId", request.getCompartmentId())
+ .accept("application/json")
+ .appendHeader("opc-request-id", request.getOpcRequestId())
+ .operationUsesDefaultRetries()
+ .handleBody(
+ com.oracle.bmc.ociproductcatalog.model.ProductCollection.class,
+ ListAdminProductsResponse.Builder::productCollection)
+ .handleResponseHeaderString(
+ "opc-request-id", ListAdminProductsResponse.Builder::opcRequestId)
+ .handleResponseHeaderString(
+ "opc-next-page", ListAdminProductsResponse.Builder::opcNextPage)
+ .callSync();
+ }
+
+ @Override
+ public UpdateAdminProductResponse updateAdminProduct(UpdateAdminProductRequest request) {
+
+ Validate.notBlank(request.getProductId(), "productId must not be blank");
+ Objects.requireNonNull(
+ request.getUpdateProductDetails(), "updateProductDetails is required");
+
+ return clientCall(request, UpdateAdminProductResponse::builder)
+ .logger(LOG, "updateAdminProduct")
+ .serviceDetails("ProductAdmin", "UpdateAdminProduct", "")
+ .method(com.oracle.bmc.http.client.Method.PUT)
+ .requestBuilder(UpdateAdminProductRequest::builder)
+ .basePath("/20250610")
+ .appendPathParam("internal")
+ .appendPathParam("admin")
+ .appendPathParam("product")
+ .appendPathParam(request.getProductId())
+ .accept("application/json")
+ .appendHeader("opc-request-id", request.getOpcRequestId())
+ .appendHeader("if-match", request.getIfMatch())
+ .operationUsesDefaultRetries()
+ .hasBody()
+ .handleBody(
+ com.oracle.bmc.ociproductcatalog.model.Product.class,
+ UpdateAdminProductResponse.Builder::product)
+ .handleResponseHeaderString(
+ "opc-request-id", UpdateAdminProductResponse.Builder::opcRequestId)
+ .handleResponseHeaderString("etag", UpdateAdminProductResponse.Builder::etag)
+ .callSync();
+ }
+
+ @Override
+ public ProductAdminWaiters getWaiters() {
+ return waiters;
+ }
+
+ @Override
+ public ProductAdminPaginators getPaginators() {
+ return paginators;
+ }
+
+ /**
+ * Create a new client instance.
+ *
+ * @param authenticationDetailsProvider The authentication details (see {@link Builder#build})
+ * @deprecated Use the {@link #builder() builder} instead.
+ */
+ @Deprecated
+ public ProductAdminClient(
+ com.oracle.bmc.auth.BasicAuthenticationDetailsProvider authenticationDetailsProvider) {
+ this(builder(), authenticationDetailsProvider, null);
+ }
+
+ /**
+ * Create a new client instance.
+ *
+ * @param authenticationDetailsProvider The authentication details (see {@link Builder#build})
+ * @param configuration {@link Builder#configuration}
+ * @deprecated Use the {@link #builder() builder} instead.
+ */
+ @Deprecated
+ public ProductAdminClient(
+ com.oracle.bmc.auth.BasicAuthenticationDetailsProvider authenticationDetailsProvider,
+ com.oracle.bmc.ClientConfiguration configuration) {
+ this(builder().configuration(configuration), authenticationDetailsProvider, null);
+ }
+
+ /**
+ * Create a new client instance.
+ *
+ * @param authenticationDetailsProvider The authentication details (see {@link Builder#build})
+ * @param configuration {@link Builder#configuration}
+ * @param clientConfigurator {@link Builder#clientConfigurator}
+ * @deprecated Use the {@link #builder() builder} instead.
+ */
+ @Deprecated
+ public ProductAdminClient(
+ com.oracle.bmc.auth.BasicAuthenticationDetailsProvider authenticationDetailsProvider,
+ com.oracle.bmc.ClientConfiguration configuration,
+ com.oracle.bmc.http.ClientConfigurator clientConfigurator) {
+ this(
+ builder().configuration(configuration).clientConfigurator(clientConfigurator),
+ authenticationDetailsProvider,
+ null);
+ }
+
+ /**
+ * Create a new client instance.
+ *
+ * @param authenticationDetailsProvider The authentication details (see {@link Builder#build})
+ * @param configuration {@link Builder#configuration}
+ * @param clientConfigurator {@link Builder#clientConfigurator}
+ * @param defaultRequestSignerFactory {@link Builder#requestSignerFactory}
+ * @deprecated Use the {@link #builder() builder} instead.
+ */
+ @Deprecated
+ public ProductAdminClient(
+ com.oracle.bmc.auth.AbstractAuthenticationDetailsProvider authenticationDetailsProvider,
+ com.oracle.bmc.ClientConfiguration configuration,
+ com.oracle.bmc.http.ClientConfigurator clientConfigurator,
+ com.oracle.bmc.http.signing.RequestSignerFactory defaultRequestSignerFactory) {
+ this(
+ builder()
+ .configuration(configuration)
+ .clientConfigurator(clientConfigurator)
+ .requestSignerFactory(defaultRequestSignerFactory),
+ authenticationDetailsProvider,
+ null);
+ }
+
+ /**
+ * Create a new client instance.
+ *
+ * @param authenticationDetailsProvider The authentication details (see {@link Builder#build})
+ * @param configuration {@link Builder#configuration}
+ * @param clientConfigurator {@link Builder#clientConfigurator}
+ * @param defaultRequestSignerFactory {@link Builder#requestSignerFactory}
+ * @param additionalClientConfigurators {@link Builder#additionalClientConfigurators}
+ * @deprecated Use the {@link #builder() builder} instead.
+ */
+ @Deprecated
+ public ProductAdminClient(
+ com.oracle.bmc.auth.AbstractAuthenticationDetailsProvider authenticationDetailsProvider,
+ com.oracle.bmc.ClientConfiguration configuration,
+ com.oracle.bmc.http.ClientConfigurator clientConfigurator,
+ com.oracle.bmc.http.signing.RequestSignerFactory defaultRequestSignerFactory,
+ java.util.List additionalClientConfigurators) {
+ this(
+ builder()
+ .configuration(configuration)
+ .clientConfigurator(clientConfigurator)
+ .requestSignerFactory(defaultRequestSignerFactory)
+ .additionalClientConfigurators(additionalClientConfigurators),
+ authenticationDetailsProvider,
+ null);
+ }
+
+ /**
+ * Create a new client instance.
+ *
+ * @param authenticationDetailsProvider The authentication details (see {@link Builder#build})
+ * @param configuration {@link Builder#configuration}
+ * @param clientConfigurator {@link Builder#clientConfigurator}
+ * @param defaultRequestSignerFactory {@link Builder#requestSignerFactory}
+ * @param additionalClientConfigurators {@link Builder#additionalClientConfigurators}
+ * @param endpoint {@link Builder#endpoint}
+ * @deprecated Use the {@link #builder() builder} instead.
+ */
+ @Deprecated
+ public ProductAdminClient(
+ com.oracle.bmc.auth.AbstractAuthenticationDetailsProvider authenticationDetailsProvider,
+ com.oracle.bmc.ClientConfiguration configuration,
+ com.oracle.bmc.http.ClientConfigurator clientConfigurator,
+ com.oracle.bmc.http.signing.RequestSignerFactory defaultRequestSignerFactory,
+ java.util.List additionalClientConfigurators,
+ String endpoint) {
+ this(
+ builder()
+ .configuration(configuration)
+ .clientConfigurator(clientConfigurator)
+ .requestSignerFactory(defaultRequestSignerFactory)
+ .additionalClientConfigurators(additionalClientConfigurators)
+ .endpoint(endpoint),
+ authenticationDetailsProvider,
+ null);
+ }
+
+ /**
+ * Create a new client instance.
+ *
+ * @param authenticationDetailsProvider The authentication details (see {@link Builder#build})
+ * @param configuration {@link Builder#configuration}
+ * @param clientConfigurator {@link Builder#clientConfigurator}
+ * @param defaultRequestSignerFactory {@link Builder#requestSignerFactory}
+ * @param additionalClientConfigurators {@link Builder#additionalClientConfigurators}
+ * @param endpoint {@link Builder#endpoint}
+ * @param signingStrategyRequestSignerFactories {@link
+ * Builder#signingStrategyRequestSignerFactories}
+ * @deprecated Use the {@link #builder() builder} instead.
+ */
+ @Deprecated
+ public ProductAdminClient(
+ com.oracle.bmc.auth.AbstractAuthenticationDetailsProvider authenticationDetailsProvider,
+ com.oracle.bmc.ClientConfiguration configuration,
+ com.oracle.bmc.http.ClientConfigurator clientConfigurator,
+ com.oracle.bmc.http.signing.RequestSignerFactory defaultRequestSignerFactory,
+ java.util.Map<
+ com.oracle.bmc.http.signing.SigningStrategy,
+ com.oracle.bmc.http.signing.RequestSignerFactory>
+ signingStrategyRequestSignerFactories,
+ java.util.List additionalClientConfigurators,
+ String endpoint) {
+ this(
+ builder()
+ .configuration(configuration)
+ .clientConfigurator(clientConfigurator)
+ .requestSignerFactory(defaultRequestSignerFactory)
+ .additionalClientConfigurators(additionalClientConfigurators)
+ .endpoint(endpoint)
+ .signingStrategyRequestSignerFactories(
+ signingStrategyRequestSignerFactories),
+ authenticationDetailsProvider,
+ null);
+ }
+
+ /**
+ * Create a new client instance.
+ *
+ * @param authenticationDetailsProvider The authentication details (see {@link Builder#build})
+ * @param configuration {@link Builder#configuration}
+ * @param clientConfigurator {@link Builder#clientConfigurator}
+ * @param defaultRequestSignerFactory {@link Builder#requestSignerFactory}
+ * @param additionalClientConfigurators {@link Builder#additionalClientConfigurators}
+ * @param endpoint {@link Builder#endpoint}
+ * @param signingStrategyRequestSignerFactories {@link
+ * Builder#signingStrategyRequestSignerFactories}
+ * @param executorService {@link Builder#executorService}
+ * @deprecated Use the {@link #builder() builder} instead.
+ */
+ @Deprecated
+ public ProductAdminClient(
+ com.oracle.bmc.auth.AbstractAuthenticationDetailsProvider authenticationDetailsProvider,
+ com.oracle.bmc.ClientConfiguration configuration,
+ com.oracle.bmc.http.ClientConfigurator clientConfigurator,
+ com.oracle.bmc.http.signing.RequestSignerFactory defaultRequestSignerFactory,
+ java.util.Map<
+ com.oracle.bmc.http.signing.SigningStrategy,
+ com.oracle.bmc.http.signing.RequestSignerFactory>
+ signingStrategyRequestSignerFactories,
+ java.util.List additionalClientConfigurators,
+ String endpoint,
+ java.util.concurrent.ExecutorService executorService) {
+ this(
+ builder()
+ .configuration(configuration)
+ .clientConfigurator(clientConfigurator)
+ .requestSignerFactory(defaultRequestSignerFactory)
+ .additionalClientConfigurators(additionalClientConfigurators)
+ .endpoint(endpoint)
+ .signingStrategyRequestSignerFactories(
+ signingStrategyRequestSignerFactories),
+ authenticationDetailsProvider,
+ executorService);
+ }
+}
diff --git a/bmc-ociproductcatalog/src/main/java/com/oracle/bmc/ociproductcatalog/ProductAdminPaginators.java b/bmc-ociproductcatalog/src/main/java/com/oracle/bmc/ociproductcatalog/ProductAdminPaginators.java
new file mode 100644
index 00000000000..fd92f221a35
--- /dev/null
+++ b/bmc-ociproductcatalog/src/main/java/com/oracle/bmc/ociproductcatalog/ProductAdminPaginators.java
@@ -0,0 +1,162 @@
+/**
+ * Copyright (c) 2016, 2026, Oracle and/or its affiliates. All rights reserved.
+ * This software is dual-licensed to you under the Universal Permissive License (UPL) 1.0 as shown at https://oss.oracle.com/licenses/upl or Apache License 2.0 as shown at http://www.apache.org/licenses/LICENSE-2.0. You may choose either license.
+ */
+package com.oracle.bmc.ociproductcatalog;
+
+import com.oracle.bmc.ociproductcatalog.requests.*;
+import com.oracle.bmc.ociproductcatalog.responses.*;
+
+/**
+ * Collection of helper methods that can be used to provide an {@link java.lang.Iterable} interface
+ * to any list operations of ProductAdmin where multiple pages of data may be fetched. Two styles of
+ * iteration are supported:
+ *
+ *
+ * - Iterating over the Response objects returned by the list operation. These are referred to
+ * as ResponseIterators, and the methods are suffixed with ResponseIterator. For example:
+ * listUsersResponseIterator
+ *
- Iterating over the resources/records being listed. These are referred to as
+ * RecordIterators, and the methods are suffixed with RecordIterator. For example:
+ * listUsersRecordIterator
+ *
+ *
+ * These iterables abstract away the need to write code to manually handle pagination via looping
+ * and using the page tokens. They will automatically fetch more data from the service when
+ * required.
+ *
+ * As an example, if we were using the ListUsers operation in IdentityService, then the {@link
+ * java.lang.Iterable} returned by calling a ResponseIterator method would iterate over the
+ * ListUsersResponse objects returned by each ListUsers call, whereas the {@link java.lang.Iterable}
+ * returned by calling a RecordIterator method would iterate over the User records and we don't have
+ * to deal with ListUsersResponse objects at all. In either case, pagination will be automatically
+ * handled so we can iterate until there are no more responses or no more resources/records
+ * available.
+ */
+@jakarta.annotation.Generated(value = "OracleSDKGenerator", comments = "API Version: 20250610")
+public class ProductAdminPaginators {
+ private final ProductAdmin client;
+
+ public ProductAdminPaginators(ProductAdmin client) {
+ this.client = client;
+ }
+
+ /**
+ * Creates a new iterable which will iterate over the responses received from the
+ * listAdminProducts operation. This iterable will fetch more data from the server as needed.
+ *
+ * @param request a request which can be sent to the service operation
+ * @return an {@link java.lang.Iterable} which can be used to iterate over the responses
+ * received from the service.
+ */
+ public Iterable listAdminProductsResponseIterator(
+ final ListAdminProductsRequest request) {
+ return new com.oracle.bmc.paginator.internal.ResponseIterable<
+ ListAdminProductsRequest.Builder,
+ ListAdminProductsRequest,
+ ListAdminProductsResponse>(
+ new java.util.function.Supplier() {
+ @Override
+ public ListAdminProductsRequest.Builder get() {
+ return ListAdminProductsRequest.builder().copy(request);
+ }
+ },
+ new java.util.function.Function() {
+ @Override
+ public String apply(ListAdminProductsResponse response) {
+ return response.getOpcNextPage();
+ }
+ },
+ new java.util.function.Function<
+ com.oracle.bmc.paginator.internal.RequestBuilderAndToken<
+ ListAdminProductsRequest.Builder>,
+ ListAdminProductsRequest>() {
+ @Override
+ public ListAdminProductsRequest apply(
+ com.oracle.bmc.paginator.internal.RequestBuilderAndToken<
+ ListAdminProductsRequest.Builder>
+ input) {
+ if (input.getNextPageToken() == null) {
+ return input.getRequestBuilder().build();
+ } else {
+ return input.getRequestBuilder()
+ .page(input.getNextPageToken().orElse(null))
+ .build();
+ }
+ }
+ },
+ new java.util.function.Function<
+ ListAdminProductsRequest, ListAdminProductsResponse>() {
+ @Override
+ public ListAdminProductsResponse apply(ListAdminProductsRequest request) {
+ return client.listAdminProducts(request);
+ }
+ });
+ }
+
+ /**
+ * Creates a new iterable which will iterate over the {@link
+ * com.oracle.bmc.ociproductcatalog.model.ProductSummary} objects contained in responses from
+ * the listAdminProducts operation. This iterable will fetch more data from the server as
+ * needed.
+ *
+ * @param request a request which can be sent to the service operation
+ * @return an {@link java.lang.Iterable} which can be used to iterate over the {@link
+ * com.oracle.bmc.ociproductcatalog.model.ProductSummary} objects contained in responses
+ * received from the service.
+ */
+ public Iterable
+ listAdminProductsRecordIterator(final ListAdminProductsRequest request) {
+ return new com.oracle.bmc.paginator.internal.ResponseRecordIterable<
+ ListAdminProductsRequest.Builder,
+ ListAdminProductsRequest,
+ ListAdminProductsResponse,
+ com.oracle.bmc.ociproductcatalog.model.ProductSummary>(
+ new java.util.function.Supplier() {
+ @Override
+ public ListAdminProductsRequest.Builder get() {
+ return ListAdminProductsRequest.builder().copy(request);
+ }
+ },
+ new java.util.function.Function() {
+ @Override
+ public String apply(ListAdminProductsResponse response) {
+ return response.getOpcNextPage();
+ }
+ },
+ new java.util.function.Function<
+ com.oracle.bmc.paginator.internal.RequestBuilderAndToken<
+ ListAdminProductsRequest.Builder>,
+ ListAdminProductsRequest>() {
+ @Override
+ public ListAdminProductsRequest apply(
+ com.oracle.bmc.paginator.internal.RequestBuilderAndToken<
+ ListAdminProductsRequest.Builder>
+ input) {
+ if (input.getNextPageToken() == null) {
+ return input.getRequestBuilder().build();
+ } else {
+ return input.getRequestBuilder()
+ .page(input.getNextPageToken().orElse(null))
+ .build();
+ }
+ }
+ },
+ new java.util.function.Function<
+ ListAdminProductsRequest, ListAdminProductsResponse>() {
+ @Override
+ public ListAdminProductsResponse apply(ListAdminProductsRequest request) {
+ return client.listAdminProducts(request);
+ }
+ },
+ new java.util.function.Function<
+ ListAdminProductsResponse,
+ java.util.List>() {
+ @Override
+ public java.util.List
+ apply(ListAdminProductsResponse response) {
+ return response.getProductCollection().getItems();
+ }
+ });
+ }
+}
diff --git a/bmc-ociproductcatalog/src/main/java/com/oracle/bmc/ociproductcatalog/ProductAdminWaiters.java b/bmc-ociproductcatalog/src/main/java/com/oracle/bmc/ociproductcatalog/ProductAdminWaiters.java
new file mode 100644
index 00000000000..37a598fa3c0
--- /dev/null
+++ b/bmc-ociproductcatalog/src/main/java/com/oracle/bmc/ociproductcatalog/ProductAdminWaiters.java
@@ -0,0 +1,133 @@
+/**
+ * Copyright (c) 2016, 2026, Oracle and/or its affiliates. All rights reserved.
+ * This software is dual-licensed to you under the Universal Permissive License (UPL) 1.0 as shown at https://oss.oracle.com/licenses/upl or Apache License 2.0 as shown at http://www.apache.org/licenses/LICENSE-2.0. You may choose either license.
+ */
+package com.oracle.bmc.ociproductcatalog;
+
+import com.oracle.bmc.ociproductcatalog.requests.*;
+import com.oracle.bmc.ociproductcatalog.responses.*;
+
+/**
+ * Collection of helper methods to produce {@link com.oracle.bmc.waiter.Waiter}s for different
+ * resources of ProductAdmin.
+ *
+ * The default configuration used is defined by {@link
+ * com.oracle.bmc.waiter.Waiters.Waiters#DEFAULT_POLLING_WAITER}.
+ */
+@jakarta.annotation.Generated(value = "OracleSDKGenerator", comments = "API Version: 20250610")
+public class ProductAdminWaiters {
+ private final java.util.concurrent.ExecutorService executorService;
+ private final ProductAdmin client;
+
+ public ProductAdminWaiters(
+ java.util.concurrent.ExecutorService executorService, ProductAdmin client) {
+ this.executorService = executorService;
+ this.client = client;
+ }
+
+ /**
+ * Creates a new {@link com.oracle.bmc.waiter.Waiter} using the default configuration.
+ *
+ * @param request the request to send
+ * @param targetStates the desired states to wait for. If multiple states are provided then the
+ * waiter will return once the resource reaches any of the provided states
+ * @return a new {@code Waiter} instance
+ */
+ public com.oracle.bmc.waiter.Waiter
+ forAdminProduct(
+ GetAdminProductRequest request,
+ com.oracle.bmc.ociproductcatalog.model.AdminProduct.LifecycleState...
+ targetStates) {
+ com.oracle.bmc.util.internal.Validate.notEmpty(
+ targetStates, "At least one targetState must be provided");
+ com.oracle.bmc.util.internal.Validate.noNullElements(
+ targetStates, "Null targetState values are not permitted");
+
+ return forAdminProduct(
+ com.oracle.bmc.waiter.Waiters.DEFAULT_POLLING_WAITER, request, targetStates);
+ }
+
+ /**
+ * Creates a new {@link com.oracle.bmc.waiter.Waiter} using the provided configuration.
+ *
+ * @param request the request to send
+ * @param targetState the desired state to wait for
+ * @param terminationStrategy the {@link com.oracle.bmc.waiter.TerminationStrategy} to use
+ * @param delayStrategy the {@link com.oracle.bmc.waiter.DelayStrategy} to use
+ * @return a new {@code com.oracle.bmc.waiter.Waiter} instance
+ */
+ public com.oracle.bmc.waiter.Waiter
+ forAdminProduct(
+ GetAdminProductRequest request,
+ com.oracle.bmc.ociproductcatalog.model.AdminProduct.LifecycleState targetState,
+ com.oracle.bmc.waiter.TerminationStrategy terminationStrategy,
+ com.oracle.bmc.waiter.DelayStrategy delayStrategy) {
+ com.oracle.bmc.util.internal.Validate.notNull(
+ targetState, "The targetState cannot be null");
+
+ return forAdminProduct(
+ com.oracle.bmc.waiter.Waiters.newWaiter(terminationStrategy, delayStrategy),
+ request,
+ targetState);
+ }
+
+ /**
+ * Creates a new {@link com.oracle.bmc.waiter.Waiter} using the provided configuration.
+ *
+ * @param request the request to send
+ * @param terminationStrategy the {@link com.oracle.bmc.waiter.TerminationStrategy} to use
+ * @param delayStrategy the {@link com.oracle.bmc.waiter.DelayStrategy} to use
+ * @param targetStates the desired states to wait for. The waiter will return once the resource
+ * reaches any of the provided states
+ * @return a new {@code com.oracle.bmc.waiter.Waiter} instance
+ */
+ public com.oracle.bmc.waiter.Waiter
+ forAdminProduct(
+ GetAdminProductRequest request,
+ com.oracle.bmc.waiter.TerminationStrategy terminationStrategy,
+ com.oracle.bmc.waiter.DelayStrategy delayStrategy,
+ com.oracle.bmc.ociproductcatalog.model.AdminProduct.LifecycleState...
+ targetStates) {
+ com.oracle.bmc.util.internal.Validate.notEmpty(
+ targetStates, "At least one target state must be provided");
+ com.oracle.bmc.util.internal.Validate.noNullElements(
+ targetStates, "Null target states are not permitted");
+
+ return forAdminProduct(
+ com.oracle.bmc.waiter.Waiters.newWaiter(terminationStrategy, delayStrategy),
+ request,
+ targetStates);
+ }
+
+ // Helper method to create a new Waiter for AdminProduct.
+ private com.oracle.bmc.waiter.Waiter
+ forAdminProduct(
+ com.oracle.bmc.waiter.BmcGenericWaiter waiter,
+ final GetAdminProductRequest request,
+ final com.oracle.bmc.ociproductcatalog.model.AdminProduct.LifecycleState...
+ targetStates) {
+ final java.util.Set
+ targetStatesSet = new java.util.HashSet<>(java.util.Arrays.asList(targetStates));
+
+ return new com.oracle.bmc.waiter.internal.SimpleWaiterImpl<>(
+ executorService,
+ waiter.toCallable(
+ () -> request,
+ new java.util.function.Function<
+ GetAdminProductRequest, GetAdminProductResponse>() {
+ @Override
+ public GetAdminProductResponse apply(GetAdminProductRequest request) {
+ return client.getAdminProduct(request);
+ }
+ },
+ new java.util.function.Predicate() {
+ @Override
+ public boolean test(GetAdminProductResponse response) {
+ return targetStatesSet.contains(
+ response.getAdminProduct().getLifecycleState());
+ }
+ },
+ false),
+ request);
+ }
+}
diff --git a/bmc-ociproductcatalog/src/main/java/com/oracle/bmc/ociproductcatalog/ProductAsync.java b/bmc-ociproductcatalog/src/main/java/com/oracle/bmc/ociproductcatalog/ProductAsync.java
new file mode 100644
index 00000000000..6891a62734e
--- /dev/null
+++ b/bmc-ociproductcatalog/src/main/java/com/oracle/bmc/ociproductcatalog/ProductAsync.java
@@ -0,0 +1,105 @@
+/**
+ * Copyright (c) 2016, 2026, Oracle and/or its affiliates. All rights reserved.
+ * This software is dual-licensed to you under the Universal Permissive License (UPL) 1.0 as shown at https://oss.oracle.com/licenses/upl or Apache License 2.0 as shown at http://www.apache.org/licenses/LICENSE-2.0. You may choose either license.
+ */
+package com.oracle.bmc.ociproductcatalog;
+
+import com.oracle.bmc.ociproductcatalog.requests.*;
+import com.oracle.bmc.ociproductcatalog.responses.*;
+
+/** Apis to manage the products used by the OCI service teams */
+@jakarta.annotation.Generated(value = "OracleSDKGenerator", comments = "API Version: 20250610")
+public interface ProductAsync extends AutoCloseable {
+
+ /** Rebuilds the client from scratch. Useful to refresh certificates. */
+ void refreshClient();
+
+ /**
+ * Sets the endpoint to call (ex, https://www.example.com).
+ *
+ * @param endpoint The endpoint of the serice.
+ */
+ void setEndpoint(String endpoint);
+
+ /** Gets the set endpoint for REST call (ex, https://www.example.com) */
+ String getEndpoint();
+
+ /**
+ * Sets the region to call (ex, Region.US_PHOENIX_1).
+ *
+ * Note, this will call {@link #setEndpoint(String) setEndpoint} after resolving the
+ * endpoint. If the service is not available in this region, however, an
+ * IllegalArgumentException will be raised.
+ *
+ * @param region The region of the service.
+ */
+ void setRegion(com.oracle.bmc.Region region);
+
+ /**
+ * Sets the region to call (ex, 'us-phoenix-1').
+ *
+ *
Note, this will first try to map the region ID to a known Region and call {@link
+ * #setRegion(Region) setRegion}.
+ *
+ *
If no known Region could be determined, it will create an endpoint based on the default
+ * endpoint format ({@link com.oracle.bmc.Region#formatDefaultRegionEndpoint(Service, String)}
+ * and then call {@link #setEndpoint(String) setEndpoint}.
+ *
+ * @param regionId The public region ID.
+ */
+ void setRegion(String regionId);
+
+ /**
+ * Determines whether realm specific endpoint should be used or not. Set
+ * realmSpecificEndpointTemplateEnabled to "true" if the user wants to enable use of realm
+ * specific endpoint template, otherwise set it to "false"
+ *
+ * @param realmSpecificEndpointTemplateEnabled flag to enable the use of realm specific endpoint
+ * template
+ */
+ void useRealmSpecificEndpointTemplate(boolean realmSpecificEndpointTemplateEnabled);
+
+ /**
+ * Activate the target Product. Change lifecycleState from INACTIVE to ACTIVE.
+ *
+ * @param request The request object containing the details to send
+ * @param handler The request handler to invoke upon completion, may be null.
+ * @return A Future that can be used to get the response if no AsyncHandler was provided. Note,
+ * if you provide an AsyncHandler and use the Future, some types of responses (like
+ * java.io.InputStream) may not be able to be read in both places as the underlying stream
+ * may only be consumed once.
+ */
+ java.util.concurrent.Future activateProduct(
+ ActivateProductRequest request,
+ com.oracle.bmc.responses.AsyncHandler
+ handler);
+
+ /**
+ * Get product by ID
+ *
+ * @param request The request object containing the details to send
+ * @param handler The request handler to invoke upon completion, may be null.
+ * @return A Future that can be used to get the response if no AsyncHandler was provided. Note,
+ * if you provide an AsyncHandler and use the Future, some types of responses (like
+ * java.io.InputStream) may not be able to be read in both places as the underlying stream
+ * may only be consumed once.
+ */
+ java.util.concurrent.Future getProduct(
+ GetProductRequest request,
+ com.oracle.bmc.responses.AsyncHandler handler);
+
+ /**
+ * List products
+ *
+ * @param request The request object containing the details to send
+ * @param handler The request handler to invoke upon completion, may be null.
+ * @return A Future that can be used to get the response if no AsyncHandler was provided. Note,
+ * if you provide an AsyncHandler and use the Future, some types of responses (like
+ * java.io.InputStream) may not be able to be read in both places as the underlying stream
+ * may only be consumed once.
+ */
+ java.util.concurrent.Future listProducts(
+ ListProductsRequest request,
+ com.oracle.bmc.responses.AsyncHandler
+ handler);
+}
diff --git a/bmc-ociproductcatalog/src/main/java/com/oracle/bmc/ociproductcatalog/ProductAsyncClient.java b/bmc-ociproductcatalog/src/main/java/com/oracle/bmc/ociproductcatalog/ProductAsyncClient.java
new file mode 100644
index 00000000000..7c9a7fc2cfb
--- /dev/null
+++ b/bmc-ociproductcatalog/src/main/java/com/oracle/bmc/ociproductcatalog/ProductAsyncClient.java
@@ -0,0 +1,349 @@
+/**
+ * Copyright (c) 2016, 2026, Oracle and/or its affiliates. All rights reserved.
+ * This software is dual-licensed to you under the Universal Permissive License (UPL) 1.0 as shown at https://oss.oracle.com/licenses/upl or Apache License 2.0 as shown at http://www.apache.org/licenses/LICENSE-2.0. You may choose either license.
+ */
+package com.oracle.bmc.ociproductcatalog;
+
+import com.oracle.bmc.util.internal.Validate;
+import com.oracle.bmc.ociproductcatalog.requests.*;
+import com.oracle.bmc.ociproductcatalog.responses.*;
+
+import java.util.Objects;
+
+/**
+ * Async client implementation for Product service.
+ * There are two ways to use async client: 1. Use AsyncHandler: using AsyncHandler, if the response
+ * to the call is an {@link java.io.InputStream}, like getObject Api in object storage service,
+ * developers need to process the stream in AsyncHandler, and not anywhere else, because the stream
+ * will be closed right after the AsyncHandler is invoked.
+ * 2. Use Java Future: using Java Future, developers need to close the stream after they are done
+ * with the Java Future.
+ * Accessing the result should be done in a mutually exclusive manner, either through the Future or
+ * the AsyncHandler, but not both. If the Future is used, the caller should pass in null as the
+ * AsyncHandler. If the AsyncHandler is used, it is still safe to use the Future to determine
+ * whether or not the request was completed via Future.isDone/isCancelled.
+ * Please refer to
+ * https://github.com/oracle/oci-java-sdk/blob/master/bmc-examples/src/main/java/ResteasyClientWithObjectStorageExample.java
+ */
+@jakarta.annotation.Generated(value = "OracleSDKGenerator", comments = "API Version: 20250610")
+public class ProductAsyncClient extends com.oracle.bmc.http.internal.BaseAsyncClient
+ implements ProductAsync {
+ /** Service instance for Product. */
+ public static final com.oracle.bmc.Service SERVICE =
+ com.oracle.bmc.Services.serviceBuilder()
+ .serviceName(ProductClient.class.getName())
+ .serviceEndpointPrefix("")
+ .serviceEndpointTemplate(
+ "https://cp.product-catalog.{region}.oci.{secondLevelDomain}")
+ .build();
+
+ private static final org.slf4j.Logger LOG =
+ org.slf4j.LoggerFactory.getLogger(ProductAsyncClient.class);
+
+ ProductAsyncClient(
+ com.oracle.bmc.common.ClientBuilderBase, ?> builder,
+ com.oracle.bmc.auth.AbstractAuthenticationDetailsProvider
+ authenticationDetailsProvider) {
+ super(builder, authenticationDetailsProvider);
+ }
+
+ /**
+ * Create a builder for this client.
+ *
+ * @return builder
+ */
+ public static Builder builder() {
+ return new Builder(SERVICE);
+ }
+
+ /**
+ * Builder class for this client. The "authenticationDetailsProvider" is required and must be
+ * passed to the {@link #build(AbstractAuthenticationDetailsProvider)} method.
+ */
+ public static class Builder
+ extends com.oracle.bmc.common.RegionalClientBuilder {
+ private Builder(com.oracle.bmc.Service service) {
+ super(service);
+ final String packageName = "ociproductcatalog";
+ com.oracle.bmc.internal.DeveloperToolConfiguration
+ .throwDisabledServiceExceptionIfAppropriate(packageName);
+ requestSignerFactory =
+ new com.oracle.bmc.http.signing.internal.DefaultRequestSignerFactory(
+ com.oracle.bmc.http.signing.SigningStrategy.STANDARD);
+ }
+
+ /**
+ * Build the client.
+ *
+ * @param authenticationDetailsProvider authentication details provider
+ * @return the client
+ */
+ public ProductAsyncClient build(
+ @jakarta.annotation.Nonnull
+ com.oracle.bmc.auth.AbstractAuthenticationDetailsProvider
+ authenticationDetailsProvider) {
+ return new ProductAsyncClient(this, authenticationDetailsProvider);
+ }
+ }
+
+ @Override
+ public void setRegion(com.oracle.bmc.Region region) {
+ super.setRegion(region);
+ }
+
+ @Override
+ public void setRegion(String regionId) {
+ super.setRegion(regionId);
+ }
+
+ @Override
+ public java.util.concurrent.Future activateProduct(
+ ActivateProductRequest request,
+ final com.oracle.bmc.responses.AsyncHandler<
+ ActivateProductRequest, ActivateProductResponse>
+ handler) {
+
+ Validate.notBlank(request.getProductId(), "productId must not be blank");
+
+ return clientCall(request, ActivateProductResponse::builder)
+ .logger(LOG, "activateProduct")
+ .serviceDetails("Product", "ActivateProduct", "")
+ .method(com.oracle.bmc.http.client.Method.POST)
+ .requestBuilder(ActivateProductRequest::builder)
+ .basePath("/20250610")
+ .appendPathParam("product")
+ .appendPathParam(request.getProductId())
+ .appendPathParam("actions")
+ .appendPathParam("activate")
+ .accept("application/json")
+ .appendHeader("opc-request-id", request.getOpcRequestId())
+ .appendHeader("opc-retry-token", request.getOpcRetryToken())
+ .appendHeader("if-match", request.getIfMatch())
+ .handleBody(
+ com.oracle.bmc.ociproductcatalog.model.Product.class,
+ ActivateProductResponse.Builder::product)
+ .handleResponseHeaderString(
+ "opc-request-id", ActivateProductResponse.Builder::opcRequestId)
+ .handleResponseHeaderString("etag", ActivateProductResponse.Builder::etag)
+ .callAsync(handler);
+ }
+
+ @Override
+ public java.util.concurrent.Future getProduct(
+ GetProductRequest request,
+ final com.oracle.bmc.responses.AsyncHandler
+ handler) {
+
+ Validate.notBlank(request.getProductId(), "productId must not be blank");
+
+ return clientCall(request, GetProductResponse::builder)
+ .logger(LOG, "getProduct")
+ .serviceDetails("Product", "GetProduct", "")
+ .method(com.oracle.bmc.http.client.Method.GET)
+ .requestBuilder(GetProductRequest::builder)
+ .basePath("/20250610")
+ .appendPathParam("product")
+ .appendPathParam(request.getProductId())
+ .accept("application/json")
+ .appendHeader("opc-request-id", request.getOpcRequestId())
+ .handleBody(
+ com.oracle.bmc.ociproductcatalog.model.Product.class,
+ GetProductResponse.Builder::product)
+ .handleResponseHeaderString(
+ "opc-request-id", GetProductResponse.Builder::opcRequestId)
+ .handleResponseHeaderString("etag", GetProductResponse.Builder::etag)
+ .callAsync(handler);
+ }
+
+ @Override
+ public java.util.concurrent.Future listProducts(
+ ListProductsRequest request,
+ final com.oracle.bmc.responses.AsyncHandler
+ handler) {
+
+ return clientCall(request, ListProductsResponse::builder)
+ .logger(LOG, "listProducts")
+ .serviceDetails("Product", "ListProducts", "")
+ .method(com.oracle.bmc.http.client.Method.GET)
+ .requestBuilder(ListProductsRequest::builder)
+ .basePath("/20250610")
+ .appendPathParam("products")
+ .appendQueryParam("skusContains", request.getSkusContains())
+ .appendQueryParam("name", request.getName())
+ .appendQueryParam("lifecycleState", request.getLifecycleState())
+ .appendQueryParam(
+ "timeReadyGreaterThanOrEqualTo", request.getTimeReadyGreaterThanOrEqualTo())
+ .appendQueryParam("page", request.getPage())
+ .appendQueryParam("limit", request.getLimit())
+ .appendQueryParam("id", request.getId())
+ .accept("application/json")
+ .appendHeader("opc-request-id", request.getOpcRequestId())
+ .handleBody(
+ com.oracle.bmc.ociproductcatalog.model.ProductCollection.class,
+ ListProductsResponse.Builder::productCollection)
+ .handleResponseHeaderString(
+ "opc-request-id", ListProductsResponse.Builder::opcRequestId)
+ .handleResponseHeaderString(
+ "opc-next-page", ListProductsResponse.Builder::opcNextPage)
+ .callAsync(handler);
+ }
+
+ /**
+ * Create a new client instance.
+ *
+ * @param authenticationDetailsProvider The authentication details (see {@link Builder#build})
+ * @deprecated Use the {@link #builder() builder} instead.
+ */
+ @Deprecated
+ public ProductAsyncClient(
+ com.oracle.bmc.auth.BasicAuthenticationDetailsProvider authenticationDetailsProvider) {
+ this(builder(), authenticationDetailsProvider);
+ }
+
+ /**
+ * Create a new client instance.
+ *
+ * @param authenticationDetailsProvider The authentication details (see {@link Builder#build})
+ * @param configuration {@link Builder#configuration}
+ * @deprecated Use the {@link #builder() builder} instead.
+ */
+ @Deprecated
+ public ProductAsyncClient(
+ com.oracle.bmc.auth.BasicAuthenticationDetailsProvider authenticationDetailsProvider,
+ com.oracle.bmc.ClientConfiguration configuration) {
+ this(builder().configuration(configuration), authenticationDetailsProvider);
+ }
+
+ /**
+ * Create a new client instance.
+ *
+ * @param authenticationDetailsProvider The authentication details (see {@link Builder#build})
+ * @param configuration {@link Builder#configuration}
+ * @param clientConfigurator {@link Builder#clientConfigurator}
+ * @deprecated Use the {@link #builder() builder} instead.
+ */
+ @Deprecated
+ public ProductAsyncClient(
+ com.oracle.bmc.auth.BasicAuthenticationDetailsProvider authenticationDetailsProvider,
+ com.oracle.bmc.ClientConfiguration configuration,
+ com.oracle.bmc.http.ClientConfigurator clientConfigurator) {
+ this(
+ builder().configuration(configuration).clientConfigurator(clientConfigurator),
+ authenticationDetailsProvider);
+ }
+
+ /**
+ * Create a new client instance.
+ *
+ * @param authenticationDetailsProvider The authentication details (see {@link Builder#build})
+ * @param configuration {@link Builder#configuration}
+ * @param clientConfigurator {@link Builder#clientConfigurator}
+ * @param defaultRequestSignerFactory {@link Builder#requestSignerFactory}
+ * @deprecated Use the {@link #builder() builder} instead.
+ */
+ @Deprecated
+ public ProductAsyncClient(
+ com.oracle.bmc.auth.AbstractAuthenticationDetailsProvider authenticationDetailsProvider,
+ com.oracle.bmc.ClientConfiguration configuration,
+ com.oracle.bmc.http.ClientConfigurator clientConfigurator,
+ com.oracle.bmc.http.signing.RequestSignerFactory defaultRequestSignerFactory) {
+ this(
+ builder()
+ .configuration(configuration)
+ .clientConfigurator(clientConfigurator)
+ .requestSignerFactory(defaultRequestSignerFactory),
+ authenticationDetailsProvider);
+ }
+
+ /**
+ * Create a new client instance.
+ *
+ * @param authenticationDetailsProvider The authentication details (see {@link Builder#build})
+ * @param configuration {@link Builder#configuration}
+ * @param clientConfigurator {@link Builder#clientConfigurator}
+ * @param defaultRequestSignerFactory {@link Builder#requestSignerFactory}
+ * @param additionalClientConfigurators {@link Builder#additionalClientConfigurators}
+ * @deprecated Use the {@link #builder() builder} instead.
+ */
+ @Deprecated
+ public ProductAsyncClient(
+ com.oracle.bmc.auth.AbstractAuthenticationDetailsProvider authenticationDetailsProvider,
+ com.oracle.bmc.ClientConfiguration configuration,
+ com.oracle.bmc.http.ClientConfigurator clientConfigurator,
+ com.oracle.bmc.http.signing.RequestSignerFactory defaultRequestSignerFactory,
+ java.util.List additionalClientConfigurators) {
+ this(
+ builder()
+ .configuration(configuration)
+ .clientConfigurator(clientConfigurator)
+ .requestSignerFactory(defaultRequestSignerFactory)
+ .additionalClientConfigurators(additionalClientConfigurators),
+ authenticationDetailsProvider);
+ }
+
+ /**
+ * Create a new client instance.
+ *
+ * @param authenticationDetailsProvider The authentication details (see {@link Builder#build})
+ * @param configuration {@link Builder#configuration}
+ * @param clientConfigurator {@link Builder#clientConfigurator}
+ * @param defaultRequestSignerFactory {@link Builder#requestSignerFactory}
+ * @param additionalClientConfigurators {@link Builder#additionalClientConfigurators}
+ * @param endpoint {@link Builder#endpoint}
+ * @deprecated Use the {@link #builder() builder} instead.
+ */
+ @Deprecated
+ public ProductAsyncClient(
+ com.oracle.bmc.auth.AbstractAuthenticationDetailsProvider authenticationDetailsProvider,
+ com.oracle.bmc.ClientConfiguration configuration,
+ com.oracle.bmc.http.ClientConfigurator clientConfigurator,
+ com.oracle.bmc.http.signing.RequestSignerFactory defaultRequestSignerFactory,
+ java.util.List additionalClientConfigurators,
+ String endpoint) {
+ this(
+ builder()
+ .configuration(configuration)
+ .clientConfigurator(clientConfigurator)
+ .requestSignerFactory(defaultRequestSignerFactory)
+ .additionalClientConfigurators(additionalClientConfigurators)
+ .endpoint(endpoint),
+ authenticationDetailsProvider);
+ }
+
+ /**
+ * Create a new client instance.
+ *
+ * @param authenticationDetailsProvider The authentication details (see {@link Builder#build})
+ * @param configuration {@link Builder#configuration}
+ * @param clientConfigurator {@link Builder#clientConfigurator}
+ * @param defaultRequestSignerFactory {@link Builder#requestSignerFactory}
+ * @param additionalClientConfigurators {@link Builder#additionalClientConfigurators}
+ * @param endpoint {@link Builder#endpoint}
+ * @param signingStrategyRequestSignerFactories {@link
+ * Builder#signingStrategyRequestSignerFactories}
+ * @deprecated Use the {@link #builder() builder} instead.
+ */
+ @Deprecated
+ public ProductAsyncClient(
+ com.oracle.bmc.auth.AbstractAuthenticationDetailsProvider authenticationDetailsProvider,
+ com.oracle.bmc.ClientConfiguration configuration,
+ com.oracle.bmc.http.ClientConfigurator clientConfigurator,
+ com.oracle.bmc.http.signing.RequestSignerFactory defaultRequestSignerFactory,
+ java.util.Map<
+ com.oracle.bmc.http.signing.SigningStrategy,
+ com.oracle.bmc.http.signing.RequestSignerFactory>
+ signingStrategyRequestSignerFactories,
+ java.util.List additionalClientConfigurators,
+ String endpoint) {
+ this(
+ builder()
+ .configuration(configuration)
+ .clientConfigurator(clientConfigurator)
+ .requestSignerFactory(defaultRequestSignerFactory)
+ .additionalClientConfigurators(additionalClientConfigurators)
+ .endpoint(endpoint)
+ .signingStrategyRequestSignerFactories(
+ signingStrategyRequestSignerFactories),
+ authenticationDetailsProvider);
+ }
+}
diff --git a/bmc-ociproductcatalog/src/main/java/com/oracle/bmc/ociproductcatalog/ProductClient.java b/bmc-ociproductcatalog/src/main/java/com/oracle/bmc/ociproductcatalog/ProductClient.java
new file mode 100644
index 00000000000..a03d79e09bc
--- /dev/null
+++ b/bmc-ociproductcatalog/src/main/java/com/oracle/bmc/ociproductcatalog/ProductClient.java
@@ -0,0 +1,424 @@
+/**
+ * Copyright (c) 2016, 2026, Oracle and/or its affiliates. All rights reserved.
+ * This software is dual-licensed to you under the Universal Permissive License (UPL) 1.0 as shown at https://oss.oracle.com/licenses/upl or Apache License 2.0 as shown at http://www.apache.org/licenses/LICENSE-2.0. You may choose either license.
+ */
+package com.oracle.bmc.ociproductcatalog;
+
+import com.oracle.bmc.util.internal.Validate;
+import com.oracle.bmc.ociproductcatalog.requests.*;
+import com.oracle.bmc.ociproductcatalog.responses.*;
+import com.oracle.bmc.circuitbreaker.CircuitBreakerConfiguration;
+import com.oracle.bmc.util.CircuitBreakerUtils;
+
+import java.util.Objects;
+
+@jakarta.annotation.Generated(value = "OracleSDKGenerator", comments = "API Version: 20250610")
+public class ProductClient extends com.oracle.bmc.http.internal.BaseSyncClient implements Product {
+ /** Service instance for Product. */
+ public static final com.oracle.bmc.Service SERVICE =
+ com.oracle.bmc.Services.serviceBuilder()
+ .serviceName(ProductClient.class.getName())
+ .serviceEndpointPrefix("")
+ .serviceEndpointTemplate(
+ "https://cp.product-catalog.{region}.oci.{secondLevelDomain}")
+ .build();
+
+ private static final org.slf4j.Logger LOG =
+ org.slf4j.LoggerFactory.getLogger(ProductClient.class);
+
+ private final ProductWaiters waiters;
+
+ private final ProductPaginators paginators;
+
+ ProductClient(
+ com.oracle.bmc.common.ClientBuilderBase, ?> builder,
+ com.oracle.bmc.auth.AbstractAuthenticationDetailsProvider authenticationDetailsProvider,
+ java.util.concurrent.ExecutorService executorService) {
+ super(
+ builder,
+ authenticationDetailsProvider,
+ CircuitBreakerUtils.DEFAULT_CIRCUIT_BREAKER_CONFIGURATION);
+
+ if (executorService == null) {
+ // up to 50 (core) threads, time out after 60s idle, all daemon
+ java.util.concurrent.ThreadPoolExecutor threadPoolExecutor =
+ new java.util.concurrent.ThreadPoolExecutor(
+ 50,
+ 50,
+ 60L,
+ java.util.concurrent.TimeUnit.SECONDS,
+ new java.util.concurrent.LinkedBlockingQueue(),
+ com.oracle.bmc.internal.ClientThreadFactory.builder()
+ .isDaemon(true)
+ .nameFormat("Product-waiters-%d")
+ .build());
+ threadPoolExecutor.allowCoreThreadTimeOut(true);
+
+ executorService = threadPoolExecutor;
+ }
+ this.waiters = new ProductWaiters(executorService, this);
+
+ this.paginators = new ProductPaginators(this);
+ }
+
+ /**
+ * Create a builder for this client.
+ *
+ * @return builder
+ */
+ public static Builder builder() {
+ return new Builder(SERVICE);
+ }
+
+ /**
+ * Builder class for this client. The "authenticationDetailsProvider" is required and must be
+ * passed to the {@link #build(AbstractAuthenticationDetailsProvider)} method.
+ */
+ public static class Builder
+ extends com.oracle.bmc.common.RegionalClientBuilder {
+ private java.util.concurrent.ExecutorService executorService;
+
+ private Builder(com.oracle.bmc.Service service) {
+ super(service);
+ final String packageName = "ociproductcatalog";
+ com.oracle.bmc.internal.DeveloperToolConfiguration
+ .throwDisabledServiceExceptionIfAppropriate(packageName);
+ requestSignerFactory =
+ new com.oracle.bmc.http.signing.internal.DefaultRequestSignerFactory(
+ com.oracle.bmc.http.signing.SigningStrategy.STANDARD);
+ }
+
+ /**
+ * Set the ExecutorService for the client to be created.
+ *
+ * @param executorService executorService
+ * @return this builder
+ */
+ public Builder executorService(java.util.concurrent.ExecutorService executorService) {
+ this.executorService = executorService;
+ return this;
+ }
+
+ /**
+ * Build the client.
+ *
+ * @param authenticationDetailsProvider authentication details provider
+ * @return the client
+ */
+ public ProductClient build(
+ @jakarta.annotation.Nonnull
+ com.oracle.bmc.auth.AbstractAuthenticationDetailsProvider
+ authenticationDetailsProvider) {
+ return new ProductClient(this, authenticationDetailsProvider, executorService);
+ }
+ }
+
+ @Override
+ public void setRegion(com.oracle.bmc.Region region) {
+ super.setRegion(region);
+ }
+
+ @Override
+ public void setRegion(String regionId) {
+ super.setRegion(regionId);
+ }
+
+ @Override
+ public ActivateProductResponse activateProduct(ActivateProductRequest request) {
+
+ Validate.notBlank(request.getProductId(), "productId must not be blank");
+
+ return clientCall(request, ActivateProductResponse::builder)
+ .logger(LOG, "activateProduct")
+ .serviceDetails("Product", "ActivateProduct", "")
+ .method(com.oracle.bmc.http.client.Method.POST)
+ .requestBuilder(ActivateProductRequest::builder)
+ .basePath("/20250610")
+ .appendPathParam("product")
+ .appendPathParam(request.getProductId())
+ .appendPathParam("actions")
+ .appendPathParam("activate")
+ .accept("application/json")
+ .appendHeader("opc-request-id", request.getOpcRequestId())
+ .appendHeader("opc-retry-token", request.getOpcRetryToken())
+ .appendHeader("if-match", request.getIfMatch())
+ .operationUsesDefaultRetries()
+ .handleBody(
+ com.oracle.bmc.ociproductcatalog.model.Product.class,
+ ActivateProductResponse.Builder::product)
+ .handleResponseHeaderString(
+ "opc-request-id", ActivateProductResponse.Builder::opcRequestId)
+ .handleResponseHeaderString("etag", ActivateProductResponse.Builder::etag)
+ .callSync();
+ }
+
+ @Override
+ public GetProductResponse getProduct(GetProductRequest request) {
+
+ Validate.notBlank(request.getProductId(), "productId must not be blank");
+
+ return clientCall(request, GetProductResponse::builder)
+ .logger(LOG, "getProduct")
+ .serviceDetails("Product", "GetProduct", "")
+ .method(com.oracle.bmc.http.client.Method.GET)
+ .requestBuilder(GetProductRequest::builder)
+ .basePath("/20250610")
+ .appendPathParam("product")
+ .appendPathParam(request.getProductId())
+ .accept("application/json")
+ .appendHeader("opc-request-id", request.getOpcRequestId())
+ .operationUsesDefaultRetries()
+ .handleBody(
+ com.oracle.bmc.ociproductcatalog.model.Product.class,
+ GetProductResponse.Builder::product)
+ .handleResponseHeaderString(
+ "opc-request-id", GetProductResponse.Builder::opcRequestId)
+ .handleResponseHeaderString("etag", GetProductResponse.Builder::etag)
+ .callSync();
+ }
+
+ @Override
+ public ListProductsResponse listProducts(ListProductsRequest request) {
+
+ return clientCall(request, ListProductsResponse::builder)
+ .logger(LOG, "listProducts")
+ .serviceDetails("Product", "ListProducts", "")
+ .method(com.oracle.bmc.http.client.Method.GET)
+ .requestBuilder(ListProductsRequest::builder)
+ .basePath("/20250610")
+ .appendPathParam("products")
+ .appendQueryParam("skusContains", request.getSkusContains())
+ .appendQueryParam("name", request.getName())
+ .appendQueryParam("lifecycleState", request.getLifecycleState())
+ .appendQueryParam(
+ "timeReadyGreaterThanOrEqualTo", request.getTimeReadyGreaterThanOrEqualTo())
+ .appendQueryParam("page", request.getPage())
+ .appendQueryParam("limit", request.getLimit())
+ .appendQueryParam("id", request.getId())
+ .accept("application/json")
+ .appendHeader("opc-request-id", request.getOpcRequestId())
+ .operationUsesDefaultRetries()
+ .handleBody(
+ com.oracle.bmc.ociproductcatalog.model.ProductCollection.class,
+ ListProductsResponse.Builder::productCollection)
+ .handleResponseHeaderString(
+ "opc-request-id", ListProductsResponse.Builder::opcRequestId)
+ .handleResponseHeaderString(
+ "opc-next-page", ListProductsResponse.Builder::opcNextPage)
+ .callSync();
+ }
+
+ @Override
+ public ProductWaiters getWaiters() {
+ return waiters;
+ }
+
+ @Override
+ public ProductPaginators getPaginators() {
+ return paginators;
+ }
+
+ /**
+ * Create a new client instance.
+ *
+ * @param authenticationDetailsProvider The authentication details (see {@link Builder#build})
+ * @deprecated Use the {@link #builder() builder} instead.
+ */
+ @Deprecated
+ public ProductClient(
+ com.oracle.bmc.auth.BasicAuthenticationDetailsProvider authenticationDetailsProvider) {
+ this(builder(), authenticationDetailsProvider, null);
+ }
+
+ /**
+ * Create a new client instance.
+ *
+ * @param authenticationDetailsProvider The authentication details (see {@link Builder#build})
+ * @param configuration {@link Builder#configuration}
+ * @deprecated Use the {@link #builder() builder} instead.
+ */
+ @Deprecated
+ public ProductClient(
+ com.oracle.bmc.auth.BasicAuthenticationDetailsProvider authenticationDetailsProvider,
+ com.oracle.bmc.ClientConfiguration configuration) {
+ this(builder().configuration(configuration), authenticationDetailsProvider, null);
+ }
+
+ /**
+ * Create a new client instance.
+ *
+ * @param authenticationDetailsProvider The authentication details (see {@link Builder#build})
+ * @param configuration {@link Builder#configuration}
+ * @param clientConfigurator {@link Builder#clientConfigurator}
+ * @deprecated Use the {@link #builder() builder} instead.
+ */
+ @Deprecated
+ public ProductClient(
+ com.oracle.bmc.auth.BasicAuthenticationDetailsProvider authenticationDetailsProvider,
+ com.oracle.bmc.ClientConfiguration configuration,
+ com.oracle.bmc.http.ClientConfigurator clientConfigurator) {
+ this(
+ builder().configuration(configuration).clientConfigurator(clientConfigurator),
+ authenticationDetailsProvider,
+ null);
+ }
+
+ /**
+ * Create a new client instance.
+ *
+ * @param authenticationDetailsProvider The authentication details (see {@link Builder#build})
+ * @param configuration {@link Builder#configuration}
+ * @param clientConfigurator {@link Builder#clientConfigurator}
+ * @param defaultRequestSignerFactory {@link Builder#requestSignerFactory}
+ * @deprecated Use the {@link #builder() builder} instead.
+ */
+ @Deprecated
+ public ProductClient(
+ com.oracle.bmc.auth.AbstractAuthenticationDetailsProvider authenticationDetailsProvider,
+ com.oracle.bmc.ClientConfiguration configuration,
+ com.oracle.bmc.http.ClientConfigurator clientConfigurator,
+ com.oracle.bmc.http.signing.RequestSignerFactory defaultRequestSignerFactory) {
+ this(
+ builder()
+ .configuration(configuration)
+ .clientConfigurator(clientConfigurator)
+ .requestSignerFactory(defaultRequestSignerFactory),
+ authenticationDetailsProvider,
+ null);
+ }
+
+ /**
+ * Create a new client instance.
+ *
+ * @param authenticationDetailsProvider The authentication details (see {@link Builder#build})
+ * @param configuration {@link Builder#configuration}
+ * @param clientConfigurator {@link Builder#clientConfigurator}
+ * @param defaultRequestSignerFactory {@link Builder#requestSignerFactory}
+ * @param additionalClientConfigurators {@link Builder#additionalClientConfigurators}
+ * @deprecated Use the {@link #builder() builder} instead.
+ */
+ @Deprecated
+ public ProductClient(
+ com.oracle.bmc.auth.AbstractAuthenticationDetailsProvider authenticationDetailsProvider,
+ com.oracle.bmc.ClientConfiguration configuration,
+ com.oracle.bmc.http.ClientConfigurator clientConfigurator,
+ com.oracle.bmc.http.signing.RequestSignerFactory defaultRequestSignerFactory,
+ java.util.List additionalClientConfigurators) {
+ this(
+ builder()
+ .configuration(configuration)
+ .clientConfigurator(clientConfigurator)
+ .requestSignerFactory(defaultRequestSignerFactory)
+ .additionalClientConfigurators(additionalClientConfigurators),
+ authenticationDetailsProvider,
+ null);
+ }
+
+ /**
+ * Create a new client instance.
+ *
+ * @param authenticationDetailsProvider The authentication details (see {@link Builder#build})
+ * @param configuration {@link Builder#configuration}
+ * @param clientConfigurator {@link Builder#clientConfigurator}
+ * @param defaultRequestSignerFactory {@link Builder#requestSignerFactory}
+ * @param additionalClientConfigurators {@link Builder#additionalClientConfigurators}
+ * @param endpoint {@link Builder#endpoint}
+ * @deprecated Use the {@link #builder() builder} instead.
+ */
+ @Deprecated
+ public ProductClient(
+ com.oracle.bmc.auth.AbstractAuthenticationDetailsProvider authenticationDetailsProvider,
+ com.oracle.bmc.ClientConfiguration configuration,
+ com.oracle.bmc.http.ClientConfigurator clientConfigurator,
+ com.oracle.bmc.http.signing.RequestSignerFactory defaultRequestSignerFactory,
+ java.util.List additionalClientConfigurators,
+ String endpoint) {
+ this(
+ builder()
+ .configuration(configuration)
+ .clientConfigurator(clientConfigurator)
+ .requestSignerFactory(defaultRequestSignerFactory)
+ .additionalClientConfigurators(additionalClientConfigurators)
+ .endpoint(endpoint),
+ authenticationDetailsProvider,
+ null);
+ }
+
+ /**
+ * Create a new client instance.
+ *
+ * @param authenticationDetailsProvider The authentication details (see {@link Builder#build})
+ * @param configuration {@link Builder#configuration}
+ * @param clientConfigurator {@link Builder#clientConfigurator}
+ * @param defaultRequestSignerFactory {@link Builder#requestSignerFactory}
+ * @param additionalClientConfigurators {@link Builder#additionalClientConfigurators}
+ * @param endpoint {@link Builder#endpoint}
+ * @param signingStrategyRequestSignerFactories {@link
+ * Builder#signingStrategyRequestSignerFactories}
+ * @deprecated Use the {@link #builder() builder} instead.
+ */
+ @Deprecated
+ public ProductClient(
+ com.oracle.bmc.auth.AbstractAuthenticationDetailsProvider authenticationDetailsProvider,
+ com.oracle.bmc.ClientConfiguration configuration,
+ com.oracle.bmc.http.ClientConfigurator clientConfigurator,
+ com.oracle.bmc.http.signing.RequestSignerFactory defaultRequestSignerFactory,
+ java.util.Map<
+ com.oracle.bmc.http.signing.SigningStrategy,
+ com.oracle.bmc.http.signing.RequestSignerFactory>
+ signingStrategyRequestSignerFactories,
+ java.util.List additionalClientConfigurators,
+ String endpoint) {
+ this(
+ builder()
+ .configuration(configuration)
+ .clientConfigurator(clientConfigurator)
+ .requestSignerFactory(defaultRequestSignerFactory)
+ .additionalClientConfigurators(additionalClientConfigurators)
+ .endpoint(endpoint)
+ .signingStrategyRequestSignerFactories(
+ signingStrategyRequestSignerFactories),
+ authenticationDetailsProvider,
+ null);
+ }
+
+ /**
+ * Create a new client instance.
+ *
+ * @param authenticationDetailsProvider The authentication details (see {@link Builder#build})
+ * @param configuration {@link Builder#configuration}
+ * @param clientConfigurator {@link Builder#clientConfigurator}
+ * @param defaultRequestSignerFactory {@link Builder#requestSignerFactory}
+ * @param additionalClientConfigurators {@link Builder#additionalClientConfigurators}
+ * @param endpoint {@link Builder#endpoint}
+ * @param signingStrategyRequestSignerFactories {@link
+ * Builder#signingStrategyRequestSignerFactories}
+ * @param executorService {@link Builder#executorService}
+ * @deprecated Use the {@link #builder() builder} instead.
+ */
+ @Deprecated
+ public ProductClient(
+ com.oracle.bmc.auth.AbstractAuthenticationDetailsProvider authenticationDetailsProvider,
+ com.oracle.bmc.ClientConfiguration configuration,
+ com.oracle.bmc.http.ClientConfigurator clientConfigurator,
+ com.oracle.bmc.http.signing.RequestSignerFactory defaultRequestSignerFactory,
+ java.util.Map<
+ com.oracle.bmc.http.signing.SigningStrategy,
+ com.oracle.bmc.http.signing.RequestSignerFactory>
+ signingStrategyRequestSignerFactories,
+ java.util.List additionalClientConfigurators,
+ String endpoint,
+ java.util.concurrent.ExecutorService executorService) {
+ this(
+ builder()
+ .configuration(configuration)
+ .clientConfigurator(clientConfigurator)
+ .requestSignerFactory(defaultRequestSignerFactory)
+ .additionalClientConfigurators(additionalClientConfigurators)
+ .endpoint(endpoint)
+ .signingStrategyRequestSignerFactories(
+ signingStrategyRequestSignerFactories),
+ authenticationDetailsProvider,
+ executorService);
+ }
+}
diff --git a/bmc-ociproductcatalog/src/main/java/com/oracle/bmc/ociproductcatalog/ProductInternal.java b/bmc-ociproductcatalog/src/main/java/com/oracle/bmc/ociproductcatalog/ProductInternal.java
new file mode 100644
index 00000000000..ffe25809b1e
--- /dev/null
+++ b/bmc-ociproductcatalog/src/main/java/com/oracle/bmc/ociproductcatalog/ProductInternal.java
@@ -0,0 +1,173 @@
+/**
+ * Copyright (c) 2016, 2026, Oracle and/or its affiliates. All rights reserved.
+ * This software is dual-licensed to you under the Universal Permissive License (UPL) 1.0 as shown at https://oss.oracle.com/licenses/upl or Apache License 2.0 as shown at http://www.apache.org/licenses/LICENSE-2.0. You may choose either license.
+ */
+package com.oracle.bmc.ociproductcatalog;
+
+import com.oracle.bmc.ociproductcatalog.requests.*;
+import com.oracle.bmc.ociproductcatalog.responses.*;
+
+/**
+ * Apis to manage the products used by the OCI service teams This service client uses
+ * CircuitBreakerUtils.DEFAULT_CIRCUIT_BREAKER for all the operations by default if no circuit
+ * breaker configuration is defined by the user.
+ */
+@jakarta.annotation.Generated(value = "OracleSDKGenerator", comments = "API Version: 20250610")
+public interface ProductInternal extends AutoCloseable {
+
+ /** Rebuilds the client from scratch. Useful to refresh certificates. */
+ void refreshClient();
+
+ /**
+ * Sets the endpoint to call (ex, https://www.example.com).
+ *
+ * @param endpoint The endpoint of the service.
+ */
+ void setEndpoint(String endpoint);
+
+ /** Gets the set endpoint for REST call (ex, https://www.example.com) */
+ String getEndpoint();
+
+ /**
+ * Sets the region to call (ex, Region.US_PHOENIX_1).
+ *
+ * Note, this will call {@link #setEndpoint(String) setEndpoint} after resolving the
+ * endpoint. If the service is not available in this Region, however, an
+ * IllegalArgumentException will be raised.
+ *
+ * @param region The region of the service.
+ */
+ void setRegion(com.oracle.bmc.Region region);
+
+ /**
+ * Sets the region to call (ex, 'us-phoenix-1').
+ *
+ *
Note, this will first try to map the region ID to a known Region and call {@link
+ * #setRegion(Region) setRegion}.
+ *
+ *
If no known Region could be determined, it will create an endpoint based on the default
+ * endpoint format ({@link com.oracle.bmc.Region#formatDefaultRegionEndpoint(Service, String)}
+ * and then call {@link #setEndpoint(String) setEndpoint}.
+ *
+ * @param regionId The public region ID.
+ */
+ void setRegion(String regionId);
+
+ /**
+ * Determines whether realm specific endpoint should be used or not. Set
+ * realmSpecificEndpointTemplateEnabled to "true" if the user wants to enable use of realm
+ * specific endpoint template, otherwise set it to "false"
+ *
+ * @param realmSpecificEndpointTemplateEnabled flag to enable the use of realm specific endpoint
+ * template
+ */
+ void useRealmSpecificEndpointTemplate(boolean realmSpecificEndpointTemplateEnabled);
+
+ /**
+ * Change product compartment
+ *
+ * @param request The request object containing the details to send
+ * @return A response object containing details about the completed operation
+ * @throws BmcException when an error occurs. This operation uses
+ * RetryConfiguration.SDK_DEFAULT_RETRY_CONFIGURATION as default if no retry strategy is
+ * provided. The specifics of the default retry strategy are described here
+ * https://docs.oracle.com/en-us/iaas/Content/API/SDKDocs/javasdkconcepts.htm#javasdkconcepts_topic_Retries
+ *
Example: Click here to see how to use
+ * ChangeInternalProductCompartment API.
+ */
+ ChangeInternalProductCompartmentResponse changeInternalProductCompartment(
+ ChangeInternalProductCompartmentRequest request);
+
+ /**
+ * Used by the OCI service teams to create a product to control the availability of the relative
+ * resources
+ *
+ * @param request The request object containing the details to send
+ * @return A response object containing details about the completed operation
+ * @throws BmcException when an error occurs. This operation uses
+ * RetryConfiguration.SDK_DEFAULT_RETRY_CONFIGURATION as default if no retry strategy is
+ * provided. The specifics of the default retry strategy are described here
+ * https://docs.oracle.com/en-us/iaas/Content/API/SDKDocs/javasdkconcepts.htm#javasdkconcepts_topic_Retries
+ *
Example: Click here to see how to use
+ * CreateInternalProduct API.
+ */
+ CreateInternalProductResponse createInternalProduct(CreateInternalProductRequest request);
+
+ /**
+ * Delete the product
+ *
+ * @param request The request object containing the details to send
+ * @return A response object containing details about the completed operation
+ * @throws BmcException when an error occurs. This operation uses
+ * RetryConfiguration.SDK_DEFAULT_RETRY_CONFIGURATION as default if no retry strategy is
+ * provided. The specifics of the default retry strategy are described here
+ * https://docs.oracle.com/en-us/iaas/Content/API/SDKDocs/javasdkconcepts.htm#javasdkconcepts_topic_Retries
+ *
Example: Click here to see how to use
+ * DeleteInternalProduct API.
+ */
+ DeleteInternalProductResponse deleteInternalProduct(DeleteInternalProductRequest request);
+
+ /**
+ * Get the product by ID
+ *
+ * @param request The request object containing the details to send
+ * @return A response object containing details about the completed operation
+ * @throws BmcException when an error occurs. This operation uses
+ * RetryConfiguration.SDK_DEFAULT_RETRY_CONFIGURATION as default if no retry strategy is
+ * provided. The specifics of the default retry strategy are described here
+ * https://docs.oracle.com/en-us/iaas/Content/API/SDKDocs/javasdkconcepts.htm#javasdkconcepts_topic_Retries
+ *
Example: Click here to see how to use GetInternalProduct
+ * API.
+ */
+ GetInternalProductResponse getInternalProduct(GetInternalProductRequest request);
+
+ /**
+ * List the products with the filters
+ *
+ * @param request The request object containing the details to send
+ * @return A response object containing details about the completed operation
+ * @throws BmcException when an error occurs. This operation uses
+ * RetryConfiguration.SDK_DEFAULT_RETRY_CONFIGURATION as default if no retry strategy is
+ * provided. The specifics of the default retry strategy are described here
+ * https://docs.oracle.com/en-us/iaas/Content/API/SDKDocs/javasdkconcepts.htm#javasdkconcepts_topic_Retries
+ *
Example: Click here to see how to use
+ * ListInternalProducts API.
+ */
+ ListInternalProductsResponse listInternalProducts(ListInternalProductsRequest request);
+
+ /**
+ * Update the product
+ *
+ * @param request The request object containing the details to send
+ * @return A response object containing details about the completed operation
+ * @throws BmcException when an error occurs. This operation uses
+ * RetryConfiguration.SDK_DEFAULT_RETRY_CONFIGURATION as default if no retry strategy is
+ * provided. The specifics of the default retry strategy are described here
+ * https://docs.oracle.com/en-us/iaas/Content/API/SDKDocs/javasdkconcepts.htm#javasdkconcepts_topic_Retries
+ *
Example: Click here to see how to use
+ * UpdateInternalProduct API.
+ */
+ UpdateInternalProductResponse updateInternalProduct(UpdateInternalProductRequest request);
+
+ /**
+ * Gets the pre-configured paginators available for list operations in this service which may
+ * return multiple pages of data. These paginators provide an {@link java.lang.Iterable}
+ * interface so that service responses, or resources/records, can be iterated through without
+ * having to manually deal with pagination and page tokens.
+ *
+ * @return The service paginators.
+ */
+ ProductInternalPaginators getPaginators();
+}
diff --git a/bmc-ociproductcatalog/src/main/java/com/oracle/bmc/ociproductcatalog/ProductInternalAsync.java b/bmc-ociproductcatalog/src/main/java/com/oracle/bmc/ociproductcatalog/ProductInternalAsync.java
new file mode 100644
index 00000000000..963ec486e74
--- /dev/null
+++ b/bmc-ociproductcatalog/src/main/java/com/oracle/bmc/ociproductcatalog/ProductInternalAsync.java
@@ -0,0 +1,160 @@
+/**
+ * Copyright (c) 2016, 2026, Oracle and/or its affiliates. All rights reserved.
+ * This software is dual-licensed to you under the Universal Permissive License (UPL) 1.0 as shown at https://oss.oracle.com/licenses/upl or Apache License 2.0 as shown at http://www.apache.org/licenses/LICENSE-2.0. You may choose either license.
+ */
+package com.oracle.bmc.ociproductcatalog;
+
+import com.oracle.bmc.ociproductcatalog.requests.*;
+import com.oracle.bmc.ociproductcatalog.responses.*;
+
+/** Apis to manage the products used by the OCI service teams */
+@jakarta.annotation.Generated(value = "OracleSDKGenerator", comments = "API Version: 20250610")
+public interface ProductInternalAsync extends AutoCloseable {
+
+ /** Rebuilds the client from scratch. Useful to refresh certificates. */
+ void refreshClient();
+
+ /**
+ * Sets the endpoint to call (ex, https://www.example.com).
+ *
+ * @param endpoint The endpoint of the serice.
+ */
+ void setEndpoint(String endpoint);
+
+ /** Gets the set endpoint for REST call (ex, https://www.example.com) */
+ String getEndpoint();
+
+ /**
+ * Sets the region to call (ex, Region.US_PHOENIX_1).
+ *
+ *
Note, this will call {@link #setEndpoint(String) setEndpoint} after resolving the
+ * endpoint. If the service is not available in this region, however, an
+ * IllegalArgumentException will be raised.
+ *
+ * @param region The region of the service.
+ */
+ void setRegion(com.oracle.bmc.Region region);
+
+ /**
+ * Sets the region to call (ex, 'us-phoenix-1').
+ *
+ *
Note, this will first try to map the region ID to a known Region and call {@link
+ * #setRegion(Region) setRegion}.
+ *
+ *
If no known Region could be determined, it will create an endpoint based on the default
+ * endpoint format ({@link com.oracle.bmc.Region#formatDefaultRegionEndpoint(Service, String)}
+ * and then call {@link #setEndpoint(String) setEndpoint}.
+ *
+ * @param regionId The public region ID.
+ */
+ void setRegion(String regionId);
+
+ /**
+ * Determines whether realm specific endpoint should be used or not. Set
+ * realmSpecificEndpointTemplateEnabled to "true" if the user wants to enable use of realm
+ * specific endpoint template, otherwise set it to "false"
+ *
+ * @param realmSpecificEndpointTemplateEnabled flag to enable the use of realm specific endpoint
+ * template
+ */
+ void useRealmSpecificEndpointTemplate(boolean realmSpecificEndpointTemplateEnabled);
+
+ /**
+ * Change product compartment
+ *
+ * @param request The request object containing the details to send
+ * @param handler The request handler to invoke upon completion, may be null.
+ * @return A Future that can be used to get the response if no AsyncHandler was provided. Note,
+ * if you provide an AsyncHandler and use the Future, some types of responses (like
+ * java.io.InputStream) may not be able to be read in both places as the underlying stream
+ * may only be consumed once.
+ */
+ java.util.concurrent.Future
+ changeInternalProductCompartment(
+ ChangeInternalProductCompartmentRequest request,
+ com.oracle.bmc.responses.AsyncHandler<
+ ChangeInternalProductCompartmentRequest,
+ ChangeInternalProductCompartmentResponse>
+ handler);
+
+ /**
+ * Used by the OCI service teams to create a product to control the availability of the relative
+ * resources
+ *
+ * @param request The request object containing the details to send
+ * @param handler The request handler to invoke upon completion, may be null.
+ * @return A Future that can be used to get the response if no AsyncHandler was provided. Note,
+ * if you provide an AsyncHandler and use the Future, some types of responses (like
+ * java.io.InputStream) may not be able to be read in both places as the underlying stream
+ * may only be consumed once.
+ */
+ java.util.concurrent.Future createInternalProduct(
+ CreateInternalProductRequest request,
+ com.oracle.bmc.responses.AsyncHandler<
+ CreateInternalProductRequest, CreateInternalProductResponse>
+ handler);
+
+ /**
+ * Delete the product
+ *
+ * @param request The request object containing the details to send
+ * @param handler The request handler to invoke upon completion, may be null.
+ * @return A Future that can be used to get the response if no AsyncHandler was provided. Note,
+ * if you provide an AsyncHandler and use the Future, some types of responses (like
+ * java.io.InputStream) may not be able to be read in both places as the underlying stream
+ * may only be consumed once.
+ */
+ java.util.concurrent.Future deleteInternalProduct(
+ DeleteInternalProductRequest request,
+ com.oracle.bmc.responses.AsyncHandler<
+ DeleteInternalProductRequest, DeleteInternalProductResponse>
+ handler);
+
+ /**
+ * Get the product by ID
+ *
+ * @param request The request object containing the details to send
+ * @param handler The request handler to invoke upon completion, may be null.
+ * @return A Future that can be used to get the response if no AsyncHandler was provided. Note,
+ * if you provide an AsyncHandler and use the Future, some types of responses (like
+ * java.io.InputStream) may not be able to be read in both places as the underlying stream
+ * may only be consumed once.
+ */
+ java.util.concurrent.Future getInternalProduct(
+ GetInternalProductRequest request,
+ com.oracle.bmc.responses.AsyncHandler<
+ GetInternalProductRequest, GetInternalProductResponse>
+ handler);
+
+ /**
+ * List the products with the filters
+ *
+ * @param request The request object containing the details to send
+ * @param handler The request handler to invoke upon completion, may be null.
+ * @return A Future that can be used to get the response if no AsyncHandler was provided. Note,
+ * if you provide an AsyncHandler and use the Future, some types of responses (like
+ * java.io.InputStream) may not be able to be read in both places as the underlying stream
+ * may only be consumed once.
+ */
+ java.util.concurrent.Future listInternalProducts(
+ ListInternalProductsRequest request,
+ com.oracle.bmc.responses.AsyncHandler<
+ ListInternalProductsRequest, ListInternalProductsResponse>
+ handler);
+
+ /**
+ * Update the product
+ *
+ * @param request The request object containing the details to send
+ * @param handler The request handler to invoke upon completion, may be null.
+ * @return A Future that can be used to get the response if no AsyncHandler was provided. Note,
+ * if you provide an AsyncHandler and use the Future, some types of responses (like
+ * java.io.InputStream) may not be able to be read in both places as the underlying stream
+ * may only be consumed once.
+ */
+ java.util.concurrent.Future updateInternalProduct(
+ UpdateInternalProductRequest request,
+ com.oracle.bmc.responses.AsyncHandler<
+ UpdateInternalProductRequest, UpdateInternalProductResponse>
+ handler);
+}
diff --git a/bmc-ociproductcatalog/src/main/java/com/oracle/bmc/ociproductcatalog/ProductInternalAsyncClient.java b/bmc-ociproductcatalog/src/main/java/com/oracle/bmc/ociproductcatalog/ProductInternalAsyncClient.java
new file mode 100644
index 00000000000..e4ca5f4bc3f
--- /dev/null
+++ b/bmc-ociproductcatalog/src/main/java/com/oracle/bmc/ociproductcatalog/ProductInternalAsyncClient.java
@@ -0,0 +1,445 @@
+/**
+ * Copyright (c) 2016, 2026, Oracle and/or its affiliates. All rights reserved.
+ * This software is dual-licensed to you under the Universal Permissive License (UPL) 1.0 as shown at https://oss.oracle.com/licenses/upl or Apache License 2.0 as shown at http://www.apache.org/licenses/LICENSE-2.0. You may choose either license.
+ */
+package com.oracle.bmc.ociproductcatalog;
+
+import com.oracle.bmc.util.internal.Validate;
+import com.oracle.bmc.ociproductcatalog.requests.*;
+import com.oracle.bmc.ociproductcatalog.responses.*;
+
+import java.util.Objects;
+
+/**
+ * Async client implementation for ProductInternal service.
+ * There are two ways to use async client: 1. Use AsyncHandler: using AsyncHandler, if the response
+ * to the call is an {@link java.io.InputStream}, like getObject Api in object storage service,
+ * developers need to process the stream in AsyncHandler, and not anywhere else, because the stream
+ * will be closed right after the AsyncHandler is invoked.
+ * 2. Use Java Future: using Java Future, developers need to close the stream after they are done
+ * with the Java Future.
+ * Accessing the result should be done in a mutually exclusive manner, either through the Future or
+ * the AsyncHandler, but not both. If the Future is used, the caller should pass in null as the
+ * AsyncHandler. If the AsyncHandler is used, it is still safe to use the Future to determine
+ * whether or not the request was completed via Future.isDone/isCancelled.
+ * Please refer to
+ * https://github.com/oracle/oci-java-sdk/blob/master/bmc-examples/src/main/java/ResteasyClientWithObjectStorageExample.java
+ */
+@jakarta.annotation.Generated(value = "OracleSDKGenerator", comments = "API Version: 20250610")
+public class ProductInternalAsyncClient extends com.oracle.bmc.http.internal.BaseAsyncClient
+ implements ProductInternalAsync {
+ /** Service instance for ProductInternal. */
+ public static final com.oracle.bmc.Service SERVICE =
+ com.oracle.bmc.Services.serviceBuilder()
+ .serviceName(ProductInternalClient.class.getName())
+ .serviceEndpointPrefix("")
+ .serviceEndpointTemplate(
+ "https://cp.product-catalog.{region}.oci.{secondLevelDomain}")
+ .build();
+
+ private static final org.slf4j.Logger LOG =
+ org.slf4j.LoggerFactory.getLogger(ProductInternalAsyncClient.class);
+
+ ProductInternalAsyncClient(
+ com.oracle.bmc.common.ClientBuilderBase, ?> builder,
+ com.oracle.bmc.auth.AbstractAuthenticationDetailsProvider
+ authenticationDetailsProvider) {
+ super(builder, authenticationDetailsProvider);
+ }
+
+ /**
+ * Create a builder for this client.
+ *
+ * @return builder
+ */
+ public static Builder builder() {
+ return new Builder(SERVICE);
+ }
+
+ /**
+ * Builder class for this client. The "authenticationDetailsProvider" is required and must be
+ * passed to the {@link #build(AbstractAuthenticationDetailsProvider)} method.
+ */
+ public static class Builder
+ extends com.oracle.bmc.common.RegionalClientBuilder<
+ Builder, ProductInternalAsyncClient> {
+ private Builder(com.oracle.bmc.Service service) {
+ super(service);
+ final String packageName = "ociproductcatalog";
+ com.oracle.bmc.internal.DeveloperToolConfiguration
+ .throwDisabledServiceExceptionIfAppropriate(packageName);
+ requestSignerFactory =
+ new com.oracle.bmc.http.signing.internal.DefaultRequestSignerFactory(
+ com.oracle.bmc.http.signing.SigningStrategy.STANDARD);
+ }
+
+ /**
+ * Build the client.
+ *
+ * @param authenticationDetailsProvider authentication details provider
+ * @return the client
+ */
+ public ProductInternalAsyncClient build(
+ @jakarta.annotation.Nonnull
+ com.oracle.bmc.auth.AbstractAuthenticationDetailsProvider
+ authenticationDetailsProvider) {
+ return new ProductInternalAsyncClient(this, authenticationDetailsProvider);
+ }
+ }
+
+ @Override
+ public void setRegion(com.oracle.bmc.Region region) {
+ super.setRegion(region);
+ }
+
+ @Override
+ public void setRegion(String regionId) {
+ super.setRegion(regionId);
+ }
+
+ @Override
+ public java.util.concurrent.Future
+ changeInternalProductCompartment(
+ ChangeInternalProductCompartmentRequest request,
+ final com.oracle.bmc.responses.AsyncHandler<
+ ChangeInternalProductCompartmentRequest,
+ ChangeInternalProductCompartmentResponse>
+ handler) {
+
+ Validate.notBlank(request.getProductId(), "productId must not be blank");
+ Objects.requireNonNull(
+ request.getChangeProductCompartmentDetails(),
+ "changeProductCompartmentDetails is required");
+
+ return clientCall(request, ChangeInternalProductCompartmentResponse::builder)
+ .logger(LOG, "changeInternalProductCompartment")
+ .serviceDetails("ProductInternal", "ChangeInternalProductCompartment", "")
+ .method(com.oracle.bmc.http.client.Method.POST)
+ .requestBuilder(ChangeInternalProductCompartmentRequest::builder)
+ .basePath("/20250610")
+ .appendPathParam("internal")
+ .appendPathParam("product")
+ .appendPathParam(request.getProductId())
+ .appendPathParam("actions")
+ .appendPathParam("changeCompartment")
+ .accept("application/json")
+ .appendHeader("opc-request-id", request.getOpcRequestId())
+ .appendHeader("opc-retry-token", request.getOpcRetryToken())
+ .appendHeader("if-match", request.getIfMatch())
+ .hasBody()
+ .handleResponseHeaderString(
+ "opc-request-id",
+ ChangeInternalProductCompartmentResponse.Builder::opcRequestId)
+ .callAsync(handler);
+ }
+
+ @Override
+ public java.util.concurrent.Future createInternalProduct(
+ CreateInternalProductRequest request,
+ final com.oracle.bmc.responses.AsyncHandler<
+ CreateInternalProductRequest, CreateInternalProductResponse>
+ handler) {
+ Objects.requireNonNull(
+ request.getCreateProductDetails(), "createProductDetails is required");
+
+ return clientCall(request, CreateInternalProductResponse::builder)
+ .logger(LOG, "createInternalProduct")
+ .serviceDetails("ProductInternal", "CreateInternalProduct", "")
+ .method(com.oracle.bmc.http.client.Method.POST)
+ .requestBuilder(CreateInternalProductRequest::builder)
+ .basePath("/20250610")
+ .appendPathParam("internal")
+ .appendPathParam("product")
+ .accept("application/json")
+ .appendHeader("opc-retry-token", request.getOpcRetryToken())
+ .appendHeader("opc-request-id", request.getOpcRequestId())
+ .hasBody()
+ .handleBody(
+ com.oracle.bmc.ociproductcatalog.model.Product.class,
+ CreateInternalProductResponse.Builder::product)
+ .handleResponseHeaderString(
+ "opc-request-id", CreateInternalProductResponse.Builder::opcRequestId)
+ .handleResponseHeaderString("etag", CreateInternalProductResponse.Builder::etag)
+ .callAsync(handler);
+ }
+
+ @Override
+ public java.util.concurrent.Future deleteInternalProduct(
+ DeleteInternalProductRequest request,
+ final com.oracle.bmc.responses.AsyncHandler<
+ DeleteInternalProductRequest, DeleteInternalProductResponse>
+ handler) {
+
+ Validate.notBlank(request.getProductId(), "productId must not be blank");
+
+ return clientCall(request, DeleteInternalProductResponse::builder)
+ .logger(LOG, "deleteInternalProduct")
+ .serviceDetails("ProductInternal", "DeleteInternalProduct", "")
+ .method(com.oracle.bmc.http.client.Method.DELETE)
+ .requestBuilder(DeleteInternalProductRequest::builder)
+ .basePath("/20250610")
+ .appendPathParam("internal")
+ .appendPathParam("product")
+ .appendPathParam(request.getProductId())
+ .accept("application/json")
+ .appendHeader("opc-request-id", request.getOpcRequestId())
+ .appendHeader("if-match", request.getIfMatch())
+ .handleResponseHeaderString(
+ "opc-request-id", DeleteInternalProductResponse.Builder::opcRequestId)
+ .callAsync(handler);
+ }
+
+ @Override
+ public java.util.concurrent.Future getInternalProduct(
+ GetInternalProductRequest request,
+ final com.oracle.bmc.responses.AsyncHandler<
+ GetInternalProductRequest, GetInternalProductResponse>
+ handler) {
+
+ Validate.notBlank(request.getProductId(), "productId must not be blank");
+
+ return clientCall(request, GetInternalProductResponse::builder)
+ .logger(LOG, "getInternalProduct")
+ .serviceDetails("ProductInternal", "GetInternalProduct", "")
+ .method(com.oracle.bmc.http.client.Method.GET)
+ .requestBuilder(GetInternalProductRequest::builder)
+ .basePath("/20250610")
+ .appendPathParam("internal")
+ .appendPathParam("product")
+ .appendPathParam(request.getProductId())
+ .accept("application/json")
+ .appendHeader("opc-request-id", request.getOpcRequestId())
+ .handleBody(
+ com.oracle.bmc.ociproductcatalog.model.Product.class,
+ GetInternalProductResponse.Builder::product)
+ .handleResponseHeaderString(
+ "opc-request-id", GetInternalProductResponse.Builder::opcRequestId)
+ .handleResponseHeaderString("etag", GetInternalProductResponse.Builder::etag)
+ .callAsync(handler);
+ }
+
+ @Override
+ public java.util.concurrent.Future listInternalProducts(
+ ListInternalProductsRequest request,
+ final com.oracle.bmc.responses.AsyncHandler<
+ ListInternalProductsRequest, ListInternalProductsResponse>
+ handler) {
+ Objects.requireNonNull(request.getCompartmentId(), "compartmentId is required");
+
+ return clientCall(request, ListInternalProductsResponse::builder)
+ .logger(LOG, "listInternalProducts")
+ .serviceDetails("ProductInternal", "ListInternalProducts", "")
+ .method(com.oracle.bmc.http.client.Method.GET)
+ .requestBuilder(ListInternalProductsRequest::builder)
+ .basePath("/20250610")
+ .appendPathParam("internal")
+ .appendPathParam("products")
+ .appendQueryParam("page", request.getPage())
+ .appendQueryParam("limit", request.getLimit())
+ .appendQueryParam("name", request.getName())
+ .appendQueryParam("compartmentId", request.getCompartmentId())
+ .appendQueryParam("id", request.getId())
+ .accept("application/json")
+ .appendHeader("opc-request-id", request.getOpcRequestId())
+ .handleBody(
+ com.oracle.bmc.ociproductcatalog.model.ProductCollection.class,
+ ListInternalProductsResponse.Builder::productCollection)
+ .handleResponseHeaderString(
+ "opc-request-id", ListInternalProductsResponse.Builder::opcRequestId)
+ .handleResponseHeaderString(
+ "opc-next-page", ListInternalProductsResponse.Builder::opcNextPage)
+ .callAsync(handler);
+ }
+
+ @Override
+ public java.util.concurrent.Future updateInternalProduct(
+ UpdateInternalProductRequest request,
+ final com.oracle.bmc.responses.AsyncHandler<
+ UpdateInternalProductRequest, UpdateInternalProductResponse>
+ handler) {
+
+ Validate.notBlank(request.getProductId(), "productId must not be blank");
+ Objects.requireNonNull(
+ request.getUpdateProductDetails(), "updateProductDetails is required");
+
+ return clientCall(request, UpdateInternalProductResponse::builder)
+ .logger(LOG, "updateInternalProduct")
+ .serviceDetails("ProductInternal", "UpdateInternalProduct", "")
+ .method(com.oracle.bmc.http.client.Method.PUT)
+ .requestBuilder(UpdateInternalProductRequest::builder)
+ .basePath("/20250610")
+ .appendPathParam("internal")
+ .appendPathParam("product")
+ .appendPathParam(request.getProductId())
+ .accept("application/json")
+ .appendHeader("opc-request-id", request.getOpcRequestId())
+ .appendHeader("if-match", request.getIfMatch())
+ .hasBody()
+ .handleBody(
+ com.oracle.bmc.ociproductcatalog.model.Product.class,
+ UpdateInternalProductResponse.Builder::product)
+ .handleResponseHeaderString(
+ "opc-request-id", UpdateInternalProductResponse.Builder::opcRequestId)
+ .handleResponseHeaderString("etag", UpdateInternalProductResponse.Builder::etag)
+ .callAsync(handler);
+ }
+
+ /**
+ * Create a new client instance.
+ *
+ * @param authenticationDetailsProvider The authentication details (see {@link Builder#build})
+ * @deprecated Use the {@link #builder() builder} instead.
+ */
+ @Deprecated
+ public ProductInternalAsyncClient(
+ com.oracle.bmc.auth.BasicAuthenticationDetailsProvider authenticationDetailsProvider) {
+ this(builder(), authenticationDetailsProvider);
+ }
+
+ /**
+ * Create a new client instance.
+ *
+ * @param authenticationDetailsProvider The authentication details (see {@link Builder#build})
+ * @param configuration {@link Builder#configuration}
+ * @deprecated Use the {@link #builder() builder} instead.
+ */
+ @Deprecated
+ public ProductInternalAsyncClient(
+ com.oracle.bmc.auth.BasicAuthenticationDetailsProvider authenticationDetailsProvider,
+ com.oracle.bmc.ClientConfiguration configuration) {
+ this(builder().configuration(configuration), authenticationDetailsProvider);
+ }
+
+ /**
+ * Create a new client instance.
+ *
+ * @param authenticationDetailsProvider The authentication details (see {@link Builder#build})
+ * @param configuration {@link Builder#configuration}
+ * @param clientConfigurator {@link Builder#clientConfigurator}
+ * @deprecated Use the {@link #builder() builder} instead.
+ */
+ @Deprecated
+ public ProductInternalAsyncClient(
+ com.oracle.bmc.auth.BasicAuthenticationDetailsProvider authenticationDetailsProvider,
+ com.oracle.bmc.ClientConfiguration configuration,
+ com.oracle.bmc.http.ClientConfigurator clientConfigurator) {
+ this(
+ builder().configuration(configuration).clientConfigurator(clientConfigurator),
+ authenticationDetailsProvider);
+ }
+
+ /**
+ * Create a new client instance.
+ *
+ * @param authenticationDetailsProvider The authentication details (see {@link Builder#build})
+ * @param configuration {@link Builder#configuration}
+ * @param clientConfigurator {@link Builder#clientConfigurator}
+ * @param defaultRequestSignerFactory {@link Builder#requestSignerFactory}
+ * @deprecated Use the {@link #builder() builder} instead.
+ */
+ @Deprecated
+ public ProductInternalAsyncClient(
+ com.oracle.bmc.auth.AbstractAuthenticationDetailsProvider authenticationDetailsProvider,
+ com.oracle.bmc.ClientConfiguration configuration,
+ com.oracle.bmc.http.ClientConfigurator clientConfigurator,
+ com.oracle.bmc.http.signing.RequestSignerFactory defaultRequestSignerFactory) {
+ this(
+ builder()
+ .configuration(configuration)
+ .clientConfigurator(clientConfigurator)
+ .requestSignerFactory(defaultRequestSignerFactory),
+ authenticationDetailsProvider);
+ }
+
+ /**
+ * Create a new client instance.
+ *
+ * @param authenticationDetailsProvider The authentication details (see {@link Builder#build})
+ * @param configuration {@link Builder#configuration}
+ * @param clientConfigurator {@link Builder#clientConfigurator}
+ * @param defaultRequestSignerFactory {@link Builder#requestSignerFactory}
+ * @param additionalClientConfigurators {@link Builder#additionalClientConfigurators}
+ * @deprecated Use the {@link #builder() builder} instead.
+ */
+ @Deprecated
+ public ProductInternalAsyncClient(
+ com.oracle.bmc.auth.AbstractAuthenticationDetailsProvider authenticationDetailsProvider,
+ com.oracle.bmc.ClientConfiguration configuration,
+ com.oracle.bmc.http.ClientConfigurator clientConfigurator,
+ com.oracle.bmc.http.signing.RequestSignerFactory defaultRequestSignerFactory,
+ java.util.List additionalClientConfigurators) {
+ this(
+ builder()
+ .configuration(configuration)
+ .clientConfigurator(clientConfigurator)
+ .requestSignerFactory(defaultRequestSignerFactory)
+ .additionalClientConfigurators(additionalClientConfigurators),
+ authenticationDetailsProvider);
+ }
+
+ /**
+ * Create a new client instance.
+ *
+ * @param authenticationDetailsProvider The authentication details (see {@link Builder#build})
+ * @param configuration {@link Builder#configuration}
+ * @param clientConfigurator {@link Builder#clientConfigurator}
+ * @param defaultRequestSignerFactory {@link Builder#requestSignerFactory}
+ * @param additionalClientConfigurators {@link Builder#additionalClientConfigurators}
+ * @param endpoint {@link Builder#endpoint}
+ * @deprecated Use the {@link #builder() builder} instead.
+ */
+ @Deprecated
+ public ProductInternalAsyncClient(
+ com.oracle.bmc.auth.AbstractAuthenticationDetailsProvider authenticationDetailsProvider,
+ com.oracle.bmc.ClientConfiguration configuration,
+ com.oracle.bmc.http.ClientConfigurator clientConfigurator,
+ com.oracle.bmc.http.signing.RequestSignerFactory defaultRequestSignerFactory,
+ java.util.List additionalClientConfigurators,
+ String endpoint) {
+ this(
+ builder()
+ .configuration(configuration)
+ .clientConfigurator(clientConfigurator)
+ .requestSignerFactory(defaultRequestSignerFactory)
+ .additionalClientConfigurators(additionalClientConfigurators)
+ .endpoint(endpoint),
+ authenticationDetailsProvider);
+ }
+
+ /**
+ * Create a new client instance.
+ *
+ * @param authenticationDetailsProvider The authentication details (see {@link Builder#build})
+ * @param configuration {@link Builder#configuration}
+ * @param clientConfigurator {@link Builder#clientConfigurator}
+ * @param defaultRequestSignerFactory {@link Builder#requestSignerFactory}
+ * @param additionalClientConfigurators {@link Builder#additionalClientConfigurators}
+ * @param endpoint {@link Builder#endpoint}
+ * @param signingStrategyRequestSignerFactories {@link
+ * Builder#signingStrategyRequestSignerFactories}
+ * @deprecated Use the {@link #builder() builder} instead.
+ */
+ @Deprecated
+ public ProductInternalAsyncClient(
+ com.oracle.bmc.auth.AbstractAuthenticationDetailsProvider authenticationDetailsProvider,
+ com.oracle.bmc.ClientConfiguration configuration,
+ com.oracle.bmc.http.ClientConfigurator clientConfigurator,
+ com.oracle.bmc.http.signing.RequestSignerFactory defaultRequestSignerFactory,
+ java.util.Map<
+ com.oracle.bmc.http.signing.SigningStrategy,
+ com.oracle.bmc.http.signing.RequestSignerFactory>
+ signingStrategyRequestSignerFactories,
+ java.util.List additionalClientConfigurators,
+ String endpoint) {
+ this(
+ builder()
+ .configuration(configuration)
+ .clientConfigurator(clientConfigurator)
+ .requestSignerFactory(defaultRequestSignerFactory)
+ .additionalClientConfigurators(additionalClientConfigurators)
+ .endpoint(endpoint)
+ .signingStrategyRequestSignerFactories(
+ signingStrategyRequestSignerFactories),
+ authenticationDetailsProvider);
+ }
+}
diff --git a/bmc-ociproductcatalog/src/main/java/com/oracle/bmc/ociproductcatalog/ProductInternalClient.java b/bmc-ociproductcatalog/src/main/java/com/oracle/bmc/ociproductcatalog/ProductInternalClient.java
new file mode 100644
index 00000000000..97e8178b234
--- /dev/null
+++ b/bmc-ociproductcatalog/src/main/java/com/oracle/bmc/ociproductcatalog/ProductInternalClient.java
@@ -0,0 +1,427 @@
+/**
+ * Copyright (c) 2016, 2026, Oracle and/or its affiliates. All rights reserved.
+ * This software is dual-licensed to you under the Universal Permissive License (UPL) 1.0 as shown at https://oss.oracle.com/licenses/upl or Apache License 2.0 as shown at http://www.apache.org/licenses/LICENSE-2.0. You may choose either license.
+ */
+package com.oracle.bmc.ociproductcatalog;
+
+import com.oracle.bmc.util.internal.Validate;
+import com.oracle.bmc.ociproductcatalog.requests.*;
+import com.oracle.bmc.ociproductcatalog.responses.*;
+import com.oracle.bmc.circuitbreaker.CircuitBreakerConfiguration;
+import com.oracle.bmc.util.CircuitBreakerUtils;
+
+import java.util.Objects;
+
+@jakarta.annotation.Generated(value = "OracleSDKGenerator", comments = "API Version: 20250610")
+public class ProductInternalClient extends com.oracle.bmc.http.internal.BaseSyncClient
+ implements ProductInternal {
+ /** Service instance for ProductInternal. */
+ public static final com.oracle.bmc.Service SERVICE =
+ com.oracle.bmc.Services.serviceBuilder()
+ .serviceName(ProductInternalClient.class.getName())
+ .serviceEndpointPrefix("")
+ .serviceEndpointTemplate(
+ "https://cp.product-catalog.{region}.oci.{secondLevelDomain}")
+ .build();
+
+ private static final org.slf4j.Logger LOG =
+ org.slf4j.LoggerFactory.getLogger(ProductInternalClient.class);
+
+ private final ProductInternalPaginators paginators;
+
+ ProductInternalClient(
+ com.oracle.bmc.common.ClientBuilderBase, ?> builder,
+ com.oracle.bmc.auth.AbstractAuthenticationDetailsProvider
+ authenticationDetailsProvider) {
+ super(
+ builder,
+ authenticationDetailsProvider,
+ CircuitBreakerUtils.DEFAULT_CIRCUIT_BREAKER_CONFIGURATION);
+
+ this.paginators = new ProductInternalPaginators(this);
+ }
+
+ /**
+ * Create a builder for this client.
+ *
+ * @return builder
+ */
+ public static Builder builder() {
+ return new Builder(SERVICE);
+ }
+
+ /**
+ * Builder class for this client. The "authenticationDetailsProvider" is required and must be
+ * passed to the {@link #build(AbstractAuthenticationDetailsProvider)} method.
+ */
+ public static class Builder
+ extends com.oracle.bmc.common.RegionalClientBuilder {
+ private Builder(com.oracle.bmc.Service service) {
+ super(service);
+ final String packageName = "ociproductcatalog";
+ com.oracle.bmc.internal.DeveloperToolConfiguration
+ .throwDisabledServiceExceptionIfAppropriate(packageName);
+ requestSignerFactory =
+ new com.oracle.bmc.http.signing.internal.DefaultRequestSignerFactory(
+ com.oracle.bmc.http.signing.SigningStrategy.STANDARD);
+ }
+
+ /**
+ * Build the client.
+ *
+ * @param authenticationDetailsProvider authentication details provider
+ * @return the client
+ */
+ public ProductInternalClient build(
+ @jakarta.annotation.Nonnull
+ com.oracle.bmc.auth.AbstractAuthenticationDetailsProvider
+ authenticationDetailsProvider) {
+ return new ProductInternalClient(this, authenticationDetailsProvider);
+ }
+ }
+
+ @Override
+ public void setRegion(com.oracle.bmc.Region region) {
+ super.setRegion(region);
+ }
+
+ @Override
+ public void setRegion(String regionId) {
+ super.setRegion(regionId);
+ }
+
+ @Override
+ public ChangeInternalProductCompartmentResponse changeInternalProductCompartment(
+ ChangeInternalProductCompartmentRequest request) {
+
+ Validate.notBlank(request.getProductId(), "productId must not be blank");
+ Objects.requireNonNull(
+ request.getChangeProductCompartmentDetails(),
+ "changeProductCompartmentDetails is required");
+
+ return clientCall(request, ChangeInternalProductCompartmentResponse::builder)
+ .logger(LOG, "changeInternalProductCompartment")
+ .serviceDetails("ProductInternal", "ChangeInternalProductCompartment", "")
+ .method(com.oracle.bmc.http.client.Method.POST)
+ .requestBuilder(ChangeInternalProductCompartmentRequest::builder)
+ .basePath("/20250610")
+ .appendPathParam("internal")
+ .appendPathParam("product")
+ .appendPathParam(request.getProductId())
+ .appendPathParam("actions")
+ .appendPathParam("changeCompartment")
+ .accept("application/json")
+ .appendHeader("opc-request-id", request.getOpcRequestId())
+ .appendHeader("opc-retry-token", request.getOpcRetryToken())
+ .appendHeader("if-match", request.getIfMatch())
+ .operationUsesDefaultRetries()
+ .hasBody()
+ .handleResponseHeaderString(
+ "opc-request-id",
+ ChangeInternalProductCompartmentResponse.Builder::opcRequestId)
+ .callSync();
+ }
+
+ @Override
+ public CreateInternalProductResponse createInternalProduct(
+ CreateInternalProductRequest request) {
+ Objects.requireNonNull(
+ request.getCreateProductDetails(), "createProductDetails is required");
+
+ return clientCall(request, CreateInternalProductResponse::builder)
+ .logger(LOG, "createInternalProduct")
+ .serviceDetails("ProductInternal", "CreateInternalProduct", "")
+ .method(com.oracle.bmc.http.client.Method.POST)
+ .requestBuilder(CreateInternalProductRequest::builder)
+ .basePath("/20250610")
+ .appendPathParam("internal")
+ .appendPathParam("product")
+ .accept("application/json")
+ .appendHeader("opc-retry-token", request.getOpcRetryToken())
+ .appendHeader("opc-request-id", request.getOpcRequestId())
+ .operationUsesDefaultRetries()
+ .hasBody()
+ .handleBody(
+ com.oracle.bmc.ociproductcatalog.model.Product.class,
+ CreateInternalProductResponse.Builder::product)
+ .handleResponseHeaderString(
+ "opc-request-id", CreateInternalProductResponse.Builder::opcRequestId)
+ .handleResponseHeaderString("etag", CreateInternalProductResponse.Builder::etag)
+ .callSync();
+ }
+
+ @Override
+ public DeleteInternalProductResponse deleteInternalProduct(
+ DeleteInternalProductRequest request) {
+
+ Validate.notBlank(request.getProductId(), "productId must not be blank");
+
+ return clientCall(request, DeleteInternalProductResponse::builder)
+ .logger(LOG, "deleteInternalProduct")
+ .serviceDetails("ProductInternal", "DeleteInternalProduct", "")
+ .method(com.oracle.bmc.http.client.Method.DELETE)
+ .requestBuilder(DeleteInternalProductRequest::builder)
+ .basePath("/20250610")
+ .appendPathParam("internal")
+ .appendPathParam("product")
+ .appendPathParam(request.getProductId())
+ .accept("application/json")
+ .appendHeader("opc-request-id", request.getOpcRequestId())
+ .appendHeader("if-match", request.getIfMatch())
+ .operationUsesDefaultRetries()
+ .handleResponseHeaderString(
+ "opc-request-id", DeleteInternalProductResponse.Builder::opcRequestId)
+ .callSync();
+ }
+
+ @Override
+ public GetInternalProductResponse getInternalProduct(GetInternalProductRequest request) {
+
+ Validate.notBlank(request.getProductId(), "productId must not be blank");
+
+ return clientCall(request, GetInternalProductResponse::builder)
+ .logger(LOG, "getInternalProduct")
+ .serviceDetails("ProductInternal", "GetInternalProduct", "")
+ .method(com.oracle.bmc.http.client.Method.GET)
+ .requestBuilder(GetInternalProductRequest::builder)
+ .basePath("/20250610")
+ .appendPathParam("internal")
+ .appendPathParam("product")
+ .appendPathParam(request.getProductId())
+ .accept("application/json")
+ .appendHeader("opc-request-id", request.getOpcRequestId())
+ .operationUsesDefaultRetries()
+ .handleBody(
+ com.oracle.bmc.ociproductcatalog.model.Product.class,
+ GetInternalProductResponse.Builder::product)
+ .handleResponseHeaderString(
+ "opc-request-id", GetInternalProductResponse.Builder::opcRequestId)
+ .handleResponseHeaderString("etag", GetInternalProductResponse.Builder::etag)
+ .callSync();
+ }
+
+ @Override
+ public ListInternalProductsResponse listInternalProducts(ListInternalProductsRequest request) {
+ Objects.requireNonNull(request.getCompartmentId(), "compartmentId is required");
+
+ return clientCall(request, ListInternalProductsResponse::builder)
+ .logger(LOG, "listInternalProducts")
+ .serviceDetails("ProductInternal", "ListInternalProducts", "")
+ .method(com.oracle.bmc.http.client.Method.GET)
+ .requestBuilder(ListInternalProductsRequest::builder)
+ .basePath("/20250610")
+ .appendPathParam("internal")
+ .appendPathParam("products")
+ .appendQueryParam("page", request.getPage())
+ .appendQueryParam("limit", request.getLimit())
+ .appendQueryParam("name", request.getName())
+ .appendQueryParam("compartmentId", request.getCompartmentId())
+ .appendQueryParam("id", request.getId())
+ .accept("application/json")
+ .appendHeader("opc-request-id", request.getOpcRequestId())
+ .operationUsesDefaultRetries()
+ .handleBody(
+ com.oracle.bmc.ociproductcatalog.model.ProductCollection.class,
+ ListInternalProductsResponse.Builder::productCollection)
+ .handleResponseHeaderString(
+ "opc-request-id", ListInternalProductsResponse.Builder::opcRequestId)
+ .handleResponseHeaderString(
+ "opc-next-page", ListInternalProductsResponse.Builder::opcNextPage)
+ .callSync();
+ }
+
+ @Override
+ public UpdateInternalProductResponse updateInternalProduct(
+ UpdateInternalProductRequest request) {
+
+ Validate.notBlank(request.getProductId(), "productId must not be blank");
+ Objects.requireNonNull(
+ request.getUpdateProductDetails(), "updateProductDetails is required");
+
+ return clientCall(request, UpdateInternalProductResponse::builder)
+ .logger(LOG, "updateInternalProduct")
+ .serviceDetails("ProductInternal", "UpdateInternalProduct", "")
+ .method(com.oracle.bmc.http.client.Method.PUT)
+ .requestBuilder(UpdateInternalProductRequest::builder)
+ .basePath("/20250610")
+ .appendPathParam("internal")
+ .appendPathParam("product")
+ .appendPathParam(request.getProductId())
+ .accept("application/json")
+ .appendHeader("opc-request-id", request.getOpcRequestId())
+ .appendHeader("if-match", request.getIfMatch())
+ .operationUsesDefaultRetries()
+ .hasBody()
+ .handleBody(
+ com.oracle.bmc.ociproductcatalog.model.Product.class,
+ UpdateInternalProductResponse.Builder::product)
+ .handleResponseHeaderString(
+ "opc-request-id", UpdateInternalProductResponse.Builder::opcRequestId)
+ .handleResponseHeaderString("etag", UpdateInternalProductResponse.Builder::etag)
+ .callSync();
+ }
+
+ @Override
+ public ProductInternalPaginators getPaginators() {
+ return paginators;
+ }
+
+ /**
+ * Create a new client instance.
+ *
+ * @param authenticationDetailsProvider The authentication details (see {@link Builder#build})
+ * @deprecated Use the {@link #builder() builder} instead.
+ */
+ @Deprecated
+ public ProductInternalClient(
+ com.oracle.bmc.auth.BasicAuthenticationDetailsProvider authenticationDetailsProvider) {
+ this(builder(), authenticationDetailsProvider);
+ }
+
+ /**
+ * Create a new client instance.
+ *
+ * @param authenticationDetailsProvider The authentication details (see {@link Builder#build})
+ * @param configuration {@link Builder#configuration}
+ * @deprecated Use the {@link #builder() builder} instead.
+ */
+ @Deprecated
+ public ProductInternalClient(
+ com.oracle.bmc.auth.BasicAuthenticationDetailsProvider authenticationDetailsProvider,
+ com.oracle.bmc.ClientConfiguration configuration) {
+ this(builder().configuration(configuration), authenticationDetailsProvider);
+ }
+
+ /**
+ * Create a new client instance.
+ *
+ * @param authenticationDetailsProvider The authentication details (see {@link Builder#build})
+ * @param configuration {@link Builder#configuration}
+ * @param clientConfigurator {@link Builder#clientConfigurator}
+ * @deprecated Use the {@link #builder() builder} instead.
+ */
+ @Deprecated
+ public ProductInternalClient(
+ com.oracle.bmc.auth.BasicAuthenticationDetailsProvider authenticationDetailsProvider,
+ com.oracle.bmc.ClientConfiguration configuration,
+ com.oracle.bmc.http.ClientConfigurator clientConfigurator) {
+ this(
+ builder().configuration(configuration).clientConfigurator(clientConfigurator),
+ authenticationDetailsProvider);
+ }
+
+ /**
+ * Create a new client instance.
+ *
+ * @param authenticationDetailsProvider The authentication details (see {@link Builder#build})
+ * @param configuration {@link Builder#configuration}
+ * @param clientConfigurator {@link Builder#clientConfigurator}
+ * @param defaultRequestSignerFactory {@link Builder#requestSignerFactory}
+ * @deprecated Use the {@link #builder() builder} instead.
+ */
+ @Deprecated
+ public ProductInternalClient(
+ com.oracle.bmc.auth.AbstractAuthenticationDetailsProvider authenticationDetailsProvider,
+ com.oracle.bmc.ClientConfiguration configuration,
+ com.oracle.bmc.http.ClientConfigurator clientConfigurator,
+ com.oracle.bmc.http.signing.RequestSignerFactory defaultRequestSignerFactory) {
+ this(
+ builder()
+ .configuration(configuration)
+ .clientConfigurator(clientConfigurator)
+ .requestSignerFactory(defaultRequestSignerFactory),
+ authenticationDetailsProvider);
+ }
+
+ /**
+ * Create a new client instance.
+ *
+ * @param authenticationDetailsProvider The authentication details (see {@link Builder#build})
+ * @param configuration {@link Builder#configuration}
+ * @param clientConfigurator {@link Builder#clientConfigurator}
+ * @param defaultRequestSignerFactory {@link Builder#requestSignerFactory}
+ * @param additionalClientConfigurators {@link Builder#additionalClientConfigurators}
+ * @deprecated Use the {@link #builder() builder} instead.
+ */
+ @Deprecated
+ public ProductInternalClient(
+ com.oracle.bmc.auth.AbstractAuthenticationDetailsProvider authenticationDetailsProvider,
+ com.oracle.bmc.ClientConfiguration configuration,
+ com.oracle.bmc.http.ClientConfigurator clientConfigurator,
+ com.oracle.bmc.http.signing.RequestSignerFactory defaultRequestSignerFactory,
+ java.util.List additionalClientConfigurators) {
+ this(
+ builder()
+ .configuration(configuration)
+ .clientConfigurator(clientConfigurator)
+ .requestSignerFactory(defaultRequestSignerFactory)
+ .additionalClientConfigurators(additionalClientConfigurators),
+ authenticationDetailsProvider);
+ }
+
+ /**
+ * Create a new client instance.
+ *
+ * @param authenticationDetailsProvider The authentication details (see {@link Builder#build})
+ * @param configuration {@link Builder#configuration}
+ * @param clientConfigurator {@link Builder#clientConfigurator}
+ * @param defaultRequestSignerFactory {@link Builder#requestSignerFactory}
+ * @param additionalClientConfigurators {@link Builder#additionalClientConfigurators}
+ * @param endpoint {@link Builder#endpoint}
+ * @deprecated Use the {@link #builder() builder} instead.
+ */
+ @Deprecated
+ public ProductInternalClient(
+ com.oracle.bmc.auth.AbstractAuthenticationDetailsProvider authenticationDetailsProvider,
+ com.oracle.bmc.ClientConfiguration configuration,
+ com.oracle.bmc.http.ClientConfigurator clientConfigurator,
+ com.oracle.bmc.http.signing.RequestSignerFactory defaultRequestSignerFactory,
+ java.util.List additionalClientConfigurators,
+ String endpoint) {
+ this(
+ builder()
+ .configuration(configuration)
+ .clientConfigurator(clientConfigurator)
+ .requestSignerFactory(defaultRequestSignerFactory)
+ .additionalClientConfigurators(additionalClientConfigurators)
+ .endpoint(endpoint),
+ authenticationDetailsProvider);
+ }
+
+ /**
+ * Create a new client instance.
+ *
+ * @param authenticationDetailsProvider The authentication details (see {@link Builder#build})
+ * @param configuration {@link Builder#configuration}
+ * @param clientConfigurator {@link Builder#clientConfigurator}
+ * @param defaultRequestSignerFactory {@link Builder#requestSignerFactory}
+ * @param additionalClientConfigurators {@link Builder#additionalClientConfigurators}
+ * @param endpoint {@link Builder#endpoint}
+ * @param signingStrategyRequestSignerFactories {@link
+ * Builder#signingStrategyRequestSignerFactories}
+ * @deprecated Use the {@link #builder() builder} instead.
+ */
+ @Deprecated
+ public ProductInternalClient(
+ com.oracle.bmc.auth.AbstractAuthenticationDetailsProvider authenticationDetailsProvider,
+ com.oracle.bmc.ClientConfiguration configuration,
+ com.oracle.bmc.http.ClientConfigurator clientConfigurator,
+ com.oracle.bmc.http.signing.RequestSignerFactory defaultRequestSignerFactory,
+ java.util.Map<
+ com.oracle.bmc.http.signing.SigningStrategy,
+ com.oracle.bmc.http.signing.RequestSignerFactory>
+ signingStrategyRequestSignerFactories,
+ java.util.List additionalClientConfigurators,
+ String endpoint) {
+ this(
+ builder()
+ .configuration(configuration)
+ .clientConfigurator(clientConfigurator)
+ .requestSignerFactory(defaultRequestSignerFactory)
+ .additionalClientConfigurators(additionalClientConfigurators)
+ .endpoint(endpoint)
+ .signingStrategyRequestSignerFactories(
+ signingStrategyRequestSignerFactories),
+ authenticationDetailsProvider);
+ }
+}
diff --git a/bmc-ociproductcatalog/src/main/java/com/oracle/bmc/ociproductcatalog/ProductInternalPaginators.java b/bmc-ociproductcatalog/src/main/java/com/oracle/bmc/ociproductcatalog/ProductInternalPaginators.java
new file mode 100644
index 00000000000..35080845d9b
--- /dev/null
+++ b/bmc-ociproductcatalog/src/main/java/com/oracle/bmc/ociproductcatalog/ProductInternalPaginators.java
@@ -0,0 +1,162 @@
+/**
+ * Copyright (c) 2016, 2026, Oracle and/or its affiliates. All rights reserved.
+ * This software is dual-licensed to you under the Universal Permissive License (UPL) 1.0 as shown at https://oss.oracle.com/licenses/upl or Apache License 2.0 as shown at http://www.apache.org/licenses/LICENSE-2.0. You may choose either license.
+ */
+package com.oracle.bmc.ociproductcatalog;
+
+import com.oracle.bmc.ociproductcatalog.requests.*;
+import com.oracle.bmc.ociproductcatalog.responses.*;
+
+/**
+ * Collection of helper methods that can be used to provide an {@link java.lang.Iterable} interface
+ * to any list operations of ProductInternal where multiple pages of data may be fetched. Two styles
+ * of iteration are supported:
+ *
+ *
+ * - Iterating over the Response objects returned by the list operation. These are referred to
+ * as ResponseIterators, and the methods are suffixed with ResponseIterator. For example:
+ * listUsersResponseIterator
+ *
- Iterating over the resources/records being listed. These are referred to as
+ * RecordIterators, and the methods are suffixed with RecordIterator. For example:
+ * listUsersRecordIterator
+ *
+ *
+ * These iterables abstract away the need to write code to manually handle pagination via looping
+ * and using the page tokens. They will automatically fetch more data from the service when
+ * required.
+ *
+ * As an example, if we were using the ListUsers operation in IdentityService, then the {@link
+ * java.lang.Iterable} returned by calling a ResponseIterator method would iterate over the
+ * ListUsersResponse objects returned by each ListUsers call, whereas the {@link java.lang.Iterable}
+ * returned by calling a RecordIterator method would iterate over the User records and we don't have
+ * to deal with ListUsersResponse objects at all. In either case, pagination will be automatically
+ * handled so we can iterate until there are no more responses or no more resources/records
+ * available.
+ */
+@jakarta.annotation.Generated(value = "OracleSDKGenerator", comments = "API Version: 20250610")
+public class ProductInternalPaginators {
+ private final ProductInternal client;
+
+ public ProductInternalPaginators(ProductInternal client) {
+ this.client = client;
+ }
+
+ /**
+ * Creates a new iterable which will iterate over the responses received from the
+ * listInternalProducts operation. This iterable will fetch more data from the server as needed.
+ *
+ * @param request a request which can be sent to the service operation
+ * @return an {@link java.lang.Iterable} which can be used to iterate over the responses
+ * received from the service.
+ */
+ public Iterable listInternalProductsResponseIterator(
+ final ListInternalProductsRequest request) {
+ return new com.oracle.bmc.paginator.internal.ResponseIterable<
+ ListInternalProductsRequest.Builder,
+ ListInternalProductsRequest,
+ ListInternalProductsResponse>(
+ new java.util.function.Supplier() {
+ @Override
+ public ListInternalProductsRequest.Builder get() {
+ return ListInternalProductsRequest.builder().copy(request);
+ }
+ },
+ new java.util.function.Function() {
+ @Override
+ public String apply(ListInternalProductsResponse response) {
+ return response.getOpcNextPage();
+ }
+ },
+ new java.util.function.Function<
+ com.oracle.bmc.paginator.internal.RequestBuilderAndToken<
+ ListInternalProductsRequest.Builder>,
+ ListInternalProductsRequest>() {
+ @Override
+ public ListInternalProductsRequest apply(
+ com.oracle.bmc.paginator.internal.RequestBuilderAndToken<
+ ListInternalProductsRequest.Builder>
+ input) {
+ if (input.getNextPageToken() == null) {
+ return input.getRequestBuilder().build();
+ } else {
+ return input.getRequestBuilder()
+ .page(input.getNextPageToken().orElse(null))
+ .build();
+ }
+ }
+ },
+ new java.util.function.Function<
+ ListInternalProductsRequest, ListInternalProductsResponse>() {
+ @Override
+ public ListInternalProductsResponse apply(ListInternalProductsRequest request) {
+ return client.listInternalProducts(request);
+ }
+ });
+ }
+
+ /**
+ * Creates a new iterable which will iterate over the {@link
+ * com.oracle.bmc.ociproductcatalog.model.ProductSummary} objects contained in responses from
+ * the listInternalProducts operation. This iterable will fetch more data from the server as
+ * needed.
+ *
+ * @param request a request which can be sent to the service operation
+ * @return an {@link java.lang.Iterable} which can be used to iterate over the {@link
+ * com.oracle.bmc.ociproductcatalog.model.ProductSummary} objects contained in responses
+ * received from the service.
+ */
+ public Iterable
+ listInternalProductsRecordIterator(final ListInternalProductsRequest request) {
+ return new com.oracle.bmc.paginator.internal.ResponseRecordIterable<
+ ListInternalProductsRequest.Builder,
+ ListInternalProductsRequest,
+ ListInternalProductsResponse,
+ com.oracle.bmc.ociproductcatalog.model.ProductSummary>(
+ new java.util.function.Supplier() {
+ @Override
+ public ListInternalProductsRequest.Builder get() {
+ return ListInternalProductsRequest.builder().copy(request);
+ }
+ },
+ new java.util.function.Function() {
+ @Override
+ public String apply(ListInternalProductsResponse response) {
+ return response.getOpcNextPage();
+ }
+ },
+ new java.util.function.Function<
+ com.oracle.bmc.paginator.internal.RequestBuilderAndToken<
+ ListInternalProductsRequest.Builder>,
+ ListInternalProductsRequest>() {
+ @Override
+ public ListInternalProductsRequest apply(
+ com.oracle.bmc.paginator.internal.RequestBuilderAndToken<
+ ListInternalProductsRequest.Builder>
+ input) {
+ if (input.getNextPageToken() == null) {
+ return input.getRequestBuilder().build();
+ } else {
+ return input.getRequestBuilder()
+ .page(input.getNextPageToken().orElse(null))
+ .build();
+ }
+ }
+ },
+ new java.util.function.Function<
+ ListInternalProductsRequest, ListInternalProductsResponse>() {
+ @Override
+ public ListInternalProductsResponse apply(ListInternalProductsRequest request) {
+ return client.listInternalProducts(request);
+ }
+ },
+ new java.util.function.Function<
+ ListInternalProductsResponse,
+ java.util.List>() {
+ @Override
+ public java.util.List
+ apply(ListInternalProductsResponse response) {
+ return response.getProductCollection().getItems();
+ }
+ });
+ }
+}
diff --git a/bmc-ociproductcatalog/src/main/java/com/oracle/bmc/ociproductcatalog/ProductPaginators.java b/bmc-ociproductcatalog/src/main/java/com/oracle/bmc/ociproductcatalog/ProductPaginators.java
new file mode 100644
index 00000000000..a009a46a124
--- /dev/null
+++ b/bmc-ociproductcatalog/src/main/java/com/oracle/bmc/ociproductcatalog/ProductPaginators.java
@@ -0,0 +1,157 @@
+/**
+ * Copyright (c) 2016, 2026, Oracle and/or its affiliates. All rights reserved.
+ * This software is dual-licensed to you under the Universal Permissive License (UPL) 1.0 as shown at https://oss.oracle.com/licenses/upl or Apache License 2.0 as shown at http://www.apache.org/licenses/LICENSE-2.0. You may choose either license.
+ */
+package com.oracle.bmc.ociproductcatalog;
+
+import com.oracle.bmc.ociproductcatalog.requests.*;
+import com.oracle.bmc.ociproductcatalog.responses.*;
+
+/**
+ * Collection of helper methods that can be used to provide an {@link java.lang.Iterable} interface
+ * to any list operations of Product where multiple pages of data may be fetched. Two styles of
+ * iteration are supported:
+ *
+ *
+ * - Iterating over the Response objects returned by the list operation. These are referred to
+ * as ResponseIterators, and the methods are suffixed with ResponseIterator. For example:
+ * listUsersResponseIterator
+ *
- Iterating over the resources/records being listed. These are referred to as
+ * RecordIterators, and the methods are suffixed with RecordIterator. For example:
+ * listUsersRecordIterator
+ *
+ *
+ * These iterables abstract away the need to write code to manually handle pagination via looping
+ * and using the page tokens. They will automatically fetch more data from the service when
+ * required.
+ *
+ * As an example, if we were using the ListUsers operation in IdentityService, then the {@link
+ * java.lang.Iterable} returned by calling a ResponseIterator method would iterate over the
+ * ListUsersResponse objects returned by each ListUsers call, whereas the {@link java.lang.Iterable}
+ * returned by calling a RecordIterator method would iterate over the User records and we don't have
+ * to deal with ListUsersResponse objects at all. In either case, pagination will be automatically
+ * handled so we can iterate until there are no more responses or no more resources/records
+ * available.
+ */
+@jakarta.annotation.Generated(value = "OracleSDKGenerator", comments = "API Version: 20250610")
+public class ProductPaginators {
+ private final Product client;
+
+ public ProductPaginators(Product client) {
+ this.client = client;
+ }
+
+ /**
+ * Creates a new iterable which will iterate over the responses received from the listProducts
+ * operation. This iterable will fetch more data from the server as needed.
+ *
+ * @param request a request which can be sent to the service operation
+ * @return an {@link java.lang.Iterable} which can be used to iterate over the responses
+ * received from the service.
+ */
+ public Iterable listProductsResponseIterator(
+ final ListProductsRequest request) {
+ return new com.oracle.bmc.paginator.internal.ResponseIterable<
+ ListProductsRequest.Builder, ListProductsRequest, ListProductsResponse>(
+ new java.util.function.Supplier() {
+ @Override
+ public ListProductsRequest.Builder get() {
+ return ListProductsRequest.builder().copy(request);
+ }
+ },
+ new java.util.function.Function() {
+ @Override
+ public String apply(ListProductsResponse response) {
+ return response.getOpcNextPage();
+ }
+ },
+ new java.util.function.Function<
+ com.oracle.bmc.paginator.internal.RequestBuilderAndToken<
+ ListProductsRequest.Builder>,
+ ListProductsRequest>() {
+ @Override
+ public ListProductsRequest apply(
+ com.oracle.bmc.paginator.internal.RequestBuilderAndToken<
+ ListProductsRequest.Builder>
+ input) {
+ if (input.getNextPageToken() == null) {
+ return input.getRequestBuilder().build();
+ } else {
+ return input.getRequestBuilder()
+ .page(input.getNextPageToken().orElse(null))
+ .build();
+ }
+ }
+ },
+ new java.util.function.Function() {
+ @Override
+ public ListProductsResponse apply(ListProductsRequest request) {
+ return client.listProducts(request);
+ }
+ });
+ }
+
+ /**
+ * Creates a new iterable which will iterate over the {@link
+ * com.oracle.bmc.ociproductcatalog.model.ProductSummary} objects contained in responses from
+ * the listProducts operation. This iterable will fetch more data from the server as needed.
+ *
+ * @param request a request which can be sent to the service operation
+ * @return an {@link java.lang.Iterable} which can be used to iterate over the {@link
+ * com.oracle.bmc.ociproductcatalog.model.ProductSummary} objects contained in responses
+ * received from the service.
+ */
+ public Iterable
+ listProductsRecordIterator(final ListProductsRequest request) {
+ return new com.oracle.bmc.paginator.internal.ResponseRecordIterable<
+ ListProductsRequest.Builder,
+ ListProductsRequest,
+ ListProductsResponse,
+ com.oracle.bmc.ociproductcatalog.model.ProductSummary>(
+ new java.util.function.Supplier() {
+ @Override
+ public ListProductsRequest.Builder get() {
+ return ListProductsRequest.builder().copy(request);
+ }
+ },
+ new java.util.function.Function() {
+ @Override
+ public String apply(ListProductsResponse response) {
+ return response.getOpcNextPage();
+ }
+ },
+ new java.util.function.Function<
+ com.oracle.bmc.paginator.internal.RequestBuilderAndToken<
+ ListProductsRequest.Builder>,
+ ListProductsRequest>() {
+ @Override
+ public ListProductsRequest apply(
+ com.oracle.bmc.paginator.internal.RequestBuilderAndToken<
+ ListProductsRequest.Builder>
+ input) {
+ if (input.getNextPageToken() == null) {
+ return input.getRequestBuilder().build();
+ } else {
+ return input.getRequestBuilder()
+ .page(input.getNextPageToken().orElse(null))
+ .build();
+ }
+ }
+ },
+ new java.util.function.Function() {
+ @Override
+ public ListProductsResponse apply(ListProductsRequest request) {
+ return client.listProducts(request);
+ }
+ },
+ new java.util.function.Function<
+ ListProductsResponse,
+ java.util.List>() {
+ @Override
+ public java.util.List
+ apply(ListProductsResponse response) {
+ return response.getProductCollection().getItems();
+ }
+ });
+ }
+}
diff --git a/bmc-ociproductcatalog/src/main/java/com/oracle/bmc/ociproductcatalog/ProductWaiters.java b/bmc-ociproductcatalog/src/main/java/com/oracle/bmc/ociproductcatalog/ProductWaiters.java
new file mode 100644
index 00000000000..d8cdcd9dde9
--- /dev/null
+++ b/bmc-ociproductcatalog/src/main/java/com/oracle/bmc/ociproductcatalog/ProductWaiters.java
@@ -0,0 +1,124 @@
+/**
+ * Copyright (c) 2016, 2026, Oracle and/or its affiliates. All rights reserved.
+ * This software is dual-licensed to you under the Universal Permissive License (UPL) 1.0 as shown at https://oss.oracle.com/licenses/upl or Apache License 2.0 as shown at http://www.apache.org/licenses/LICENSE-2.0. You may choose either license.
+ */
+package com.oracle.bmc.ociproductcatalog;
+
+import com.oracle.bmc.ociproductcatalog.requests.*;
+import com.oracle.bmc.ociproductcatalog.responses.*;
+
+/**
+ * Collection of helper methods to produce {@link com.oracle.bmc.waiter.Waiter}s for different
+ * resources of Product.
+ *
+ * The default configuration used is defined by {@link
+ * com.oracle.bmc.waiter.Waiters.Waiters#DEFAULT_POLLING_WAITER}.
+ */
+@jakarta.annotation.Generated(value = "OracleSDKGenerator", comments = "API Version: 20250610")
+public class ProductWaiters {
+ private final java.util.concurrent.ExecutorService executorService;
+ private final Product client;
+
+ public ProductWaiters(java.util.concurrent.ExecutorService executorService, Product client) {
+ this.executorService = executorService;
+ this.client = client;
+ }
+
+ /**
+ * Creates a new {@link com.oracle.bmc.waiter.Waiter} using the default configuration.
+ *
+ * @param request the request to send
+ * @param targetStates the desired states to wait for. If multiple states are provided then the
+ * waiter will return once the resource reaches any of the provided states
+ * @return a new {@code Waiter} instance
+ */
+ public com.oracle.bmc.waiter.Waiter forProduct(
+ GetProductRequest request,
+ com.oracle.bmc.ociproductcatalog.model.Product.LifecycleState... targetStates) {
+ com.oracle.bmc.util.internal.Validate.notEmpty(
+ targetStates, "At least one targetState must be provided");
+ com.oracle.bmc.util.internal.Validate.noNullElements(
+ targetStates, "Null targetState values are not permitted");
+
+ return forProduct(
+ com.oracle.bmc.waiter.Waiters.DEFAULT_POLLING_WAITER, request, targetStates);
+ }
+
+ /**
+ * Creates a new {@link com.oracle.bmc.waiter.Waiter} using the provided configuration.
+ *
+ * @param request the request to send
+ * @param targetState the desired state to wait for
+ * @param terminationStrategy the {@link com.oracle.bmc.waiter.TerminationStrategy} to use
+ * @param delayStrategy the {@link com.oracle.bmc.waiter.DelayStrategy} to use
+ * @return a new {@code com.oracle.bmc.waiter.Waiter} instance
+ */
+ public com.oracle.bmc.waiter.Waiter forProduct(
+ GetProductRequest request,
+ com.oracle.bmc.ociproductcatalog.model.Product.LifecycleState targetState,
+ com.oracle.bmc.waiter.TerminationStrategy terminationStrategy,
+ com.oracle.bmc.waiter.DelayStrategy delayStrategy) {
+ com.oracle.bmc.util.internal.Validate.notNull(
+ targetState, "The targetState cannot be null");
+
+ return forProduct(
+ com.oracle.bmc.waiter.Waiters.newWaiter(terminationStrategy, delayStrategy),
+ request,
+ targetState);
+ }
+
+ /**
+ * Creates a new {@link com.oracle.bmc.waiter.Waiter} using the provided configuration.
+ *
+ * @param request the request to send
+ * @param terminationStrategy the {@link com.oracle.bmc.waiter.TerminationStrategy} to use
+ * @param delayStrategy the {@link com.oracle.bmc.waiter.DelayStrategy} to use
+ * @param targetStates the desired states to wait for. The waiter will return once the resource
+ * reaches any of the provided states
+ * @return a new {@code com.oracle.bmc.waiter.Waiter} instance
+ */
+ public com.oracle.bmc.waiter.Waiter forProduct(
+ GetProductRequest request,
+ com.oracle.bmc.waiter.TerminationStrategy terminationStrategy,
+ com.oracle.bmc.waiter.DelayStrategy delayStrategy,
+ com.oracle.bmc.ociproductcatalog.model.Product.LifecycleState... targetStates) {
+ com.oracle.bmc.util.internal.Validate.notEmpty(
+ targetStates, "At least one target state must be provided");
+ com.oracle.bmc.util.internal.Validate.noNullElements(
+ targetStates, "Null target states are not permitted");
+
+ return forProduct(
+ com.oracle.bmc.waiter.Waiters.newWaiter(terminationStrategy, delayStrategy),
+ request,
+ targetStates);
+ }
+
+ // Helper method to create a new Waiter for Product.
+ private com.oracle.bmc.waiter.Waiter forProduct(
+ com.oracle.bmc.waiter.BmcGenericWaiter waiter,
+ final GetProductRequest request,
+ final com.oracle.bmc.ociproductcatalog.model.Product.LifecycleState... targetStates) {
+ final java.util.Set
+ targetStatesSet = new java.util.HashSet<>(java.util.Arrays.asList(targetStates));
+
+ return new com.oracle.bmc.waiter.internal.SimpleWaiterImpl<>(
+ executorService,
+ waiter.toCallable(
+ () -> request,
+ new java.util.function.Function() {
+ @Override
+ public GetProductResponse apply(GetProductRequest request) {
+ return client.getProduct(request);
+ }
+ },
+ new java.util.function.Predicate() {
+ @Override
+ public boolean test(GetProductResponse response) {
+ return targetStatesSet.contains(
+ response.getProduct().getLifecycleState());
+ }
+ },
+ false),
+ request);
+ }
+}
diff --git a/bmc-ociproductcatalog/src/main/java/com/oracle/bmc/ociproductcatalog/model/AdminProduct.java b/bmc-ociproductcatalog/src/main/java/com/oracle/bmc/ociproductcatalog/model/AdminProduct.java
new file mode 100644
index 00000000000..070e3f5f194
--- /dev/null
+++ b/bmc-ociproductcatalog/src/main/java/com/oracle/bmc/ociproductcatalog/model/AdminProduct.java
@@ -0,0 +1,957 @@
+/**
+ * Copyright (c) 2016, 2026, Oracle and/or its affiliates. All rights reserved.
+ * This software is dual-licensed to you under the Universal Permissive License (UPL) 1.0 as shown at https://oss.oracle.com/licenses/upl or Apache License 2.0 as shown at http://www.apache.org/licenses/LICENSE-2.0. You may choose either license.
+ */
+package com.oracle.bmc.ociproductcatalog.model;
+
+/**
+ * The properties of a product
+ * Note: Objects should always be created or deserialized using the {@link Builder}. This model
+ * distinguishes fields that are {@code null} because they are unset from fields that are explicitly
+ * set to {@code null}. This is done in the setter methods of the {@link Builder}, which maintain a
+ * set of all explicitly set fields called {@link Builder#__explicitlySet__}. The {@link
+ * #hashCode()} and {@link #equals(Object)} methods are implemented to take the explicitly set
+ * fields into account. The constructor, on the other hand, does not take the explicitly set fields
+ * into account (since the constructor cannot distinguish explicit {@code null} from unset {@code
+ * null}).
+ */
+@jakarta.annotation.Generated(value = "OracleSDKGenerator", comments = "API Version: 20250610")
+@com.fasterxml.jackson.databind.annotation.JsonDeserialize(builder = AdminProduct.Builder.class)
+@com.fasterxml.jackson.annotation.JsonFilter(
+ com.oracle.bmc.http.client.internal.ExplicitlySetBmcModel.EXPLICITLY_SET_FILTER_NAME)
+public final class AdminProduct extends com.oracle.bmc.http.client.internal.ExplicitlySetBmcModel {
+ @Deprecated
+ @java.beans.ConstructorProperties({
+ "id",
+ "compartmentId",
+ "name",
+ "description",
+ "lifecycleState",
+ "lifecycleDetails",
+ "meterwithSKUs",
+ "serviceName",
+ "limits",
+ "timeCreated",
+ "timeUpdated",
+ "timeReady",
+ "timeLaunched",
+ "isExcluded",
+ "timeExcluded",
+ "freeformTags",
+ "definedTags",
+ "systemTags"
+ })
+ public AdminProduct(
+ String id,
+ String compartmentId,
+ String name,
+ String description,
+ LifecycleState lifecycleState,
+ String lifecycleDetails,
+ java.util.List meterwithSKUs,
+ String serviceName,
+ java.util.List limits,
+ java.util.Date timeCreated,
+ java.util.Date timeUpdated,
+ java.util.Date timeReady,
+ java.util.Date timeLaunched,
+ Boolean isExcluded,
+ java.util.Date timeExcluded,
+ java.util.Map freeformTags,
+ java.util.Map> definedTags,
+ java.util.Map> systemTags) {
+ super();
+ this.id = id;
+ this.compartmentId = compartmentId;
+ this.name = name;
+ this.description = description;
+ this.lifecycleState = lifecycleState;
+ this.lifecycleDetails = lifecycleDetails;
+ this.meterwithSKUs = meterwithSKUs;
+ this.serviceName = serviceName;
+ this.limits = limits;
+ this.timeCreated = timeCreated;
+ this.timeUpdated = timeUpdated;
+ this.timeReady = timeReady;
+ this.timeLaunched = timeLaunched;
+ this.isExcluded = isExcluded;
+ this.timeExcluded = timeExcluded;
+ this.freeformTags = freeformTags;
+ this.definedTags = definedTags;
+ this.systemTags = systemTags;
+ }
+
+ @com.fasterxml.jackson.databind.annotation.JsonPOJOBuilder(withPrefix = "")
+ public static class Builder {
+ /** OCID of the product */
+ @com.fasterxml.jackson.annotation.JsonProperty("id")
+ private String id;
+
+ /**
+ * OCID of the product
+ *
+ * @param id the value to set
+ * @return this builder
+ */
+ public Builder id(String id) {
+ this.id = id;
+ this.__explicitlySet__.add("id");
+ return this;
+ }
+ /**
+ * The OCID of the compartment (remember that the tenancy is simply the root compartment).
+ */
+ @com.fasterxml.jackson.annotation.JsonProperty("compartmentId")
+ private String compartmentId;
+
+ /**
+ * The OCID of the compartment (remember that the tenancy is simply the root compartment).
+ *
+ * @param compartmentId the value to set
+ * @return this builder
+ */
+ public Builder compartmentId(String compartmentId) {
+ this.compartmentId = compartmentId;
+ this.__explicitlySet__.add("compartmentId");
+ return this;
+ }
+ /** Name of the product, defined by service teams. Unique within one service */
+ @com.fasterxml.jackson.annotation.JsonProperty("name")
+ private String name;
+
+ /**
+ * Name of the product, defined by service teams. Unique within one service
+ *
+ * @param name the value to set
+ * @return this builder
+ */
+ public Builder name(String name) {
+ this.name = name;
+ this.__explicitlySet__.add("name");
+ return this;
+ }
+ /** description to the product */
+ @com.fasterxml.jackson.annotation.JsonProperty("description")
+ private String description;
+
+ /**
+ * description to the product
+ *
+ * @param description the value to set
+ * @return this builder
+ */
+ public Builder description(String description) {
+ this.description = description;
+ this.__explicitlySet__.add("description");
+ return this;
+ }
+ /**
+ * The status of a product following the OCI standard. ACTIVE: resources of this product can
+ * be used by the end customer. INACTIVE: resources of this product can't be used by the end
+ * customer. Product needs manual approval. NEEDS_ATTENTION: operator action is needed.
+ */
+ @com.fasterxml.jackson.annotation.JsonProperty("lifecycleState")
+ private LifecycleState lifecycleState;
+
+ /**
+ * The status of a product following the OCI standard. ACTIVE: resources of this product can
+ * be used by the end customer. INACTIVE: resources of this product can't be used by the end
+ * customer. Product needs manual approval. NEEDS_ATTENTION: operator action is needed.
+ *
+ * @param lifecycleState the value to set
+ * @return this builder
+ */
+ public Builder lifecycleState(LifecycleState lifecycleState) {
+ this.lifecycleState = lifecycleState;
+ this.__explicitlySet__.add("lifecycleState");
+ return this;
+ }
+ /**
+ * The displayed status of a product. lifecycleState to lifecycleDetails mapping: INACTIVE
+ * -> "Not yet launched" ACTIVE -> "Launched" NEEDS_ATTENTION -> "Pricing not set"
+ */
+ @com.fasterxml.jackson.annotation.JsonProperty("lifecycleDetails")
+ private String lifecycleDetails;
+
+ /**
+ * The displayed status of a product. lifecycleState to lifecycleDetails mapping: INACTIVE
+ * -> "Not yet launched" ACTIVE -> "Launched" NEEDS_ATTENTION -> "Pricing not set"
+ *
+ * @param lifecycleDetails the value to set
+ * @return this builder
+ */
+ public Builder lifecycleDetails(String lifecycleDetails) {
+ this.lifecycleDetails = lifecycleDetails;
+ this.__explicitlySet__.add("lifecycleDetails");
+ return this;
+ }
+ /** List of meters associated with this product, including SKU information */
+ @com.fasterxml.jackson.annotation.JsonProperty("meterwithSKUs")
+ private java.util.List meterwithSKUs;
+
+ /**
+ * List of meters associated with this product, including SKU information
+ *
+ * @param meterwithSKUs the value to set
+ * @return this builder
+ */
+ public Builder meterwithSKUs(java.util.List meterwithSKUs) {
+ this.meterwithSKUs = meterwithSKUs;
+ this.__explicitlySet__.add("meterwithSKUs");
+ return this;
+ }
+ /** Name of the metering service this product relates to. */
+ @com.fasterxml.jackson.annotation.JsonProperty("serviceName")
+ private String serviceName;
+
+ /**
+ * Name of the metering service this product relates to.
+ *
+ * @param serviceName the value to set
+ * @return this builder
+ */
+ public Builder serviceName(String serviceName) {
+ this.serviceName = serviceName;
+ this.__explicitlySet__.add("serviceName");
+ return this;
+ }
+ /** List of limits that this product is associated with. */
+ @com.fasterxml.jackson.annotation.JsonProperty("limits")
+ private java.util.List limits;
+
+ /**
+ * List of limits that this product is associated with.
+ *
+ * @param limits the value to set
+ * @return this builder
+ */
+ public Builder limits(java.util.List limits) {
+ this.limits = limits;
+ this.__explicitlySet__.add("limits");
+ return this;
+ }
+ /** Date and time when the product was created Example: {@code 2022-01-25T21:10:29.600Z} */
+ @com.fasterxml.jackson.annotation.JsonProperty("timeCreated")
+ private java.util.Date timeCreated;
+
+ /**
+ * Date and time when the product was created Example: {@code 2022-01-25T21:10:29.600Z}
+ *
+ * @param timeCreated the value to set
+ * @return this builder
+ */
+ public Builder timeCreated(java.util.Date timeCreated) {
+ this.timeCreated = timeCreated;
+ this.__explicitlySet__.add("timeCreated");
+ return this;
+ }
+ /**
+ * Date and time when the product was updated. Nullable Example: {@code
+ * 2022-01-25T21:10:29.600Z}
+ */
+ @com.fasterxml.jackson.annotation.JsonProperty("timeUpdated")
+ private java.util.Date timeUpdated;
+
+ /**
+ * Date and time when the product was updated. Nullable Example: {@code
+ * 2022-01-25T21:10:29.600Z}
+ *
+ * @param timeUpdated the value to set
+ * @return this builder
+ */
+ public Builder timeUpdated(java.util.Date timeUpdated) {
+ this.timeUpdated = timeUpdated;
+ this.__explicitlySet__.add("timeUpdated");
+ return this;
+ }
+ /**
+ * Date and time when the product was set to ready. Nullable Example: {@code
+ * 2022-01-25T21:10:29.600Z}
+ */
+ @com.fasterxml.jackson.annotation.JsonProperty("timeReady")
+ private java.util.Date timeReady;
+
+ /**
+ * Date and time when the product was set to ready. Nullable Example: {@code
+ * 2022-01-25T21:10:29.600Z}
+ *
+ * @param timeReady the value to set
+ * @return this builder
+ */
+ public Builder timeReady(java.util.Date timeReady) {
+ this.timeReady = timeReady;
+ this.__explicitlySet__.add("timeReady");
+ return this;
+ }
+ /**
+ * Date and time when the product was launched. Nullable Example: {@code
+ * 2022-01-25T21:10:29.600Z}
+ */
+ @com.fasterxml.jackson.annotation.JsonProperty("timeLaunched")
+ private java.util.Date timeLaunched;
+
+ /**
+ * Date and time when the product was launched. Nullable Example: {@code
+ * 2022-01-25T21:10:29.600Z}
+ *
+ * @param timeLaunched the value to set
+ * @return this builder
+ */
+ public Builder timeLaunched(java.util.Date timeLaunched) {
+ this.timeLaunched = timeLaunched;
+ this.__explicitlySet__.add("timeLaunched");
+ return this;
+ }
+ /**
+ * Whether the product is currently excluded from SKU processing flows. Nullable when the
+ * exclusion flag has not been explicitly set.
+ */
+ @com.fasterxml.jackson.annotation.JsonProperty("isExcluded")
+ private Boolean isExcluded;
+
+ /**
+ * Whether the product is currently excluded from SKU processing flows. Nullable when the
+ * exclusion flag has not been explicitly set.
+ *
+ * @param isExcluded the value to set
+ * @return this builder
+ */
+ public Builder isExcluded(Boolean isExcluded) {
+ this.isExcluded = isExcluded;
+ this.__explicitlySet__.add("isExcluded");
+ return this;
+ }
+ /**
+ * Date and time when the product was marked as excluded. Nullable Example: {@code
+ * 2022-01-25T21:10:29.600Z}
+ */
+ @com.fasterxml.jackson.annotation.JsonProperty("timeExcluded")
+ private java.util.Date timeExcluded;
+
+ /**
+ * Date and time when the product was marked as excluded. Nullable Example: {@code
+ * 2022-01-25T21:10:29.600Z}
+ *
+ * @param timeExcluded the value to set
+ * @return this builder
+ */
+ public Builder timeExcluded(java.util.Date timeExcluded) {
+ this.timeExcluded = timeExcluded;
+ this.__explicitlySet__.add("timeExcluded");
+ return this;
+ }
+ /**
+ * Free-form tags for this resource. Each tag is a simple key-value pair with no predefined
+ * name, type, or namespace. For more information, see [Resource
+ * Tags](https://docs.oracle.com/iaas/Content/General/Concepts/resourcetags.htm).
+ *
+ * Example: {@code {"Department": "Finance"}}
+ */
+ @com.fasterxml.jackson.annotation.JsonProperty("freeformTags")
+ private java.util.Map freeformTags;
+
+ /**
+ * Free-form tags for this resource. Each tag is a simple key-value pair with no predefined
+ * name, type, or namespace. For more information, see [Resource
+ * Tags](https://docs.oracle.com/iaas/Content/General/Concepts/resourcetags.htm).
+ *
+ * Example: {@code {"Department": "Finance"}}
+ *
+ * @param freeformTags the value to set
+ * @return this builder
+ */
+ public Builder freeformTags(java.util.Map freeformTags) {
+ this.freeformTags = freeformTags;
+ this.__explicitlySet__.add("freeformTags");
+ return this;
+ }
+ /**
+ * Defined tags for this resource. Each key is predefined and scoped to a namespace. For
+ * more information, see [Resource
+ * Tags](https://docs.oracle.com/iaas/Content/General/Concepts/resourcetags.htm).
+ *
+ * Example: {@code {"Operations": {"CostCenter": "42"}}}
+ */
+ @com.fasterxml.jackson.annotation.JsonProperty("definedTags")
+ private java.util.Map> definedTags;
+
+ /**
+ * Defined tags for this resource. Each key is predefined and scoped to a namespace. For
+ * more information, see [Resource
+ * Tags](https://docs.oracle.com/iaas/Content/General/Concepts/resourcetags.htm).
+ *
+ * Example: {@code {"Operations": {"CostCenter": "42"}}}
+ *
+ * @param definedTags the value to set
+ * @return this builder
+ */
+ public Builder definedTags(
+ java.util.Map> definedTags) {
+ this.definedTags = definedTags;
+ this.__explicitlySet__.add("definedTags");
+ return this;
+ }
+ /**
+ * System tags for this resource. Each key is predefined and scoped to a namespace.
+ *
+ * Example: {@code {"orcl-cloud": {"free-tier-retained": "true"}}}
+ */
+ @com.fasterxml.jackson.annotation.JsonProperty("systemTags")
+ private java.util.Map> systemTags;
+
+ /**
+ * System tags for this resource. Each key is predefined and scoped to a namespace.
+ *
+ * Example: {@code {"orcl-cloud": {"free-tier-retained": "true"}}}
+ *
+ * @param systemTags the value to set
+ * @return this builder
+ */
+ public Builder systemTags(java.util.Map> systemTags) {
+ this.systemTags = systemTags;
+ this.__explicitlySet__.add("systemTags");
+ return this;
+ }
+
+ @com.fasterxml.jackson.annotation.JsonIgnore
+ private final java.util.Set __explicitlySet__ = new java.util.HashSet();
+
+ public AdminProduct build() {
+ AdminProduct model =
+ new AdminProduct(
+ this.id,
+ this.compartmentId,
+ this.name,
+ this.description,
+ this.lifecycleState,
+ this.lifecycleDetails,
+ this.meterwithSKUs,
+ this.serviceName,
+ this.limits,
+ this.timeCreated,
+ this.timeUpdated,
+ this.timeReady,
+ this.timeLaunched,
+ this.isExcluded,
+ this.timeExcluded,
+ this.freeformTags,
+ this.definedTags,
+ this.systemTags);
+ for (String explicitlySetProperty : this.__explicitlySet__) {
+ model.markPropertyAsExplicitlySet(explicitlySetProperty);
+ }
+ return model;
+ }
+
+ @com.fasterxml.jackson.annotation.JsonIgnore
+ public Builder copy(AdminProduct model) {
+ if (model.wasPropertyExplicitlySet("id")) {
+ this.id(model.getId());
+ }
+ if (model.wasPropertyExplicitlySet("compartmentId")) {
+ this.compartmentId(model.getCompartmentId());
+ }
+ if (model.wasPropertyExplicitlySet("name")) {
+ this.name(model.getName());
+ }
+ if (model.wasPropertyExplicitlySet("description")) {
+ this.description(model.getDescription());
+ }
+ if (model.wasPropertyExplicitlySet("lifecycleState")) {
+ this.lifecycleState(model.getLifecycleState());
+ }
+ if (model.wasPropertyExplicitlySet("lifecycleDetails")) {
+ this.lifecycleDetails(model.getLifecycleDetails());
+ }
+ if (model.wasPropertyExplicitlySet("meterwithSKUs")) {
+ this.meterwithSKUs(model.getMeterwithSKUs());
+ }
+ if (model.wasPropertyExplicitlySet("serviceName")) {
+ this.serviceName(model.getServiceName());
+ }
+ if (model.wasPropertyExplicitlySet("limits")) {
+ this.limits(model.getLimits());
+ }
+ if (model.wasPropertyExplicitlySet("timeCreated")) {
+ this.timeCreated(model.getTimeCreated());
+ }
+ if (model.wasPropertyExplicitlySet("timeUpdated")) {
+ this.timeUpdated(model.getTimeUpdated());
+ }
+ if (model.wasPropertyExplicitlySet("timeReady")) {
+ this.timeReady(model.getTimeReady());
+ }
+ if (model.wasPropertyExplicitlySet("timeLaunched")) {
+ this.timeLaunched(model.getTimeLaunched());
+ }
+ if (model.wasPropertyExplicitlySet("isExcluded")) {
+ this.isExcluded(model.getIsExcluded());
+ }
+ if (model.wasPropertyExplicitlySet("timeExcluded")) {
+ this.timeExcluded(model.getTimeExcluded());
+ }
+ if (model.wasPropertyExplicitlySet("freeformTags")) {
+ this.freeformTags(model.getFreeformTags());
+ }
+ if (model.wasPropertyExplicitlySet("definedTags")) {
+ this.definedTags(model.getDefinedTags());
+ }
+ if (model.wasPropertyExplicitlySet("systemTags")) {
+ this.systemTags(model.getSystemTags());
+ }
+ return this;
+ }
+ }
+
+ /** Create a new builder. */
+ public static Builder builder() {
+ return new Builder();
+ }
+
+ public Builder toBuilder() {
+ return new Builder().copy(this);
+ }
+
+ /** OCID of the product */
+ @com.fasterxml.jackson.annotation.JsonProperty("id")
+ private final String id;
+
+ /**
+ * OCID of the product
+ *
+ * @return the value
+ */
+ public String getId() {
+ return id;
+ }
+
+ /** The OCID of the compartment (remember that the tenancy is simply the root compartment). */
+ @com.fasterxml.jackson.annotation.JsonProperty("compartmentId")
+ private final String compartmentId;
+
+ /**
+ * The OCID of the compartment (remember that the tenancy is simply the root compartment).
+ *
+ * @return the value
+ */
+ public String getCompartmentId() {
+ return compartmentId;
+ }
+
+ /** Name of the product, defined by service teams. Unique within one service */
+ @com.fasterxml.jackson.annotation.JsonProperty("name")
+ private final String name;
+
+ /**
+ * Name of the product, defined by service teams. Unique within one service
+ *
+ * @return the value
+ */
+ public String getName() {
+ return name;
+ }
+
+ /** description to the product */
+ @com.fasterxml.jackson.annotation.JsonProperty("description")
+ private final String description;
+
+ /**
+ * description to the product
+ *
+ * @return the value
+ */
+ public String getDescription() {
+ return description;
+ }
+
+ /**
+ * The status of a product following the OCI standard. ACTIVE: resources of this product can be
+ * used by the end customer. INACTIVE: resources of this product can't be used by the end
+ * customer. Product needs manual approval. NEEDS_ATTENTION: operator action is needed.
+ */
+ public enum LifecycleState implements com.oracle.bmc.http.internal.BmcEnum {
+ Active("ACTIVE"),
+ Inactive("INACTIVE"),
+ NeedsAttention("NEEDS_ATTENTION"),
+
+ /**
+ * This value is used if a service returns a value for this enum that is not recognized by
+ * this version of the SDK.
+ */
+ UnknownEnumValue(null);
+
+ private static final org.slf4j.Logger LOG =
+ org.slf4j.LoggerFactory.getLogger(LifecycleState.class);
+
+ private final String value;
+ private static java.util.Map map;
+
+ static {
+ map = new java.util.HashMap<>();
+ for (LifecycleState v : LifecycleState.values()) {
+ if (v != UnknownEnumValue) {
+ map.put(v.getValue(), v);
+ }
+ }
+ }
+
+ LifecycleState(String value) {
+ this.value = value;
+ }
+
+ @com.fasterxml.jackson.annotation.JsonValue
+ public String getValue() {
+ return value;
+ }
+
+ @com.fasterxml.jackson.annotation.JsonCreator
+ public static LifecycleState create(String key) {
+ if (map.containsKey(key)) {
+ return map.get(key);
+ }
+ LOG.warn(
+ "Received unknown value '{}' for enum 'LifecycleState', returning UnknownEnumValue",
+ key);
+ return UnknownEnumValue;
+ }
+ };
+ /**
+ * The status of a product following the OCI standard. ACTIVE: resources of this product can be
+ * used by the end customer. INACTIVE: resources of this product can't be used by the end
+ * customer. Product needs manual approval. NEEDS_ATTENTION: operator action is needed.
+ */
+ @com.fasterxml.jackson.annotation.JsonProperty("lifecycleState")
+ private final LifecycleState lifecycleState;
+
+ /**
+ * The status of a product following the OCI standard. ACTIVE: resources of this product can be
+ * used by the end customer. INACTIVE: resources of this product can't be used by the end
+ * customer. Product needs manual approval. NEEDS_ATTENTION: operator action is needed.
+ *
+ * @return the value
+ */
+ public LifecycleState getLifecycleState() {
+ return lifecycleState;
+ }
+
+ /**
+ * The displayed status of a product. lifecycleState to lifecycleDetails mapping: INACTIVE ->
+ * "Not yet launched" ACTIVE -> "Launched" NEEDS_ATTENTION -> "Pricing not set"
+ */
+ @com.fasterxml.jackson.annotation.JsonProperty("lifecycleDetails")
+ private final String lifecycleDetails;
+
+ /**
+ * The displayed status of a product. lifecycleState to lifecycleDetails mapping: INACTIVE ->
+ * "Not yet launched" ACTIVE -> "Launched" NEEDS_ATTENTION -> "Pricing not set"
+ *
+ * @return the value
+ */
+ public String getLifecycleDetails() {
+ return lifecycleDetails;
+ }
+
+ /** List of meters associated with this product, including SKU information */
+ @com.fasterxml.jackson.annotation.JsonProperty("meterwithSKUs")
+ private final java.util.List meterwithSKUs;
+
+ /**
+ * List of meters associated with this product, including SKU information
+ *
+ * @return the value
+ */
+ public java.util.List getMeterwithSKUs() {
+ return meterwithSKUs;
+ }
+
+ /** Name of the metering service this product relates to. */
+ @com.fasterxml.jackson.annotation.JsonProperty("serviceName")
+ private final String serviceName;
+
+ /**
+ * Name of the metering service this product relates to.
+ *
+ * @return the value
+ */
+ public String getServiceName() {
+ return serviceName;
+ }
+
+ /** List of limits that this product is associated with. */
+ @com.fasterxml.jackson.annotation.JsonProperty("limits")
+ private final java.util.List limits;
+
+ /**
+ * List of limits that this product is associated with.
+ *
+ * @return the value
+ */
+ public java.util.List getLimits() {
+ return limits;
+ }
+
+ /** Date and time when the product was created Example: {@code 2022-01-25T21:10:29.600Z} */
+ @com.fasterxml.jackson.annotation.JsonProperty("timeCreated")
+ private final java.util.Date timeCreated;
+
+ /**
+ * Date and time when the product was created Example: {@code 2022-01-25T21:10:29.600Z}
+ *
+ * @return the value
+ */
+ public java.util.Date getTimeCreated() {
+ return timeCreated;
+ }
+
+ /**
+ * Date and time when the product was updated. Nullable Example: {@code
+ * 2022-01-25T21:10:29.600Z}
+ */
+ @com.fasterxml.jackson.annotation.JsonProperty("timeUpdated")
+ private final java.util.Date timeUpdated;
+
+ /**
+ * Date and time when the product was updated. Nullable Example: {@code
+ * 2022-01-25T21:10:29.600Z}
+ *
+ * @return the value
+ */
+ public java.util.Date getTimeUpdated() {
+ return timeUpdated;
+ }
+
+ /**
+ * Date and time when the product was set to ready. Nullable Example: {@code
+ * 2022-01-25T21:10:29.600Z}
+ */
+ @com.fasterxml.jackson.annotation.JsonProperty("timeReady")
+ private final java.util.Date timeReady;
+
+ /**
+ * Date and time when the product was set to ready. Nullable Example: {@code
+ * 2022-01-25T21:10:29.600Z}
+ *
+ * @return the value
+ */
+ public java.util.Date getTimeReady() {
+ return timeReady;
+ }
+
+ /**
+ * Date and time when the product was launched. Nullable Example: {@code
+ * 2022-01-25T21:10:29.600Z}
+ */
+ @com.fasterxml.jackson.annotation.JsonProperty("timeLaunched")
+ private final java.util.Date timeLaunched;
+
+ /**
+ * Date and time when the product was launched. Nullable Example: {@code
+ * 2022-01-25T21:10:29.600Z}
+ *
+ * @return the value
+ */
+ public java.util.Date getTimeLaunched() {
+ return timeLaunched;
+ }
+
+ /**
+ * Whether the product is currently excluded from SKU processing flows. Nullable when the
+ * exclusion flag has not been explicitly set.
+ */
+ @com.fasterxml.jackson.annotation.JsonProperty("isExcluded")
+ private final Boolean isExcluded;
+
+ /**
+ * Whether the product is currently excluded from SKU processing flows. Nullable when the
+ * exclusion flag has not been explicitly set.
+ *
+ * @return the value
+ */
+ public Boolean getIsExcluded() {
+ return isExcluded;
+ }
+
+ /**
+ * Date and time when the product was marked as excluded. Nullable Example: {@code
+ * 2022-01-25T21:10:29.600Z}
+ */
+ @com.fasterxml.jackson.annotation.JsonProperty("timeExcluded")
+ private final java.util.Date timeExcluded;
+
+ /**
+ * Date and time when the product was marked as excluded. Nullable Example: {@code
+ * 2022-01-25T21:10:29.600Z}
+ *
+ * @return the value
+ */
+ public java.util.Date getTimeExcluded() {
+ return timeExcluded;
+ }
+
+ /**
+ * Free-form tags for this resource. Each tag is a simple key-value pair with no predefined
+ * name, type, or namespace. For more information, see [Resource
+ * Tags](https://docs.oracle.com/iaas/Content/General/Concepts/resourcetags.htm).
+ *
+ * Example: {@code {"Department": "Finance"}}
+ */
+ @com.fasterxml.jackson.annotation.JsonProperty("freeformTags")
+ private final java.util.Map freeformTags;
+
+ /**
+ * Free-form tags for this resource. Each tag is a simple key-value pair with no predefined
+ * name, type, or namespace. For more information, see [Resource
+ * Tags](https://docs.oracle.com/iaas/Content/General/Concepts/resourcetags.htm).
+ *
+ * Example: {@code {"Department": "Finance"}}
+ *
+ * @return the value
+ */
+ public java.util.Map getFreeformTags() {
+ return freeformTags;
+ }
+
+ /**
+ * Defined tags for this resource. Each key is predefined and scoped to a namespace. For more
+ * information, see [Resource
+ * Tags](https://docs.oracle.com/iaas/Content/General/Concepts/resourcetags.htm).
+ *
+ * Example: {@code {"Operations": {"CostCenter": "42"}}}
+ */
+ @com.fasterxml.jackson.annotation.JsonProperty("definedTags")
+ private final java.util.Map> definedTags;
+
+ /**
+ * Defined tags for this resource. Each key is predefined and scoped to a namespace. For more
+ * information, see [Resource
+ * Tags](https://docs.oracle.com/iaas/Content/General/Concepts/resourcetags.htm).
+ *
+ * Example: {@code {"Operations": {"CostCenter": "42"}}}
+ *
+ * @return the value
+ */
+ public java.util.Map> getDefinedTags() {
+ return definedTags;
+ }
+
+ /**
+ * System tags for this resource. Each key is predefined and scoped to a namespace.
+ *
+ * Example: {@code {"orcl-cloud": {"free-tier-retained": "true"}}}
+ */
+ @com.fasterxml.jackson.annotation.JsonProperty("systemTags")
+ private final java.util.Map> systemTags;
+
+ /**
+ * System tags for this resource. Each key is predefined and scoped to a namespace.
+ *
+ * Example: {@code {"orcl-cloud": {"free-tier-retained": "true"}}}
+ *
+ * @return the value
+ */
+ public java.util.Map> getSystemTags() {
+ return systemTags;
+ }
+
+ @Override
+ public String toString() {
+ return this.toString(true);
+ }
+
+ /**
+ * Return a string representation of the object.
+ *
+ * @param includeByteArrayContents true to include the full contents of byte arrays
+ * @return string representation
+ */
+ public String toString(boolean includeByteArrayContents) {
+ java.lang.StringBuilder sb = new java.lang.StringBuilder();
+ sb.append("AdminProduct(");
+ sb.append("super=").append(super.toString());
+ sb.append("id=").append(String.valueOf(this.id));
+ sb.append(", compartmentId=").append(String.valueOf(this.compartmentId));
+ sb.append(", name=").append(String.valueOf(this.name));
+ sb.append(", description=").append(String.valueOf(this.description));
+ sb.append(", lifecycleState=").append(String.valueOf(this.lifecycleState));
+ sb.append(", lifecycleDetails=").append(String.valueOf(this.lifecycleDetails));
+ sb.append(", meterwithSKUs=").append(String.valueOf(this.meterwithSKUs));
+ sb.append(", serviceName=").append(String.valueOf(this.serviceName));
+ sb.append(", limits=").append(String.valueOf(this.limits));
+ sb.append(", timeCreated=").append(String.valueOf(this.timeCreated));
+ sb.append(", timeUpdated=").append(String.valueOf(this.timeUpdated));
+ sb.append(", timeReady=").append(String.valueOf(this.timeReady));
+ sb.append(", timeLaunched=").append(String.valueOf(this.timeLaunched));
+ sb.append(", isExcluded=").append(String.valueOf(this.isExcluded));
+ sb.append(", timeExcluded=").append(String.valueOf(this.timeExcluded));
+ sb.append(", freeformTags=").append(String.valueOf(this.freeformTags));
+ sb.append(", definedTags=").append(String.valueOf(this.definedTags));
+ sb.append(", systemTags=").append(String.valueOf(this.systemTags));
+ sb.append(")");
+ return sb.toString();
+ }
+
+ @Override
+ public boolean equals(Object o) {
+ if (this == o) {
+ return true;
+ }
+ if (!(o instanceof AdminProduct)) {
+ return false;
+ }
+
+ AdminProduct other = (AdminProduct) o;
+ return java.util.Objects.equals(this.id, other.id)
+ && java.util.Objects.equals(this.compartmentId, other.compartmentId)
+ && java.util.Objects.equals(this.name, other.name)
+ && java.util.Objects.equals(this.description, other.description)
+ && java.util.Objects.equals(this.lifecycleState, other.lifecycleState)
+ && java.util.Objects.equals(this.lifecycleDetails, other.lifecycleDetails)
+ && java.util.Objects.equals(this.meterwithSKUs, other.meterwithSKUs)
+ && java.util.Objects.equals(this.serviceName, other.serviceName)
+ && java.util.Objects.equals(this.limits, other.limits)
+ && java.util.Objects.equals(this.timeCreated, other.timeCreated)
+ && java.util.Objects.equals(this.timeUpdated, other.timeUpdated)
+ && java.util.Objects.equals(this.timeReady, other.timeReady)
+ && java.util.Objects.equals(this.timeLaunched, other.timeLaunched)
+ && java.util.Objects.equals(this.isExcluded, other.isExcluded)
+ && java.util.Objects.equals(this.timeExcluded, other.timeExcluded)
+ && java.util.Objects.equals(this.freeformTags, other.freeformTags)
+ && java.util.Objects.equals(this.definedTags, other.definedTags)
+ && java.util.Objects.equals(this.systemTags, other.systemTags)
+ && super.equals(other);
+ }
+
+ @Override
+ public int hashCode() {
+ final int PRIME = 59;
+ int result = 1;
+ result = (result * PRIME) + (this.id == null ? 43 : this.id.hashCode());
+ result =
+ (result * PRIME)
+ + (this.compartmentId == null ? 43 : this.compartmentId.hashCode());
+ result = (result * PRIME) + (this.name == null ? 43 : this.name.hashCode());
+ result = (result * PRIME) + (this.description == null ? 43 : this.description.hashCode());
+ result =
+ (result * PRIME)
+ + (this.lifecycleState == null ? 43 : this.lifecycleState.hashCode());
+ result =
+ (result * PRIME)
+ + (this.lifecycleDetails == null ? 43 : this.lifecycleDetails.hashCode());
+ result =
+ (result * PRIME)
+ + (this.meterwithSKUs == null ? 43 : this.meterwithSKUs.hashCode());
+ result = (result * PRIME) + (this.serviceName == null ? 43 : this.serviceName.hashCode());
+ result = (result * PRIME) + (this.limits == null ? 43 : this.limits.hashCode());
+ result = (result * PRIME) + (this.timeCreated == null ? 43 : this.timeCreated.hashCode());
+ result = (result * PRIME) + (this.timeUpdated == null ? 43 : this.timeUpdated.hashCode());
+ result = (result * PRIME) + (this.timeReady == null ? 43 : this.timeReady.hashCode());
+ result = (result * PRIME) + (this.timeLaunched == null ? 43 : this.timeLaunched.hashCode());
+ result = (result * PRIME) + (this.isExcluded == null ? 43 : this.isExcluded.hashCode());
+ result = (result * PRIME) + (this.timeExcluded == null ? 43 : this.timeExcluded.hashCode());
+ result = (result * PRIME) + (this.freeformTags == null ? 43 : this.freeformTags.hashCode());
+ result = (result * PRIME) + (this.definedTags == null ? 43 : this.definedTags.hashCode());
+ result = (result * PRIME) + (this.systemTags == null ? 43 : this.systemTags.hashCode());
+ result = (result * PRIME) + super.hashCode();
+ return result;
+ }
+}
diff --git a/bmc-ociproductcatalog/src/main/java/com/oracle/bmc/ociproductcatalog/model/AdminProductSummary.java b/bmc-ociproductcatalog/src/main/java/com/oracle/bmc/ociproductcatalog/model/AdminProductSummary.java
new file mode 100644
index 00000000000..be89f8ce83e
--- /dev/null
+++ b/bmc-ociproductcatalog/src/main/java/com/oracle/bmc/ociproductcatalog/model/AdminProductSummary.java
@@ -0,0 +1,959 @@
+/**
+ * Copyright (c) 2016, 2026, Oracle and/or its affiliates. All rights reserved.
+ * This software is dual-licensed to you under the Universal Permissive License (UPL) 1.0 as shown at https://oss.oracle.com/licenses/upl or Apache License 2.0 as shown at http://www.apache.org/licenses/LICENSE-2.0. You may choose either license.
+ */
+package com.oracle.bmc.ociproductcatalog.model;
+
+/**
+ * The properties of a product returned by the admin get API
+ * Note: Objects should always be created or deserialized using the {@link Builder}. This model
+ * distinguishes fields that are {@code null} because they are unset from fields that are explicitly
+ * set to {@code null}. This is done in the setter methods of the {@link Builder}, which maintain a
+ * set of all explicitly set fields called {@link Builder#__explicitlySet__}. The {@link
+ * #hashCode()} and {@link #equals(Object)} methods are implemented to take the explicitly set
+ * fields into account. The constructor, on the other hand, does not take the explicitly set fields
+ * into account (since the constructor cannot distinguish explicit {@code null} from unset {@code
+ * null}).
+ */
+@jakarta.annotation.Generated(value = "OracleSDKGenerator", comments = "API Version: 20250610")
+@com.fasterxml.jackson.databind.annotation.JsonDeserialize(
+ builder = AdminProductSummary.Builder.class)
+@com.fasterxml.jackson.annotation.JsonFilter(
+ com.oracle.bmc.http.client.internal.ExplicitlySetBmcModel.EXPLICITLY_SET_FILTER_NAME)
+public final class AdminProductSummary
+ extends com.oracle.bmc.http.client.internal.ExplicitlySetBmcModel {
+ @Deprecated
+ @java.beans.ConstructorProperties({
+ "id",
+ "compartmentId",
+ "name",
+ "description",
+ "lifecycleState",
+ "lifecycleDetails",
+ "meterwithSKUs",
+ "serviceName",
+ "limits",
+ "timeCreated",
+ "timeUpdated",
+ "timeReady",
+ "timeLaunched",
+ "isExcluded",
+ "timeExcluded",
+ "freeformTags",
+ "definedTags",
+ "systemTags"
+ })
+ public AdminProductSummary(
+ String id,
+ String compartmentId,
+ String name,
+ String description,
+ LifecycleState lifecycleState,
+ String lifecycleDetails,
+ java.util.List meterwithSKUs,
+ String serviceName,
+ java.util.List limits,
+ java.util.Date timeCreated,
+ java.util.Date timeUpdated,
+ java.util.Date timeReady,
+ java.util.Date timeLaunched,
+ Boolean isExcluded,
+ java.util.Date timeExcluded,
+ java.util.Map freeformTags,
+ java.util.Map> definedTags,
+ java.util.Map> systemTags) {
+ super();
+ this.id = id;
+ this.compartmentId = compartmentId;
+ this.name = name;
+ this.description = description;
+ this.lifecycleState = lifecycleState;
+ this.lifecycleDetails = lifecycleDetails;
+ this.meterwithSKUs = meterwithSKUs;
+ this.serviceName = serviceName;
+ this.limits = limits;
+ this.timeCreated = timeCreated;
+ this.timeUpdated = timeUpdated;
+ this.timeReady = timeReady;
+ this.timeLaunched = timeLaunched;
+ this.isExcluded = isExcluded;
+ this.timeExcluded = timeExcluded;
+ this.freeformTags = freeformTags;
+ this.definedTags = definedTags;
+ this.systemTags = systemTags;
+ }
+
+ @com.fasterxml.jackson.databind.annotation.JsonPOJOBuilder(withPrefix = "")
+ public static class Builder {
+ /** OCID of the product */
+ @com.fasterxml.jackson.annotation.JsonProperty("id")
+ private String id;
+
+ /**
+ * OCID of the product
+ *
+ * @param id the value to set
+ * @return this builder
+ */
+ public Builder id(String id) {
+ this.id = id;
+ this.__explicitlySet__.add("id");
+ return this;
+ }
+ /**
+ * The OCID of the compartment (remember that the tenancy is simply the root compartment).
+ */
+ @com.fasterxml.jackson.annotation.JsonProperty("compartmentId")
+ private String compartmentId;
+
+ /**
+ * The OCID of the compartment (remember that the tenancy is simply the root compartment).
+ *
+ * @param compartmentId the value to set
+ * @return this builder
+ */
+ public Builder compartmentId(String compartmentId) {
+ this.compartmentId = compartmentId;
+ this.__explicitlySet__.add("compartmentId");
+ return this;
+ }
+ /** Name of the product, defined by service teams. Unique within one service */
+ @com.fasterxml.jackson.annotation.JsonProperty("name")
+ private String name;
+
+ /**
+ * Name of the product, defined by service teams. Unique within one service
+ *
+ * @param name the value to set
+ * @return this builder
+ */
+ public Builder name(String name) {
+ this.name = name;
+ this.__explicitlySet__.add("name");
+ return this;
+ }
+ /** description to the product */
+ @com.fasterxml.jackson.annotation.JsonProperty("description")
+ private String description;
+
+ /**
+ * description to the product
+ *
+ * @param description the value to set
+ * @return this builder
+ */
+ public Builder description(String description) {
+ this.description = description;
+ this.__explicitlySet__.add("description");
+ return this;
+ }
+ /**
+ * The status of a product following the OCI standard. ACTIVE: resources of this product can
+ * be used by the end customer. INACTIVE: resources of this product can't be used by the end
+ * customer. Product needs manual approval. NEEDS_ATTENTION: operator action is needed.
+ */
+ @com.fasterxml.jackson.annotation.JsonProperty("lifecycleState")
+ private LifecycleState lifecycleState;
+
+ /**
+ * The status of a product following the OCI standard. ACTIVE: resources of this product can
+ * be used by the end customer. INACTIVE: resources of this product can't be used by the end
+ * customer. Product needs manual approval. NEEDS_ATTENTION: operator action is needed.
+ *
+ * @param lifecycleState the value to set
+ * @return this builder
+ */
+ public Builder lifecycleState(LifecycleState lifecycleState) {
+ this.lifecycleState = lifecycleState;
+ this.__explicitlySet__.add("lifecycleState");
+ return this;
+ }
+ /**
+ * The displayed status of a product. lifecycleState to lifecycleDetails mapping: INACTIVE
+ * -> "Not yet launched" ACTIVE -> "Launched" NEEDS_ATTENTION -> "Pricing not set"
+ */
+ @com.fasterxml.jackson.annotation.JsonProperty("lifecycleDetails")
+ private String lifecycleDetails;
+
+ /**
+ * The displayed status of a product. lifecycleState to lifecycleDetails mapping: INACTIVE
+ * -> "Not yet launched" ACTIVE -> "Launched" NEEDS_ATTENTION -> "Pricing not set"
+ *
+ * @param lifecycleDetails the value to set
+ * @return this builder
+ */
+ public Builder lifecycleDetails(String lifecycleDetails) {
+ this.lifecycleDetails = lifecycleDetails;
+ this.__explicitlySet__.add("lifecycleDetails");
+ return this;
+ }
+ /** List of meters associated with this product, including SKU information */
+ @com.fasterxml.jackson.annotation.JsonProperty("meterwithSKUs")
+ private java.util.List meterwithSKUs;
+
+ /**
+ * List of meters associated with this product, including SKU information
+ *
+ * @param meterwithSKUs the value to set
+ * @return this builder
+ */
+ public Builder meterwithSKUs(java.util.List meterwithSKUs) {
+ this.meterwithSKUs = meterwithSKUs;
+ this.__explicitlySet__.add("meterwithSKUs");
+ return this;
+ }
+ /** Name of the metering service this product relates to. */
+ @com.fasterxml.jackson.annotation.JsonProperty("serviceName")
+ private String serviceName;
+
+ /**
+ * Name of the metering service this product relates to.
+ *
+ * @param serviceName the value to set
+ * @return this builder
+ */
+ public Builder serviceName(String serviceName) {
+ this.serviceName = serviceName;
+ this.__explicitlySet__.add("serviceName");
+ return this;
+ }
+ /** List of limits that this product is associated with. */
+ @com.fasterxml.jackson.annotation.JsonProperty("limits")
+ private java.util.List limits;
+
+ /**
+ * List of limits that this product is associated with.
+ *
+ * @param limits the value to set
+ * @return this builder
+ */
+ public Builder limits(java.util.List limits) {
+ this.limits = limits;
+ this.__explicitlySet__.add("limits");
+ return this;
+ }
+ /** Date and time when the product was created Example: {@code 2022-01-25T21:10:29.600Z} */
+ @com.fasterxml.jackson.annotation.JsonProperty("timeCreated")
+ private java.util.Date timeCreated;
+
+ /**
+ * Date and time when the product was created Example: {@code 2022-01-25T21:10:29.600Z}
+ *
+ * @param timeCreated the value to set
+ * @return this builder
+ */
+ public Builder timeCreated(java.util.Date timeCreated) {
+ this.timeCreated = timeCreated;
+ this.__explicitlySet__.add("timeCreated");
+ return this;
+ }
+ /**
+ * Date and time when the product was updated. Nullable Example: {@code
+ * 2022-01-25T21:10:29.600Z}
+ */
+ @com.fasterxml.jackson.annotation.JsonProperty("timeUpdated")
+ private java.util.Date timeUpdated;
+
+ /**
+ * Date and time when the product was updated. Nullable Example: {@code
+ * 2022-01-25T21:10:29.600Z}
+ *
+ * @param timeUpdated the value to set
+ * @return this builder
+ */
+ public Builder timeUpdated(java.util.Date timeUpdated) {
+ this.timeUpdated = timeUpdated;
+ this.__explicitlySet__.add("timeUpdated");
+ return this;
+ }
+ /**
+ * Date and time when the product was set to ready. Nullable Example: {@code
+ * 2022-01-25T21:10:29.600Z}
+ */
+ @com.fasterxml.jackson.annotation.JsonProperty("timeReady")
+ private java.util.Date timeReady;
+
+ /**
+ * Date and time when the product was set to ready. Nullable Example: {@code
+ * 2022-01-25T21:10:29.600Z}
+ *
+ * @param timeReady the value to set
+ * @return this builder
+ */
+ public Builder timeReady(java.util.Date timeReady) {
+ this.timeReady = timeReady;
+ this.__explicitlySet__.add("timeReady");
+ return this;
+ }
+ /**
+ * Date and time when the product was launched. Nullable Example: {@code
+ * 2022-01-25T21:10:29.600Z}
+ */
+ @com.fasterxml.jackson.annotation.JsonProperty("timeLaunched")
+ private java.util.Date timeLaunched;
+
+ /**
+ * Date and time when the product was launched. Nullable Example: {@code
+ * 2022-01-25T21:10:29.600Z}
+ *
+ * @param timeLaunched the value to set
+ * @return this builder
+ */
+ public Builder timeLaunched(java.util.Date timeLaunched) {
+ this.timeLaunched = timeLaunched;
+ this.__explicitlySet__.add("timeLaunched");
+ return this;
+ }
+ /**
+ * Whether the product is currently excluded from SKU processing flows. Nullable when the
+ * exclusion flag has not been explicitly set.
+ */
+ @com.fasterxml.jackson.annotation.JsonProperty("isExcluded")
+ private Boolean isExcluded;
+
+ /**
+ * Whether the product is currently excluded from SKU processing flows. Nullable when the
+ * exclusion flag has not been explicitly set.
+ *
+ * @param isExcluded the value to set
+ * @return this builder
+ */
+ public Builder isExcluded(Boolean isExcluded) {
+ this.isExcluded = isExcluded;
+ this.__explicitlySet__.add("isExcluded");
+ return this;
+ }
+ /**
+ * Date and time when the product was marked as excluded. Nullable Example: {@code
+ * 2022-01-25T21:10:29.600Z}
+ */
+ @com.fasterxml.jackson.annotation.JsonProperty("timeExcluded")
+ private java.util.Date timeExcluded;
+
+ /**
+ * Date and time when the product was marked as excluded. Nullable Example: {@code
+ * 2022-01-25T21:10:29.600Z}
+ *
+ * @param timeExcluded the value to set
+ * @return this builder
+ */
+ public Builder timeExcluded(java.util.Date timeExcluded) {
+ this.timeExcluded = timeExcluded;
+ this.__explicitlySet__.add("timeExcluded");
+ return this;
+ }
+ /**
+ * Free-form tags for this resource. Each tag is a simple key-value pair with no predefined
+ * name, type, or namespace. For more information, see [Resource
+ * Tags](https://docs.oracle.com/iaas/Content/General/Concepts/resourcetags.htm).
+ *
+ * Example: {@code {"Department": "Finance"}}
+ */
+ @com.fasterxml.jackson.annotation.JsonProperty("freeformTags")
+ private java.util.Map freeformTags;
+
+ /**
+ * Free-form tags for this resource. Each tag is a simple key-value pair with no predefined
+ * name, type, or namespace. For more information, see [Resource
+ * Tags](https://docs.oracle.com/iaas/Content/General/Concepts/resourcetags.htm).
+ *
+ * Example: {@code {"Department": "Finance"}}
+ *
+ * @param freeformTags the value to set
+ * @return this builder
+ */
+ public Builder freeformTags(java.util.Map freeformTags) {
+ this.freeformTags = freeformTags;
+ this.__explicitlySet__.add("freeformTags");
+ return this;
+ }
+ /**
+ * Defined tags for this resource. Each key is predefined and scoped to a namespace. For
+ * more information, see [Resource
+ * Tags](https://docs.oracle.com/iaas/Content/General/Concepts/resourcetags.htm).
+ *
+ * Example: {@code {"Operations": {"CostCenter": "42"}}}
+ */
+ @com.fasterxml.jackson.annotation.JsonProperty("definedTags")
+ private java.util.Map> definedTags;
+
+ /**
+ * Defined tags for this resource. Each key is predefined and scoped to a namespace. For
+ * more information, see [Resource
+ * Tags](https://docs.oracle.com/iaas/Content/General/Concepts/resourcetags.htm).
+ *
+ * Example: {@code {"Operations": {"CostCenter": "42"}}}
+ *
+ * @param definedTags the value to set
+ * @return this builder
+ */
+ public Builder definedTags(
+ java.util.Map> definedTags) {
+ this.definedTags = definedTags;
+ this.__explicitlySet__.add("definedTags");
+ return this;
+ }
+ /**
+ * System tags for this resource. Each key is predefined and scoped to a namespace.
+ *
+ * Example: {@code {"orcl-cloud": {"free-tier-retained": "true"}}}
+ */
+ @com.fasterxml.jackson.annotation.JsonProperty("systemTags")
+ private java.util.Map> systemTags;
+
+ /**
+ * System tags for this resource. Each key is predefined and scoped to a namespace.
+ *
+ * Example: {@code {"orcl-cloud": {"free-tier-retained": "true"}}}
+ *
+ * @param systemTags the value to set
+ * @return this builder
+ */
+ public Builder systemTags(java.util.Map> systemTags) {
+ this.systemTags = systemTags;
+ this.__explicitlySet__.add("systemTags");
+ return this;
+ }
+
+ @com.fasterxml.jackson.annotation.JsonIgnore
+ private final java.util.Set __explicitlySet__ = new java.util.HashSet();
+
+ public AdminProductSummary build() {
+ AdminProductSummary model =
+ new AdminProductSummary(
+ this.id,
+ this.compartmentId,
+ this.name,
+ this.description,
+ this.lifecycleState,
+ this.lifecycleDetails,
+ this.meterwithSKUs,
+ this.serviceName,
+ this.limits,
+ this.timeCreated,
+ this.timeUpdated,
+ this.timeReady,
+ this.timeLaunched,
+ this.isExcluded,
+ this.timeExcluded,
+ this.freeformTags,
+ this.definedTags,
+ this.systemTags);
+ for (String explicitlySetProperty : this.__explicitlySet__) {
+ model.markPropertyAsExplicitlySet(explicitlySetProperty);
+ }
+ return model;
+ }
+
+ @com.fasterxml.jackson.annotation.JsonIgnore
+ public Builder copy(AdminProductSummary model) {
+ if (model.wasPropertyExplicitlySet("id")) {
+ this.id(model.getId());
+ }
+ if (model.wasPropertyExplicitlySet("compartmentId")) {
+ this.compartmentId(model.getCompartmentId());
+ }
+ if (model.wasPropertyExplicitlySet("name")) {
+ this.name(model.getName());
+ }
+ if (model.wasPropertyExplicitlySet("description")) {
+ this.description(model.getDescription());
+ }
+ if (model.wasPropertyExplicitlySet("lifecycleState")) {
+ this.lifecycleState(model.getLifecycleState());
+ }
+ if (model.wasPropertyExplicitlySet("lifecycleDetails")) {
+ this.lifecycleDetails(model.getLifecycleDetails());
+ }
+ if (model.wasPropertyExplicitlySet("meterwithSKUs")) {
+ this.meterwithSKUs(model.getMeterwithSKUs());
+ }
+ if (model.wasPropertyExplicitlySet("serviceName")) {
+ this.serviceName(model.getServiceName());
+ }
+ if (model.wasPropertyExplicitlySet("limits")) {
+ this.limits(model.getLimits());
+ }
+ if (model.wasPropertyExplicitlySet("timeCreated")) {
+ this.timeCreated(model.getTimeCreated());
+ }
+ if (model.wasPropertyExplicitlySet("timeUpdated")) {
+ this.timeUpdated(model.getTimeUpdated());
+ }
+ if (model.wasPropertyExplicitlySet("timeReady")) {
+ this.timeReady(model.getTimeReady());
+ }
+ if (model.wasPropertyExplicitlySet("timeLaunched")) {
+ this.timeLaunched(model.getTimeLaunched());
+ }
+ if (model.wasPropertyExplicitlySet("isExcluded")) {
+ this.isExcluded(model.getIsExcluded());
+ }
+ if (model.wasPropertyExplicitlySet("timeExcluded")) {
+ this.timeExcluded(model.getTimeExcluded());
+ }
+ if (model.wasPropertyExplicitlySet("freeformTags")) {
+ this.freeformTags(model.getFreeformTags());
+ }
+ if (model.wasPropertyExplicitlySet("definedTags")) {
+ this.definedTags(model.getDefinedTags());
+ }
+ if (model.wasPropertyExplicitlySet("systemTags")) {
+ this.systemTags(model.getSystemTags());
+ }
+ return this;
+ }
+ }
+
+ /** Create a new builder. */
+ public static Builder builder() {
+ return new Builder();
+ }
+
+ public Builder toBuilder() {
+ return new Builder().copy(this);
+ }
+
+ /** OCID of the product */
+ @com.fasterxml.jackson.annotation.JsonProperty("id")
+ private final String id;
+
+ /**
+ * OCID of the product
+ *
+ * @return the value
+ */
+ public String getId() {
+ return id;
+ }
+
+ /** The OCID of the compartment (remember that the tenancy is simply the root compartment). */
+ @com.fasterxml.jackson.annotation.JsonProperty("compartmentId")
+ private final String compartmentId;
+
+ /**
+ * The OCID of the compartment (remember that the tenancy is simply the root compartment).
+ *
+ * @return the value
+ */
+ public String getCompartmentId() {
+ return compartmentId;
+ }
+
+ /** Name of the product, defined by service teams. Unique within one service */
+ @com.fasterxml.jackson.annotation.JsonProperty("name")
+ private final String name;
+
+ /**
+ * Name of the product, defined by service teams. Unique within one service
+ *
+ * @return the value
+ */
+ public String getName() {
+ return name;
+ }
+
+ /** description to the product */
+ @com.fasterxml.jackson.annotation.JsonProperty("description")
+ private final String description;
+
+ /**
+ * description to the product
+ *
+ * @return the value
+ */
+ public String getDescription() {
+ return description;
+ }
+
+ /**
+ * The status of a product following the OCI standard. ACTIVE: resources of this product can be
+ * used by the end customer. INACTIVE: resources of this product can't be used by the end
+ * customer. Product needs manual approval. NEEDS_ATTENTION: operator action is needed.
+ */
+ public enum LifecycleState implements com.oracle.bmc.http.internal.BmcEnum {
+ Active("ACTIVE"),
+ Inactive("INACTIVE"),
+ NeedsAttention("NEEDS_ATTENTION"),
+
+ /**
+ * This value is used if a service returns a value for this enum that is not recognized by
+ * this version of the SDK.
+ */
+ UnknownEnumValue(null);
+
+ private static final org.slf4j.Logger LOG =
+ org.slf4j.LoggerFactory.getLogger(LifecycleState.class);
+
+ private final String value;
+ private static java.util.Map map;
+
+ static {
+ map = new java.util.HashMap<>();
+ for (LifecycleState v : LifecycleState.values()) {
+ if (v != UnknownEnumValue) {
+ map.put(v.getValue(), v);
+ }
+ }
+ }
+
+ LifecycleState(String value) {
+ this.value = value;
+ }
+
+ @com.fasterxml.jackson.annotation.JsonValue
+ public String getValue() {
+ return value;
+ }
+
+ @com.fasterxml.jackson.annotation.JsonCreator
+ public static LifecycleState create(String key) {
+ if (map.containsKey(key)) {
+ return map.get(key);
+ }
+ LOG.warn(
+ "Received unknown value '{}' for enum 'LifecycleState', returning UnknownEnumValue",
+ key);
+ return UnknownEnumValue;
+ }
+ };
+ /**
+ * The status of a product following the OCI standard. ACTIVE: resources of this product can be
+ * used by the end customer. INACTIVE: resources of this product can't be used by the end
+ * customer. Product needs manual approval. NEEDS_ATTENTION: operator action is needed.
+ */
+ @com.fasterxml.jackson.annotation.JsonProperty("lifecycleState")
+ private final LifecycleState lifecycleState;
+
+ /**
+ * The status of a product following the OCI standard. ACTIVE: resources of this product can be
+ * used by the end customer. INACTIVE: resources of this product can't be used by the end
+ * customer. Product needs manual approval. NEEDS_ATTENTION: operator action is needed.
+ *
+ * @return the value
+ */
+ public LifecycleState getLifecycleState() {
+ return lifecycleState;
+ }
+
+ /**
+ * The displayed status of a product. lifecycleState to lifecycleDetails mapping: INACTIVE ->
+ * "Not yet launched" ACTIVE -> "Launched" NEEDS_ATTENTION -> "Pricing not set"
+ */
+ @com.fasterxml.jackson.annotation.JsonProperty("lifecycleDetails")
+ private final String lifecycleDetails;
+
+ /**
+ * The displayed status of a product. lifecycleState to lifecycleDetails mapping: INACTIVE ->
+ * "Not yet launched" ACTIVE -> "Launched" NEEDS_ATTENTION -> "Pricing not set"
+ *
+ * @return the value
+ */
+ public String getLifecycleDetails() {
+ return lifecycleDetails;
+ }
+
+ /** List of meters associated with this product, including SKU information */
+ @com.fasterxml.jackson.annotation.JsonProperty("meterwithSKUs")
+ private final java.util.List meterwithSKUs;
+
+ /**
+ * List of meters associated with this product, including SKU information
+ *
+ * @return the value
+ */
+ public java.util.List getMeterwithSKUs() {
+ return meterwithSKUs;
+ }
+
+ /** Name of the metering service this product relates to. */
+ @com.fasterxml.jackson.annotation.JsonProperty("serviceName")
+ private final String serviceName;
+
+ /**
+ * Name of the metering service this product relates to.
+ *
+ * @return the value
+ */
+ public String getServiceName() {
+ return serviceName;
+ }
+
+ /** List of limits that this product is associated with. */
+ @com.fasterxml.jackson.annotation.JsonProperty("limits")
+ private final java.util.List limits;
+
+ /**
+ * List of limits that this product is associated with.
+ *
+ * @return the value
+ */
+ public java.util.List getLimits() {
+ return limits;
+ }
+
+ /** Date and time when the product was created Example: {@code 2022-01-25T21:10:29.600Z} */
+ @com.fasterxml.jackson.annotation.JsonProperty("timeCreated")
+ private final java.util.Date timeCreated;
+
+ /**
+ * Date and time when the product was created Example: {@code 2022-01-25T21:10:29.600Z}
+ *
+ * @return the value
+ */
+ public java.util.Date getTimeCreated() {
+ return timeCreated;
+ }
+
+ /**
+ * Date and time when the product was updated. Nullable Example: {@code
+ * 2022-01-25T21:10:29.600Z}
+ */
+ @com.fasterxml.jackson.annotation.JsonProperty("timeUpdated")
+ private final java.util.Date timeUpdated;
+
+ /**
+ * Date and time when the product was updated. Nullable Example: {@code
+ * 2022-01-25T21:10:29.600Z}
+ *
+ * @return the value
+ */
+ public java.util.Date getTimeUpdated() {
+ return timeUpdated;
+ }
+
+ /**
+ * Date and time when the product was set to ready. Nullable Example: {@code
+ * 2022-01-25T21:10:29.600Z}
+ */
+ @com.fasterxml.jackson.annotation.JsonProperty("timeReady")
+ private final java.util.Date timeReady;
+
+ /**
+ * Date and time when the product was set to ready. Nullable Example: {@code
+ * 2022-01-25T21:10:29.600Z}
+ *
+ * @return the value
+ */
+ public java.util.Date getTimeReady() {
+ return timeReady;
+ }
+
+ /**
+ * Date and time when the product was launched. Nullable Example: {@code
+ * 2022-01-25T21:10:29.600Z}
+ */
+ @com.fasterxml.jackson.annotation.JsonProperty("timeLaunched")
+ private final java.util.Date timeLaunched;
+
+ /**
+ * Date and time when the product was launched. Nullable Example: {@code
+ * 2022-01-25T21:10:29.600Z}
+ *
+ * @return the value
+ */
+ public java.util.Date getTimeLaunched() {
+ return timeLaunched;
+ }
+
+ /**
+ * Whether the product is currently excluded from SKU processing flows. Nullable when the
+ * exclusion flag has not been explicitly set.
+ */
+ @com.fasterxml.jackson.annotation.JsonProperty("isExcluded")
+ private final Boolean isExcluded;
+
+ /**
+ * Whether the product is currently excluded from SKU processing flows. Nullable when the
+ * exclusion flag has not been explicitly set.
+ *
+ * @return the value
+ */
+ public Boolean getIsExcluded() {
+ return isExcluded;
+ }
+
+ /**
+ * Date and time when the product was marked as excluded. Nullable Example: {@code
+ * 2022-01-25T21:10:29.600Z}
+ */
+ @com.fasterxml.jackson.annotation.JsonProperty("timeExcluded")
+ private final java.util.Date timeExcluded;
+
+ /**
+ * Date and time when the product was marked as excluded. Nullable Example: {@code
+ * 2022-01-25T21:10:29.600Z}
+ *
+ * @return the value
+ */
+ public java.util.Date getTimeExcluded() {
+ return timeExcluded;
+ }
+
+ /**
+ * Free-form tags for this resource. Each tag is a simple key-value pair with no predefined
+ * name, type, or namespace. For more information, see [Resource
+ * Tags](https://docs.oracle.com/iaas/Content/General/Concepts/resourcetags.htm).
+ *
+ * Example: {@code {"Department": "Finance"}}
+ */
+ @com.fasterxml.jackson.annotation.JsonProperty("freeformTags")
+ private final java.util.Map freeformTags;
+
+ /**
+ * Free-form tags for this resource. Each tag is a simple key-value pair with no predefined
+ * name, type, or namespace. For more information, see [Resource
+ * Tags](https://docs.oracle.com/iaas/Content/General/Concepts/resourcetags.htm).
+ *
+ * Example: {@code {"Department": "Finance"}}
+ *
+ * @return the value
+ */
+ public java.util.Map getFreeformTags() {
+ return freeformTags;
+ }
+
+ /**
+ * Defined tags for this resource. Each key is predefined and scoped to a namespace. For more
+ * information, see [Resource
+ * Tags](https://docs.oracle.com/iaas/Content/General/Concepts/resourcetags.htm).
+ *
+ * Example: {@code {"Operations": {"CostCenter": "42"}}}
+ */
+ @com.fasterxml.jackson.annotation.JsonProperty("definedTags")
+ private final java.util.Map> definedTags;
+
+ /**
+ * Defined tags for this resource. Each key is predefined and scoped to a namespace. For more
+ * information, see [Resource
+ * Tags](https://docs.oracle.com/iaas/Content/General/Concepts/resourcetags.htm).
+ *
+ * Example: {@code {"Operations": {"CostCenter": "42"}}}
+ *
+ * @return the value
+ */
+ public java.util.Map> getDefinedTags() {
+ return definedTags;
+ }
+
+ /**
+ * System tags for this resource. Each key is predefined and scoped to a namespace.
+ *
+ * Example: {@code {"orcl-cloud": {"free-tier-retained": "true"}}}
+ */
+ @com.fasterxml.jackson.annotation.JsonProperty("systemTags")
+ private final java.util.Map> systemTags;
+
+ /**
+ * System tags for this resource. Each key is predefined and scoped to a namespace.
+ *
+ * Example: {@code {"orcl-cloud": {"free-tier-retained": "true"}}}
+ *
+ * @return the value
+ */
+ public java.util.Map> getSystemTags() {
+ return systemTags;
+ }
+
+ @Override
+ public String toString() {
+ return this.toString(true);
+ }
+
+ /**
+ * Return a string representation of the object.
+ *
+ * @param includeByteArrayContents true to include the full contents of byte arrays
+ * @return string representation
+ */
+ public String toString(boolean includeByteArrayContents) {
+ java.lang.StringBuilder sb = new java.lang.StringBuilder();
+ sb.append("AdminProductSummary(");
+ sb.append("super=").append(super.toString());
+ sb.append("id=").append(String.valueOf(this.id));
+ sb.append(", compartmentId=").append(String.valueOf(this.compartmentId));
+ sb.append(", name=").append(String.valueOf(this.name));
+ sb.append(", description=").append(String.valueOf(this.description));
+ sb.append(", lifecycleState=").append(String.valueOf(this.lifecycleState));
+ sb.append(", lifecycleDetails=").append(String.valueOf(this.lifecycleDetails));
+ sb.append(", meterwithSKUs=").append(String.valueOf(this.meterwithSKUs));
+ sb.append(", serviceName=").append(String.valueOf(this.serviceName));
+ sb.append(", limits=").append(String.valueOf(this.limits));
+ sb.append(", timeCreated=").append(String.valueOf(this.timeCreated));
+ sb.append(", timeUpdated=").append(String.valueOf(this.timeUpdated));
+ sb.append(", timeReady=").append(String.valueOf(this.timeReady));
+ sb.append(", timeLaunched=").append(String.valueOf(this.timeLaunched));
+ sb.append(", isExcluded=").append(String.valueOf(this.isExcluded));
+ sb.append(", timeExcluded=").append(String.valueOf(this.timeExcluded));
+ sb.append(", freeformTags=").append(String.valueOf(this.freeformTags));
+ sb.append(", definedTags=").append(String.valueOf(this.definedTags));
+ sb.append(", systemTags=").append(String.valueOf(this.systemTags));
+ sb.append(")");
+ return sb.toString();
+ }
+
+ @Override
+ public boolean equals(Object o) {
+ if (this == o) {
+ return true;
+ }
+ if (!(o instanceof AdminProductSummary)) {
+ return false;
+ }
+
+ AdminProductSummary other = (AdminProductSummary) o;
+ return java.util.Objects.equals(this.id, other.id)
+ && java.util.Objects.equals(this.compartmentId, other.compartmentId)
+ && java.util.Objects.equals(this.name, other.name)
+ && java.util.Objects.equals(this.description, other.description)
+ && java.util.Objects.equals(this.lifecycleState, other.lifecycleState)
+ && java.util.Objects.equals(this.lifecycleDetails, other.lifecycleDetails)
+ && java.util.Objects.equals(this.meterwithSKUs, other.meterwithSKUs)
+ && java.util.Objects.equals(this.serviceName, other.serviceName)
+ && java.util.Objects.equals(this.limits, other.limits)
+ && java.util.Objects.equals(this.timeCreated, other.timeCreated)
+ && java.util.Objects.equals(this.timeUpdated, other.timeUpdated)
+ && java.util.Objects.equals(this.timeReady, other.timeReady)
+ && java.util.Objects.equals(this.timeLaunched, other.timeLaunched)
+ && java.util.Objects.equals(this.isExcluded, other.isExcluded)
+ && java.util.Objects.equals(this.timeExcluded, other.timeExcluded)
+ && java.util.Objects.equals(this.freeformTags, other.freeformTags)
+ && java.util.Objects.equals(this.definedTags, other.definedTags)
+ && java.util.Objects.equals(this.systemTags, other.systemTags)
+ && super.equals(other);
+ }
+
+ @Override
+ public int hashCode() {
+ final int PRIME = 59;
+ int result = 1;
+ result = (result * PRIME) + (this.id == null ? 43 : this.id.hashCode());
+ result =
+ (result * PRIME)
+ + (this.compartmentId == null ? 43 : this.compartmentId.hashCode());
+ result = (result * PRIME) + (this.name == null ? 43 : this.name.hashCode());
+ result = (result * PRIME) + (this.description == null ? 43 : this.description.hashCode());
+ result =
+ (result * PRIME)
+ + (this.lifecycleState == null ? 43 : this.lifecycleState.hashCode());
+ result =
+ (result * PRIME)
+ + (this.lifecycleDetails == null ? 43 : this.lifecycleDetails.hashCode());
+ result =
+ (result * PRIME)
+ + (this.meterwithSKUs == null ? 43 : this.meterwithSKUs.hashCode());
+ result = (result * PRIME) + (this.serviceName == null ? 43 : this.serviceName.hashCode());
+ result = (result * PRIME) + (this.limits == null ? 43 : this.limits.hashCode());
+ result = (result * PRIME) + (this.timeCreated == null ? 43 : this.timeCreated.hashCode());
+ result = (result * PRIME) + (this.timeUpdated == null ? 43 : this.timeUpdated.hashCode());
+ result = (result * PRIME) + (this.timeReady == null ? 43 : this.timeReady.hashCode());
+ result = (result * PRIME) + (this.timeLaunched == null ? 43 : this.timeLaunched.hashCode());
+ result = (result * PRIME) + (this.isExcluded == null ? 43 : this.isExcluded.hashCode());
+ result = (result * PRIME) + (this.timeExcluded == null ? 43 : this.timeExcluded.hashCode());
+ result = (result * PRIME) + (this.freeformTags == null ? 43 : this.freeformTags.hashCode());
+ result = (result * PRIME) + (this.definedTags == null ? 43 : this.definedTags.hashCode());
+ result = (result * PRIME) + (this.systemTags == null ? 43 : this.systemTags.hashCode());
+ result = (result * PRIME) + super.hashCode();
+ return result;
+ }
+}
diff --git a/bmc-ociproductcatalog/src/main/java/com/oracle/bmc/ociproductcatalog/model/ChangeProductCompartmentDetails.java b/bmc-ociproductcatalog/src/main/java/com/oracle/bmc/ociproductcatalog/model/ChangeProductCompartmentDetails.java
new file mode 100644
index 00000000000..9fcec47c077
--- /dev/null
+++ b/bmc-ociproductcatalog/src/main/java/com/oracle/bmc/ociproductcatalog/model/ChangeProductCompartmentDetails.java
@@ -0,0 +1,137 @@
+/**
+ * Copyright (c) 2016, 2026, Oracle and/or its affiliates. All rights reserved.
+ * This software is dual-licensed to you under the Universal Permissive License (UPL) 1.0 as shown at https://oss.oracle.com/licenses/upl or Apache License 2.0 as shown at http://www.apache.org/licenses/LICENSE-2.0. You may choose either license.
+ */
+package com.oracle.bmc.ociproductcatalog.model;
+
+/**
+ * The details to change the product's compartment.
+ * Note: Objects should always be created or deserialized using the {@link Builder}. This model
+ * distinguishes fields that are {@code null} because they are unset from fields that are explicitly
+ * set to {@code null}. This is done in the setter methods of the {@link Builder}, which maintain a
+ * set of all explicitly set fields called {@link Builder#__explicitlySet__}. The {@link
+ * #hashCode()} and {@link #equals(Object)} methods are implemented to take the explicitly set
+ * fields into account. The constructor, on the other hand, does not take the explicitly set fields
+ * into account (since the constructor cannot distinguish explicit {@code null} from unset {@code
+ * null}).
+ */
+@jakarta.annotation.Generated(value = "OracleSDKGenerator", comments = "API Version: 20250610")
+@com.fasterxml.jackson.databind.annotation.JsonDeserialize(
+ builder = ChangeProductCompartmentDetails.Builder.class)
+@com.fasterxml.jackson.annotation.JsonFilter(
+ com.oracle.bmc.http.client.internal.ExplicitlySetBmcModel.EXPLICITLY_SET_FILTER_NAME)
+public final class ChangeProductCompartmentDetails
+ extends com.oracle.bmc.http.client.internal.ExplicitlySetBmcModel {
+ @Deprecated
+ @java.beans.ConstructorProperties({"newCompartmentId"})
+ public ChangeProductCompartmentDetails(String newCompartmentId) {
+ super();
+ this.newCompartmentId = newCompartmentId;
+ }
+
+ @com.fasterxml.jackson.databind.annotation.JsonPOJOBuilder(withPrefix = "")
+ public static class Builder {
+ /** The new product compartment OCID. */
+ @com.fasterxml.jackson.annotation.JsonProperty("newCompartmentId")
+ private String newCompartmentId;
+
+ /**
+ * The new product compartment OCID.
+ *
+ * @param newCompartmentId the value to set
+ * @return this builder
+ */
+ public Builder newCompartmentId(String newCompartmentId) {
+ this.newCompartmentId = newCompartmentId;
+ this.__explicitlySet__.add("newCompartmentId");
+ return this;
+ }
+
+ @com.fasterxml.jackson.annotation.JsonIgnore
+ private final java.util.Set __explicitlySet__ = new java.util.HashSet();
+
+ public ChangeProductCompartmentDetails build() {
+ ChangeProductCompartmentDetails model =
+ new ChangeProductCompartmentDetails(this.newCompartmentId);
+ for (String explicitlySetProperty : this.__explicitlySet__) {
+ model.markPropertyAsExplicitlySet(explicitlySetProperty);
+ }
+ return model;
+ }
+
+ @com.fasterxml.jackson.annotation.JsonIgnore
+ public Builder copy(ChangeProductCompartmentDetails model) {
+ if (model.wasPropertyExplicitlySet("newCompartmentId")) {
+ this.newCompartmentId(model.getNewCompartmentId());
+ }
+ return this;
+ }
+ }
+
+ /** Create a new builder. */
+ public static Builder builder() {
+ return new Builder();
+ }
+
+ public Builder toBuilder() {
+ return new Builder().copy(this);
+ }
+
+ /** The new product compartment OCID. */
+ @com.fasterxml.jackson.annotation.JsonProperty("newCompartmentId")
+ private final String newCompartmentId;
+
+ /**
+ * The new product compartment OCID.
+ *
+ * @return the value
+ */
+ public String getNewCompartmentId() {
+ return newCompartmentId;
+ }
+
+ @Override
+ public String toString() {
+ return this.toString(true);
+ }
+
+ /**
+ * Return a string representation of the object.
+ *
+ * @param includeByteArrayContents true to include the full contents of byte arrays
+ * @return string representation
+ */
+ public String toString(boolean includeByteArrayContents) {
+ java.lang.StringBuilder sb = new java.lang.StringBuilder();
+ sb.append("ChangeProductCompartmentDetails(");
+ sb.append("super=").append(super.toString());
+ sb.append("newCompartmentId=").append(String.valueOf(this.newCompartmentId));
+ sb.append(")");
+ return sb.toString();
+ }
+
+ @Override
+ public boolean equals(Object o) {
+ if (this == o) {
+ return true;
+ }
+ if (!(o instanceof ChangeProductCompartmentDetails)) {
+ return false;
+ }
+
+ ChangeProductCompartmentDetails other = (ChangeProductCompartmentDetails) o;
+ return java.util.Objects.equals(this.newCompartmentId, other.newCompartmentId)
+ && super.equals(other);
+ }
+
+ @Override
+ public int hashCode() {
+ final int PRIME = 59;
+ int result = 1;
+ result =
+ (result * PRIME)
+ + (this.newCompartmentId == null ? 43 : this.newCompartmentId.hashCode());
+ result = (result * PRIME) + super.hashCode();
+ return result;
+ }
+}
diff --git a/bmc-ociproductcatalog/src/main/java/com/oracle/bmc/ociproductcatalog/model/CreateProductDetails.java b/bmc-ociproductcatalog/src/main/java/com/oracle/bmc/ociproductcatalog/model/CreateProductDetails.java
new file mode 100644
index 00000000000..9429e710fce
--- /dev/null
+++ b/bmc-ociproductcatalog/src/main/java/com/oracle/bmc/ociproductcatalog/model/CreateProductDetails.java
@@ -0,0 +1,469 @@
+/**
+ * Copyright (c) 2016, 2026, Oracle and/or its affiliates. All rights reserved.
+ * This software is dual-licensed to you under the Universal Permissive License (UPL) 1.0 as shown at https://oss.oracle.com/licenses/upl or Apache License 2.0 as shown at http://www.apache.org/licenses/LICENSE-2.0. You may choose either license.
+ */
+package com.oracle.bmc.ociproductcatalog.model;
+
+/**
+ * The properties of a product
+ * Note: Objects should always be created or deserialized using the {@link Builder}. This model
+ * distinguishes fields that are {@code null} because they are unset from fields that are explicitly
+ * set to {@code null}. This is done in the setter methods of the {@link Builder}, which maintain a
+ * set of all explicitly set fields called {@link Builder#__explicitlySet__}. The {@link
+ * #hashCode()} and {@link #equals(Object)} methods are implemented to take the explicitly set
+ * fields into account. The constructor, on the other hand, does not take the explicitly set fields
+ * into account (since the constructor cannot distinguish explicit {@code null} from unset {@code
+ * null}).
+ */
+@jakarta.annotation.Generated(value = "OracleSDKGenerator", comments = "API Version: 20250610")
+@com.fasterxml.jackson.databind.annotation.JsonDeserialize(
+ builder = CreateProductDetails.Builder.class)
+@com.fasterxml.jackson.annotation.JsonFilter(
+ com.oracle.bmc.http.client.internal.ExplicitlySetBmcModel.EXPLICITLY_SET_FILTER_NAME)
+public final class CreateProductDetails
+ extends com.oracle.bmc.http.client.internal.ExplicitlySetBmcModel {
+ @Deprecated
+ @java.beans.ConstructorProperties({
+ "compartmentId",
+ "name",
+ "description",
+ "meters",
+ "serviceName",
+ "limits",
+ "backfillEligibility",
+ "isExcluded"
+ })
+ public CreateProductDetails(
+ String compartmentId,
+ String name,
+ String description,
+ java.util.List meters,
+ String serviceName,
+ java.util.List limits,
+ BackfillEligibility backfillEligibility,
+ Boolean isExcluded) {
+ super();
+ this.compartmentId = compartmentId;
+ this.name = name;
+ this.description = description;
+ this.meters = meters;
+ this.serviceName = serviceName;
+ this.limits = limits;
+ this.backfillEligibility = backfillEligibility;
+ this.isExcluded = isExcluded;
+ }
+
+ @com.fasterxml.jackson.databind.annotation.JsonPOJOBuilder(withPrefix = "")
+ public static class Builder {
+ /**
+ * The OCID of the compartment (remember that the tenancy is simply the root compartment).
+ */
+ @com.fasterxml.jackson.annotation.JsonProperty("compartmentId")
+ private String compartmentId;
+
+ /**
+ * The OCID of the compartment (remember that the tenancy is simply the root compartment).
+ *
+ * @param compartmentId the value to set
+ * @return this builder
+ */
+ public Builder compartmentId(String compartmentId) {
+ this.compartmentId = compartmentId;
+ this.__explicitlySet__.add("compartmentId");
+ return this;
+ }
+ /** Name of the product, defined by service teams. Unique within one service */
+ @com.fasterxml.jackson.annotation.JsonProperty("name")
+ private String name;
+
+ /**
+ * Name of the product, defined by service teams. Unique within one service
+ *
+ * @param name the value to set
+ * @return this builder
+ */
+ public Builder name(String name) {
+ this.name = name;
+ this.__explicitlySet__.add("name");
+ return this;
+ }
+ /** description to the product */
+ @com.fasterxml.jackson.annotation.JsonProperty("description")
+ private String description;
+
+ /**
+ * description to the product
+ *
+ * @param description the value to set
+ * @return this builder
+ */
+ public Builder description(String description) {
+ this.description = description;
+ this.__explicitlySet__.add("description");
+ return this;
+ }
+ /** List of meters associated with this product */
+ @com.fasterxml.jackson.annotation.JsonProperty("meters")
+ private java.util.List meters;
+
+ /**
+ * List of meters associated with this product
+ *
+ * @param meters the value to set
+ * @return this builder
+ */
+ public Builder meters(java.util.List meters) {
+ this.meters = meters;
+ this.__explicitlySet__.add("meters");
+ return this;
+ }
+ /** Name of the metering service this product relates to. */
+ @com.fasterxml.jackson.annotation.JsonProperty("serviceName")
+ private String serviceName;
+
+ /**
+ * Name of the metering service this product relates to.
+ *
+ * @param serviceName the value to set
+ * @return this builder
+ */
+ public Builder serviceName(String serviceName) {
+ this.serviceName = serviceName;
+ this.__explicitlySet__.add("serviceName");
+ return this;
+ }
+ /** List of limits that this product is associated with. */
+ @com.fasterxml.jackson.annotation.JsonProperty("limits")
+ private java.util.List limits;
+
+ /**
+ * List of limits that this product is associated with.
+ *
+ * @param limits the value to set
+ * @return this builder
+ */
+ public Builder limits(java.util.List limits) {
+ this.limits = limits;
+ this.__explicitlySet__.add("limits");
+ return this;
+ }
+ /**
+ * Optional create-time signal that marks the product as eligible for the backfill flow in
+ * existing Alloy regions. Omit this field to preserve the current create behavior. Final
+ * runtime backfill and auto-enable decisions remain worker-side.
+ */
+ @com.fasterxml.jackson.annotation.JsonProperty("backfillEligibility")
+ private BackfillEligibility backfillEligibility;
+
+ /**
+ * Optional create-time signal that marks the product as eligible for the backfill flow in
+ * existing Alloy regions. Omit this field to preserve the current create behavior. Final
+ * runtime backfill and auto-enable decisions remain worker-side.
+ *
+ * @param backfillEligibility the value to set
+ * @return this builder
+ */
+ public Builder backfillEligibility(BackfillEligibility backfillEligibility) {
+ this.backfillEligibility = backfillEligibility;
+ this.__explicitlySet__.add("backfillEligibility");
+ return this;
+ }
+ /**
+ * Optional create-time exclusion flag. When true, the product is created in an excluded
+ * state. Omit this field to preserve backward-compatible create behavior.
+ */
+ @com.fasterxml.jackson.annotation.JsonProperty("isExcluded")
+ private Boolean isExcluded;
+
+ /**
+ * Optional create-time exclusion flag. When true, the product is created in an excluded
+ * state. Omit this field to preserve backward-compatible create behavior.
+ *
+ * @param isExcluded the value to set
+ * @return this builder
+ */
+ public Builder isExcluded(Boolean isExcluded) {
+ this.isExcluded = isExcluded;
+ this.__explicitlySet__.add("isExcluded");
+ return this;
+ }
+
+ @com.fasterxml.jackson.annotation.JsonIgnore
+ private final java.util.Set __explicitlySet__ = new java.util.HashSet();
+
+ public CreateProductDetails build() {
+ CreateProductDetails model =
+ new CreateProductDetails(
+ this.compartmentId,
+ this.name,
+ this.description,
+ this.meters,
+ this.serviceName,
+ this.limits,
+ this.backfillEligibility,
+ this.isExcluded);
+ for (String explicitlySetProperty : this.__explicitlySet__) {
+ model.markPropertyAsExplicitlySet(explicitlySetProperty);
+ }
+ return model;
+ }
+
+ @com.fasterxml.jackson.annotation.JsonIgnore
+ public Builder copy(CreateProductDetails model) {
+ if (model.wasPropertyExplicitlySet("compartmentId")) {
+ this.compartmentId(model.getCompartmentId());
+ }
+ if (model.wasPropertyExplicitlySet("name")) {
+ this.name(model.getName());
+ }
+ if (model.wasPropertyExplicitlySet("description")) {
+ this.description(model.getDescription());
+ }
+ if (model.wasPropertyExplicitlySet("meters")) {
+ this.meters(model.getMeters());
+ }
+ if (model.wasPropertyExplicitlySet("serviceName")) {
+ this.serviceName(model.getServiceName());
+ }
+ if (model.wasPropertyExplicitlySet("limits")) {
+ this.limits(model.getLimits());
+ }
+ if (model.wasPropertyExplicitlySet("backfillEligibility")) {
+ this.backfillEligibility(model.getBackfillEligibility());
+ }
+ if (model.wasPropertyExplicitlySet("isExcluded")) {
+ this.isExcluded(model.getIsExcluded());
+ }
+ return this;
+ }
+ }
+
+ /** Create a new builder. */
+ public static Builder builder() {
+ return new Builder();
+ }
+
+ public Builder toBuilder() {
+ return new Builder().copy(this);
+ }
+
+ /** The OCID of the compartment (remember that the tenancy is simply the root compartment). */
+ @com.fasterxml.jackson.annotation.JsonProperty("compartmentId")
+ private final String compartmentId;
+
+ /**
+ * The OCID of the compartment (remember that the tenancy is simply the root compartment).
+ *
+ * @return the value
+ */
+ public String getCompartmentId() {
+ return compartmentId;
+ }
+
+ /** Name of the product, defined by service teams. Unique within one service */
+ @com.fasterxml.jackson.annotation.JsonProperty("name")
+ private final String name;
+
+ /**
+ * Name of the product, defined by service teams. Unique within one service
+ *
+ * @return the value
+ */
+ public String getName() {
+ return name;
+ }
+
+ /** description to the product */
+ @com.fasterxml.jackson.annotation.JsonProperty("description")
+ private final String description;
+
+ /**
+ * description to the product
+ *
+ * @return the value
+ */
+ public String getDescription() {
+ return description;
+ }
+
+ /** List of meters associated with this product */
+ @com.fasterxml.jackson.annotation.JsonProperty("meters")
+ private final java.util.List meters;
+
+ /**
+ * List of meters associated with this product
+ *
+ * @return the value
+ */
+ public java.util.List getMeters() {
+ return meters;
+ }
+
+ /** Name of the metering service this product relates to. */
+ @com.fasterxml.jackson.annotation.JsonProperty("serviceName")
+ private final String serviceName;
+
+ /**
+ * Name of the metering service this product relates to.
+ *
+ * @return the value
+ */
+ public String getServiceName() {
+ return serviceName;
+ }
+
+ /** List of limits that this product is associated with. */
+ @com.fasterxml.jackson.annotation.JsonProperty("limits")
+ private final java.util.List limits;
+
+ /**
+ * List of limits that this product is associated with.
+ *
+ * @return the value
+ */
+ public java.util.List getLimits() {
+ return limits;
+ }
+
+ /**
+ * Optional create-time signal that marks the product as eligible for the backfill flow in
+ * existing Alloy regions. Omit this field to preserve the current create behavior. Final
+ * runtime backfill and auto-enable decisions remain worker-side.
+ */
+ public enum BackfillEligibility implements com.oracle.bmc.http.internal.BmcEnum {
+ BackfillEligible("BACKFILL_ELIGIBLE"),
+ ;
+
+ private final String value;
+ private static java.util.Map map;
+
+ static {
+ map = new java.util.HashMap<>();
+ for (BackfillEligibility v : BackfillEligibility.values()) {
+ map.put(v.getValue(), v);
+ }
+ }
+
+ BackfillEligibility(String value) {
+ this.value = value;
+ }
+
+ @com.fasterxml.jackson.annotation.JsonValue
+ public String getValue() {
+ return value;
+ }
+
+ @com.fasterxml.jackson.annotation.JsonCreator
+ public static BackfillEligibility create(String key) {
+ if (map.containsKey(key)) {
+ return map.get(key);
+ }
+ throw new IllegalArgumentException("Invalid BackfillEligibility: " + key);
+ }
+ };
+ /**
+ * Optional create-time signal that marks the product as eligible for the backfill flow in
+ * existing Alloy regions. Omit this field to preserve the current create behavior. Final
+ * runtime backfill and auto-enable decisions remain worker-side.
+ */
+ @com.fasterxml.jackson.annotation.JsonProperty("backfillEligibility")
+ private final BackfillEligibility backfillEligibility;
+
+ /**
+ * Optional create-time signal that marks the product as eligible for the backfill flow in
+ * existing Alloy regions. Omit this field to preserve the current create behavior. Final
+ * runtime backfill and auto-enable decisions remain worker-side.
+ *
+ * @return the value
+ */
+ public BackfillEligibility getBackfillEligibility() {
+ return backfillEligibility;
+ }
+
+ /**
+ * Optional create-time exclusion flag. When true, the product is created in an excluded state.
+ * Omit this field to preserve backward-compatible create behavior.
+ */
+ @com.fasterxml.jackson.annotation.JsonProperty("isExcluded")
+ private final Boolean isExcluded;
+
+ /**
+ * Optional create-time exclusion flag. When true, the product is created in an excluded state.
+ * Omit this field to preserve backward-compatible create behavior.
+ *
+ * @return the value
+ */
+ public Boolean getIsExcluded() {
+ return isExcluded;
+ }
+
+ @Override
+ public String toString() {
+ return this.toString(true);
+ }
+
+ /**
+ * Return a string representation of the object.
+ *
+ * @param includeByteArrayContents true to include the full contents of byte arrays
+ * @return string representation
+ */
+ public String toString(boolean includeByteArrayContents) {
+ java.lang.StringBuilder sb = new java.lang.StringBuilder();
+ sb.append("CreateProductDetails(");
+ sb.append("super=").append(super.toString());
+ sb.append("compartmentId=").append(String.valueOf(this.compartmentId));
+ sb.append(", name=").append(String.valueOf(this.name));
+ sb.append(", description=").append(String.valueOf(this.description));
+ sb.append(", meters=").append(String.valueOf(this.meters));
+ sb.append(", serviceName=").append(String.valueOf(this.serviceName));
+ sb.append(", limits=").append(String.valueOf(this.limits));
+ sb.append(", backfillEligibility=").append(String.valueOf(this.backfillEligibility));
+ sb.append(", isExcluded=").append(String.valueOf(this.isExcluded));
+ sb.append(")");
+ return sb.toString();
+ }
+
+ @Override
+ public boolean equals(Object o) {
+ if (this == o) {
+ return true;
+ }
+ if (!(o instanceof CreateProductDetails)) {
+ return false;
+ }
+
+ CreateProductDetails other = (CreateProductDetails) o;
+ return java.util.Objects.equals(this.compartmentId, other.compartmentId)
+ && java.util.Objects.equals(this.name, other.name)
+ && java.util.Objects.equals(this.description, other.description)
+ && java.util.Objects.equals(this.meters, other.meters)
+ && java.util.Objects.equals(this.serviceName, other.serviceName)
+ && java.util.Objects.equals(this.limits, other.limits)
+ && java.util.Objects.equals(this.backfillEligibility, other.backfillEligibility)
+ && java.util.Objects.equals(this.isExcluded, other.isExcluded)
+ && super.equals(other);
+ }
+
+ @Override
+ public int hashCode() {
+ final int PRIME = 59;
+ int result = 1;
+ result =
+ (result * PRIME)
+ + (this.compartmentId == null ? 43 : this.compartmentId.hashCode());
+ result = (result * PRIME) + (this.name == null ? 43 : this.name.hashCode());
+ result = (result * PRIME) + (this.description == null ? 43 : this.description.hashCode());
+ result = (result * PRIME) + (this.meters == null ? 43 : this.meters.hashCode());
+ result = (result * PRIME) + (this.serviceName == null ? 43 : this.serviceName.hashCode());
+ result = (result * PRIME) + (this.limits == null ? 43 : this.limits.hashCode());
+ result =
+ (result * PRIME)
+ + (this.backfillEligibility == null
+ ? 43
+ : this.backfillEligibility.hashCode());
+ result = (result * PRIME) + (this.isExcluded == null ? 43 : this.isExcluded.hashCode());
+ result = (result * PRIME) + super.hashCode();
+ return result;
+ }
+}
diff --git a/bmc-ociproductcatalog/src/main/java/com/oracle/bmc/ociproductcatalog/model/Limit.java b/bmc-ociproductcatalog/src/main/java/com/oracle/bmc/ociproductcatalog/model/Limit.java
new file mode 100644
index 00000000000..0933db127c8
--- /dev/null
+++ b/bmc-ociproductcatalog/src/main/java/com/oracle/bmc/ociproductcatalog/model/Limit.java
@@ -0,0 +1,171 @@
+/**
+ * Copyright (c) 2016, 2026, Oracle and/or its affiliates. All rights reserved.
+ * This software is dual-licensed to you under the Universal Permissive License (UPL) 1.0 as shown at https://oss.oracle.com/licenses/upl or Apache License 2.0 as shown at http://www.apache.org/licenses/LICENSE-2.0. You may choose either license.
+ */
+package com.oracle.bmc.ociproductcatalog.model;
+
+/**
+ * Limit that the use of a resource is controlled with
+ * Note: Objects should always be created or deserialized using the {@link Builder}. This model
+ * distinguishes fields that are {@code null} because they are unset from fields that are explicitly
+ * set to {@code null}. This is done in the setter methods of the {@link Builder}, which maintain a
+ * set of all explicitly set fields called {@link Builder#__explicitlySet__}. The {@link
+ * #hashCode()} and {@link #equals(Object)} methods are implemented to take the explicitly set
+ * fields into account. The constructor, on the other hand, does not take the explicitly set fields
+ * into account (since the constructor cannot distinguish explicit {@code null} from unset {@code
+ * null}).
+ */
+@jakarta.annotation.Generated(value = "OracleSDKGenerator", comments = "API Version: 20250610")
+@com.fasterxml.jackson.databind.annotation.JsonDeserialize(builder = Limit.Builder.class)
+@com.fasterxml.jackson.annotation.JsonFilter(
+ com.oracle.bmc.http.client.internal.ExplicitlySetBmcModel.EXPLICITLY_SET_FILTER_NAME)
+public final class Limit extends com.oracle.bmc.http.client.internal.ExplicitlySetBmcModel {
+ @Deprecated
+ @java.beans.ConstructorProperties({"publicLimitName", "publicServiceName"})
+ public Limit(String publicLimitName, String publicServiceName) {
+ super();
+ this.publicLimitName = publicLimitName;
+ this.publicServiceName = publicServiceName;
+ }
+
+ @com.fasterxml.jackson.databind.annotation.JsonPOJOBuilder(withPrefix = "")
+ public static class Builder {
+ /** public name of the limit */
+ @com.fasterxml.jackson.annotation.JsonProperty("publicLimitName")
+ private String publicLimitName;
+
+ /**
+ * public name of the limit
+ *
+ * @param publicLimitName the value to set
+ * @return this builder
+ */
+ public Builder publicLimitName(String publicLimitName) {
+ this.publicLimitName = publicLimitName;
+ this.__explicitlySet__.add("publicLimitName");
+ return this;
+ }
+ /** public name of the limit service */
+ @com.fasterxml.jackson.annotation.JsonProperty("publicServiceName")
+ private String publicServiceName;
+
+ /**
+ * public name of the limit service
+ *
+ * @param publicServiceName the value to set
+ * @return this builder
+ */
+ public Builder publicServiceName(String publicServiceName) {
+ this.publicServiceName = publicServiceName;
+ this.__explicitlySet__.add("publicServiceName");
+ return this;
+ }
+
+ @com.fasterxml.jackson.annotation.JsonIgnore
+ private final java.util.Set __explicitlySet__ = new java.util.HashSet();
+
+ public Limit build() {
+ Limit model = new Limit(this.publicLimitName, this.publicServiceName);
+ for (String explicitlySetProperty : this.__explicitlySet__) {
+ model.markPropertyAsExplicitlySet(explicitlySetProperty);
+ }
+ return model;
+ }
+
+ @com.fasterxml.jackson.annotation.JsonIgnore
+ public Builder copy(Limit model) {
+ if (model.wasPropertyExplicitlySet("publicLimitName")) {
+ this.publicLimitName(model.getPublicLimitName());
+ }
+ if (model.wasPropertyExplicitlySet("publicServiceName")) {
+ this.publicServiceName(model.getPublicServiceName());
+ }
+ return this;
+ }
+ }
+
+ /** Create a new builder. */
+ public static Builder builder() {
+ return new Builder();
+ }
+
+ public Builder toBuilder() {
+ return new Builder().copy(this);
+ }
+
+ /** public name of the limit */
+ @com.fasterxml.jackson.annotation.JsonProperty("publicLimitName")
+ private final String publicLimitName;
+
+ /**
+ * public name of the limit
+ *
+ * @return the value
+ */
+ public String getPublicLimitName() {
+ return publicLimitName;
+ }
+
+ /** public name of the limit service */
+ @com.fasterxml.jackson.annotation.JsonProperty("publicServiceName")
+ private final String publicServiceName;
+
+ /**
+ * public name of the limit service
+ *
+ * @return the value
+ */
+ public String getPublicServiceName() {
+ return publicServiceName;
+ }
+
+ @Override
+ public String toString() {
+ return this.toString(true);
+ }
+
+ /**
+ * Return a string representation of the object.
+ *
+ * @param includeByteArrayContents true to include the full contents of byte arrays
+ * @return string representation
+ */
+ public String toString(boolean includeByteArrayContents) {
+ java.lang.StringBuilder sb = new java.lang.StringBuilder();
+ sb.append("Limit(");
+ sb.append("super=").append(super.toString());
+ sb.append("publicLimitName=").append(String.valueOf(this.publicLimitName));
+ sb.append(", publicServiceName=").append(String.valueOf(this.publicServiceName));
+ sb.append(")");
+ return sb.toString();
+ }
+
+ @Override
+ public boolean equals(Object o) {
+ if (this == o) {
+ return true;
+ }
+ if (!(o instanceof Limit)) {
+ return false;
+ }
+
+ Limit other = (Limit) o;
+ return java.util.Objects.equals(this.publicLimitName, other.publicLimitName)
+ && java.util.Objects.equals(this.publicServiceName, other.publicServiceName)
+ && super.equals(other);
+ }
+
+ @Override
+ public int hashCode() {
+ final int PRIME = 59;
+ int result = 1;
+ result =
+ (result * PRIME)
+ + (this.publicLimitName == null ? 43 : this.publicLimitName.hashCode());
+ result =
+ (result * PRIME)
+ + (this.publicServiceName == null ? 43 : this.publicServiceName.hashCode());
+ result = (result * PRIME) + super.hashCode();
+ return result;
+ }
+}
diff --git a/bmc-ociproductcatalog/src/main/java/com/oracle/bmc/ociproductcatalog/model/Meter.java b/bmc-ociproductcatalog/src/main/java/com/oracle/bmc/ociproductcatalog/model/Meter.java
new file mode 100644
index 00000000000..5281d8742ec
--- /dev/null
+++ b/bmc-ociproductcatalog/src/main/java/com/oracle/bmc/ociproductcatalog/model/Meter.java
@@ -0,0 +1,131 @@
+/**
+ * Copyright (c) 2016, 2026, Oracle and/or its affiliates. All rights reserved.
+ * This software is dual-licensed to you under the Universal Permissive License (UPL) 1.0 as shown at https://oss.oracle.com/licenses/upl or Apache License 2.0 as shown at http://www.apache.org/licenses/LICENSE-2.0. You may choose either license.
+ */
+package com.oracle.bmc.ociproductcatalog.model;
+
+/**
+ * Meter defined in metering service
+ * Note: Objects should always be created or deserialized using the {@link Builder}. This model
+ * distinguishes fields that are {@code null} because they are unset from fields that are explicitly
+ * set to {@code null}. This is done in the setter methods of the {@link Builder}, which maintain a
+ * set of all explicitly set fields called {@link Builder#__explicitlySet__}. The {@link
+ * #hashCode()} and {@link #equals(Object)} methods are implemented to take the explicitly set
+ * fields into account. The constructor, on the other hand, does not take the explicitly set fields
+ * into account (since the constructor cannot distinguish explicit {@code null} from unset {@code
+ * null}).
+ */
+@jakarta.annotation.Generated(value = "OracleSDKGenerator", comments = "API Version: 20250610")
+@com.fasterxml.jackson.databind.annotation.JsonDeserialize(builder = Meter.Builder.class)
+@com.fasterxml.jackson.annotation.JsonFilter(
+ com.oracle.bmc.http.client.internal.ExplicitlySetBmcModel.EXPLICITLY_SET_FILTER_NAME)
+public final class Meter extends com.oracle.bmc.http.client.internal.ExplicitlySetBmcModel {
+ @Deprecated
+ @java.beans.ConstructorProperties({"name"})
+ public Meter(String name) {
+ super();
+ this.name = name;
+ }
+
+ @com.fasterxml.jackson.databind.annotation.JsonPOJOBuilder(withPrefix = "")
+ public static class Builder {
+ /** Name of the meter */
+ @com.fasterxml.jackson.annotation.JsonProperty("name")
+ private String name;
+
+ /**
+ * Name of the meter
+ *
+ * @param name the value to set
+ * @return this builder
+ */
+ public Builder name(String name) {
+ this.name = name;
+ this.__explicitlySet__.add("name");
+ return this;
+ }
+
+ @com.fasterxml.jackson.annotation.JsonIgnore
+ private final java.util.Set __explicitlySet__ = new java.util.HashSet();
+
+ public Meter build() {
+ Meter model = new Meter(this.name);
+ for (String explicitlySetProperty : this.__explicitlySet__) {
+ model.markPropertyAsExplicitlySet(explicitlySetProperty);
+ }
+ return model;
+ }
+
+ @com.fasterxml.jackson.annotation.JsonIgnore
+ public Builder copy(Meter model) {
+ if (model.wasPropertyExplicitlySet("name")) {
+ this.name(model.getName());
+ }
+ return this;
+ }
+ }
+
+ /** Create a new builder. */
+ public static Builder builder() {
+ return new Builder();
+ }
+
+ public Builder toBuilder() {
+ return new Builder().copy(this);
+ }
+
+ /** Name of the meter */
+ @com.fasterxml.jackson.annotation.JsonProperty("name")
+ private final String name;
+
+ /**
+ * Name of the meter
+ *
+ * @return the value
+ */
+ public String getName() {
+ return name;
+ }
+
+ @Override
+ public String toString() {
+ return this.toString(true);
+ }
+
+ /**
+ * Return a string representation of the object.
+ *
+ * @param includeByteArrayContents true to include the full contents of byte arrays
+ * @return string representation
+ */
+ public String toString(boolean includeByteArrayContents) {
+ java.lang.StringBuilder sb = new java.lang.StringBuilder();
+ sb.append("Meter(");
+ sb.append("super=").append(super.toString());
+ sb.append("name=").append(String.valueOf(this.name));
+ sb.append(")");
+ return sb.toString();
+ }
+
+ @Override
+ public boolean equals(Object o) {
+ if (this == o) {
+ return true;
+ }
+ if (!(o instanceof Meter)) {
+ return false;
+ }
+
+ Meter other = (Meter) o;
+ return java.util.Objects.equals(this.name, other.name) && super.equals(other);
+ }
+
+ @Override
+ public int hashCode() {
+ final int PRIME = 59;
+ int result = 1;
+ result = (result * PRIME) + (this.name == null ? 43 : this.name.hashCode());
+ result = (result * PRIME) + super.hashCode();
+ return result;
+ }
+}
diff --git a/bmc-ociproductcatalog/src/main/java/com/oracle/bmc/ociproductcatalog/model/MeterWithSKU.java b/bmc-ociproductcatalog/src/main/java/com/oracle/bmc/ociproductcatalog/model/MeterWithSKU.java
new file mode 100644
index 00000000000..53ec27854fe
--- /dev/null
+++ b/bmc-ociproductcatalog/src/main/java/com/oracle/bmc/ociproductcatalog/model/MeterWithSKU.java
@@ -0,0 +1,204 @@
+/**
+ * Copyright (c) 2016, 2026, Oracle and/or its affiliates. All rights reserved.
+ * This software is dual-licensed to you under the Universal Permissive License (UPL) 1.0 as shown at https://oss.oracle.com/licenses/upl or Apache License 2.0 as shown at http://www.apache.org/licenses/LICENSE-2.0. You may choose either license.
+ */
+package com.oracle.bmc.ociproductcatalog.model;
+
+/**
+ * Meter defined in metering service with the associated SKU
+ * Note: Objects should always be created or deserialized using the {@link Builder}. This model
+ * distinguishes fields that are {@code null} because they are unset from fields that are explicitly
+ * set to {@code null}. This is done in the setter methods of the {@link Builder}, which maintain a
+ * set of all explicitly set fields called {@link Builder#__explicitlySet__}. The {@link
+ * #hashCode()} and {@link #equals(Object)} methods are implemented to take the explicitly set
+ * fields into account. The constructor, on the other hand, does not take the explicitly set fields
+ * into account (since the constructor cannot distinguish explicit {@code null} from unset {@code
+ * null}).
+ */
+@jakarta.annotation.Generated(value = "OracleSDKGenerator", comments = "API Version: 20250610")
+@com.fasterxml.jackson.databind.annotation.JsonDeserialize(builder = MeterWithSKU.Builder.class)
+@com.fasterxml.jackson.annotation.JsonFilter(
+ com.oracle.bmc.http.client.internal.ExplicitlySetBmcModel.EXPLICITLY_SET_FILTER_NAME)
+public final class MeterWithSKU extends com.oracle.bmc.http.client.internal.ExplicitlySetBmcModel {
+ @Deprecated
+ @java.beans.ConstructorProperties({"name", "skuBNumber", "skuDescription"})
+ public MeterWithSKU(String name, String skuBNumber, String skuDescription) {
+ super();
+ this.name = name;
+ this.skuBNumber = skuBNumber;
+ this.skuDescription = skuDescription;
+ }
+
+ @com.fasterxml.jackson.databind.annotation.JsonPOJOBuilder(withPrefix = "")
+ public static class Builder {
+ /** Name of the meter */
+ @com.fasterxml.jackson.annotation.JsonProperty("name")
+ private String name;
+
+ /**
+ * Name of the meter
+ *
+ * @param name the value to set
+ * @return this builder
+ */
+ public Builder name(String name) {
+ this.name = name;
+ this.__explicitlySet__.add("name");
+ return this;
+ }
+ /** B number of the SKU associated with the meter */
+ @com.fasterxml.jackson.annotation.JsonProperty("skuBNumber")
+ private String skuBNumber;
+
+ /**
+ * B number of the SKU associated with the meter
+ *
+ * @param skuBNumber the value to set
+ * @return this builder
+ */
+ public Builder skuBNumber(String skuBNumber) {
+ this.skuBNumber = skuBNumber;
+ this.__explicitlySet__.add("skuBNumber");
+ return this;
+ }
+ /** Description of the SKU associated with the meter */
+ @com.fasterxml.jackson.annotation.JsonProperty("skuDescription")
+ private String skuDescription;
+
+ /**
+ * Description of the SKU associated with the meter
+ *
+ * @param skuDescription the value to set
+ * @return this builder
+ */
+ public Builder skuDescription(String skuDescription) {
+ this.skuDescription = skuDescription;
+ this.__explicitlySet__.add("skuDescription");
+ return this;
+ }
+
+ @com.fasterxml.jackson.annotation.JsonIgnore
+ private final java.util.Set __explicitlySet__ = new java.util.HashSet();
+
+ public MeterWithSKU build() {
+ MeterWithSKU model = new MeterWithSKU(this.name, this.skuBNumber, this.skuDescription);
+ for (String explicitlySetProperty : this.__explicitlySet__) {
+ model.markPropertyAsExplicitlySet(explicitlySetProperty);
+ }
+ return model;
+ }
+
+ @com.fasterxml.jackson.annotation.JsonIgnore
+ public Builder copy(MeterWithSKU model) {
+ if (model.wasPropertyExplicitlySet("name")) {
+ this.name(model.getName());
+ }
+ if (model.wasPropertyExplicitlySet("skuBNumber")) {
+ this.skuBNumber(model.getSkuBNumber());
+ }
+ if (model.wasPropertyExplicitlySet("skuDescription")) {
+ this.skuDescription(model.getSkuDescription());
+ }
+ return this;
+ }
+ }
+
+ /** Create a new builder. */
+ public static Builder builder() {
+ return new Builder();
+ }
+
+ public Builder toBuilder() {
+ return new Builder().copy(this);
+ }
+
+ /** Name of the meter */
+ @com.fasterxml.jackson.annotation.JsonProperty("name")
+ private final String name;
+
+ /**
+ * Name of the meter
+ *
+ * @return the value
+ */
+ public String getName() {
+ return name;
+ }
+
+ /** B number of the SKU associated with the meter */
+ @com.fasterxml.jackson.annotation.JsonProperty("skuBNumber")
+ private final String skuBNumber;
+
+ /**
+ * B number of the SKU associated with the meter
+ *
+ * @return the value
+ */
+ public String getSkuBNumber() {
+ return skuBNumber;
+ }
+
+ /** Description of the SKU associated with the meter */
+ @com.fasterxml.jackson.annotation.JsonProperty("skuDescription")
+ private final String skuDescription;
+
+ /**
+ * Description of the SKU associated with the meter
+ *
+ * @return the value
+ */
+ public String getSkuDescription() {
+ return skuDescription;
+ }
+
+ @Override
+ public String toString() {
+ return this.toString(true);
+ }
+
+ /**
+ * Return a string representation of the object.
+ *
+ * @param includeByteArrayContents true to include the full contents of byte arrays
+ * @return string representation
+ */
+ public String toString(boolean includeByteArrayContents) {
+ java.lang.StringBuilder sb = new java.lang.StringBuilder();
+ sb.append("MeterWithSKU(");
+ sb.append("super=").append(super.toString());
+ sb.append("name=").append(String.valueOf(this.name));
+ sb.append(", skuBNumber=").append(String.valueOf(this.skuBNumber));
+ sb.append(", skuDescription=").append(String.valueOf(this.skuDescription));
+ sb.append(")");
+ return sb.toString();
+ }
+
+ @Override
+ public boolean equals(Object o) {
+ if (this == o) {
+ return true;
+ }
+ if (!(o instanceof MeterWithSKU)) {
+ return false;
+ }
+
+ MeterWithSKU other = (MeterWithSKU) o;
+ return java.util.Objects.equals(this.name, other.name)
+ && java.util.Objects.equals(this.skuBNumber, other.skuBNumber)
+ && java.util.Objects.equals(this.skuDescription, other.skuDescription)
+ && super.equals(other);
+ }
+
+ @Override
+ public int hashCode() {
+ final int PRIME = 59;
+ int result = 1;
+ result = (result * PRIME) + (this.name == null ? 43 : this.name.hashCode());
+ result = (result * PRIME) + (this.skuBNumber == null ? 43 : this.skuBNumber.hashCode());
+ result =
+ (result * PRIME)
+ + (this.skuDescription == null ? 43 : this.skuDescription.hashCode());
+ result = (result * PRIME) + super.hashCode();
+ return result;
+ }
+}
diff --git a/bmc-ociproductcatalog/src/main/java/com/oracle/bmc/ociproductcatalog/model/Product.java b/bmc-ociproductcatalog/src/main/java/com/oracle/bmc/ociproductcatalog/model/Product.java
new file mode 100644
index 00000000000..f842cd905c4
--- /dev/null
+++ b/bmc-ociproductcatalog/src/main/java/com/oracle/bmc/ociproductcatalog/model/Product.java
@@ -0,0 +1,783 @@
+/**
+ * Copyright (c) 2016, 2026, Oracle and/or its affiliates. All rights reserved.
+ * This software is dual-licensed to you under the Universal Permissive License (UPL) 1.0 as shown at https://oss.oracle.com/licenses/upl or Apache License 2.0 as shown at http://www.apache.org/licenses/LICENSE-2.0. You may choose either license.
+ */
+package com.oracle.bmc.ociproductcatalog.model;
+
+/**
+ * The fields of a product to be displayed to the operator in OCI Console
+ * Note: Objects should always be created or deserialized using the {@link Builder}. This model
+ * distinguishes fields that are {@code null} because they are unset from fields that are explicitly
+ * set to {@code null}. This is done in the setter methods of the {@link Builder}, which maintain a
+ * set of all explicitly set fields called {@link Builder#__explicitlySet__}. The {@link
+ * #hashCode()} and {@link #equals(Object)} methods are implemented to take the explicitly set
+ * fields into account. The constructor, on the other hand, does not take the explicitly set fields
+ * into account (since the constructor cannot distinguish explicit {@code null} from unset {@code
+ * null}).
+ */
+@jakarta.annotation.Generated(value = "OracleSDKGenerator", comments = "API Version: 20250610")
+@com.fasterxml.jackson.databind.annotation.JsonDeserialize(builder = Product.Builder.class)
+@com.fasterxml.jackson.annotation.JsonFilter(
+ com.oracle.bmc.http.client.internal.ExplicitlySetBmcModel.EXPLICITLY_SET_FILTER_NAME)
+public final class Product extends com.oracle.bmc.http.client.internal.ExplicitlySetBmcModel {
+ @Deprecated
+ @java.beans.ConstructorProperties({
+ "description",
+ "id",
+ "name",
+ "skus",
+ "serviceName",
+ "lifecycleState",
+ "lifecycleDetails",
+ "timeCreated",
+ "timeLaunched",
+ "timeReady",
+ "isExcluded",
+ "freeformTags",
+ "definedTags",
+ "systemTags"
+ })
+ public Product(
+ String description,
+ String id,
+ String name,
+ java.util.List skus,
+ String serviceName,
+ LifecycleState lifecycleState,
+ String lifecycleDetails,
+ java.util.Date timeCreated,
+ java.util.Date timeLaunched,
+ java.util.Date timeReady,
+ Boolean isExcluded,
+ java.util.Map freeformTags,
+ java.util.Map> definedTags,
+ java.util.Map> systemTags) {
+ super();
+ this.description = description;
+ this.id = id;
+ this.name = name;
+ this.skus = skus;
+ this.serviceName = serviceName;
+ this.lifecycleState = lifecycleState;
+ this.lifecycleDetails = lifecycleDetails;
+ this.timeCreated = timeCreated;
+ this.timeLaunched = timeLaunched;
+ this.timeReady = timeReady;
+ this.isExcluded = isExcluded;
+ this.freeformTags = freeformTags;
+ this.definedTags = definedTags;
+ this.systemTags = systemTags;
+ }
+
+ @com.fasterxml.jackson.databind.annotation.JsonPOJOBuilder(withPrefix = "")
+ public static class Builder {
+ /** description to the product */
+ @com.fasterxml.jackson.annotation.JsonProperty("description")
+ private String description;
+
+ /**
+ * description to the product
+ *
+ * @param description the value to set
+ * @return this builder
+ */
+ public Builder description(String description) {
+ this.description = description;
+ this.__explicitlySet__.add("description");
+ return this;
+ }
+ /** OCID of the product */
+ @com.fasterxml.jackson.annotation.JsonProperty("id")
+ private String id;
+
+ /**
+ * OCID of the product
+ *
+ * @param id the value to set
+ * @return this builder
+ */
+ public Builder id(String id) {
+ this.id = id;
+ this.__explicitlySet__.add("id");
+ return this;
+ }
+ /** Name of the product, defined by service teams. Unique within one service */
+ @com.fasterxml.jackson.annotation.JsonProperty("name")
+ private String name;
+
+ /**
+ * Name of the product, defined by service teams. Unique within one service
+ *
+ * @param name the value to set
+ * @return this builder
+ */
+ public Builder name(String name) {
+ this.name = name;
+ this.__explicitlySet__.add("name");
+ return this;
+ }
+ /** List of skus associated with this product. */
+ @com.fasterxml.jackson.annotation.JsonProperty("skus")
+ private java.util.List skus;
+
+ /**
+ * List of skus associated with this product.
+ *
+ * @param skus the value to set
+ * @return this builder
+ */
+ public Builder skus(java.util.List skus) {
+ this.skus = skus;
+ this.__explicitlySet__.add("skus");
+ return this;
+ }
+ /** Name of the metering service this product relates to. */
+ @com.fasterxml.jackson.annotation.JsonProperty("serviceName")
+ private String serviceName;
+
+ /**
+ * Name of the metering service this product relates to.
+ *
+ * @param serviceName the value to set
+ * @return this builder
+ */
+ public Builder serviceName(String serviceName) {
+ this.serviceName = serviceName;
+ this.__explicitlySet__.add("serviceName");
+ return this;
+ }
+ /**
+ * The status of a product following the OCI standard. ACTIVE: resources of this product can
+ * be used by the end customer. INACTIVE: resources of this product can't be used by the end
+ * customer. Product needs manual approval. NEEDS_ATTENTION: operator action is needed.
+ */
+ @com.fasterxml.jackson.annotation.JsonProperty("lifecycleState")
+ private LifecycleState lifecycleState;
+
+ /**
+ * The status of a product following the OCI standard. ACTIVE: resources of this product can
+ * be used by the end customer. INACTIVE: resources of this product can't be used by the end
+ * customer. Product needs manual approval. NEEDS_ATTENTION: operator action is needed.
+ *
+ * @param lifecycleState the value to set
+ * @return this builder
+ */
+ public Builder lifecycleState(LifecycleState lifecycleState) {
+ this.lifecycleState = lifecycleState;
+ this.__explicitlySet__.add("lifecycleState");
+ return this;
+ }
+ /**
+ * The displayed status of a product. lifecycleState to lifecycleDetails mapping: INACTIVE
+ * -> "Not yet launched" ACTIVE -> "Launched" NEEDS_ATTENTION -> "Pricing not set"
+ */
+ @com.fasterxml.jackson.annotation.JsonProperty("lifecycleDetails")
+ private String lifecycleDetails;
+
+ /**
+ * The displayed status of a product. lifecycleState to lifecycleDetails mapping: INACTIVE
+ * -> "Not yet launched" ACTIVE -> "Launched" NEEDS_ATTENTION -> "Pricing not set"
+ *
+ * @param lifecycleDetails the value to set
+ * @return this builder
+ */
+ public Builder lifecycleDetails(String lifecycleDetails) {
+ this.lifecycleDetails = lifecycleDetails;
+ this.__explicitlySet__.add("lifecycleDetails");
+ return this;
+ }
+ /** Date and time when the product is created Example: {@code 2022-01-25T21:10:29.600Z} */
+ @com.fasterxml.jackson.annotation.JsonProperty("timeCreated")
+ private java.util.Date timeCreated;
+
+ /**
+ * Date and time when the product is created Example: {@code 2022-01-25T21:10:29.600Z}
+ *
+ * @param timeCreated the value to set
+ * @return this builder
+ */
+ public Builder timeCreated(java.util.Date timeCreated) {
+ this.timeCreated = timeCreated;
+ this.__explicitlySet__.add("timeCreated");
+ return this;
+ }
+ /**
+ * Date and time when the product is launched. Nullable Example: {@code
+ * 2022-01-25T21:10:29.600Z}
+ */
+ @com.fasterxml.jackson.annotation.JsonProperty("timeLaunched")
+ private java.util.Date timeLaunched;
+
+ /**
+ * Date and time when the product is launched. Nullable Example: {@code
+ * 2022-01-25T21:10:29.600Z}
+ *
+ * @param timeLaunched the value to set
+ * @return this builder
+ */
+ public Builder timeLaunched(java.util.Date timeLaunched) {
+ this.timeLaunched = timeLaunched;
+ this.__explicitlySet__.add("timeLaunched");
+ return this;
+ }
+ /**
+ * Date and time when the product is ready to be launched. Nullable Example: {@code
+ * 2022-01-25T21:10:29.600Z}
+ */
+ @com.fasterxml.jackson.annotation.JsonProperty("timeReady")
+ private java.util.Date timeReady;
+
+ /**
+ * Date and time when the product is ready to be launched. Nullable Example: {@code
+ * 2022-01-25T21:10:29.600Z}
+ *
+ * @param timeReady the value to set
+ * @return this builder
+ */
+ public Builder timeReady(java.util.Date timeReady) {
+ this.timeReady = timeReady;
+ this.__explicitlySet__.add("timeReady");
+ return this;
+ }
+ /**
+ * Indicates whether the product is currently excluded from SKU processing flows. This field
+ * is nullable when the exclusion flag has not been explicitly set.
+ */
+ @com.fasterxml.jackson.annotation.JsonProperty("isExcluded")
+ private Boolean isExcluded;
+
+ /**
+ * Indicates whether the product is currently excluded from SKU processing flows. This field
+ * is nullable when the exclusion flag has not been explicitly set.
+ *
+ * @param isExcluded the value to set
+ * @return this builder
+ */
+ public Builder isExcluded(Boolean isExcluded) {
+ this.isExcluded = isExcluded;
+ this.__explicitlySet__.add("isExcluded");
+ return this;
+ }
+ /**
+ * Free-form tags for this resource. Each tag is a simple key-value pair with no predefined
+ * name, type, or namespace. For more information, see [Resource
+ * Tags](https://docs.oracle.com/iaas/Content/General/Concepts/resourcetags.htm).
+ *
+ * Example: {@code {"Department": "Finance"}}
+ */
+ @com.fasterxml.jackson.annotation.JsonProperty("freeformTags")
+ private java.util.Map freeformTags;
+
+ /**
+ * Free-form tags for this resource. Each tag is a simple key-value pair with no predefined
+ * name, type, or namespace. For more information, see [Resource
+ * Tags](https://docs.oracle.com/iaas/Content/General/Concepts/resourcetags.htm).
+ *
+ * Example: {@code {"Department": "Finance"}}
+ *
+ * @param freeformTags the value to set
+ * @return this builder
+ */
+ public Builder freeformTags(java.util.Map freeformTags) {
+ this.freeformTags = freeformTags;
+ this.__explicitlySet__.add("freeformTags");
+ return this;
+ }
+ /**
+ * Defined tags for this resource. Each key is predefined and scoped to a namespace. For
+ * more information, see [Resource
+ * Tags](https://docs.oracle.com/iaas/Content/General/Concepts/resourcetags.htm).
+ *
+ * Example: {@code {"Operations": {"CostCenter": "42"}}}
+ */
+ @com.fasterxml.jackson.annotation.JsonProperty("definedTags")
+ private java.util.Map> definedTags;
+
+ /**
+ * Defined tags for this resource. Each key is predefined and scoped to a namespace. For
+ * more information, see [Resource
+ * Tags](https://docs.oracle.com/iaas/Content/General/Concepts/resourcetags.htm).
+ *
+ * Example: {@code {"Operations": {"CostCenter": "42"}}}
+ *
+ * @param definedTags the value to set
+ * @return this builder
+ */
+ public Builder definedTags(
+ java.util.Map> definedTags) {
+ this.definedTags = definedTags;
+ this.__explicitlySet__.add("definedTags");
+ return this;
+ }
+ /**
+ * System tags for this resource. Each key is predefined and scoped to a namespace.
+ *
+ * Example: {@code {"orcl-cloud": {"free-tier-retained": "true"}}}
+ */
+ @com.fasterxml.jackson.annotation.JsonProperty("systemTags")
+ private java.util.Map> systemTags;
+
+ /**
+ * System tags for this resource. Each key is predefined and scoped to a namespace.
+ *
+ *