Insert local inventory asynchronously

Merchant API code sample to insert local inventory asynchronously.

Java

  // Copyright 2025 Google LLC 
 // 
 // Licensed under the Apache License, Version 2.0 (the "License"); 
 // you may not use this file except in compliance with the License. 
 // You may obtain a copy of the License at 
 // 
 //     https://www.apache.org/licenses/LICENSE-2.0 
 // 
 // Unless required by applicable law or agreed to in writing, software 
 // distributed under the License is distributed on an "AS IS" BASIS, 
 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 
 // See the License for the specific language governing permissions and 
 // limitations under the License. 
 package 
  
 shopping.merchant.samples.inventories.v1 
 ; 
 import 
  
 com.google.api.core.ApiFuture 
 ; 
 import 
  
 com.google.api.core.ApiFutureCallback 
 ; 
 import 
  
 com.google.api.core.ApiFutures 
 ; 
 import 
  
 com.google.api.gax.core.FixedCredentialsProvider 
 ; 
 import 
  
 com.google.auth.oauth2.GoogleCredentials 
 ; 
 import 
  
 com.google.common.util.concurrent.MoreExecutors 
 ; 
 import 
  
 com.google.shopping.merchant.inventories.v1.InsertLocalInventoryRequest 
 ; 
 import 
  
 com.google.shopping.merchant.inventories.v1.LocalInventory 
 ; 
 import 
  
 com.google.shopping.merchant.inventories.v1.LocalInventoryAttributes 
 ; 
 import 
  
 com.google.shopping.merchant.inventories.v1.LocalInventoryAttributes.Availability 
 ; 
 import 
  
 com.google.shopping.merchant.inventories.v1.LocalInventoryServiceClient 
 ; 
 import 
  
 com.google.shopping.merchant.inventories.v1.LocalInventoryServiceSettings 
 ; 
 import 
  
 com.google.shopping.merchant.products.v1.ListProductsRequest 
 ; 
 import 
  
 com.google.shopping.merchant.products.v1.Product 
 ; 
 import 
  
 com.google.shopping.merchant.products.v1.ProductsServiceClient 
 ; 
 import 
  
 com.google.shopping.merchant.products.v1.ProductsServiceClient.ListProductsPagedResponse 
 ; 
 import 
  
 com.google.shopping.merchant.products.v1.ProductsServiceSettings 
 ; 
 import 
  
 com.google.shopping.type.Price 
 ; 
 import 
  
 java.io.IOException 
 ; 
 import 
  
 java.util.ArrayList 
 ; 
 import 
  
 java.util.List 
 ; 
 import 
  
 java.util.stream.Collectors 
 ; 
 import 
  
 shopping.merchant.samples.utils.Authenticator 
 ; 
 import 
  
 shopping.merchant.samples.utils.Config 
 ; 
 /** 
 * This class demonstrates how to insert Local inventory asynchronously for multiple products. Note, 
 * this code sample will only work if you already have datasource and products available for local 
 * products. You can create a datasource for local and products by looking at the DataSources and 
 * Products samples. 
 */ 
 public 
  
 class 
 InsertLocalInventoryAsyncSample 
  
 { 
  
 /* Gets the names of all the local products for a given merchant center account. */ 
  
 public 
  
 static 
  
 List<String> 
  
 getLocalProductNames 
 ( 
 GoogleCredentials 
  
 credential 
 , 
  
 String 
  
 accountId 
 ) 
  
 throws 
  
 IOException 
  
 { 
  
 ProductsServiceSettings 
  
 productsServiceSettings 
  
 = 
  
 ProductsServiceSettings 
 . 
 newBuilder 
 () 
  
 . 
 setCredentialsProvider 
 ( 
 FixedCredentialsProvider 
 . 
 create 
 ( 
 credential 
 )) 
  
 . 
 build 
 (); 
  
 try 
  
 ( 
 ProductsServiceClient 
  
 productsServiceClient 
  
 = 
  
 ProductsServiceClient 
 . 
 create 
 ( 
 productsServiceSettings 
 )) 
  
 { 
  
 ListProductsRequest 
  
 request 
  
 = 
  
 ListProductsRequest 
 . 
 newBuilder 
 () 
  
 // Creates parent to identify the account from which to list all products. 
  
 . 
 setParent 
 ( 
 String 
 . 
 format 
 ( 
 "accounts/%s" 
 , 
  
 accountId 
 )) 
  
 . 
 build 
 (); 
  
 System 
 . 
 out 
 . 
 println 
 ( 
 "Sending list products request:" 
 ); 
  
 ListProductsPagedResponse 
  
 response 
  
 = 
  
 productsServiceClient 
 . 
 listProducts 
 ( 
 request 
 ); 
  
 // Iterates over all rows in all pages and prints the datasource in each row. 
  
 // Automatically uses the `nextPageToken` if returned to fetch all pages of data 
  
 List<String> 
  
 localProductNames 
  
 = 
  
 new 
  
 ArrayList<String> 
 (); 
  
 for 
  
 ( 
 Product 
  
 product 
  
 : 
  
 response 
 . 
 iterateAll 
 ()) 
  
 { 
  
 // Filters for only local products using the legacyLocal field. 
  
 if 
  
 ( 
 product 
 . 
 getLegacyLocal 
 ()) 
  
 { 
  
 // The name is returned in the format: 
  
 // accounts/{account}/products/{channel}~{contentLanguage}~{feedLabel}~{offerId} 
  
 // These will be used to insert local inventory for each product. 
  
 localProductNames 
 . 
 add 
 ( 
 product 
 . 
 getName 
 ()); 
  
 } 
  
 } 
  
 return 
  
 localProductNames 
 ; 
  
 } 
  
 } 
  
 public 
  
 static 
  
 void 
  
 insertLocalInventoryAsync 
 ( 
  
 GoogleCredentials 
  
 credential 
 , 
  
 String 
  
 accountId 
 , 
  
 String 
  
 storeCode 
 ) 
  
 throws 
  
 Exception 
  
 { 
  
 LocalInventoryServiceSettings 
  
 localInventoryServiceSettings 
  
 = 
  
 LocalInventoryServiceSettings 
 . 
 newBuilder 
 () 
  
 . 
 setCredentialsProvider 
 ( 
 FixedCredentialsProvider 
 . 
 create 
 ( 
 credential 
 )) 
  
 . 
 build 
 (); 
  
 try 
  
 ( 
 LocalInventoryServiceClient 
  
 localInventoryServiceClient 
  
 = 
  
 LocalInventoryServiceClient 
 . 
 create 
 ( 
 localInventoryServiceSettings 
 )) 
  
 { 
  
 // In this example, we are simply using the same price for all products. 
  
 Price 
  
 price 
  
 = 
  
 Price 
 . 
 newBuilder 
 (). 
 setAmountMicros 
 ( 
 33_450_000 
 ). 
 setCurrencyCode 
 ( 
 "USD" 
 ). 
 build 
 (); 
  
 // Checks that the account has local products. 
  
 List<String> 
  
 localProductNames 
  
 = 
  
 getLocalProductNames 
 ( 
 credential 
 , 
  
 accountId 
 ); 
  
 if 
  
 ( 
 localProductNames 
 . 
 isEmpty 
 ()) 
  
 { 
  
 throw 
  
 new 
  
 Exception 
 ( 
 "No local products found for this account." 
 ); 
  
 } 
  
 // Creates requests to update the inventory for each product, set a fixed price and set the 
  
 // availability to "out of stock". 
  
 List<InsertLocalInventoryRequest> 
  
 requests 
  
 = 
  
 localProductNames 
 . 
 stream 
 () 
  
 . 
 map 
 ( 
  
 name 
  
 - 
>  
 { 
  
 return 
  
 InsertLocalInventoryRequest 
 . 
 newBuilder 
 () 
  
 . 
 setParent 
 ( 
 name 
 ) 
  
 . 
 setLocalInventory 
 ( 
  
 LocalInventory 
 . 
 newBuilder 
 () 
  
 . 
 setLocalInventoryAttributes 
 ( 
  
 LocalInventoryAttributes 
 . 
 newBuilder 
 () 
  
 . 
 setAvailability 
 ( 
 Availability 
 . 
 OUT_OF_STOCK 
 ) 
  
 . 
 setPrice 
 ( 
 price 
 ) 
  
 . 
 build 
 ()) 
  
 . 
 setStoreCode 
 ( 
 storeCode 
 ) 
  
 . 
 build 
 ()) 
  
 . 
 build 
 (); 
  
 }) 
  
 . 
 collect 
 ( 
 Collectors 
 . 
 toList 
 ()); 
  
 // Inserts the local inventory for each product. 
  
 System 
 . 
 out 
 . 
 println 
 ( 
 "Sending InsertLocalInventory requests" 
 ); 
  
 List<ApiFuture<LocalInventory> 
>  
 futures 
  
 = 
  
 requests 
 . 
 stream 
 () 
  
 . 
 map 
 ( 
  
 request 
  
 - 
>  
 localInventoryServiceClient 
  
 . 
 insertLocalInventoryCallable 
 () 
  
 . 
 futureCall 
 ( 
 request 
 )) 
  
 . 
 collect 
 ( 
 Collectors 
 . 
 toList 
 ()); 
  
 // Callback to handle the responses from the API once they are all returned. 
  
 ApiFuture<List<LocalInventory> 
>  
 responses 
  
 = 
  
 ApiFutures 
 . 
 allAsList 
 ( 
 futures 
 ); 
  
 ApiFutures 
 . 
 addCallback 
 ( 
  
 responses 
 , 
  
 new 
  
 ApiFutureCallback<List<LocalInventory> 
> () 
  
 { 
  
 @Override 
  
 public 
  
 void 
  
 onSuccess 
 ( 
 List<LocalInventory> 
  
 results 
 ) 
  
 { 
  
 System 
 . 
 out 
 . 
 println 
 ( 
 "Inserted LocalInventory below" 
 ); 
  
 System 
 . 
 out 
 . 
 println 
 ( 
 results 
 ); 
  
 } 
  
 @Override 
  
 public 
  
 void 
  
 onFailure 
 ( 
 Throwable 
  
 throwable 
 ) 
  
 { 
  
 System 
 . 
 err 
 . 
 println 
 ( 
  
 "An error occurred while inserting local inventory: " 
  
 + 
  
 throwable 
 . 
 getMessage 
 ()); 
  
 } 
  
 }, 
  
 MoreExecutors 
 . 
 directExecutor 
 ()); 
  
 } 
  
 catch 
  
 ( 
 Exception 
  
 e 
 ) 
  
 { 
  
 System 
 . 
 err 
 . 
 println 
 ( 
 e 
 . 
 getMessage 
 ()); 
  
 } 
  
 } 
  
 public 
  
 static 
  
 void 
  
 main 
 ( 
 String 
 [] 
  
 args 
 ) 
  
 throws 
  
 Exception 
  
 { 
  
 GoogleCredentials 
  
 credential 
  
 = 
  
 new 
  
 Authenticator 
 (). 
 authenticate 
 (); 
  
 String 
  
 accountId 
  
 = 
  
 Config 
 . 
 load 
 (). 
 getAccountId 
 (). 
 toString 
 (); 
  
 // The code uniquely identifying each store. 
  
 // This can be found in the Google Business Profile UI, by going to Business Profile Settings - 
>  
 // Advanced Settings. The store must have passed verification for this code sample to work. 
  
 String 
  
 storeCode 
  
 = 
  
 "yourstorecode" 
 ; 
  
 insertLocalInventoryAsync 
 ( 
 credential 
 , 
  
 accountId 
 , 
  
 storeCode 
 ); 
  
 } 
 } 
  
 
Design a Mobile Site
View Site in Mobile | Classic
Share by: